diff --git a/.gitignore b/.gitignore
index fb2b897..4a9dbac 100644
--- a/.gitignore
+++ b/.gitignore
@@ -9,6 +9,7 @@ lastchange.txt
/venv/
/lokalize-scripts/
/venvv/
+/.idea/
__pycache__
*.bat
*.code-workspace
diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index a25256c..0edcec6 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -1,17 +1,47 @@
-image: python:3.6-alpine
+image: python:3.7-alpine
include:
- template: Code-Quality.gitlab-ci.yml
+variables:
+ PIP_CACHE_DIR: "$CI_PROJECT_DIR/.cache/pip"
+
+stages:
+ - test
+ - pytest
+
+cache:
+ paths:
+ - settings.json
+ - .cache/pip
+ - venv/
+
test:
- type: test
+ stage: test
script:
- apk add libxml2-dev libxslt-dev libxml2 gcc musl-dev linux-headers
- - pip3.6 install -r requirements.txt
+ - pip3.7 install virtualenv
+ - virtualenv venv
+ - source venv/bin/activate
+ - pip3.7 install -r requirements.txt
- sed -i -e "s/111111111111111111/$DISCORD1/g" settings.json.example
- sed -i -e "s/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/$DISCORD2/g" settings.json.example
- mv settings.json.example settings.json
- - python3.6 start.py --test
+ - python3.7 start.py --test
only:
- testing
- - merge_requests
+
+pytest:
+ stage: pytest
+ needs: ['test']
+ script:
+ - source venv/bin/activate
+ - pip3.7 install -U pytest
+ - pytest --junitxml=report.xml
+ artifacts:
+ when: always
+ reports:
+ junit: report.xml
+ only:
+ - testing
+
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index 3395c0d..6594a82 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -9,4 +9,4 @@ If you contribute, I ask of you to create merge requests based on testing branch
`testing `- testing branch is what all of my hosted scripts run. It is used to test the code before merging it with master branch.
## Translations ##
-If you speak in other languages than English, you are more than welcome to. There are several ways you can contribute your translation, first the easiest one is to signup at [our weblate instance](https://weblate.frisk.space) and [contact me directly with request to review your account](https://minecraft.gamepedia.com/User:Frisk#Contact). You can also contact me so I send you the translation files you can fill in. If you know how .po files work, you are also free to send Merge Requests with translated files.
+If you speak in other languages than English, you are more than welcome to. There are several ways you can contribute your translation, first the easiest one is to signup at [our weblate instance](https://translate.wikibot.de) and [contact me directly with request to review your account](https://minecraft.gamepedia.com/User:Frisk#Contact). You can also contact me so I send you the translation files you can fill in. If you know how .po files work, you are also free to send Merge Requests with translated files.
diff --git a/README.md b/README.md
index 43e3088..5e82978 100644
--- a/README.md
+++ b/README.md
@@ -11,7 +11,7 @@
* Very customizable
### Dependencies ###
-* **Python 3.6+**
+* **Python 3.7+**
* requests 2.18.4+
* beautifulsoup 4.6.0+
* schedule 0.5.0+
@@ -31,15 +31,23 @@
* MarkusRost – German translation
* JSBM – French translation
* [Eduaddad](https://eduardoaddad.com.br) – Brazilian Portuguese translation
-* BabylonAS and Russian Minecraft Wiki community – Russian translation
+* BabylonAS, Philo and Russian Minecraft Wiki community – Russian translation
* Mak_and_Iv – Ukrainian translation
+* Tamara Carvallo – Spanish translation
+* Lakejason0 - Simplified Chinese translation
Thank you!
-[](https://weblate.frisk.space/engage/rcgcdw/?utm_source=widget)
+[](https://translate.wikibot.de/engage/rcgcdw/?utm_source=widget)
-### Other extensions/compatible programs ###
+### Extensions/compatible programs ###
* [Wiki Utilities](https://github.com/Sidemen19/Wiki-Utilities) – an integration that allows wiki administrators to revert edits, block editors, and delete pages on the wiki by reacting to messages created by RcGcDw/RcGcDb. Author: [Sidemen19](https://github.com/Sidemen19)
+### Alternatives ###
+There are various alternatives to RcGcDw you may want to consider if for some reason RcGcDw doesn't satisfy your needs:
+* [Wiki-Bot](https://wiki.wikibot.de/wiki/Wiki-Bot_Wiki) - while it's not exactly an alternative since Wiki-Bot is running a modified version of RcGcDw in the backend, you can use its rcscript feature to add a webhook for your wiki and have it work similarly to how RcGcDw does without hosting anything on your own,
+* [Extension:Discord](https://www.mediawiki.org/wiki/Extension:Discord) - MediaWiki extension to do the same thing,
+* [Extension:DiscordNotifications](https://www.mediawiki.org/wiki/Extension:DiscordNotifications) - another MediaWiki extension with the same goal.
+
### Wiki ###
For more information, check the [wiki](https://gitlab.com/piotrex43/RcGcDw/wikis/Home)!
\ No newline at end of file
diff --git a/docs/API spec.md b/docs/API spec.md
new file mode 100644
index 0000000..4e331bb
--- /dev/null
+++ b/docs/API spec.md
@@ -0,0 +1,151 @@
+## About
+This is a specification for RcGcDw API extending formatters and allowing to add additional pre and post processing hooks for message contents.
+This document assumes you have at least a basic understanding of Python, concept of classes, objects and decorators.
+
+### Pre-processing hook
+A class allowing to change the raw event values obtained for a change via query.recentchanges endpoint on the wiki and/or execute additional actions each time given event gets read. This type of hook executes before a formatter.
+
+### Formatters
+Formatters allow specifying how does a Discord message look like depending on message mode (embed, compact) and type of the event that had happened on the wiki (new, edit etc).
+If formatter for given event is not registered, the script will look for formatter for event "generic" and if this is also not found it will throw a warning.
+
+### Post-processing hook
+A class allowing to change the message content and/or execute additional actions after message has been processed by the formatter. This type of hook executes after a formatter.
+
+## File structure
+Directory with extensions is specified by setting `extensions_dir` in settings.json.
+The directory with hooks and formatters needs to be below root directory (directory in which start.py is located) and every directory inside it needs to be a Python package importing its child packages and modules.
+
+.
+├── extensions
+│ ├── base
+│ │ ├── abusefilter.py
+│ │ ├── my_formatters.py
+│ │ ├── \_\_init\_\_.py
+│ ├── hooks
+│ │ ├── my_hooks.py
+│ │ ├── \_\_init\_\_.py
+│ ├── \_\_init\_\_.py
+├── start.py
+
+## API
+api object exposes various data which allows to extend the usefulness of what can be then sent to Discord. It also contains
+common functions that can be used to interact with the script and the wiki.
+
+### Formatter
+**Path**: `src.api.formatter`
+_Formatter module implements two decorators: `embed` and `compact`. Both of them can take the following keyword arguments:_
+- `event` - string - event type for formatter, in case the event is a [log event](https://www.mediawiki.org/wiki/Manual:Log_actions) it's constructed by taking log_type and combining it with log_action with / character in between (for example `upload/overwrite`). If the event however is not a log event but action like edit, the type will consist only of `type` value.
+- `aliases` - list[str] - list of strings containing all the events given event should alias for, it helps in case you want the same function be used for multiple event types.
+
+Both `event` and `aliases` arguments are optional in formatters. However, every formatter needs to have some kind of event specified. If it's not specified in the decorator, a fallback method will be used which constructs event type in format `{func.__module__}/{func.__name__.split("_", 1)[1]}`, in other terms taking the name of the file in which formatter is defined as first part and entire function name after first _ character as second part. Note that this fallback works only for log events.
+There are also additional, made up event types that are special cases, they are listed below:
+- `abuselog` – reserved for AbuseFilter filter logs
+- `discussion/{post_type.lower()}` – reserved for Fandom's Discussion/Feeds integration
+- `suppressed` – reserved for logs that were [suppressed](https://www.mediawiki.org/wiki/Special:MyLanguage/Help:RevisionDelete) and cannot be read by the script
+
+Formatter decorator registers a Python function and calls it each time a specific event is being processed from the wiki. Function is then called with Context and change arguments where context is [Context object](#Context) and change is a dict object containing the body of a change.
+Every formatter **must** return a DiscordMessage object.
+
+#### Usage
+
+```python
+from src.discord.message import DiscordMessage
+from src.api import formatter
+from src.i18n import formatters_i18n
+from src.api.context import Context
+from src.api.util import embed_helper, compact_author, create_article_path, sanitize_to_markdown, sanitize_to_url, \
+ clean_link
+
+# Setup translation function which is used to translate english strings to other languages
+_ = formatters_i18n.gettext
+
+# Call a decorator and register embed_sprite_sprite function for all sprite/sprite events
+@formatter.embed(event="sprite/sprite")
+def embed_sprite_sprite(ctx: Context, change: dict) -> DiscordMessage:
+ # Create DiscordMessage object which constructs Discord embed content
+ embed = DiscordMessage(ctx.message_type, ctx.event, ctx.webhook_url)
+ # embed_helper function can be used to automatically populate DiscordMessage object with some common useful information such as setting author name/url, adding fields for tags/categories, or setting default description
+ embed_helper(ctx, embed, change)
+ embed["url"] = create_article_path(sanitize_to_url(change["title"]))
+ embed["title"] = _("Edited the sprite for {article}").format(article=sanitize_to_markdown(change["title"]))
+ # return populated DiscordMessage object
+ return embed
+
+
+@formatter.compact(event="sprite/sprite")
+def compact_sprite_sprite(ctx: Context, change: dict) -> DiscordMessage:
+ author, author_url = compact_author(ctx, change)
+ link = clean_link(create_article_path(sanitize_to_url(change["title"])))
+ content = _("[{author}]({author_url}) edited the sprite for [{article}]({article_url})").format(author=author,
+ author_url=author_url,
+ article=sanitize_to_markdown(change[
+ "title"]),
+ article_url=link)
+ return DiscordMessage(ctx.message_type, ctx.event, ctx.webhook_url, content=content)
+```
+
+### Client
+**Path**: `src.api.client.Client`
+_Client is a class containing most of usable methods and communication layer with the core functionality._
+Client consists of the following fields:
+- `WIKI_API_PATH` - string - URL path leading to API (`WIKI_DOMAIN/api.php`)
+- `WIKI_ARTICLE_PATH` - string - URL path leading to article path (`WIKI_DOMAIN/articlepath`)
+- `WIKI_SCRIPT_PATH` - string - URL path leading to script path of the wiki (`WIKI_DOMAIN/`)
+- `WIKI_JUST_DOMAIN` - string - URL path leading just to the wiki domain (`WIKI_DOMAIN`)
+- `content_parser` - class - a reference to HTMLParser implementation that parses edit diffs
+- `tags` - dict - a container storing all [tags](https://www.mediawiki.org/wiki/Manual:Tags) the wiki has configured
+- `namespaces` - dict - a dictionary of [namespaces](https://www.mediawiki.org/wiki/Manual:Namespace) on the wiki
+- `LinkParser` - class - a class of LinkParser which is usually used to parse parsed_comment from events including turning URLs into Markdown links
+Client consists of the following methods:
+- `refresh_internal_data()` - requests namespaces, tags and MediaWiki messages to be retrieved and updated in internal storage
+- `parse_links(text: str)` - parses links using LinkParser object
+- `pull_curseprofile_comment(comment_id: Union[str, int])` - allows retrieving CurseProfile comment from wikis originated from Gamepedia
+- `make_api_request(params: Union[str, OrderedDict], *json_path: str, timeout: int = 10, allow_redirects: bool = False)` - allows to make a request to the wiki with parameters specified in params argument, json_path additionally allows to provide a list of strings that will be iterated over and json path of the result of this iteration returned. Timeout in float (seconds) can be added to limit the time for response, allow_redirects can be set to disallow or allow redirects
+- `get_formatters()` - returns a dictionary of all formatters in format of `{'eventtype': func}`
+- `get_ipmapper()` - returns ip mapper which tracks edit counts of IP editors
+
+### Context
+**Path**: `src.api.context.Context`
+_Context is a class which objects of are only used as first argument of formatter definitions._
+Context can consist of the following fields:
+- `client` - [Client](#Client) object
+- `webhook_url` - string - webhook url for given formatter
+- `message_type` - string - can be either `embed` or `compact`
+- `categories` - {"new": set(), "removed": set()} - each set containing strings of added or removed categories for given page
+- `parsedcomment` - string - contains escaped and Markdown parsed summary (parsed_comment) of a log/edit action
+- `event` - string - action called, should be the same as formatter event action
+- `comment_page` - dict - containing `fullUrl` and `article` with strings both to full article url and its name
+
+### Util
+**Path**: `src.api.util`
+_Util is a module with a few common functions that can be useful for generating Discord messages, parsing changes in formatting and more._
+Util provides the following functionalities:
+- `clean_link(link: str)` – returns a string wrapped with <> brackets, so the link given as a string doesn't embed in Discord
+- `sanitize_to_markdown(text: str)` – returns a string with Discord Markdown characters escaped
+- `sanitize_to_url(text: str)` – returns a string that should be safe to be part of URL with special characters either escaped or encoded
+- `parse_mediawiki_changes(ctx: Context, content: str, embed: DiscordMessage)` – populates embed with two new fields "Added" and "Removed" containing diff of changes within content argument retrieved using action=compare request between two revisions
+- `create_article_path(article: str)` – returns a string with URL leading to an article page (basically taking into account wiki's article path)
+- `compact_author(ctx: Context, content: dict)` – returns two strings - first containing the name of the author with hide_ips setting taken into account and second a URL leading to author's contribution page, this makes it easier for compact formatters to include author detail in messages
+- `embed_helper(ctx: Context, message: DiscordMessage, change: dict, set_user=True, set_edit_meta=True, set_desc=True)` – a function populating the message (Discord embed message) with most essential fields accordingly. Populating includes the following fields: author, author_url, category and tags fields, description
+
+### DiscordMessage
+**Path**: `src.discord.message.DiscordMessage`
+_DiscordMessage is a class taking care of creation of Discord messages that can be sent via send_to_discord function later on._
+DiscordMessage object when created with message_type == embed will take all assignments and reads using object[key] as ones reading/setting the actual embed object.
+DiscordMessage consists of the following:
+- `__init__(message_type: str, event_type: str, webhook_url: str, content=None)` – constructor which takes message type (can be either `embed` or `compact`), event_type (for example `protect/protect`), webhook_url (full URL of webhook message is intended to be sent to), content optional parameter used in compact messages as main body
+- `set_author(name, url, icon_url="")` – a method that can be used to set username, URL to their profile and optionally an icon for the embed
+- `add_field(name, value, inline=False)` – a method to add a field with given name and value, optional inline argument can be set if field should be inline
+- `set_avatar(url)` – sets avatar for WEBHOOK MESSAGE (not to be confused with actual embed)
+- `set_name(name)` – sets name for WEBHOOK MESSAGE
+- `set_link(link)` – equivalent to object["link"] = link for embed messages
+
+### Language support
+RcGcDw implements i18n with gettext and already exposes Translations instance with its `src.i18` module. formatters_i18n variable is used for instance of all formatters inside base directory.
+
+### Pre/post hooks
+**Path**: `src.api.hook`
+There are two decorator functions available in the module: `pre_hook` and `post_hook`. They don't take arguments and simply register the function as a hook.
+Pre-hook functions take the following arguments: `context` ([Context object](#Context)) and `change` (dict object with change).
+Post-hook functions take the following arguments: `message` ([Discord message object](#DiscordMessage)), `metadata` ([Discord message metadata](#DiscordMessageMetadata)), `context` ([Context object](#Context)) and `change` (dictionary of main change body)
\ No newline at end of file
diff --git a/extensions/__init__.py b/extensions/__init__.py
new file mode 100644
index 0000000..c2cc1c1
--- /dev/null
+++ b/extensions/__init__.py
@@ -0,0 +1,17 @@
+# This file is part of Recent changes Goat compatible Discord webhook (RcGcDw).
+#
+# RcGcDw is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# RcGcDw is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with RcGcDw. If not, see .
+
+import extensions.base
+import extensions.hooks
\ No newline at end of file
diff --git a/extensions/base/__init__.py b/extensions/base/__init__.py
new file mode 100644
index 0000000..e6ffd54
--- /dev/null
+++ b/extensions/base/__init__.py
@@ -0,0 +1,26 @@
+# This file is part of Recent changes Goat compatible Discord webhook (RcGcDw).
+#
+# RcGcDw is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# RcGcDw is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with RcGcDw. If not, see .
+
+import extensions.base.mediawiki
+import extensions.base.abusefilter
+import extensions.base.managewiki
+import extensions.base.cargo
+import extensions.base.datadump
+import extensions.base.sprite
+import extensions.base.translate
+import extensions.base.discussions
+import extensions.base.curseprofile
+import extensions.base.interwiki
+import extensions.base.renameuser
\ No newline at end of file
diff --git a/extensions/base/abusefilter.py b/extensions/base/abusefilter.py
new file mode 100644
index 0000000..d54226c
--- /dev/null
+++ b/extensions/base/abusefilter.py
@@ -0,0 +1,125 @@
+# This file is part of Recent changes Goat compatible Discord webhook (RcGcDw).
+#
+# RcGcDw is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# RcGcDw is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with RcGcDw. If not, see .
+
+import ipaddress
+import logging
+from src.discord.message import DiscordMessage
+from src.api import formatter
+from src.i18n import formatters_i18n
+from src.api.context import Context
+from src.api.util import embed_helper, sanitize_to_url, parse_mediawiki_changes, clean_link, compact_author, \
+ create_article_path, sanitize_to_markdown
+from src.configloader import settings
+
+_ = formatters_i18n.gettext
+ngettext = formatters_i18n.ngettext
+
+abusefilter_results = {"": _("None"), "warn": _("Warning issued"), "block": _("**Blocked user**"), "tag": _("Tagged the edit"), "disallow": _("Disallowed the action"), "rangeblock": _("**IP range blocked**"), "throttle": _("Throttled actions"), "blockautopromote": _("Removed autoconfirmed group"), "degroup": _("**Removed from privileged groups**")}
+abusefilter_actions = {"edit": _("Edit"), "upload": _("Upload"), "move": _("Move"), "stashupload": _("Stash upload"), "delete": _("Deletion"), "createaccount": _("Account creation"), "autocreateaccount": _("Auto account creation")}
+
+logger = logging.getLogger("extensions.base")
+
+# AbuseFilter - https://www.mediawiki.org/wiki/Special:MyLanguage/Extension:AbuseFilter
+# Processing Abuselog LOG events, separate from RC logs
+
+def abuse_filter_format_user(change):
+ author = change["user"]
+ if settings.get("hide_ips", False):
+ try:
+ ipaddress.ip_address(change["user"])
+ except ValueError:
+ pass
+ else:
+ author = _("Unregistered user")
+ return author
+
+
+@formatter.embed(event="abuselog")
+def embed_abuselog(ctx: Context, change: dict):
+ action = "abuselog/{}".format(change["result"])
+ embed = DiscordMessage(ctx.message_type, action, ctx.webhook_url)
+ author = abuse_filter_format_user(change)
+ embed["title"] = _("{user} triggered \"{abuse_filter}\"").format(user=author, abuse_filter=sanitize_to_markdown(change["filter"]))
+ embed.add_field(_("Performed"), abusefilter_actions.get(change["action"], _("Unknown")))
+ embed.add_field(_("Action taken"), abusefilter_results.get(change["result"], _("Unknown")))
+ embed.add_field(_("Title"), sanitize_to_markdown(change.get("title", _("Unknown"))))
+ return embed
+
+
+@formatter.compact(event="abuselog")
+def compact_abuselog(ctx: Context, change: dict):
+ action = "abuselog/{}".format(change["result"])
+ author_url = clean_link(create_article_path("User:{user}".format(user=change["user"])))
+ author = abuse_filter_format_user(change)
+ message = _("[{author}]({author_url}) triggered *{abuse_filter}*, performing the action \"{action}\" on *[{target}]({target_url})* - action taken: {result}.").format(
+ author=author, author_url=author_url, abuse_filter=sanitize_to_markdown(change["filter"]),
+ action=abusefilter_actions.get(change["action"], _("Unknown")), target=change.get("title", _("Unknown")),
+ target_url=clean_link(create_article_path(sanitize_to_url(change.get("title", _("Unknown"))))),
+ result=abusefilter_results.get(change["result"], _("Unknown")))
+ return DiscordMessage(ctx.message_type, action, ctx.webhook_url, content=message)
+
+# abusefilter/modify - AbuseFilter filter modification
+
+
+@formatter.embed(event="abusefilter/modify")
+def embed_abuselog_modify(ctx: Context, change: dict):
+ embed = DiscordMessage(ctx.message_type, ctx.event, ctx.webhook_url)
+ embed_helper(ctx, embed, change)
+ embed["url"] = create_article_path(
+ "Special:AbuseFilter/history/{number}/diff/prev/{historyid}".format(number=change["logparams"]['newId'],
+ historyid=change["logparams"]["historyId"]))
+ embed["title"] = _("Edited abuse filter number {number}").format(number=change["logparams"]['newId'])
+ return embed
+
+
+@formatter.compact(event="abusefilter/modify")
+def compact_abuselog_modify(ctx: Context, change: dict):
+ author, author_url = compact_author(ctx, change)
+ link = clean_link(create_article_path(
+ "Special:AbuseFilter/history/{number}/diff/prev/{historyid}".format(number=change["logparams"]['newId'],
+ historyid=change["logparams"][
+ "historyId"])))
+
+ content = _("[{author}]({author_url}) edited abuse filter [number {number}]({filter_url})").format(author=author,
+ author_url=author_url,
+ number=change[
+ "logparams"][
+ 'newId'],
+ filter_url=link)
+ return DiscordMessage(ctx.message_type, ctx.event, ctx.webhook_url, content=content)
+
+# abusefilter/create - AbuseFilter filter creation
+
+
+@formatter.embed(event="abusefilter/create")
+def embed_abuselog_create(ctx: Context, change: dict):
+ embed = DiscordMessage(ctx.message_type, ctx.event, ctx.webhook_url)
+ embed_helper(ctx, embed, change)
+ embed["url"] = create_article_path("Special:AbuseFilter/{number}".format(number=change["logparams"]['newId']))
+ embed["title"] = _("Created abuse filter number {number}").format(number=change["logparams"]['newId'])
+ return embed
+
+@formatter.compact(event="abusefilter/create")
+def compact_abuselog_create(ctx: Context, change: dict):
+ author, author_url = compact_author(ctx, change)
+ link = clean_link(
+ create_article_path("Special:AbuseFilter/{number}".format(number=change["logparams"]['newId'])))
+ content = _("[{author}]({author_url}) created abuse filter [number {number}]({filter_url})").format(author=author,
+ author_url=author_url,
+ number=change[
+ "logparams"][
+ 'newId'],
+ filter_url=link)
+ return DiscordMessage(ctx.message_type, ctx.event, ctx.webhook_url, content=content)
diff --git a/extensions/base/cargo.py b/extensions/base/cargo.py
new file mode 100644
index 0000000..af7d484
--- /dev/null
+++ b/extensions/base/cargo.py
@@ -0,0 +1,115 @@
+# This file is part of Recent changes Goat compatible Discord webhook (RcGcDw).
+#
+# RcGcDw is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# RcGcDw is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with RcGcDw. If not, see .
+
+import logging
+import re
+from src.discord.message import DiscordMessage
+from src.api import formatter
+from src.i18n import formatters_i18n
+from src.api.context import Context
+from src.api.util import embed_helper, compact_author, create_article_path, sanitize_to_markdown
+
+_ = formatters_i18n.gettext
+ngettext = formatters_i18n.ngettext
+
+
+# Cargo - https://www.mediawiki.org/wiki/Extension:Cargo
+# cargo/createtable - Creation of Cargo table
+
+@formatter.embed(event="cargo/createtable")
+def embed_cargo_createtable(ctx: Context, change: dict):
+ embed = DiscordMessage(ctx.message_type, ctx.event, ctx.webhook_url)
+ embed_helper(ctx, embed, change)
+ table = re.search(r"\[(.*?)]\(<(.*?)>\)", ctx.client.parse_links(change["logparams"]["0"]))
+ embed["url"] = table.group(2)
+ embed["title"] = _("Created the Cargo table \"{table}\"").format(table=table.group(1))
+ return embed
+
+
+@formatter.compact(event="cargo/createtable")
+def compact_cargo_createtable(ctx: Context, change: dict):
+ author, author_url = compact_author(ctx, change)
+ table = re.search(r"\[(.*?)]\(<(.*?)>\)", ctx.client.parse_links(change["logparams"]["0"]))
+ content = _("[{author}]({author_url}) created the Cargo table \"{table}\"").format(author=author,
+ author_url=author_url,
+ table=table)
+ return DiscordMessage(ctx.message_type, ctx.event, ctx.webhook_url, content=content)
+
+
+# cargo/recreatetable - Recreating a Cargo table
+
+
+@formatter.embed(event="cargo/recreatetable")
+def embed_cargo_recreatetable(ctx: Context, change: dict):
+ embed = DiscordMessage(ctx.message_type, ctx.event, ctx.webhook_url)
+ embed_helper(ctx, embed, change)
+ table = re.search(r"\[(.*?)]\(<(.*?)>\)", ctx.client.parse_links(change["logparams"]["0"]))
+ embed["url"] = table.group(2)
+ embed["title"] = _("Recreated the Cargo table \"{table}\"").format(table=table.group(1))
+ return embed
+
+
+@formatter.compact(event="cargo/recreatetable")
+def compact_cargo_recreatetable(ctx: Context, change: dict):
+ author, author_url = compact_author(ctx, change)
+ table = re.search(r"\[(.*?)]\(<(.*?)>\)", ctx.client.parse_links(change["logparams"]["0"]))
+ content = _("[{author}]({author_url}) recreated the Cargo table \"{table}\"").format(author=author,
+ author_url=author_url,
+ table=table)
+ return DiscordMessage(ctx.message_type, ctx.event, ctx.webhook_url, content=content)
+
+
+# cargo/replacetable - Replacing a Cargo table
+
+
+@formatter.embed(event="cargo/replacetable")
+def embed_cargo_replacetable(ctx: Context, change: dict):
+ embed = DiscordMessage(ctx.message_type, ctx.event, ctx.webhook_url)
+ embed_helper(ctx, embed, change)
+ table = re.search(r"\[(.*?)]\(<(.*?)>\)", ctx.client.parse_links(change["logparams"]["0"]))
+ embed["url"] = table.group(2)
+ embed["title"] = _("Replaced the Cargo table \"{table}\"").format(table=table.group(1))
+ return embed
+
+
+@formatter.compact(event="cargo/replacetable")
+def compact_cargo_replacetable(ctx: Context, change: dict):
+ author, author_url = compact_author(ctx, change)
+ table = re.search(r"\[(.*?)]\(<(.*?)>\)", ctx.client.parse_links(change["logparams"]["0"]))
+ content = _("[{author}]({author_url}) replaced the Cargo table \"{table}\"").format(author=author,
+ author_url=author_url,
+ table=table)
+ return DiscordMessage(ctx.message_type, ctx.event, ctx.webhook_url, content=content)
+
+
+# cargo/deletetable - Deleting a table in Cargo
+
+
+@formatter.embed(event="cargo/deletetable")
+def embed_cargo_deletetable(ctx: Context, change: dict):
+ embed = DiscordMessage(ctx.message_type, ctx.event, ctx.webhook_url)
+ embed_helper(ctx, embed, change)
+ embed["url"] = create_article_path("Special:CargoTables")
+ embed["title"] = _("Deleted the Cargo table \"{table}\"").format(table=sanitize_to_markdown(change["logparams"]["0"]))
+ return embed
+
+
+@formatter.compact(event="cargo/deletetable")
+def compact_cargo_deletetable(ctx: Context, change: dict):
+ author, author_url = compact_author(ctx, change)
+ content = _("[{author}]({author_url}) deleted the Cargo table \"{table}\"").format(author=author,
+ author_url=author_url,
+ table=sanitize_to_markdown(change["logparams"]["0"]))
+ return DiscordMessage(ctx.message_type, ctx.event, ctx.webhook_url, content=content)
diff --git a/extensions/base/curseprofile.py b/extensions/base/curseprofile.py
new file mode 100644
index 0000000..3582a79
--- /dev/null
+++ b/extensions/base/curseprofile.py
@@ -0,0 +1,234 @@
+# This file is part of Recent changes Goat compatible Discord webhook (RcGcDw).
+#
+# RcGcDw is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# RcGcDw is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with RcGcDw. If not, see .
+
+
+import logging
+from src.configloader import settings
+from src.discord.message import DiscordMessage
+from src.api import formatter
+from src.i18n import formatters_i18n
+from src.api.context import Context
+from src.api.util import embed_helper, clean_link, compact_author, create_article_path, sanitize_to_markdown, sanitize_to_url
+from src.misc import profile_field_name
+
+_ = formatters_i18n.gettext
+ngettext = formatters_i18n.ngettext
+
+
+# CurseProfile - https://help.fandom.com/wiki/Extension:CurseProfile
+# curseprofile/profile-edited - Editing user profile
+
+
+@formatter.embed(event="curseprofile/profile-edited")
+def embed_curseprofile_profile_edited(ctx: Context, change: dict) -> DiscordMessage:
+ embed = DiscordMessage(ctx.message_type, ctx.event, ctx.webhook_url)
+ embed_helper(ctx, embed, change)
+ target_user = change["title"].split(':', 1)[1]
+ if target_user != change["user"]:
+ embed["title"] = _("Edited {target}'s profile").format(target=sanitize_to_markdown(target_user))
+ else:
+ embed["title"] = _("Edited their own profile")
+ if ctx.parsedcomment is None: # If the field is empty
+ embed["description"] = _("Cleared the {field} field").format(field=profile_field_name(change["logparams"]['4:section'], True))
+ else:
+ embed["description"] = _("{field} field changed to: {desc}").format(field=profile_field_name(change["logparams"]['4:section'], True), desc=ctx.parsedcomment)
+ embed["url"] = create_article_path("UserProfile:" + sanitize_to_url(target_user))
+ return embed
+
+
+@formatter.compact(event="curseprofile/profile-edited")
+def compact_curseprofile_profile_edited(ctx: Context, change: dict) -> DiscordMessage:
+ author, author_url = compact_author(ctx, change)
+ target_user = change["title"].split(':', 1)[1]
+ link = clean_link(create_article_path("UserProfile:" + sanitize_to_url(target_user)))
+ if target_user != author:
+ if ctx.parsedcomment is None: # If the field is empty
+ edit_clear_message = _("[{author}]({author_url}) cleared the {field} on [{target}]({target_url})'s profile.")
+ else:
+ edit_clear_message = _("[{author}]({author_url}) edited the {field} on [{target}]({target_url})'s profile. *({desc})*")
+ content = edit_clear_message.format(author=author, author_url=author_url, target=sanitize_to_markdown(target_user), target_url=link,
+ field=profile_field_name(change["logparams"]['4:section'], False), desc=ctx.parsedcomment)
+ else:
+ if ctx.parsedcomment is None: # If the field is empty
+ edit_clear_message = _("[{author}]({author_url}) cleared the {field} on [their own]({target_url}) profile.")
+ else:
+ edit_clear_message = _("[{author}]({author_url}) edited the {field} on [their own]({target_url}) profile. *({desc})*")
+ content = edit_clear_message.format(author=author, author_url=author_url, target_url=link,
+ field=profile_field_name(change["logparams"]['4:section'], False), desc=ctx.parsedcomment)
+ return DiscordMessage(ctx.message_type, ctx.event, ctx.webhook_url, content=content)
+
+
+# curseprofile/comment-created - Creating comment on user profile
+
+
+@formatter.embed(event="curseprofile/comment-created")
+def embed_curseprofile_comment_created(ctx: Context, change: dict) -> DiscordMessage:
+ embed = DiscordMessage(ctx.message_type, ctx.event, ctx.webhook_url)
+ embed_helper(ctx, embed, change)
+ target_user = change["title"].split(':', 1)[1]
+ if target_user != change["user"]:
+ embed["title"] = _("Left a comment on {target}'s profile").format(target=sanitize_to_markdown(target_user))
+ else:
+ embed["title"] = _("Left a comment on their own profile")
+ if settings["appearance"]["embed"]["show_edit_changes"]:
+ embed["description"] = ctx.client.pull_curseprofile_comment(change["logparams"]["4:comment_id"])
+ embed["url"] = create_article_path("Special:CommentPermalink/{commentid}".format(commentid=change["logparams"]["4:comment_id"]))
+ return embed
+
+
+@formatter.compact(event="curseprofile/comment-created")
+def compact_curseprofile_comment_created(ctx: Context, change: dict) -> DiscordMessage:
+ author, author_url = compact_author(ctx, change)
+ target_user = change["title"].split(':', 1)[1]
+ link = clean_link(create_article_path("Special:CommentPermalink/{commentid}".format(commentid=change["logparams"]["4:comment_id"])))
+ if target_user != author:
+ content = _("[{author}]({author_url}) left a [comment]({comment}) on {target}'s profile.").format(
+ author=author, author_url=author_url, comment=link, target=sanitize_to_markdown(target_user))
+ else:
+ content = _("[{author}]({author_url}) left a [comment]({comment}) on their own profile.").format(author=author, author_url=author_url, comment=link)
+ return DiscordMessage(ctx.message_type, ctx.event, ctx.webhook_url, content=content)
+
+
+# curseprofile/comment-edited - Editing comment on user profile
+
+
+@formatter.embed(event="curseprofile/comment-edited")
+def embed_curseprofile_comment_edited(ctx: Context, change: dict) -> DiscordMessage:
+ embed = DiscordMessage(ctx.message_type, ctx.event, ctx.webhook_url)
+ embed_helper(ctx, embed, change)
+ target_user = change["title"].split(':', 1)[1]
+ if target_user != change["user"]:
+ embed["title"] = _("Edited a comment on {target}'s profile").format(target=sanitize_to_markdown(target_user))
+ else:
+ embed["title"] = _("Edited a comment on their own profile")
+ if settings["appearance"]["embed"]["show_edit_changes"]:
+ embed["description"] = ctx.client.pull_curseprofile_comment(change["logparams"]["4:comment_id"])
+ embed["url"] = create_article_path("Special:CommentPermalink/{commentid}".format(commentid=change["logparams"]["4:comment_id"]))
+ return embed
+
+
+@formatter.compact(event="curseprofile/comment-edited")
+def compact_curseprofile_comment_edited(ctx: Context, change: dict) -> DiscordMessage:
+ author, author_url = compact_author(ctx, change)
+ target_user = change["title"].split(':', 1)[1]
+ link = clean_link(create_article_path("Special:CommentPermalink/{commentid}".format(commentid=change["logparams"]["4:comment_id"])))
+ if target_user != author:
+ content = _("[{author}]({author_url}) edited a [comment]({comment}) on {target}'s profile.").format(
+ author=author, author_url=author_url, comment=link, target=sanitize_to_markdown(target_user))
+ else:
+ content = _("[{author}]({author_url}) edited a [comment]({comment}) on their own profile.").format(author=author, author_url=author_url, comment=link)
+ return DiscordMessage(ctx.message_type, ctx.event, ctx.webhook_url, content=content)
+
+
+# curseprofile/comment-replied - Replying to comment on user profile
+
+
+@formatter.embed(event="curseprofile/comment-replied")
+def embed_curseprofile_comment_replied(ctx: Context, change: dict) -> DiscordMessage:
+ embed = DiscordMessage(ctx.message_type, ctx.event, ctx.webhook_url)
+ embed_helper(ctx, embed, change)
+ target_user = change["title"].split(':', 1)[1]
+ if target_user != change["user"]:
+ embed["title"] = _("Replied to a comment on {target}'s profile").format(target=sanitize_to_markdown(target_user))
+ else:
+ embed["title"] = _("Replied to a comment on their own profile")
+ if settings["appearance"]["embed"]["show_edit_changes"]:
+ embed["description"] = ctx.client.pull_curseprofile_comment(change["logparams"]["4:comment_id"])
+ embed["url"] = create_article_path("Special:CommentPermalink/{commentid}".format(commentid=change["logparams"]["4:comment_id"]))
+ return embed
+
+
+@formatter.compact(event="curseprofile/comment-replied")
+def compact_curseprofile_comment_replied(ctx: Context, change: dict) -> DiscordMessage:
+ author, author_url = compact_author(ctx, change)
+ target_user = change["title"].split(':', 1)[1]
+ link = clean_link(create_article_path("Special:CommentPermalink/{commentid}".format(commentid=change["logparams"]["4:comment_id"])))
+ if target_user != author:
+ content = _("[{author}]({author_url}) replied to a [comment]({comment}) on {target}'s profile.").format(
+ author=author, author_url=author_url, comment=link, target=sanitize_to_markdown(target_user))
+ else:
+ content = _("[{author}]({author_url}) replied to a [comment]({comment}) on their own profile.").format(author=author, author_url=author_url, comment=link)
+ return DiscordMessage(ctx.message_type, ctx.event, ctx.webhook_url, content=content)
+
+
+# curseprofile/comment-deleted - Deleting comment on user profile
+
+
+@formatter.embed(event="curseprofile/comment-deleted")
+def embed_curseprofile_comment_deleted(ctx: Context, change: dict) -> DiscordMessage:
+ embed = DiscordMessage(ctx.message_type, ctx.event, ctx.webhook_url)
+ embed_helper(ctx, embed, change)
+ target_user = change["title"].split(':', 1)[1]
+ if target_user != change["user"]:
+ embed["title"] = _("Deleted a comment on {target}'s profile").format(target=sanitize_to_markdown(target_user))
+ else:
+ embed["title"] = _("Deleted a comment on their own profile")
+ if ctx.parsedcomment is not None:
+ embed["description"] = ctx.parsedcomment
+ if "4:comment_id" in change["logparams"]:
+ embed["url"] = create_article_path("Special:CommentPermalink/{commentid}".format(commentid=change["logparams"]["4:comment_id"]))
+ else:
+ embed["url"] = create_article_path("UserProfile:" + sanitize_to_url(target_user))
+ return embed
+
+
+@formatter.compact(event="curseprofile/comment-deleted")
+def compact_curseprofile_comment_deleted(ctx: Context, change: dict) -> DiscordMessage:
+ author, author_url = compact_author(ctx, change)
+ target_user = change["title"].split(':', 1)[1]
+ if "4:comment_id" in change["logparams"]:
+ link = clean_link(create_article_path("Special:CommentPermalink/{commentid}".format(commentid=change["logparams"]["4:comment_id"])))
+ else:
+ link = clean_link(create_article_path("UserProfile:" + sanitize_to_url(target_user)))
+ parsed_comment = "" if ctx.parsedcomment is None else " *(" + ctx.parsedcomment + ")*"
+ if target_user != author:
+ content = _("[{author}]({author_url}) deleted a [comment]({comment}) on {target}'s profile.{reason}").format(
+ author=author, author_url=author_url, comment=link, target=sanitize_to_markdown(target_user), reason=parsed_comment)
+ else:
+ content = _("[{author}]({author_url}) deleted a [comment]({comment}) on their own profile.{reason}").format(
+ author=author, author_url=author_url, comment=link, reason=parsed_comment)
+ return DiscordMessage(ctx.message_type, ctx.event, ctx.webhook_url, content=content)
+
+
+# curseprofile/comment-purged - Purging comment on user profile
+
+
+@formatter.embed(event="curseprofile/comment-purged")
+def embed_curseprofile_comment_purged(ctx: Context, change: dict) -> DiscordMessage:
+ embed = DiscordMessage(ctx.message_type, ctx.event, ctx.webhook_url)
+ embed_helper(ctx, embed, change)
+ target_user = change["title"].split(':', 1)[1]
+ if target_user != change["user"]:
+ embed["title"] = _("Purged a comment on {target}'s profile").format(target=sanitize_to_markdown(target_user))
+ else:
+ embed["title"] = _("Purged a comment on their own profile")
+ if ctx.parsedcomment is not None:
+ embed["description"] = ctx.parsedcomment
+ embed["url"] = create_article_path("UserProfile:" + sanitize_to_url(target_user))
+ return embed
+
+
+@formatter.compact(event="curseprofile/comment-purged")
+def compact_curseprofile_comment_purged(ctx: Context, change: dict) -> DiscordMessage:
+ author, author_url = compact_author(ctx, change)
+ target_user = change["title"].split(':', 1)[1]
+ link = clean_link(create_article_path("UserProfile:" + sanitize_to_url(target_user)))
+ parsed_comment = "" if ctx.parsedcomment is None else " *(" + ctx.parsedcomment + ")*"
+ if target_user != author:
+ content = _("[{author}]({author_url}) purged a comment on [{target}]({link})'s profile.{reason}").format(
+ author=author, author_url=author_url, link=link, target=sanitize_to_markdown(target_user), reason=parsed_comment)
+ else:
+ content = _("[{author}]({author_url}) purged a comment on [their own]({link}) profile.{reason}").format(author=author, author_url=author_url, link=link)
+ return DiscordMessage(ctx.message_type, ctx.event, ctx.webhook_url, content=content, reason=parsed_comment)
diff --git a/extensions/base/datadump.py b/extensions/base/datadump.py
new file mode 100644
index 0000000..82eeae8
--- /dev/null
+++ b/extensions/base/datadump.py
@@ -0,0 +1,71 @@
+# This file is part of Recent changes Goat compatible Discord webhook (RcGcDw).
+#
+# RcGcDw is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# RcGcDw is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with RcGcDw. If not, see .
+
+
+import logging
+from src.discord.message import DiscordMessage
+from src.api import formatter
+from src.i18n import formatters_i18n
+from src.api.context import Context
+from src.api.util import embed_helper, compact_author, create_article_path, sanitize_to_markdown, sanitize_to_url, compact_summary
+
+_ = formatters_i18n.gettext
+ngettext = formatters_i18n.ngettext
+
+
+# DataDumps - https://www.mediawiki.org/wiki/Extension:DataDump
+# datadump/generate - Generating a dump of wiki
+
+
+@formatter.embed(event="datadump/generate")
+def embed_datadump_generate(ctx: Context, change: dict) -> DiscordMessage:
+ embed = DiscordMessage(ctx.message_type, ctx.event, ctx.webhook_url)
+ embed_helper(ctx, embed, change)
+ embed["title"] = _("Generated {file} dump").format(file=change["logparams"]["filename"])
+ embed["url"] = create_article_path(sanitize_to_url(change["title"]))
+ return embed
+
+
+@formatter.compact(event="mdatadump/generate")
+def compact_datadump_generate(ctx: Context, change: dict):
+ author, author_url = compact_author(ctx, change)
+ parsed_comment = compact_summary(ctx)
+ content = _("[{author}]({author_url}) generated *{file}* dump{comment}").format(
+ author=author, author_url=author_url, file=sanitize_to_markdown(change["logparams"]["filename"]),
+ comment=parsed_comment
+ )
+ return DiscordMessage(ctx.message_type, ctx.event, ctx.webhook_url, content=content)
+
+# datadump/delete - Deleting a dump of a wiki
+
+
+@formatter.embed(event="datadump/delete")
+def embed_datadump_delete(ctx: Context, change: dict) -> DiscordMessage:
+ embed = DiscordMessage(ctx.message_type, ctx.event, ctx.webhook_url)
+ embed_helper(ctx, embed, change)
+ embed["title"] = _("Deleted {file} dump").format(file=sanitize_to_markdown(change["logparams"]["filename"]))
+ embed["url"] = create_article_path(sanitize_to_url(change["title"]))
+ return embed
+
+
+@formatter.compact(event="mdatadump/delete")
+def compact_datadump_delete(ctx: Context, change: dict) -> DiscordMessage:
+ author, author_url = compact_author(ctx, change)
+ parsed_comment = compact_summary(ctx)
+ content = _("[{author}]({author_url}) deleted *{file}* dump{comment}").format(
+ author=author, author_url=author_url, file=sanitize_to_markdown(change["logparams"]["filename"]),
+ comment=parsed_comment
+ )
+ return DiscordMessage(ctx.message_type, ctx.event, ctx.webhook_url, content=content)
diff --git a/extensions/base/discussions.py b/extensions/base/discussions.py
new file mode 100644
index 0000000..db609e5
--- /dev/null
+++ b/extensions/base/discussions.py
@@ -0,0 +1,368 @@
+# This file is part of Recent changes Goat compatible Discord webhook (RcGcDw).
+#
+# RcGcDw is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# RcGcDw is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with RcGcDw. If not, see .
+
+# Discussions - Custom Fandom technology which apparently doesn't have any documentation or homepage, not even open-source, go figure
+
+import json
+import datetime, logging
+import gettext
+from urllib.parse import quote_plus
+
+from src.configloader import settings
+from src.api.util import create_article_path, clean_link, sanitize_to_markdown
+from src.api.context import Context
+from src.discord.queue import send_to_discord
+from src.discord.message import DiscordMessage, DiscordMessageMetadata
+from src.api import formatter
+from src.i18n import formatters_i18n
+
+_ = formatters_i18n.gettext
+
+
+logger = logging.getLogger("rcgcdw.discussion_formatter")
+
+
+class DiscussionsFromHellParser:
+ """This class converts fairly convoluted Fandom jsonModal of a discussion post into Markdown formatted usable thing.
+ Takes string, returns string. Kudos to MarkusRost for allowing me to implement this formatter based on his code in Wiki-Bot."""
+
+ def __init__(self, post):
+ self.post = post
+ self.jsonModal = json.loads(post.get("jsonModel", "{}"))
+ self.markdown_text = ""
+ self.item_num = 1
+ self.image_last = None
+
+ def parse(self) -> str:
+ """Main parsing logic"""
+ self.parse_content(self.jsonModal["content"])
+ if len(self.markdown_text) > 2000:
+ self.markdown_text = self.markdown_text[0:2000] + "…"
+ return self.markdown_text
+
+ def parse_content(self, content, ctype=None):
+ self.image_last = None
+ for item in content:
+ if ctype == "bulletList":
+ self.markdown_text += "\t• "
+ if ctype == "orderedList":
+ self.markdown_text += "\t{num}. ".format(num=self.item_num)
+ self.item_num += 1
+ if item["type"] == "text":
+ if "marks" in item:
+ prefix, suffix = self.convert_marks(item["marks"])
+ self.markdown_text = "{old}{pre}{text}{suf}".format(old=self.markdown_text, pre=prefix,
+ text=sanitize_to_markdown(item["text"]),
+ suf=suffix)
+ else:
+ if ctype == "code_block":
+ self.markdown_text += item["text"] # ignore formatting on preformatted text which cannot have additional formatting anyways
+ else:
+ self.markdown_text += sanitize_to_markdown(item["text"])
+ elif item["type"] == "paragraph":
+ if "content" in item:
+ self.parse_content(item["content"], item["type"])
+ self.markdown_text += "\n"
+ elif item["type"] == "openGraph":
+ if not item["attrs"]["wasAddedWithInlineLink"]:
+ self.markdown_text = "{old}{link}\n".format(old=self.markdown_text, link=item["attrs"]["url"])
+ elif item["type"] == "image":
+ try:
+ logger.debug(item["attrs"]["id"])
+ if item["attrs"]["id"] is not None:
+ self.markdown_text = "{old}{img_url}\n".format(old=self.markdown_text, img_url=
+ self.post["_embedded"]["contentImages"][int(item["attrs"]["id"])]["url"])
+ self.image_last = self.post["_embedded"]["contentImages"][int(item["attrs"]["id"])]["url"]
+ except (IndexError, ValueError):
+ logger.warning("Image {} not found.".format(item["attrs"]["id"]))
+ logger.debug(self.markdown_text)
+ elif item["type"] == "code_block":
+ self.markdown_text += "```\n"
+ if "content" in item:
+ self.parse_content(item["content"], item["type"])
+ self.markdown_text += "\n```\n"
+ elif item["type"] == "bulletList":
+ if "content" in item:
+ self.parse_content(item["content"], item["type"])
+ elif item["type"] == "orderedList":
+ self.item_num = 1
+ if "content" in item:
+ self.parse_content(item["content"], item["type"])
+ elif item["type"] == "listItem":
+ self.parse_content(item["content"], item["type"])
+
+ @staticmethod
+ def convert_marks(marks):
+ prefix = ""
+ suffix = ""
+ for mark in marks:
+ if mark["type"] == "mention":
+ prefix += "["
+ suffix = "]({wiki}f/u/{userid}){suffix}".format(wiki=settings["fandom_discussions"]["wiki_url"],
+ userid=mark["attrs"]["userId"], suffix=suffix)
+ elif mark["type"] == "strong":
+ prefix += "**"
+ suffix = "**{suffix}".format(suffix=suffix)
+ elif mark["type"] == "link":
+ prefix += "["
+ suffix = "]({link}){suffix}".format(link=mark["attrs"]["href"], suffix=suffix)
+ elif mark["type"] == "em":
+ prefix += "_"
+ suffix = "_" + suffix
+ return prefix, suffix
+
+
+def common_discussions(post: dict, embed: DiscordMessage):
+ """A method to setup embeds with common info shared between all types of discussion posts"""
+ if settings["fandom_discussions"]["appearance"]["embed"]["show_content"]:
+ if post.get("jsonModel") is not None:
+ npost = DiscussionsFromHellParser(post)
+ embed["description"] = npost.parse()
+ if npost.image_last:
+ embed["image"]["url"] = npost.image_last
+ embed["description"] = embed["description"].replace(npost.image_last, "")
+ else: # Fallback when model is not available
+ embed["description"] = post.get("rawContent", "")
+ embed["footer"]["text"] = post["forumName"]
+ embed["timestamp"] = datetime.datetime.fromtimestamp(post["creationDate"]["epochSecond"],
+ tz=datetime.timezone.utc).isoformat()
+
+# discussion/forum - Discussions on the "forum" available via "Discuss" button
+
+@formatter.embed(event="discussion/forum")
+def embed_discussion_forum(ctx: Context, post: dict):
+ embed = DiscordMessage("embed", "discussion", settings["fandom_discussions"]["webhookURL"])
+ common_discussions(post, embed)
+ author = _("unknown") # Fail safe
+ if post["createdBy"]["name"]:
+ author = post["createdBy"]["name"]
+ embed.set_author(author, "{url}f/u/{creatorId}".format(url=settings["fandom_discussions"]["wiki_url"],
+ creatorId=post["creatorId"]),
+ icon_url=post["createdBy"]["avatarUrl"])
+ if not post["isReply"]:
+ embed["url"] = "{url}f/p/{threadId}".format(url=settings["fandom_discussions"]["wiki_url"],
+ threadId=post["threadId"])
+ embed["title"] = _("Created \"{title}\"").format(title=post["title"])
+ thread_funnel = post.get("funnel")
+ if thread_funnel == "POLL":
+ embed.event_type = "discussion/forum/poll"
+ embed["title"] = _("Created a poll \"{title}\"").format(title=post["title"])
+ if settings["fandom_discussions"]["appearance"]["embed"]["show_content"]:
+ poll = post["poll"]
+ image_type = False
+ if poll["answers"][0]["image"] is not None:
+ image_type = True
+ for num, option in enumerate(poll["answers"]):
+ embed.add_field(option["text"] if image_type is True else _("Option {}").format(num + 1),
+ option["text"] if image_type is False else _(
+ "__[View image]({image_url})__").format(image_url=option["image"]["url"]),
+ inline=True)
+ elif thread_funnel == "QUIZ":
+ embed.event_type = "discussion/forum/quiz"
+ embed["title"] = _("Created a quiz \"{title}\"").format(title=post["title"])
+ if settings["fandom_discussions"]["appearance"]["embed"]["show_content"]:
+ quiz = post["_embedded"]["quizzes"][0]
+ embed["description"] = quiz["title"]
+ if quiz["image"] is not None:
+ embed["image"]["url"] = quiz["image"]
+ elif thread_funnel == "TEXT":
+ embed.event_type = "discussion/forum/post"
+ else:
+ logger.warning(
+ "The type of {} is an unknown discussion post type. Please post an issue on the project page to have it added https://gitlab.com/piotrex43/RcGcDw/-/issues.".format(
+ thread_funnel))
+ embed.event_type = "unknown"
+ if post["_embedded"]["thread"][0]["tags"]:
+ tag_displayname = []
+ for tag in post["_embedded"]["thread"][0]["tags"]:
+ tag_displayname.append("[{title}]({url})".format(title=tag["articleTitle"], url=create_article_path(
+ quote_plus(tag["articleTitle"].replace(" ", "_"), "/:?=&"))))
+ if len(", ".join(tag_displayname)) > 1000:
+ embed.add_field(formatters_i18n.pgettext("Fandom discussions Tags/Forums", "Tags"), formatters_i18n.pgettext("Fandom discussions amount of Tags/Forums", "{} tags").format(len(post["_embedded"]["thread"][0]["tags"])))
+ else:
+ embed.add_field(formatters_i18n.pgettext("Fandom discussions Tags/Forums", "Tags"), ", ".join(tag_displayname))
+ else:
+ embed.event_type = "discussion/forum/reply"
+ embed["title"] = _("Replied to \"{title}\"").format(title=post["_embedded"]["thread"][0]["title"])
+ embed["url"] = "{url}f/p/{threadId}/r/{postId}".format(url=settings["fandom_discussions"]["wiki_url"],
+ threadId=post["threadId"], postId=post["id"])
+ return embed
+
+
+@formatter.compact(event="discussion/forum")
+def compact_discussion_forum(ctx: Context, post: dict):
+ message = None
+ author = _("unknown") # Fail safe
+ if post["createdBy"]["name"]:
+ author = post["createdBy"]["name"]
+ author_url = "<{url}f/u/{creatorId}>".format(url=settings["fandom_discussions"]["wiki_url"],
+ creatorId=post["creatorId"])
+ if not post["isReply"]:
+ thread_funnel = post.get("funnel")
+ msg_text = _("[{author}]({author_url}) created [{title}](<{url}f/p/{threadId}>) in {forumName}")
+ if thread_funnel == "POLL":
+ event_type = "discussion/forum/poll"
+ msg_text = _("[{author}]({author_url}) created a poll [{title}](<{url}f/p/{threadId}>) in {forumName}")
+ elif thread_funnel == "QUIZ":
+ event_type = "discussion/forum/quiz"
+ msg_text = _("[{author}]({author_url}) created a quiz [{title}](<{url}f/p/{threadId}>) in {forumName}")
+ elif thread_funnel == "TEXT":
+ event_type = "discussion/forum/post"
+ else:
+ logger.warning(
+ "The type of {} is an unknown discussion post type. Please post an issue on the project page to have it added https://gitlab.com/piotrex43/RcGcDw/-/issues.".format(
+ thread_funnel))
+ event_type = "unknown"
+ message = msg_text.format(author=author, author_url=author_url, title=post["title"],
+ url=settings["fandom_discussions"]["wiki_url"], threadId=post["threadId"],
+ forumName=post["forumName"])
+ else:
+ event_type = "discussion/forum/reply"
+ message = _(
+ "[{author}]({author_url}) created a [reply](<{url}f/p/{threadId}/r/{postId}>) to [{title}](<{url}f/p/{threadId}>) in {forumName}").format(
+ author=author, author_url=author_url, url=settings["fandom_discussions"]["wiki_url"],
+ threadId=post["threadId"], postId=post["id"], title=post["_embedded"]["thread"][0]["title"],
+ forumName=post["forumName"])
+ return DiscordMessage("compact", event_type, ctx.webhook_url, content=message)
+
+# discussion/wall - Wall posts/replies
+
+
+def compact_author_discussions(post: dict):
+ """A common function for a few discussion related foramtters, it's formatting author's name and URL to their profile"""
+ author = _("unknown") # Fail safe
+ if post["creatorIp"]:
+ author = post["creatorIp"][1:] if settings.get("hide_ips", False) is False else _("Unregistered user")
+ author_url = "<{url}wiki/Special:Contributions{creatorIp}>".format(url=settings["fandom_discussions"]["wiki_url"],
+ creatorIp=post["creatorIp"])
+ else:
+ if post["createdBy"]["name"]:
+ author = post["createdBy"]["name"]
+ author_url = clean_link(create_article_path("User:{user}".format(user=author)))
+ else:
+ author_url = "<{url}f/u/{creatorId}>".format(url=settings["fandom_discussions"]["wiki_url"],
+ creatorId=post["creatorId"])
+ return author, author_url
+
+
+def embed_author_discussions(post: dict, embed: DiscordMessage):
+ author = _("unknown") # Fail safe
+ if post["creatorIp"]:
+ author = post["creatorIp"][1:]
+ embed.set_author(author if settings.get("hide_ips", False) is False else _("Unregistered user"),
+ "{url}wiki/Special:Contributions{creatorIp}".format(
+ url=settings["fandom_discussions"]["wiki_url"], creatorIp=post["creatorIp"]))
+ else:
+ if post["createdBy"]["name"]:
+ author = post["createdBy"]["name"]
+ embed.set_author(author, "{url}wiki/User:{creator}".format(url=settings["fandom_discussions"]["wiki_url"],
+ creator=author.replace(" ", "_")),
+ icon_url=post["createdBy"]["avatarUrl"])
+ else:
+ embed.set_author(author, "{url}f/u/{creatorId}".format(url=settings["fandom_discussions"]["wiki_url"],
+ creatorId=post["creatorId"]),
+ icon_url=post["createdBy"]["avatarUrl"])
+
+
+@formatter.embed(event="discussion/wall")
+def embed_discussion_wall(ctx: Context, post: dict):
+ embed = DiscordMessage("embed", "discussion", settings["fandom_discussions"]["webhookURL"])
+ common_discussions(post, embed)
+ embed_author_discussions(post, embed)
+ user_wall = _("unknown") # Fail safe
+ if post["forumName"].endswith(' Message Wall'):
+ user_wall = post["forumName"][:-13]
+ if not post["isReply"]:
+ embed.event_type = "discussion/wall/post"
+ embed["url"] = "{url}wiki/Message_Wall:{user_wall}?threadId={threadId}".format(
+ url=settings["fandom_discussions"]["wiki_url"], user_wall=quote_plus(user_wall.replace(" ", "_")),
+ threadId=post["threadId"])
+ embed["title"] = _("Created \"{title}\" on {user}'s Message Wall").format(title=post["title"], user=user_wall)
+ else:
+ embed.event_type = "discussion/wall/reply"
+ embed["url"] = "{url}wiki/Message_Wall:{user_wall}?threadId={threadId}#{replyId}".format(
+ url=settings["fandom_discussions"]["wiki_url"], user_wall=quote_plus(user_wall.replace(" ", "_")),
+ threadId=post["threadId"], replyId=post["id"])
+ embed["title"] = _("Replied to \"{title}\" on {user}'s Message Wall").format(
+ title=post["_embedded"]["thread"][0]["title"], user=user_wall)
+ return embed
+
+
+@formatter.compact(event="discussion/wall")
+def compact_discussion_wall(ctx: Context, post: dict):
+ author, author_url = compact_author_discussions(post)
+ user_wall = _("unknown") # Fail safe
+ if post["forumName"].endswith(' Message Wall'):
+ user_wall = post["forumName"][:-13]
+ if not post["isReply"]:
+ event_type = "discussion/wall/post"
+ message = _(
+ "[{author}]({author_url}) created [{title}](<{url}wiki/Message_Wall:{user_wall}?threadId={threadId}>) on [{user}'s Message Wall](<{url}wiki/Message_Wall:{user_wall}>)").format(
+ author=author, author_url=author_url, title=post["title"], url=settings["fandom_discussions"]["wiki_url"],
+ user=user_wall, user_wall=quote_plus(user_wall.replace(" ", "_")), threadId=post["threadId"])
+ else:
+ event_type = "discussion/wall/reply"
+ message = _(
+ "[{author}]({author_url}) created a [reply](<{url}wiki/Message_Wall:{user_wall}?threadId={threadId}#{replyId}>) to [{title}](<{url}wiki/Message_Wall:{user_wall}?threadId={threadId}>) on [{user}'s Message Wall](<{url}wiki/Message_Wall:{user_wall}>)").format(
+ author=author, author_url=author_url, url=settings["fandom_discussions"]["wiki_url"],
+ title=post["_embedded"]["thread"][0]["title"], user=user_wall,
+ user_wall=quote_plus(user_wall.replace(" ", "_")), threadId=post["threadId"], replyId=post["id"])
+ return DiscordMessage("compact", event_type, ctx.webhook_url, content=message)
+
+# discussion/article_comment - Article comments
+
+
+@formatter.embed(event="discussion/article_comment")
+def embed_discussion_article_comment(ctx: Context, post: dict):
+ embed = DiscordMessage("embed", "discussion", settings["fandom_discussions"]["webhookURL"])
+ common_discussions(post, embed)
+ embed_author_discussions(post, embed)
+ article_paths = ctx.comment_page
+ if article_paths is None:
+ article_page = {"title": _("unknown"), "fullUrl": settings["fandom_discussions"]["wiki_url"]} # No page known
+ if not post["isReply"]:
+ embed.event_type = "discussion/comment/post"
+ embed["url"] = "{url}?commentId={commentId}".format(url=article_paths["fullUrl"], commentId=post["threadId"])
+ embed["title"] = _("Commented on {article}").format(article=article_paths["title"])
+ else:
+ embed.event_type = "discussion/comment/reply"
+ embed["url"] = "{url}?commentId={commentId}&replyId={replyId}".format(url=article_paths["fullUrl"],
+ commentId=post["threadId"],
+ replyId=post["id"])
+ embed["title"] = _("Replied to a comment on {article}").format(article=article_paths["title"])
+ embed["footer"]["text"] = article_paths["title"]
+ return embed
+
+
+@formatter.compact(event="discussion/article_comment")
+def compact_discussion_article_comment(ctx: Context, post: dict):
+ author, author_url = compact_author_discussions(post)
+ article_paths = ctx.comment_page
+ if article_paths is None:
+ article_paths = {"title": _("unknown"), "fullUrl": settings["fandom_discussions"]["wiki_url"]} # No page known
+ article_paths["fullUrl"] = article_paths["fullUrl"].replace(")", "\)").replace("()", "\(")
+ if not post["isReply"]:
+ event_type = "discussion/comment/post"
+ message = _(
+ "[{author}]({author_url}) created a [comment](<{url}?commentId={commentId}>) on [{article}](<{url}>)").format(
+ author=author, author_url=author_url, url=article_paths["fullUrl"], article=article_paths["title"],
+ commentId=post["threadId"])
+ else:
+ event_type = "discussion/comment/reply"
+ message = _(
+ "[{author}]({author_url}) created a [reply](<{url}?commentId={commentId}&replyId={replyId}>) to a [comment](<{url}?commentId={commentId}>) on [{article}](<{url}>)").format(
+ author=author, author_url=author_url, url=article_paths["fullUrl"], article=article_paths["title"],
+ commentId=post["threadId"], replyId=post["id"])
+ return DiscordMessage("compact", event_type, ctx.webhook_url, content=message)
\ No newline at end of file
diff --git a/extensions/base/interwiki.py b/extensions/base/interwiki.py
new file mode 100644
index 0000000..a9dffd2
--- /dev/null
+++ b/extensions/base/interwiki.py
@@ -0,0 +1,108 @@
+# This file is part of Recent changes Goat compatible Discord webhook (RcGcDw).
+#
+# RcGcDw is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# RcGcDw is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with RcGcDw. If not, see .
+
+
+import logging
+from src.discord.message import DiscordMessage
+from src.api import formatter
+from src.i18n import formatters_i18n
+from src.api.context import Context
+from src.api.util import embed_helper, clean_link, compact_author, create_article_path, sanitize_to_url, compact_summary
+
+_ = formatters_i18n.gettext
+ngettext = formatters_i18n.ngettext
+
+
+# Interwiki - https://www.mediawiki.org/wiki/Extension:Interwiki
+# interwiki/iw_add - Added entry to interwiki table
+
+
+@formatter.embed(event="interwiki/iw_add", mode="embed")
+def embed_interwiki_iw_add(ctx: Context, change: dict) -> DiscordMessage:
+ embed = DiscordMessage(ctx.message_type, ctx.event, ctx.webhook_url)
+ embed_helper(ctx, embed, change, set_desc=False)
+ embed["url"] = create_article_path("Special:Interwiki")
+ embed["title"] = _("Added an entry to the interwiki table")
+ embed["description"] = _("Prefix: {prefix}, website: {website} | {desc}").format(desc=ctx.parsedcomment,
+ prefix=change["logparams"]['0'],
+ website=change["logparams"]['1'])
+ return embed
+
+
+@formatter.compact(event="interwiki/iw_add")
+def compact_interwiki_iw_add(ctx: Context, change: dict) -> DiscordMessage:
+ author, author_url = compact_author(ctx, change)
+ link = clean_link(create_article_path("Special:Interwiki"))
+ parsed_comment = compact_summary(ctx)
+ content = _(
+ "[{author}]({author_url}) added an entry to the [interwiki table]({table_url}) pointing to {website} with {prefix} prefix").format(
+ author=author, author_url=author_url, desc=parsed_comment, prefix=change["logparams"]['0'],
+ website=change["logparams"]['1'], table_url=link)
+ return DiscordMessage(ctx.message_type, ctx.event, ctx.webhook_url, content=content)
+
+
+# interwiki/iw_edit - Editing interwiki entry
+
+
+@formatter.embed(event="interwiki/iw_edit", mode="embed")
+def embed_interwiki_iw_edit(ctx: Context, change: dict) -> DiscordMessage:
+ embed = DiscordMessage(ctx.message_type, ctx.event, ctx.webhook_url)
+ embed_helper(ctx, embed, change, set_desc=False)
+ embed["url"] = create_article_path("Special:Interwiki")
+ embed["title"] = _("Edited an entry in interwiki table")
+ embed["description"] = _("Prefix: {prefix}, website: {website} | {desc}").format(desc=ctx.parsedcomment,
+ prefix=change["logparams"]['0'],
+ website=change["logparams"]['1'])
+ return embed
+
+
+@formatter.compact(event="interwiki/iw_edit")
+def compact_interwiki_iw_edit(ctx: Context, change: dict) -> DiscordMessage:
+ author, author_url = compact_author(ctx, change)
+ link = clean_link(create_article_path("Special:Interwiki"))
+ parsed_comment = compact_summary(ctx)
+ content = _(
+ "[{author}]({author_url}) edited an entry in [interwiki table]({table_url}) pointing to {website} with {prefix} prefix").format(
+ author=author, author_url=author_url, desc=parsed_comment, prefix=change["logparams"]['0'],
+ website=change["logparams"]['1'], table_url=link)
+ return DiscordMessage(ctx.message_type, ctx.event, ctx.webhook_url, content=content)
+
+
+# interwiki/iw_delete - Deleting interwiki entry
+
+
+@formatter.embed(event="interwiki/iw_delete", mode="embed")
+def embed_interwiki_iw_delete(ctx: Context, change: dict) -> DiscordMessage:
+ embed = DiscordMessage(ctx.message_type, ctx.event, ctx.webhook_url)
+ embed_helper(ctx, embed, change, set_desc=False)
+ embed["url"] = create_article_path("Special:Interwiki")
+ embed["title"] = _("Deleted an entry in interwiki table")
+ embed["description"] = _("Prefix: {prefix} | {desc}").format(desc=ctx.parsedcomment,
+ prefix=change["logparams"]['0'])
+ return embed
+
+
+@formatter.compact(event="interwiki/iw_delete")
+def compact_interwiki_iw_delete(ctx: Context, change: dict) -> DiscordMessage:
+ author, author_url = compact_author(ctx, change)
+ link = clean_link(create_article_path("Special:Interwiki"))
+ parsed_comment = compact_summary(ctx)
+ content = _("[{author}]({author_url}) deleted an entry in [interwiki table]({table_url}){desc}").format(
+ author=author,
+ author_url=author_url,
+ table_url=link,
+ desc=parsed_comment)
+
+ return DiscordMessage(ctx.message_type, ctx.event, ctx.webhook_url, content=content)
diff --git a/extensions/base/managewiki.py b/extensions/base/managewiki.py
new file mode 100644
index 0000000..7675441
--- /dev/null
+++ b/extensions/base/managewiki.py
@@ -0,0 +1,229 @@
+# This file is part of Recent changes Goat compatible Discord webhook (RcGcDw).
+#
+# RcGcDw is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# RcGcDw is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with RcGcDw. If not, see .
+
+from src.discord.message import DiscordMessage
+from src.api import formatter
+from src.i18n import formatters_i18n
+from src.api.context import Context
+from src.api.util import embed_helper, compact_author, create_article_path, sanitize_to_markdown, sanitize_to_url, compact_summary
+
+_ = formatters_i18n.gettext
+ngettext = formatters_i18n.ngettext
+
+
+# ManageWiki - https://www.mediawiki.org/wiki/Special:MyLanguage/Extension:ManageWiki
+# managewiki/settings - Changing wiki settings
+
+@formatter.embed(event="managewiki/settings")
+def embed_managewiki_settings(ctx: Context, change: dict):
+ embed = DiscordMessage(ctx.message_type, ctx.event, ctx.webhook_url)
+ embed_helper(ctx, embed, change)
+ embed["url"] = create_article_path(sanitize_to_url(change["title"]))
+ embed["title"] = _("Changed wiki settings")
+ if change["logparams"].get("changes", ""):
+ embed.add_field("Setting", sanitize_to_markdown(change["logparams"].get("changes")))
+ return embed
+
+
+@formatter.compact(event="managewiki/settings")
+def compact_managewiki_settings(ctx: Context, change: dict):
+ author, author_url = compact_author(ctx, change)
+ parsed_comment = compact_summary(ctx)
+ content = _("[{author}]({author_url}) changed wiki settings{reason}".format(author=author, author_url=author_url, reason=parsed_comment))
+ return DiscordMessage(ctx.message_type, ctx.event, ctx.webhook_url, content=content)
+
+# managewiki/delete - Deleting a wiki
+
+
+@formatter.embed(event="managewiki/delete")
+def embed_managewiki_delete(ctx: Context, change: dict):
+ embed = DiscordMessage(ctx.message_type, ctx.event, ctx.webhook_url)
+ embed_helper(ctx, embed, change)
+ embed["url"] = create_article_path(sanitize_to_url(change["title"]))
+ embed["title"] = _("Deleted a \"{wiki}\" wiki").format(wiki=change["logparams"].get("wiki", _("Unknown")))
+ return embed
+
+
+@formatter.compact(event="managewiki/delete")
+def compact_managewiki_delete(ctx: Context, change: dict):
+ author, author_url = compact_author(ctx, change)
+ parsed_comment = compact_summary(ctx)
+ content = _("[{author}]({author_url}) deleted a wiki *{wiki_name}*{comment}").format(author=author,
+ author_url=author_url,
+ wiki_name=change[
+ "logparams"].get("wiki",
+ _("Unknown")),
+ comment=parsed_comment)
+ return DiscordMessage(ctx.message_type, ctx.event, ctx.webhook_url, content=content)
+
+# managewiki/delete-group - Deleting a group
+
+
+@formatter.embed(event="managewiki/delete-group")
+def embed_managewiki_delete_group(ctx: Context, change: dict) -> DiscordMessage:
+ embed = DiscordMessage(ctx.message_type, ctx.event, ctx.webhook_url)
+ embed_helper(ctx, embed, change)
+ embed["url"] = create_article_path(sanitize_to_url(change["title"]))
+ group = change["title"].split("/")[-1]
+ embed["title"] = _("Deleted a \"{group}\" user group").format(wiki=group)
+ return embed
+
+
+@formatter.compact(event="managewiki/delete-group")
+def compact_managewiki_delete_group(ctx: Context, change: dict) -> DiscordMessage:
+ author, author_url = compact_author(ctx, change)
+ parsed_comment = compact_summary(ctx)
+ group = change["title"].split("/")[-1]
+ content = _("[{author}]({author_url}) deleted a usergroup *{group}*{comment}").format(author=author,
+ author_url=author_url,
+ group=group,
+ comment=parsed_comment)
+ return DiscordMessage(ctx.message_type, ctx.event, ctx.webhook_url, content=content)
+
+# managewiki/lock - Locking a wiki
+
+
+@formatter.embed(event="managewiki/lock")
+def embed_managewiki_lock(ctx: Context, change: dict):
+ embed = DiscordMessage(ctx.message_type, ctx.event, ctx.webhook_url)
+ embed_helper(ctx, embed, change)
+ embed["url"] = create_article_path(sanitize_to_url(change["title"]))
+ embed["title"] = _("Locked a \"{wiki}\" wiki").format(wiki=change["logparams"].get("wiki", _("Unknown")))
+ return embed
+
+
+@formatter.compact(event="managewiki/lock")
+def compact_managewiki_lock(ctx: Context, change: dict):
+ author, author_url = compact_author(ctx, change)
+ parsed_comment = compact_summary(ctx)
+ content = _("[{author}]({author_url}) locked a wiki *{wiki_name}*{comment}").format(
+ author=author, author_url=author_url, wiki_name=change["logparams"].get("wiki", _("Unknown")),
+ comment=parsed_comment)
+ return DiscordMessage(ctx.message_type, ctx.event, ctx.webhook_url, content=content)
+
+# managewiki/namespaces - Modirying a wiki namespace
+
+
+@formatter.embed(event="managewiki/namespaces")
+def embed_managewiki_namespaces(ctx: Context, change: dict):
+ embed = DiscordMessage(ctx.message_type, ctx.event, ctx.webhook_url)
+ embed_helper(ctx, embed, change)
+ embed["url"] = create_article_path(sanitize_to_url(change["title"]))
+ embed["title"] = _("Modified \"{namespace_name}\" namespace").format(
+ namespace_name=change["logparams"].get("namespace", _("Unknown")))
+ embed.add_field(_('Wiki'), change["logparams"].get("wiki", _("Unknown")))
+ return embed
+
+
+@formatter.compact(event="managewiki/namespaces")
+def compact_managewiki_namespaces(ctx: Context, change: dict):
+ author, author_url = compact_author(ctx, change)
+ parsed_comment = compact_summary(ctx)
+ content = _("[{author}]({author_url}) modified namespace *{namespace_name}* on *{wiki_name}*{comment}").format(
+ author=author, author_url=author_url, namespace_name=change["logparams"].get("namespace", _("Unknown")),
+ wiki_name=change["logparams"].get("wiki", _("Unknown")), comment=parsed_comment)
+ return DiscordMessage(ctx.message_type, ctx.event, ctx.webhook_url, content=content)
+
+# managewiki/namespaces-delete - Deleteing a namespace
+
+
+@formatter.embed(event="managewiki/namespaces-delete")
+def embed_managewiki_namespaces_delete(ctx: Context, change: dict):
+ embed = DiscordMessage(ctx.message_type, ctx.event, ctx.webhook_url)
+ embed_helper(ctx, embed, change)
+ embed["url"] = create_article_path(sanitize_to_url(change["title"]))
+ embed["title"] = _("Deleted a \"{namespace_name}\" namespace").format(
+ namespace_name=change["logparams"].get("namespace", _("Unknown")))
+ embed.add_field(_('Wiki'), change["logparams"].get("wiki", _("Unknown")))
+ return embed
+
+
+@formatter.compact(event="managewiki/namespaces-delete")
+def compact_managewiki_namespaces_delete(ctx: Context, change: dict):
+ author, author_url = compact_author(ctx, change)
+ parsed_comment = compact_summary(ctx)
+ content = _(
+ "[{author}]({author_url}) deleted a namespace *{namespace_name}* on *{wiki_name}*{comment}").format(
+ author=author, author_url=author_url,
+ namespace_name=change["logparams"].get("namespace", _("Unknown")),
+ wiki_name=change["logparams"].get("wiki", _("Unknown")), comment=parsed_comment)
+ return DiscordMessage(ctx.message_type, ctx.event, ctx.webhook_url, content=content)
+
+# managewiki/rights - Modifying user groups
+
+
+@formatter.embed(event="managewiki/rights")
+def embed_managewiki_rights(ctx: Context, change: dict):
+ embed = DiscordMessage(ctx.message_type, ctx.event, ctx.webhook_url)
+ embed_helper(ctx, embed, change)
+ embed["url"] = create_article_path(sanitize_to_url(change["title"]))
+ group_name = change["title"].split("/permissions/", 1)[1]
+ embed["title"] = _("Modified \"{usergroup_name}\" usergroup").format(usergroup_name=group_name)
+ return embed
+
+
+@formatter.compact(event="managewiki/rights")
+def compact_managewiki_rights(ctx: Context, change: dict):
+ author, author_url = compact_author(ctx, change)
+ parsed_comment = compact_summary(ctx)
+ group_name = change["title"].split("/permissions/", 1)[1]
+ content = _("[{author}]({author_url}) modified user group *{group_name}*{comment}").format(
+ author=author, author_url=author_url, group_name=group_name, comment=parsed_comment
+ )
+ return DiscordMessage(ctx.message_type, ctx.event, ctx.webhook_url, content=content)
+
+# managewiki/undelete - Restoring a wiki
+
+
+@formatter.embed(event="managewiki/undelete")
+def embed_managewiki_undelete(ctx: Context, change: dict):
+ embed = DiscordMessage(ctx.message_type, ctx.event, ctx.webhook_url)
+ embed_helper(ctx, embed, change)
+ embed["url"] = create_article_path(sanitize_to_url(change["title"]))
+ embed["title"] = _("Undeleted a \"{wiki}\" wiki").format(wiki=change["logparams"].get("wiki", _("Unknown")))
+ return embed
+
+
+@formatter.compact(event="managewiki/undelete")
+def compact_managewiki_undelete(ctx: Context, change: dict):
+ author, author_url = compact_author(ctx, change)
+ parsed_comment = compact_summary(ctx)
+ content = _("[{author}]({author_url}) undeleted a wiki *{wiki_name}*{comment}").format(
+ author=author, author_url=author_url, wiki_name=change["logparams"].get("wiki", _("Unknown")),
+ comment=parsed_comment
+ )
+ return DiscordMessage(ctx.message_type, ctx.event, ctx.webhook_url, content=content)
+
+# managewiki/unlock - Unlocking a wiki
+
+
+@formatter.embed(event="managewiki/unlock")
+def embed_managewiki_unlock(ctx: Context, change: dict):
+ embed = DiscordMessage(ctx.message_type, ctx.event, ctx.webhook_url)
+ embed_helper(ctx, embed, change)
+ embed["url"] = create_article_path(sanitize_to_url(change["title"]))
+ embed["title"] = _("Unlocked a \"{wiki}\" wiki").format(wiki=change["logparams"].get("wiki", _("Unknown")))
+ return embed
+
+
+@formatter.compact(event="managewiki/unlock")
+def compact_managewiki_unlock(ctx: Context, change: dict):
+ author, author_url = compact_author(ctx, change)
+ parsed_comment = compact_summary(ctx)
+ content = _("[{author}]({author_url}) unlocked a wiki *{wiki_name}*{comment}").format(
+ author=author, author_url=author_url, wiki_name=change["logparams"].get("wiki", _("Unknown")),
+ comment=parsed_comment
+ )
+ return DiscordMessage(ctx.message_type, ctx.event, ctx.webhook_url, content=content)
diff --git a/extensions/base/mediawiki.py b/extensions/base/mediawiki.py
new file mode 100644
index 0000000..f5b81d0
--- /dev/null
+++ b/extensions/base/mediawiki.py
@@ -0,0 +1,1189 @@
+# This file is part of Recent changes Goat compatible Discord webhook (RcGcDw).
+#
+# RcGcDw is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# RcGcDw is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with RcGcDw. If not, see .
+import ipaddress
+import logging
+import math
+import re
+import time
+import datetime
+from collections import OrderedDict
+from src.discord.message import DiscordMessage
+from src.api import formatter
+from src.i18n import formatters_i18n
+from src.api.context import Context
+from src.api.util import embed_helper, sanitize_to_url, parse_mediawiki_changes, clean_link, compact_author, \
+ create_article_path, sanitize_to_markdown, compact_summary
+from src.configloader import settings
+from src.exceptions import *
+
+_ = formatters_i18n.gettext
+ngettext = formatters_i18n.ngettext
+
+logger = logging.getLogger("extensions.base")
+
+if 1 == 2: # additional translation strings in unreachable code
+ print(_("director"), _("bot"), _("editor"), _("directors"), _("sysop"), _("bureaucrat"), _("reviewer"),
+ _("autoreview"), _("autopatrol"), _("wiki_guardian"))
+
+
+# Page edit - event edit, New - page creation
+
+
+@formatter.embed(event="edit", mode="embed", aliases=["new"])
+def embed_edit(ctx: Context, change: dict) -> DiscordMessage:
+ embed = DiscordMessage(ctx.message_type, ctx.event, ctx.webhook_url)
+ action = ctx.event
+ editsize = change["newlen"] - change["oldlen"]
+ if editsize > 0:
+ embed["color"] = min(65280, 35840 + (math.floor(editsize / 52)) * 256) # Choose shade of green
+ elif editsize < 0:
+ embed["color"] = min(16711680, 9175040 + (math.floor(abs(editsize) / 52)) * 65536) # Choose shade of red
+ elif editsize == 0:
+ embed["color"] = 8750469
+ if change["title"].startswith("MediaWiki:Tag-"): # Refresh tag list when tag display name is edited
+ ctx.client.refresh_internal_data()
+ # Sparse is better than dense.
+ # Readability counts.
+ embed["url"] = "{wiki}index.php?title={article}&curid={pageid}&diff={diff}&oldid={oldrev}".format(
+ wiki=ctx.client.WIKI_SCRIPT_PATH,
+ pageid=change["pageid"],
+ diff=change["revid"],
+ oldrev=change["old_revid"],
+ article=sanitize_to_url(change["title"])
+ )
+ embed["title"] = "{redirect}{article} ({new}{minor}{bot}{space}{editsize})".format(
+ redirect="⤷ " if "redirect" in change else "",
+ article=sanitize_to_markdown(change["title"]),
+ editsize="+" + str(editsize) if editsize > 0 else editsize,
+ new=_("(N!) ") if action == "new" else "",
+ minor=_("m") if action == "edit" and "minor" in change else "",
+ bot=_('b') if "bot" in change else "",
+ space=" " if "bot" in change or (action == "edit" and "minor" in change) or action == "new" else "")
+ if settings["appearance"]["embed"]["show_edit_changes"]:
+ try:
+ if action == "new":
+ changed_content = ctx.client.make_api_request(
+ "?action=compare&format=json&fromslots=main&torev={diff}&fromtext-main=&topst=1&prop=diff".format(
+ diff=change["revid"]), "compare", "*")
+ else:
+ changed_content = ctx.client.make_api_request(
+ "?action=compare&format=json&fromrev={oldrev}&torev={diff}&topst=1&prop=diff".format(
+ diff=change["revid"], oldrev=change["old_revid"]), "compare", "*")
+ except ServerError:
+ changed_content = None
+ if changed_content:
+ parse_mediawiki_changes(ctx, changed_content, embed)
+ else:
+ logger.warning("Unable to download data on the edit content!")
+ embed_helper(ctx, embed, change)
+ return embed
+
+
+@formatter.compact(event="edit", mode="compact", aliases=["new"])
+def compact_edit(ctx: Context, change: dict) -> DiscordMessage:
+ parsed_comment = compact_summary(ctx)
+ author, author_url = compact_author(ctx, change)
+ action = ctx.event
+ edit_link = clean_link("{wiki}index.php?title={article}&curid={pageid}&diff={diff}&oldid={oldrev}".format(
+ wiki=ctx.client.WIKI_SCRIPT_PATH, pageid=change["pageid"], diff=change["revid"], oldrev=change["old_revid"],
+ article=sanitize_to_url(change["title"])))
+ logger.debug(edit_link)
+ edit_size = change["newlen"] - change["oldlen"]
+ sign = ""
+ if edit_size > 0:
+ sign = "+"
+ bold = ""
+ if abs(edit_size) > 500:
+ bold = "**"
+ if action == "edit":
+ content = _(
+ "[{author}]({author_url}) edited [{article}]({edit_link}){comment} {bold}({sign}{edit_size}){bold}").format(
+ author=author, author_url=author_url, article=sanitize_to_markdown(change["title"]), edit_link=edit_link, comment=parsed_comment,
+ edit_size=edit_size, sign=sign, bold=bold)
+ else:
+ content = _(
+ "[{author}]({author_url}) created [{article}]({edit_link}){comment} {bold}({sign}{edit_size}){bold}").format(
+ author=author, author_url=author_url, article=sanitize_to_markdown(change["title"]), edit_link=edit_link, comment=parsed_comment,
+ edit_size=edit_size, sign=sign, bold=bold)
+ return DiscordMessage(ctx.message_type, ctx.event, ctx.webhook_url, content=content)
+
+
+# Upload - upload/reupload, upload/upload
+@formatter.embed(event="upload/upload", mode="embed", aliases=["upload/overwrite", "upload/revert"])
+def embed_upload_upload(ctx, change) -> DiscordMessage:
+ license = None
+ embed = DiscordMessage(ctx.message_type, ctx.event, ctx.webhook_url)
+ action = ctx.event
+ # Requesting more information on the image
+ request_for_image_data = None
+ try:
+ params = OrderedDict()
+ params["action"] = "query"
+ params["format"] = "json"
+ if settings["license_detection"] and action == "upload/upload":
+ params["prop"] = "imageinfo|revisions"
+ params["rvprop"] = "content"
+ params["rvslots"] = "main"
+ else:
+ params["prop"] = "imageinfo"
+ params["titles"] = change["title"]
+ params["iiprop"] = "timestamp|url|archivename"
+ params["iilimit"] = "5"
+ request_for_image_data = ctx.client.make_api_request(params, "query", "pages")
+ except (ServerError, MediaWikiError):
+ logger.exception(
+ "Couldn't retrieve more information about the image {} because of server/MediaWiki error".format(
+ change["title"]))
+ except (ClientError, BadRequest):
+ raise
+ except KeyError:
+ logger.exception(
+ "Couldn't retrieve more information about the image {} because of unknown error".format(
+ change["title"]))
+ else:
+ if "-1" not in request_for_image_data: # Image still exists and not removed
+ image_data = next(iter(request_for_image_data.values()))
+ else:
+ logger.warning("Request for additional image information have failed. The preview will not be shown.")
+ request_for_image_data = None
+ embed["url"] = create_article_path(sanitize_to_url(change["title"]))
+ image_direct_url = None
+ # Make a request for file revisions so we can get direct URL to the image for embed
+ if request_for_image_data is not None:
+ try:
+ urls = image_data["imageinfo"]
+ for num, revision in enumerate(urls):
+ if revision["timestamp"] == change["logparams"][
+ "img_timestamp"]: # find the correct revision corresponding for this log entry
+ image_direct_url = "{rev}?{cache}".format(rev=revision["url"],
+ cache=int(time.time() * 5)) # cachebusting
+ break
+ except KeyError:
+ logger.exception(
+ "Wiki did not respond with extended information about file. The preview will not be shown.")
+ else:
+ logger.warning("Request for additional image information have failed. The preview will not be shown.")
+ if action in ("upload/overwrite", "upload/revert"):
+ if image_direct_url:
+ try:
+ revision = image_data["imageinfo"][num + 1]
+ except IndexError:
+ logger.exception(
+ "Could not analize the information about the image (does it have only one version when expected more in overwrite?) which resulted in no Options field: {}".format(
+ image_data["imageinfo"]))
+ else:
+ undolink = "{wiki}index.php?title={filename}&action=revert&oldimage={archiveid}".format(
+ wiki=ctx.client.WIKI_SCRIPT_PATH, filename=sanitize_to_url(change["title"]),
+ archiveid=revision["archivename"])
+ embed.add_field(_("Options"), _("([preview]({link}) | [undo]({undolink}))").format(
+ link=image_direct_url, undolink=undolink))
+ if settings["appearance"]["embed"]["embed_images"]:
+ embed["image"]["url"] = image_direct_url
+ if action == "upload/overwrite":
+ embed["title"] = _("Uploaded a new version of {name}").format(name=sanitize_to_markdown(change["title"]))
+ elif action == "upload/revert":
+ embed["title"] = _("Reverted a version of {name}").format(name=sanitize_to_markdown(change["title"]))
+ else:
+ embed["title"] = _("Uploaded {name}").format(name=sanitize_to_markdown(change["title"]))
+ if settings["license_detection"] and image_direct_url:
+ try:
+ content = image_data['revisions'][0]["slots"]["main"]['*']
+ matches = re.search(re.compile(settings["license_regex"], re.IGNORECASE), content)
+ if matches is not None:
+ license = matches.group("license")
+ else:
+ if re.search(re.compile(settings["license_regex_detect"], re.IGNORECASE), content) is None:
+ license = _("**No license!**")
+ else:
+ license = "?"
+ except IndexError:
+ logger.error(
+ "Given regex for the license detection is incorrect. It does not have a capturing group called \"license\" specified. Please fix license_regex value in the config!")
+ license = "?"
+ except re.error:
+ logger.error(
+ "Given regex for the license detection is incorrect. Please fix license_regex or license_regex_detect values in the config!")
+ license = "?"
+ except KeyError:
+ logger.exception(
+ "Unknown error when retriefing the image data for a license, full content: {}".format(image_data))
+ if image_direct_url:
+ embed.add_field(_("Options"), _("([preview]({link}))").format(link=image_direct_url))
+ if settings["appearance"]["embed"]["embed_images"]:
+ embed["image"]["url"] = image_direct_url
+ embed_helper(ctx, embed, change)
+ if license is not None:
+ embed["description"] += _("\nLicense: {}").format(license)
+ return embed
+
+
+@formatter.compact(event="upload/revert", mode="compact")
+def compact_upload_revert(ctx, change) -> DiscordMessage:
+ author, author_url = compact_author(ctx, change)
+ file_link = clean_link(create_article_path(sanitize_to_url(change["title"])))
+ parsed_comment = compact_summary(ctx)
+ content = _("[{author}]({author_url}) reverted a version of [{file}]({file_link}){comment}").format(
+ author=author, author_url=author_url, file=sanitize_to_markdown(change["title"]), file_link=file_link,
+ comment=parsed_comment)
+ return DiscordMessage(ctx.message_type, ctx.event, ctx.webhook_url, content=content)
+
+
+@formatter.compact(event="upload/overwrite", mode="compact")
+def compact_upload_overwrite(ctx, change) -> DiscordMessage:
+ author, author_url = compact_author(ctx, change)
+ file_link = clean_link(create_article_path(sanitize_to_url(change["title"])))
+ parsed_comment = compact_summary(ctx)
+ content = _("[{author}]({author_url}) uploaded a new version of [{file}]({file_link}){comment}").format(
+ author=author, author_url=author_url, file=sanitize_to_markdown(change["title"]), file_link=file_link,
+ comment=parsed_comment)
+ return DiscordMessage(ctx.message_type, ctx.event, ctx.webhook_url, content=content)
+
+
+@formatter.compact(event="upload/upload", mode="compact")
+def compact_upload_upload(ctx, change) -> DiscordMessage:
+ author, author_url = compact_author(ctx, change)
+ file_link = clean_link(create_article_path(sanitize_to_url(change["title"])))
+ parsed_comment = compact_summary(ctx)
+ content = _("[{author}]({author_url}) uploaded [{file}]({file_link}){comment}").format(author=author,
+ author_url=author_url,
+ file=sanitize_to_markdown(
+ change["title"]),
+ file_link=file_link,
+ comment=parsed_comment)
+ return DiscordMessage(ctx.message_type, ctx.event, ctx.webhook_url, content=content)
+
+
+# delete/delete - Page deletion
+@formatter.embed(event="delete/delete", mode="embed")
+def embed_delete_delete(ctx, change) -> DiscordMessage:
+ embed = DiscordMessage(ctx.message_type, ctx.event, ctx.webhook_url)
+ embed_helper(ctx, embed, change)
+ embed['url'] = create_article_path(sanitize_to_url(change["title"]))
+ embed["title"] = _("Deleted page {article}").format(article=sanitize_to_markdown(change["title"]))
+ return embed
+
+
+@formatter.compact(event="delete/delete", mode="compact")
+def compact_delete_delete(ctx, change) -> DiscordMessage:
+ parsed_comment = compact_summary(ctx)
+ author, author_url = compact_author(ctx, change)
+ page_link = clean_link(create_article_path(sanitize_to_url(change["title"])))
+ content = _("[{author}]({author_url}) deleted [{page}]({page_link}){comment}").format(author=author,
+ author_url=author_url,
+ page=sanitize_to_markdown(
+ change["title"]),
+ page_link=page_link,
+ comment=parsed_comment)
+ return DiscordMessage(ctx.message_type, ctx.event, ctx.webhook_url, content=content)
+
+
+# delete/delete_redir - Redirect deletion
+@formatter.embed(event="delete/delete_redir", mode="embed")
+def embed_delete_delete_redir(ctx, change) -> DiscordMessage:
+ embed = DiscordMessage(ctx.message_type, ctx.event, ctx.webhook_url)
+ embed_helper(ctx, embed, change)
+ embed['url'] = create_article_path(sanitize_to_url(change["title"]))
+ embed["title"] = _("Deleted redirect {article} by overwriting").format(
+ article=sanitize_to_markdown(change["title"]))
+ return embed
+
+
+@formatter.compact(event="delete/delete_redir", mode="compact")
+def compact_delete_delete_redir(ctx, change) -> DiscordMessage:
+ page_link = clean_link(create_article_path(sanitize_to_url(change["title"])))
+ author, author_url = compact_author(ctx, change)
+ parsed_comment = compact_summary(ctx)
+ content = _("[{author}]({author_url}) deleted redirect by overwriting [{page}]({page_link}){comment}").format(
+ author=author, author_url=author_url, page=sanitize_to_markdown(change["title"]), page_link=page_link,
+ comment=parsed_comment)
+ return DiscordMessage(ctx.message_type, ctx.event, ctx.webhook_url, content=content)
+
+
+# delete/restore - Restoring a page
+
+
+@formatter.embed(event="delete/restore", mode="embed")
+def embed_delete_restore(ctx, change) -> DiscordMessage:
+ embed = DiscordMessage(ctx.message_type, ctx.event, ctx.webhook_url)
+ embed_helper(ctx, embed, change)
+ embed['url'] = create_article_path(sanitize_to_url(change["title"]))
+ embed["title"] = _("Restored {article}").format(article=sanitize_to_markdown(change["title"]))
+ return embed
+
+
+@formatter.compact(event="delete/restore", mode="compact")
+def compact_delete_restore(ctx, change) -> DiscordMessage:
+ page_link = clean_link(create_article_path(sanitize_to_url(change["title"])))
+ author, author_url = compact_author(ctx, change)
+ parsed_comment = compact_summary(ctx)
+ content = _("[{author}]({author_url}) restored [{article}]({article_url}){comment}").format(author=author,
+ author_url=author_url,
+ article=sanitize_to_markdown(
+ change["title"]),
+ article_url=page_link,
+ comment=parsed_comment)
+ return DiscordMessage(ctx.message_type, ctx.event, ctx.webhook_url, content=content)
+
+
+# delete/event - Deleting an event with revdelete feature
+
+
+@formatter.embed(event="delete/event", mode="embed")
+def embed_delete_event(ctx, change) -> DiscordMessage:
+ embed = DiscordMessage(ctx.message_type, ctx.event, ctx.webhook_url)
+ embed_helper(ctx, embed, change)
+ embed['url'] = create_article_path("Special:RecentChanges")
+ embed["title"] = _("Changed visibility of log events")
+ return embed
+
+
+@formatter.compact(event="delete/event", mode="compact")
+def compact_delete_event(ctx, change) -> DiscordMessage:
+ author, author_url = compact_author(ctx, change)
+ parsed_comment = compact_summary(ctx)
+ content = _("[{author}]({author_url}) changed visibility of log events{comment}").format(author=author,
+ author_url=author_url,
+ comment=parsed_comment)
+ return DiscordMessage(ctx.message_type, ctx.event, ctx.webhook_url, content=content)
+
+
+# delete/revision - Deleting revision information
+
+@formatter.embed(event="delete/revision", mode="embed")
+def embed_delete_revision(ctx, change) -> DiscordMessage:
+ embed = DiscordMessage(ctx.message_type, ctx.event, ctx.webhook_url)
+ embed_helper(ctx, embed, change)
+ amount = len(change["logparams"]["ids"])
+ embed['url'] = create_article_path(sanitize_to_url(change["title"]))
+ embed["title"] = ngettext("Changed visibility of revision on page {article} ",
+ "Changed visibility of {amount} revisions on page {article} ", amount).format(
+ article=sanitize_to_markdown(change["title"]), amount=amount)
+ return embed
+
+
+@formatter.compact(event="delete/revision", mode="compact")
+def compact_delete_revision(ctx, change) -> DiscordMessage:
+ author, author_url = compact_author(ctx, change)
+ amount = len(change["logparams"]["ids"])
+ link = clean_link(create_article_path(sanitize_to_url(change["title"])))
+ parsed_comment = compact_summary(ctx)
+ content = ngettext(
+ "[{author}]({author_url}) changed visibility of revision on page [{article}]({article_url}){comment}",
+ "[{author}]({author_url}) changed visibility of {amount} revisions on page [{article}]({article_url}){comment}",
+ amount).format(author=author, author_url=author_url,
+ article=sanitize_to_markdown(change["title"]), article_url=link, amount=amount, comment=parsed_comment)
+ return DiscordMessage(ctx.message_type, ctx.event, ctx.webhook_url, content=content)
+
+
+# move/move - Moving pages
+
+
+@formatter.embed(event="move/move", mode="embed")
+def embed_move_move(ctx, change) -> DiscordMessage:
+ embed = DiscordMessage(ctx.message_type, ctx.event, ctx.webhook_url)
+ embed_helper(ctx, embed, change, set_desc=False)
+ embed["url"] = create_article_path(sanitize_to_url(change["logparams"]['target_title']))
+ embed["description"] = "{supress}. {desc}".format(desc=ctx.parsedcomment,
+ supress=_("No redirect has been made") if "suppressredirect" in
+ change["logparams"] else _("A redirect has been made"))
+ embed["title"] = _("Moved {redirect}{article} to {target}").format(redirect="⤷ " if "redirect" in change else "",
+ article=sanitize_to_markdown(change["title"]),
+ target=sanitize_to_markdown(
+ change["logparams"]['target_title']))
+ return embed
+
+
+@formatter.compact(event="move/move", mode="compact")
+def compact_move_move(ctx, change) -> DiscordMessage:
+ author, author_url = compact_author(ctx, change)
+ link = clean_link(create_article_path(sanitize_to_url(change["logparams"]['target_title'])))
+ redirect_status = _("without making a redirect") if "suppressredirect" in change["logparams"] else _(
+ "with a redirect")
+ parsed_comment = compact_summary(ctx)
+ content = _(
+ "[{author}]({author_url}) moved {redirect}*{article}* to [{target}]({target_url}) {made_a_redirect}{comment}").format(
+ author=author, author_url=author_url, redirect="⤷ " if "redirect" in change else "", article=sanitize_to_markdown(change["title"]),
+ target=sanitize_to_markdown(change["logparams"]['target_title']), target_url=link, comment=parsed_comment,
+ made_a_redirect=redirect_status)
+ return DiscordMessage(ctx.message_type, ctx.event, ctx.webhook_url, content=content)
+
+
+# move/move_redir - Move over redirect
+
+
+@formatter.embed(event="move/move_redir", mode="embed")
+def embed_move_move_redir(ctx, change) -> DiscordMessage:
+ embed = DiscordMessage(ctx.message_type, ctx.event, ctx.webhook_url)
+ embed_helper(ctx, embed, change, set_desc=False)
+ embed["url"] = create_article_path(sanitize_to_url(change["logparams"]['target_title']))
+ embed["description"] = "{supress}. {desc}".format(desc=ctx.parsedcomment,
+ supress=_("No redirect has been made") if "suppressredirect" in
+ change["logparams"] else _("A redirect has been made"))
+ embed["title"] = _("Moved {redirect}{article} to {title} over redirect").format(
+ redirect="⤷ " if "redirect" in change else "", article=sanitize_to_markdown(change["title"]),
+ title=sanitize_to_markdown(change["logparams"]["target_title"]))
+ return embed
+
+
+@formatter.compact(event="move/move_redir", mode="compact")
+def compact_move_move_redir(ctx, change) -> DiscordMessage:
+ author, author_url = compact_author(ctx, change)
+ link = clean_link(create_article_path(sanitize_to_url(change["logparams"]['target_title'])))
+ redirect_status = _("without making a redirect") if "suppressredirect" in change["logparams"] else _(
+ "with a redirect")
+ parsed_comment = compact_summary(ctx)
+ content = _(
+ "[{author}]({author_url}) moved {redirect}*{article}* over redirect to [{target}]({target_url}) {made_a_redirect}{comment}").format(
+ author=author, author_url=author_url, redirect="⤷ " if "redirect" in change else "",
+ article=sanitize_to_markdown(change["title"]),
+ target=sanitize_to_markdown(change["logparams"]['target_title']), target_url=link, comment=parsed_comment,
+ made_a_redirect=redirect_status)
+ return DiscordMessage(ctx.message_type, ctx.event, ctx.webhook_url, content=content)
+
+
+# protect/move_prot - Moving protection
+
+
+@formatter.embed(event="protect/move_prot", mode="embed")
+def embed_protect_move_prot(ctx, change):
+ embed = DiscordMessage(ctx.message_type, ctx.event, ctx.webhook_url)
+ embed_helper(ctx, embed, change)
+ embed["url"] = create_article_path(sanitize_to_url(change["logparams"]["oldtitle_title"]))
+ embed["title"] = _("Moved protection settings from {redirect}{article} to {title}").format(
+ redirect="⤷ " if "redirect" in change else "",
+ article=sanitize_to_markdown(change["logparams"]["oldtitle_title"]),
+ title=sanitize_to_markdown(change["title"]))
+ return embed
+
+
+@formatter.compact(event="protect/move_prot", mode="compact")
+def compact_protect_move_prot(ctx, change):
+ author, author_url = compact_author(ctx, change)
+ link = clean_link(create_article_path(sanitize_to_url(change["logparams"]["oldtitle_title"])))
+ parsed_comment = compact_summary(ctx)
+ content = _(
+ "[{author}]({author_url}) moved protection settings from {redirect}*{article}* to [{target}]({target_url}){comment}").format(
+ author=author, author_url=author_url, redirect="⤷ " if "redirect" in change else "",
+ article=sanitize_to_markdown(change["logparams"]["oldtitle_title"]),
+ target=sanitize_to_markdown(change["title"]), target_url=link, comment=parsed_comment)
+ return DiscordMessage(ctx.message_type, ctx.event, ctx.webhook_url, content=content)
+
+
+# protect/protect - Creating protection
+
+
+@formatter.embed(event="protect/protect", mode="embed")
+def embed_protect_protect(ctx, change):
+ embed = DiscordMessage(ctx.message_type, ctx.event, ctx.webhook_url)
+ embed_helper(ctx, embed, change, set_desc=False)
+ embed["url"] = create_article_path(sanitize_to_url(change["title"]))
+ embed["title"] = _("Protected {target}").format(target=sanitize_to_markdown(change["title"]))
+ embed["description"] = "{settings}{cascade} | {reason}".format(
+ settings=sanitize_to_markdown(change["logparams"].get("description", "")),
+ cascade=_(" [cascading]") if "cascade" in change["logparams"] else "",
+ reason=ctx.parsedcomment)
+ return embed
+
+
+@formatter.compact(event="protect/protect", mode="compact")
+def compact_protect_protect(ctx, change):
+ author, author_url = compact_author(ctx, change)
+ link = clean_link(create_article_path(sanitize_to_url(change["title"])))
+ parsed_comment = compact_summary(ctx)
+ content = _(
+ "[{author}]({author_url}) protected [{article}]({article_url}) with the following settings: {settings}{comment}").format(
+ author=author, author_url=author_url,
+ article=sanitize_to_markdown(change["title"]), article_url=link,
+ settings=change["logparams"].get("description", "") + (
+ _(" [cascading]") if "cascade" in change["logparams"] else ""),
+ comment=parsed_comment)
+ return DiscordMessage(ctx.message_type, ctx.event, ctx.webhook_url, content=content)
+
+
+# protect/modify - Changing protection settings
+
+
+@formatter.embed(event="protect/modify", mode="embed")
+def embed_protect_modify(ctx, change):
+ embed = DiscordMessage(ctx.message_type, ctx.event, ctx.webhook_url)
+ embed_helper(ctx, embed, change, set_desc=False)
+ embed["url"] = create_article_path(sanitize_to_url(change["title"]))
+ embed["title"] = _("Changed protection level for {article}").format(article=sanitize_to_markdown(change["title"]))
+ embed["description"] = "{settings}{cascade} | {reason}".format(
+ settings=sanitize_to_markdown(change["logparams"].get("description", "")),
+ cascade=_(" [cascading]") if "cascade" in change["logparams"] else "",
+ reason=ctx.parsedcomment)
+ return embed
+
+
+@formatter.compact(event="protect/modify", mode="compact")
+def compact_protect_modify(ctx, change):
+ author, author_url = compact_author(ctx, change)
+ link = clean_link(create_article_path(sanitize_to_url(change["title"])))
+ parsed_comment = compact_summary(ctx)
+ content = _(
+ "[{author}]({author_url}) modified protection settings of [{article}]({article_url}) to: {settings}{comment}").format(
+ author=author, author_url=author_url,
+ article=sanitize_to_markdown(change["title"]), article_url=link,
+ settings=sanitize_to_markdown(change["logparams"].get("description", "")) + (
+ _(" [cascading]") if "cascade" in change["logparams"] else ""),
+ comment=parsed_comment)
+ return DiscordMessage(ctx.message_type, ctx.event, ctx.webhook_url, content=content)
+
+
+# protect/unprotect - Unprotecting a page
+
+
+@formatter.embed(event="protect/unprotect", mode="embed")
+def embed_protect_unprotect(ctx, change):
+ embed = DiscordMessage(ctx.message_type, ctx.event, ctx.webhook_url)
+ embed_helper(ctx, embed, change)
+ embed["url"] = create_article_path(sanitize_to_url(change["title"]))
+ embed["title"] = _("Removed protection from {article}").format(article=sanitize_to_markdown(change["title"]))
+ return embed
+
+
+@formatter.compact(event="protect/unprotect", mode="compact")
+def compact_protect_unprotect(ctx, change):
+ author, author_url = compact_author(ctx, change)
+ link = clean_link(create_article_path(sanitize_to_url(change["title"])))
+ parsed_comment = compact_summary(ctx)
+ content = _("[{author}]({author_url}) removed protection from [{article}]({article_url}){comment}").format(
+ author=author, author_url=author_url, article=sanitize_to_markdown(change["title"]), article_url=link,
+ comment=parsed_comment)
+ return DiscordMessage(ctx.message_type, ctx.event, ctx.webhook_url, content=content)
+
+
+# block/block - Blocking an user
+def block_expiry(change: dict) -> str:
+ if change["logparams"]["duration"] in ["infinite", "indefinite", "infinity", "never"]:
+ return _("for infinity and beyond")
+ else:
+ if "expiry" in change["logparams"]:
+ expiry_date_time_obj = datetime.datetime.strptime(change["logparams"]["expiry"], '%Y-%m-%dT%H:%M:%SZ')
+ timestamp_date_time_obj = datetime.datetime.strptime(change["timestamp"], '%Y-%m-%dT%H:%M:%SZ')
+ timedelta_for_expiry = (expiry_date_time_obj - timestamp_date_time_obj).total_seconds()
+ years, days, hours, minutes = timedelta_for_expiry // 31557600, timedelta_for_expiry % 31557600 // 86400, \
+ timedelta_for_expiry % 86400 // 3600, timedelta_for_expiry % 3600 // 60
+ if not any([years, days, hours, minutes]):
+ return _("for less than a minute")
+ time_names = (
+ ngettext("year", "years", years), ngettext("day", "days", days), ngettext("hour", "hours", hours),
+ ngettext("minute", "minutes", minutes))
+ final_time = []
+ for num, timev in enumerate([years, days, hours, minutes]):
+ if timev:
+ final_time.append(
+ _("for {time_number} {time_unit}").format(time_unit=time_names[num], time_number=int(timev)))
+ return ", ".join(final_time)
+ else:
+ return change["logparams"]["duration"] # Temporary? Should be rare? We will see in testing
+
+
+@formatter.embed(event="block/block", mode="embed")
+def embed_block_block(ctx, change):
+ embed = DiscordMessage(ctx.message_type, ctx.event, ctx.webhook_url)
+ user = change["title"].split(':', 1)[1]
+ try:
+ ipaddress.ip_address(user)
+ embed["url"] = create_article_path("Special:Contributions/{user}".format(user=user))
+ except ValueError:
+ embed["url"] = create_article_path(sanitize_to_url(change["title"]))
+ if "sitewide" not in change["logparams"]:
+ restriction_description = ""
+ if "restrictions" in change["logparams"]:
+ if "pages" in change["logparams"]["restrictions"] and change["logparams"]["restrictions"]["pages"]:
+ restriction_description = _("Blocked from editing the following pages: ")
+ restricted_pages = ["*" + i["page_title"] + "*" for i in change["logparams"]["restrictions"]["pages"]]
+ restriction_description = restriction_description + ", ".join(restricted_pages)
+ if "namespaces" in change["logparams"]["restrictions"] and change["logparams"]["restrictions"][
+ "namespaces"]:
+ namespaces = []
+ if restriction_description:
+ restriction_description = restriction_description + _(" and namespaces: ")
+ else:
+ restriction_description = _("Blocked from editing pages on following namespaces: ")
+ for namespace in change["logparams"]["restrictions"]["namespaces"]:
+ if str(namespace) in ctx.client.namespaces: # if we have cached namespace name for given namespace number, add its name to the list
+ namespaces.append("*{ns}*".format(ns=ctx.client.namespaces[str(namespace)]["*"]))
+ else:
+ namespaces.append("*{ns}*".format(ns=namespace))
+ restriction_description = restriction_description + ", ".join(namespaces)
+ restriction_description = restriction_description + "."
+ if len(restriction_description) > 1020:
+ logger.debug(restriction_description)
+ restriction_description = restriction_description[:1020] + "…"
+ embed.add_field(_("Partial block details"), restriction_description, inline=True)
+ block_flags = change["logparams"].get("flags")
+ if block_flags:
+ embed.add_field(_("Block flags"), ", ".join(
+ block_flags)) # TODO Translate flags into MW messages, this requires making additional request in init_request since we want to get all messages with prefix (amprefix) block-log-flags- and that parameter is exclusive with ammessages
+ embed["title"] = _("Blocked {blocked_user} {time}").format(blocked_user=user, time=block_expiry(change))
+ embed_helper(ctx, embed, change)
+ return embed
+
+
+@formatter.compact(event="block/block", mode="compact")
+def compact_block_block(ctx, change):
+ user = change["title"].split(':', 1)[1]
+ restriction_description = ""
+ author, author_url = compact_author(ctx, change)
+ parsed_comment = compact_summary(ctx)
+ try:
+ ipaddress.ip_address(user)
+ link = clean_link(create_article_path("Special:Contributions/{user}".format(user=user)))
+ except ValueError:
+ link = clean_link(create_article_path(sanitize_to_url(change["title"])))
+ else:
+ if "sitewide" not in change["logparams"]:
+ if "restrictions" in change["logparams"]:
+ if "pages" in change["logparams"]["restrictions"] and change["logparams"]["restrictions"]["pages"]:
+ restriction_description = _(" on pages: ")
+ restricted_pages = ["*{page}*".format(page=i["page_title"]) for i in
+ change["logparams"]["restrictions"]["pages"]]
+ restriction_description = restriction_description + ", ".join(restricted_pages)
+ if "namespaces" in change["logparams"]["restrictions"] and change["logparams"]["restrictions"][
+ "namespaces"]:
+ namespaces = []
+ if restriction_description:
+ restriction_description = restriction_description + _(" and namespaces: ")
+ else:
+ restriction_description = _(" on namespaces: ")
+ for namespace in change["logparams"]["restrictions"]["namespaces"]:
+ if str(namespace) in ctx.client.namespaces: # if we have cached namespace name for given namespace number, add its name to the list
+ namespaces.append("*{ns}*".format(ns=ctx.client.namespaces[str(namespace)]["*"]))
+ else:
+ namespaces.append("*{ns}*".format(ns=namespace))
+ restriction_description = restriction_description + ", ".join(namespaces)
+ restriction_description = restriction_description + "."
+ if len(restriction_description) > 1020:
+ logger.debug(restriction_description)
+ restriction_description = restriction_description[:1020] + "…"
+ content = _(
+ "[{author}]({author_url}) blocked [{user}]({user_url}) {time}{restriction_desc}{comment}").format(author=author,
+ author_url=author_url,
+ user=user,
+ time=block_expiry(
+ change),
+ user_url=link,
+ restriction_desc=restriction_description,
+ comment=parsed_comment)
+ return DiscordMessage(ctx.message_type, ctx.event, ctx.webhook_url, content=content)
+
+
+# block/reblock - Changing settings of a block
+@formatter.embed(event="block/reblock", mode="embed")
+def embed_block_reblock(ctx, change):
+ embed = DiscordMessage(ctx.message_type, ctx.event, ctx.webhook_url)
+ embed_helper(ctx, embed, change)
+ embed["url"] = create_article_path(sanitize_to_url(change["title"]))
+ user = change["title"].split(':', 1)[1]
+ embed["title"] = _("Changed block settings for {blocked_user}").format(blocked_user=sanitize_to_markdown(user))
+ return embed
+
+
+@formatter.compact(event="block/reblock")
+def compact_block_reblock(ctx, change):
+ author, author_url = compact_author(ctx, change)
+ link = clean_link(create_article_path(sanitize_to_url(change["title"])))
+ user = change["title"].split(':', 1)[1]
+ parsed_comment = compact_summary(ctx)
+ content = _("[{author}]({author_url}) changed block settings for [{blocked_user}]({user_url}){comment}").format(
+ author=author, author_url=author_url, blocked_user=sanitize_to_markdown(user), user_url=link, comment=parsed_comment)
+ return DiscordMessage(ctx.message_type, ctx.event, ctx.webhook_url, content=content)
+
+
+# block/unblock - Unblocking an user
+
+@formatter.embed(event="block/unblock", mode="embed")
+def embed_block_unblock(ctx, change):
+ embed = DiscordMessage(ctx.message_type, ctx.event, ctx.webhook_url)
+ embed_helper(ctx, embed, change)
+ embed["url"] = create_article_path(sanitize_to_url(change["title"]))
+ user = change["title"].split(':', 1)[1]
+ embed["title"] = _("Unblocked {blocked_user}").format(blocked_user=sanitize_to_markdown(user))
+ return embed
+
+
+@formatter.compact(event="block/unblock")
+def compact_block_unblock(ctx, change):
+ author, author_url = compact_author(ctx, change)
+ link = clean_link(create_article_path(sanitize_to_url(change["title"])))
+ user = change["title"].split(':', 1)[1]
+ parsed_comment = compact_summary(ctx)
+ content = _("[{author}]({author_url}) unblocked [{blocked_user}]({user_url}){comment}").format(author=author,
+ author_url=author_url,
+ blocked_user=sanitize_to_markdown(user),
+ user_url=link,
+ comment=parsed_comment)
+
+ return DiscordMessage(ctx.message_type, ctx.event, ctx.webhook_url, content=content)
+
+
+# suppressed - Custom event for whenever there is limited information available about the event due to revdel
+
+
+@formatter.embed(event="suppressed", mode="embed")
+def embed_suppressed(ctx, change):
+ embed = DiscordMessage(ctx.message_type, ctx.event, ctx.webhook_url)
+ embed["url"] = create_article_path("")
+ embed["title"] = _("Action has been hidden by administration")
+ embed["author"]["name"] = _("Unknown")
+ return embed
+
+
+@formatter.compact(event="suppressed", mode="compact")
+def compact_suppressed(ctx, change):
+ content = _("An action has been hidden by administration.")
+ return DiscordMessage(ctx.message_type, ctx.event, ctx.webhook_url, content=content)
+
+
+# import/upload - Importing pages by uploading exported XML files
+
+@formatter.embed(event="import/upload", mode="embed")
+def embed_import_upload(ctx, change):
+ embed = DiscordMessage(ctx.message_type, ctx.event, ctx.webhook_url)
+ embed_helper(ctx, embed, change)
+ embed["url"] = create_article_path(sanitize_to_url(change["title"]))
+ embed["title"] = ngettext("Imported {article} with {count} revision",
+ "Imported {article} with {count} revisions", change["logparams"]["count"]).format(
+ article=sanitize_to_markdown(change["title"]), count=change["logparams"]["count"])
+ return embed
+
+
+@formatter.compact(event="import/upload", mode="compact")
+def compact_import_upload(ctx, change):
+ link = clean_link(create_article_path(sanitize_to_url(change["title"])))
+ author, author_url = compact_author(ctx, change)
+ parsed_comment = compact_summary(ctx)
+ content = ngettext("[{author}]({author_url}) imported [{article}]({article_url}) with {count} revision{comment}",
+ "[{author}]({author_url}) imported [{article}]({article_url}) with {count} revisions{comment}",
+ change["logparams"]["count"]).format(
+ author=author, author_url=author_url, article=sanitize_to_markdown(change["title"]), article_url=link,
+ count=change["logparams"]["count"], comment=parsed_comment)
+ return DiscordMessage(ctx.message_type, ctx.event, ctx.webhook_url, content=content)
+
+
+# import/interwiki - Importing interwiki entries
+
+
+@formatter.embed(event="import/interwiki", mode="embed")
+def embed_import_interwiki(ctx, change):
+ embed = DiscordMessage(ctx.message_type, ctx.event, ctx.webhook_url)
+ embed_helper(ctx, embed, change)
+ embed["url"] = create_article_path(sanitize_to_url(change["title"]))
+ embed["title"] = ngettext("Imported {article} with {count} revision from \"{source}\"",
+ "Imported {article} with {count} revisions from \"{source}\"",
+ change["logparams"]["count"]).format(
+ article=sanitize_to_markdown(change["title"]), count=change["logparams"]["count"],
+ source=sanitize_to_markdown(change["logparams"]["interwiki_title"]))
+ return embed
+
+
+@formatter.compact(event="import/interwiki", mode="compact")
+def compact_import_interwiki(ctx, change):
+ link = clean_link(create_article_path(sanitize_to_url(change["title"])))
+ author, author_url = compact_author(ctx, change)
+ source_link = clean_link(create_article_path(change["logparams"]["interwiki_title"]))
+ parsed_comment = compact_summary(ctx)
+ content = ngettext(
+ "[{author}]({author_url}) imported [{article}]({article_url}) with {count} revision from [{source}]({source_url}){comment}",
+ "[{author}]({author_url}) imported [{article}]({article_url}) with {count} revisions from [{source}]({source_url}){comment}",
+ change["logparams"]["count"]).format(
+ author=author, author_url=author_url, article=sanitize_to_markdown(change["title"]), article_url=link,
+ count=change["logparams"]["count"], source=sanitize_to_markdown(change["logparams"]["interwiki_title"]),
+ source_url=source_link,
+ comment=parsed_comment)
+ return DiscordMessage(ctx.message_type, ctx.event, ctx.webhook_url, content=content)
+
+
+# rights/rights - Assigning rights groups
+def get_changed_groups(change: dict) -> [[str], [str]]:
+ """Creates strings comparing the changes between the user groups for the user"""
+ def expiry_parse_time(passed_time):
+ try:
+ return _(" (until {date_and_time})").format(date_and_time=datetime.datetime.strptime(passed_time, "%Y-%m-%dT%H:%M:%SZ").strftime("%Y-%m-%d %H:%M:%S UTC"))
+ except ValueError:
+ return ""
+ new_group_meta = {_(t["group"]): expiry_parse_time(t.get("expiry", "infinity")) for t in change["logparams"].get("newmetadata", [])}
+ # translate all groups and pull them into a set
+ old_groups = {_(x) for x in change["logparams"]["oldgroups"]}
+ new_groups = {_(x) for x in change["logparams"]["newgroups"]}
+ added = [x + new_group_meta.get(x, "") for x in new_groups - old_groups]
+ removed = [x for x in old_groups - new_groups]
+ return added, removed
+
+
+@formatter.embed(event="rights/rights", aliases=["rights/autopromote"])
+def embed_rights_rights(ctx, change):
+ embed = DiscordMessage(ctx.message_type, ctx.event, ctx.webhook_url)
+ embed["url"] = create_article_path(sanitize_to_url("User:{}".format(change["title"].split(":")[1])))
+ if ctx.event == "rights/rights":
+ embed["title"] = _("Changed group membership for {target}").format(target=sanitize_to_markdown(change["title"].split(":")[1]))
+ else:
+ embed.set_author(_("System"), "")
+ embed["title"] = _("{target} got autopromoted to a new usergroup").format(
+ target=sanitize_to_markdown(change["title"].split(":")[1]))
+ # if len(change["logparams"]["oldgroups"]) < len(change["logparams"]["newgroups"]):
+ # embed["thumbnail"]["url"] = "https://i.imgur.com/WnGhF5g.gif"
+ added, removed = get_changed_groups(change)
+ if added:
+ embed.add_field(ngettext("Added group", "Added groups", len(added)), "\n".join(added), inline=True)
+ if removed:
+ embed.add_field(ngettext("Removed group", "Removed groups", len(removed)), "\n".join(removed), inline=True)
+ embed_helper(ctx, embed, change)
+ return embed
+
+
+@formatter.compact(event="rights/rights", aliases=["rights/autopromote"])
+def compact_rights_rights(ctx, change):
+ link = clean_link(create_article_path(sanitize_to_url("User:{user}".format(user=change["title"].split(":")[1]))))
+ added, removed = get_changed_groups(change)
+ author, author_url = compact_author(ctx, change)
+ parsed_comment = compact_summary(ctx)
+ if ctx.event == "rights/rights":
+ group_changes = "Unknown group changes." # Because I don't know if it can handle time extensions correctly
+ if added and removed:
+ group_changes = _("Added to {added} and removed from {removed}.").format(
+ added=_(", ").join(added), removed=_(", ").join(removed))
+ elif added:
+ group_changes = _("Added to {added}.").format(added=_(", ").join(added))
+ elif removed:
+ group_changes = _("Removed from {removed}.").format(removed=_(", ").join(removed))
+ content = _("[{author}]({author_url}) changed group membership for [{target}]({target_url}): {group_changes}{comment}").format(
+ author=author, author_url=author_url, target=sanitize_to_markdown(change["title"].split(":")[1]),
+ target_url=link, group_changes=group_changes, comment=parsed_comment)
+ else:
+ content = _("The system autopromoted [{target}]({target_url}) to {added}.{comment}").format(
+ target=sanitize_to_markdown(change["title"].split(":")[1]), target_url=link,
+ added=_(", ").join(added), comment=parsed_comment)
+ return DiscordMessage(ctx.message_type, ctx.event, ctx.webhook_url, content=content)
+
+
+# merge/merge - Merging histories of two pages
+
+@formatter.embed(event="merge/merge", mode="embed")
+def embed_merge_merge(ctx, change):
+ embed = DiscordMessage(ctx.message_type, ctx.event, ctx.webhook_url)
+ embed_helper(ctx, embed, change)
+ embed["url"] = create_article_path(sanitize_to_url(change["title"]))
+ embed["title"] = _("Merged revision histories of {article} into {dest}").format(
+ article=sanitize_to_markdown(change["title"]),
+ dest=sanitize_to_markdown(change["logparams"][
+ "dest_title"]))
+ return embed
+
+
+@formatter.compact(event="merge/merge")
+def compact_merge_merge(ctx, change):
+ author, author_url = compact_author(ctx, change)
+ parsed_comment = compact_summary(ctx)
+ link = clean_link(create_article_path(sanitize_to_url(change["title"])))
+ link_dest = clean_link(create_article_path(sanitize_to_url(change["logparams"]["dest_title"])))
+ content = _(
+ "[{author}]({author_url}) merged revision histories of [{article}]({article_url}) into [{dest}]({dest_url}){comment}").format(
+ author=author, author_url=author_url, article=sanitize_to_markdown(change["title"]), article_url=link, dest_url=link_dest,
+ dest=sanitize_to_markdown(change["logparams"]["dest_title"]), comment=parsed_comment)
+ return DiscordMessage(ctx.message_type, ctx.event, ctx.webhook_url, content=content)
+
+
+# newusers/autocreate - Auto creation of user account
+
+
+@formatter.embed(event="newusers/autocreate", mode="embed")
+def embed_newusers_autocreate(ctx, change):
+ embed = DiscordMessage(ctx.message_type, ctx.event, ctx.webhook_url)
+ embed_helper(ctx, embed, change)
+ embed["url"] = create_article_path(sanitize_to_url(change["title"]))
+ embed["title"] = _("Created account automatically")
+ return embed
+
+
+@formatter.compact(event="newusers/autocreate")
+def compact_newusers_autocreate(ctx, change):
+ author, author_url = compact_author(ctx, change)
+ content = _("Account [{author}]({author_url}) was created automatically").format(author=author,
+ author_url=author_url)
+ return DiscordMessage(ctx.message_type, ctx.event, ctx.webhook_url, content=content)
+
+
+# newusers/create - Auto creation of user account
+
+
+@formatter.embed(event="newusers/create", mode="embed")
+def embed_newusers_create(ctx, change):
+ embed = DiscordMessage(ctx.message_type, ctx.event, ctx.webhook_url)
+ embed_helper(ctx, embed, change)
+ embed["url"] = create_article_path(sanitize_to_url(change["title"]))
+ embed["title"] = _("Created account")
+ return embed
+
+
+@formatter.compact(event="newusers/create")
+def compact_newusers_create(ctx, change):
+ author, author_url = compact_author(ctx, change)
+ content = _("Account [{author}]({author_url}) was created").format(author=author, author_url=author_url)
+ return DiscordMessage(ctx.message_type, ctx.event, ctx.webhook_url, content=content)
+
+
+# newusers/autocreate - Auto creation of user account
+
+
+@formatter.embed(event="newusers/create2", mode="embed")
+def embed_newusers_create2(ctx, change):
+ embed = DiscordMessage(ctx.message_type, ctx.event, ctx.webhook_url)
+ embed_helper(ctx, embed, change)
+ embed["url"] = create_article_path(sanitize_to_url(change["title"]))
+ embed["title"] = _("Created account {article}").format(article=sanitize_to_markdown(change["title"]))
+ return embed
+
+
+@formatter.compact(event="newusers/create2")
+def compact_newusers_create2(ctx, change):
+ author, author_url = compact_author(ctx, change)
+ parsed_comment = compact_summary(ctx)
+ link = clean_link(create_article_path(sanitize_to_url(change["title"])))
+ content = _("Account [{article}]({article_url}) was created by [{author}]({author_url}){comment}").format(
+ article=sanitize_to_markdown(change["title"]), article_url=link, author=author, author_url=author_url, comment=parsed_comment)
+ return DiscordMessage(ctx.message_type, ctx.event, ctx.webhook_url, content=content)
+
+
+# newusers/byemail - Creation of account by email
+
+
+@formatter.embed(event="newusers/byemail", mode="embed")
+def embed_newusers_byemail(ctx, change):
+ embed = DiscordMessage(ctx.message_type, ctx.event, ctx.webhook_url)
+ embed_helper(ctx, embed, change)
+ embed["url"] = create_article_path(sanitize_to_url(change["title"]))
+ embed["title"] = _("Created account {article} and password was sent by email").format(
+ article=sanitize_to_markdown(change["title"]))
+ return embed
+
+
+@formatter.compact(event="newusers/byemail")
+def compact_newusers_byemail(ctx, change):
+ author, author_url = compact_author(ctx, change)
+ parsed_comment = compact_summary(ctx)
+ link = clean_link(create_article_path(sanitize_to_url(change["title"])))
+ content = _(
+ "Account [{article}]({article_url}) was created by [{author}]({author_url}) and password was sent by email{comment}").format(
+ article=sanitize_to_markdown(change["title"]), article_url=link, author=author, author_url=author_url, comment=parsed_comment)
+ return DiscordMessage(ctx.message_type, ctx.event, ctx.webhook_url, content=content)
+
+
+# newusers/newusers - New users
+
+
+@formatter.embed(event="newusers/newusers", mode="embed")
+def embed_newusers_newusers(ctx, change):
+ embed = DiscordMessage(ctx.message_type, ctx.event, ctx.webhook_url)
+ embed_helper(ctx, embed, change)
+ embed["url"] = create_article_path(sanitize_to_url("User:{}".format(change["user"])))
+ embed["title"] = _("Created account")
+ return embed
+
+
+@formatter.compact(event="newusers/newusers")
+def compact_newusers_newusers(ctx, change):
+ author, author_url = compact_author(ctx, change)
+ content = _("Account [{author}]({author_url}) was created").format(author=author, author_url=author_url)
+ return DiscordMessage(ctx.message_type, ctx.event, ctx.webhook_url, content=content)
+
+
+# contentmodel/change - Changing the content model of a page
+
+
+@formatter.embed(event="contentmodel/change", mode="embed")
+def embed_contentmodel_change(ctx, change):
+ embed = DiscordMessage(ctx.message_type, ctx.event, ctx.webhook_url)
+ embed_helper(ctx, embed, change, set_desc=False)
+ embed["url"] = create_article_path(sanitize_to_url(change["title"]))
+ embed["title"] = _("Changed the content model of the page {article}").format(
+ article=sanitize_to_markdown(change["title"]))
+ embed["description"] = _("Model changed from {old} to {new}: {reason}").format(old=change["logparams"]["oldmodel"],
+ new=change["logparams"]["newmodel"],
+ reason=ctx.parsedcomment)
+ return embed
+
+
+@formatter.compact(event="contentmodel/change")
+def compact_contentmodel_change(ctx, change):
+ author, author_url = compact_author(ctx, change)
+ link = clean_link(create_article_path(sanitize_to_url(change["title"])))
+ parsed_comment = compact_summary(ctx)
+ content = _(
+ "[{author}]({author_url}) changed the content model of the page [{article}]({article_url}) from {old} to {new}{comment}").format(
+ author=author, author_url=author_url, article=sanitize_to_markdown(change["title"]), article_url=link,
+ old=change["logparams"]["oldmodel"],
+ new=change["logparams"]["newmodel"], comment=parsed_comment)
+ return DiscordMessage(ctx.message_type, ctx.event, ctx.webhook_url, content=content)
+
+
+# contentmodel/new - Creating a page with non-default content model
+
+
+@formatter.embed(event="contentmodel/new", mode="embed")
+def embed_contentmodel_new(ctx, change):
+ embed = DiscordMessage(ctx.message_type, ctx.event, ctx.webhook_url)
+ embed_helper(ctx, embed, change, set_desc=False)
+ embed["url"] = create_article_path(sanitize_to_url(change["title"]))
+ embed["title"] = _("Created the page {article} using a non-default content model").format(
+ article=sanitize_to_markdown(change["title"]))
+ embed["description"] = _("Created with model {new}: {reason}").format(new=change["logparams"]["newmodel"],
+ reason=ctx.parsedcomment)
+ return embed
+
+
+@formatter.compact(event="contentmodel/new")
+def compact_contentmodel_new(ctx, change):
+ author, author_url = compact_author(ctx, change)
+ link = clean_link(create_article_path(sanitize_to_url(change["title"])))
+ parsed_comment = compact_summary(ctx)
+ content = _(
+ "[{author}]({author_url}) created the page [{article}]({article_url}) using a non-default content model {new}{comment}").format(
+ author=author, author_url=author_url, article=sanitize_to_markdown(change["title"]), article_url=link,
+ new=change["logparams"]["newmodel"], comment=parsed_comment)
+ return DiscordMessage(ctx.message_type, ctx.event, ctx.webhook_url, content=content)
+
+
+# managetags/create - Creating log tags
+
+
+@formatter.embed(event="managetags/create", mode="embed")
+def embed_managetags_create(ctx, change):
+ embed = DiscordMessage(ctx.message_type, ctx.event, ctx.webhook_url)
+ embed_helper(ctx, embed, change)
+ ctx.client.refresh_internal_data()
+ embed["url"] = create_article_path(sanitize_to_url(change["title"]))
+ embed["title"] = _("Created the tag \"{tag}\"").format(tag=sanitize_to_markdown(change["logparams"]["tag"]))
+ return embed
+
+
+@formatter.compact(event="managetags/create")
+def compact_managetags_create(ctx, change):
+ author, author_url = compact_author(ctx, change)
+ link = clean_link(create_article_path(sanitize_to_url(change["title"])))
+ ctx.client.refresh_internal_data()
+ parsed_comment = compact_summary(ctx)
+ content = _("[{author}]({author_url}) created the [tag]({tag_url}) \"{tag}\"{comment}").format(author=author,
+ author_url=author_url,
+ tag=
+ sanitize_to_markdown(
+ change[
+ "logparams"][
+ "tag"]),
+ tag_url=link,
+ comment=parsed_comment)
+
+ return DiscordMessage(ctx.message_type, ctx.event, ctx.webhook_url, content=content)
+
+
+# managetags/delete - Deleting a tag
+
+
+@formatter.embed(event="managetags/delete", mode="embed")
+def embed_managetags_delete(ctx, change):
+ embed = DiscordMessage(ctx.message_type, ctx.event, ctx.webhook_url)
+ ctx.client.refresh_internal_data()
+ embed["url"] = create_article_path(sanitize_to_url(change["title"]))
+ embed["title"] = _("Deleted the tag \"{tag}\"").format(tag=sanitize_to_markdown(change["logparams"]["tag"]))
+ if change["logparams"]["count"] > 0:
+ embed.add_field(_('Removed from'), ngettext("{} revision or log entry", "{} revisions and/or log entries",
+ change["logparams"]["count"]).format(change["logparams"]["count"]))
+ embed_helper(ctx, embed, change)
+ return embed
+
+
+@formatter.compact(event="managetags/delete")
+def compact_managetags_delete(ctx, change):
+ author, author_url = compact_author(ctx, change)
+ link = clean_link(create_article_path(sanitize_to_url(change["title"])))
+ ctx.client.refresh_internal_data()
+ parsed_comment = compact_summary(ctx)
+ if change["logparams"]["count"] == 0:
+ content = _("[{author}]({author_url}) deleted the [tag]({tag_url}) \"{tag}\"{comment}").format(author=author,
+ author_url=author_url,
+ tag=sanitize_to_markdown(
+ change[
+ "logparams"][
+ "tag"]),
+ tag_url=link,
+ comment=parsed_comment)
+ else:
+ content = ngettext(
+ "[{author}]({author_url}) deleted the [tag]({tag_url}) \"{tag}\" and removed it from {count} revision or log entry{comment}",
+ "[{author}]({author_url}) deleted the [tag]({tag_url}) \"{tag}\" and removed it from {count} revisions and/or log entries{comment}",
+ change["logparams"]["count"]).format(author=author, author_url=author_url,
+ tag=sanitize_to_markdown(change["logparams"]["tag"]),
+ tag_url=link, count=change["logparams"]["count"],
+ comment=parsed_comment)
+ return DiscordMessage(ctx.message_type, ctx.event, ctx.webhook_url, content=content)
+
+
+# managetags/activate - Activating a tag
+
+
+@formatter.embed(event="managetags/activate", mode="embed")
+def embed_managetags_activate(ctx, change):
+ embed = DiscordMessage(ctx.message_type, ctx.event, ctx.webhook_url)
+ embed_helper(ctx, embed, change)
+ embed["url"] = create_article_path(sanitize_to_url(change["title"]))
+ embed["title"] = _("Activated the tag \"{tag}\"").format(tag=sanitize_to_markdown(change["logparams"]["tag"]))
+ return embed
+
+
+@formatter.compact(event="managetags/activate")
+def compact_managetags_activate(ctx, change):
+ author, author_url = compact_author(ctx, change)
+ link = clean_link(create_article_path(sanitize_to_url(change["title"])))
+ parsed_comment = compact_summary(ctx)
+ content = _("[{author}]({author_url}) activated the [tag]({tag_url}) \"{tag}\"{comment}").format(author=author,
+ author_url=author_url,
+ tag=sanitize_to_markdown(
+ change[
+ "logparams"][
+ "tag"]),
+ tag_url=link,
+ comment=parsed_comment)
+ return DiscordMessage(ctx.message_type, ctx.event, ctx.webhook_url, content=content)
+
+
+# managetags/deactivate - Deactivating a tag
+
+
+@formatter.embed(event="managetags/deactivate", mode="embed")
+def embed_managetags_deactivate(ctx, change):
+ embed = DiscordMessage(ctx.message_type, ctx.event, ctx.webhook_url)
+ embed_helper(ctx, embed, change)
+ embed["url"] = create_article_path(sanitize_to_url(change["title"]))
+ embed["title"] = _("Deactivated the tag \"{tag}\"").format(tag=sanitize_to_markdown(change["logparams"]["tag"]))
+ return embed
+
+
+@formatter.compact(event="managetags/deactivate")
+def compact_managetags_deactivate(ctx, change):
+ author, author_url = compact_author(ctx, change)
+ link = clean_link(create_article_path(sanitize_to_url(change["title"])))
+ parsed_comment = compact_summary(ctx)
+ content = _("[{author}]({author_url}) deactivated the [tag]({tag_url}) \"{tag}\"{comment}").format(author=author,
+ author_url=author_url,
+ tag=sanitize_to_markdown(
+ change[
+ "logparams"][
+ "tag"]),
+ tag_url=link,
+ comment=parsed_comment)
+ return DiscordMessage(ctx.message_type, ctx.event, ctx.webhook_url, content=content)
diff --git a/extensions/base/renameuser.py b/extensions/base/renameuser.py
new file mode 100644
index 0000000..bdffbb4
--- /dev/null
+++ b/extensions/base/renameuser.py
@@ -0,0 +1,70 @@
+# This file is part of Recent changes Goat compatible Discord webhook (RcGcDw).
+#
+# RcGcDw is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# RcGcDw is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with RcGcDw. If not, see .
+
+
+import logging
+from src.discord.message import DiscordMessage
+from src.api import formatter
+from src.i18n import formatters_i18n
+from src.api.context import Context
+from src.api.util import embed_helper, compact_summary, clean_link, compact_author, create_article_path, sanitize_to_markdown, sanitize_to_url
+
+_ = formatters_i18n.gettext
+ngettext = formatters_i18n.ngettext
+
+
+# Renameuser - https://www.mediawiki.org/wiki/Extension:Renameuser
+# renameuser/renameuser - Renaming a user
+
+
+@formatter.embed(event="renameuser/renameuser")
+def embed_renameuser_renameuser(ctx: Context, change: dict) -> DiscordMessage:
+ embed = DiscordMessage(ctx.message_type, ctx.event, ctx.webhook_url)
+ embed_helper(ctx, embed, change)
+ edits = change["logparams"]["edits"]
+ if edits > 0:
+ embed["title"] = ngettext("Renamed user \"{old_name}\" with {edits} edit to \"{new_name}\"",
+ "Renamed user \"{old_name}\" with {edits} edits to \"{new_name}\"", edits).format(
+ old_name=sanitize_to_markdown(change["logparams"]["olduser"]), edits=edits,
+ new_name=sanitize_to_markdown(change["logparams"]["newuser"]))
+ else:
+ embed["title"] = _("Renamed user \"{old_name}\" to \"{new_name}\"").format(
+ old_name=sanitize_to_markdown(change["logparams"]["olduser"]),
+ new_name=sanitize_to_markdown(change["logparams"]["newuser"]))
+ embed["url"] = create_article_path("User:" + sanitize_to_url(change["logparams"]["newuser"]))
+ return embed
+
+
+@formatter.compact(event="renameuser/renameuser")
+def compact_renameuser_renameuser(ctx: Context, change: dict) -> DiscordMessage:
+ author, author_url = compact_author(ctx, change)
+ link = clean_link(create_article_path("User:" + sanitize_to_url(change["logparams"]["newuser"])))
+ edits = change["logparams"]["edits"]
+ parsed_comment = compact_summary(ctx)
+ if edits > 0:
+ content = ngettext(
+ "[{author}]({author_url}) renamed user *{old_name}* with {edits} edit to [{new_name}]({link}){comment}",
+ "[{author}]({author_url}) renamed user *{old_name}* with {edits} edits to [{new_name}]({link}){comment}",
+ edits).format(
+ author=author, author_url=author_url, old_name=sanitize_to_markdown(change["logparams"]["olduser"]),
+ edits=edits,
+ new_name=sanitize_to_markdown(change["logparams"]["newuser"]), link=link, comment=parsed_comment
+ )
+ else:
+ content = _("[{author}]({author_url}) renamed user *{old_name}* to [{new_name}]({link}){comment}").format(
+ author=author, author_url=author_url, old_name=sanitize_to_markdown(change["logparams"]["olduser"]),
+ new_name=sanitize_to_markdown(change["logparams"]["newuser"]), link=link, comment=parsed_comment
+ )
+ return DiscordMessage(ctx.message_type, ctx.event, ctx.webhook_url, content=content)
diff --git a/extensions/base/sprite.py b/extensions/base/sprite.py
new file mode 100644
index 0000000..cd3423d
--- /dev/null
+++ b/extensions/base/sprite.py
@@ -0,0 +1,91 @@
+# This file is part of Recent changes Goat compatible Discord webhook (RcGcDw).
+#
+# RcGcDw is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# RcGcDw is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with RcGcDw. If not, see .
+
+import logging
+from src.discord.message import DiscordMessage
+from src.api import formatter
+from src.i18n import formatters_i18n
+from src.api.context import Context
+from src.api.util import embed_helper, compact_author, create_article_path, sanitize_to_markdown, sanitize_to_url, \
+ clean_link
+
+_ = formatters_i18n.gettext
+ngettext = formatters_i18n.ngettext
+
+
+# SpriteSheet - https://www.mediawiki.org/wiki/Extension:SpriteSheet
+# sprite/sprite - Editing a sprite
+
+
+@formatter.embed(event="sprite/sprite")
+def embed_sprite_sprite(ctx: Context, change: dict):
+ embed = DiscordMessage(ctx.message_type, ctx.event, ctx.webhook_url)
+ embed_helper(ctx, embed, change)
+ embed["url"] = create_article_path(sanitize_to_url(change["title"]))
+ embed["title"] = _("Edited the sprite for {article}").format(article=sanitize_to_markdown(change["title"]))
+ return embed
+
+
+@formatter.compact(event="sprite/sprite")
+def compact_sprite_sprite(ctx: Context, change: dict):
+ author, author_url = compact_author(ctx, change)
+ link = clean_link(create_article_path(sanitize_to_url(change["title"])))
+ content = _("[{author}]({author_url}) edited the sprite for [{article}]({article_url})").format(author=author,
+ author_url=author_url,
+ article=sanitize_to_markdown(change[
+ "title"]),
+ article_url=link)
+ return DiscordMessage(ctx.message_type, ctx.event, ctx.webhook_url, content=content)
+
+# sprite/sheet - Creating a sprite sheet
+
+
+@formatter.embed(event="sprite/sheet")
+def embed_sprite_sheet(ctx: Context, change: dict):
+ embed = DiscordMessage(ctx.message_type, ctx.event, ctx.webhook_url)
+ embed_helper(ctx, embed, change)
+ embed["url"] = create_article_path(sanitize_to_url(change["title"]))
+ embed["title"] = _("Created the sprite sheet for {article}").format(article=sanitize_to_markdown(change["title"]))
+ return embed
+
+
+@formatter.compact(event="sprite/sheet")
+def compact_sprite_sheet(ctx: Context, change: dict):
+ author, author_url = compact_author(ctx, change)
+ link = clean_link(create_article_path(sanitize_to_url(change["title"])))
+ content = _("[{author}]({author_url}) created the sprite sheet for [{article}]({article_url})").format(author=author, author_url=author_url, article=sanitize_to_markdown(change["title"]), article_url=link)
+ return DiscordMessage(ctx.message_type, ctx.event, ctx.webhook_url, content=content)
+
+# sprite/slice - Editing a slice
+
+
+@formatter.embed(event="sprite/slice")
+def embed_sprite_slice(ctx: Context, change: dict):
+ embed = DiscordMessage(ctx.message_type, ctx.event, ctx.webhook_url)
+ embed_helper(ctx, embed, change)
+ embed["url"] = create_article_path(sanitize_to_url(change["title"]))
+ embed["title"] = _("Edited the slice for {article}").format(article=sanitize_to_markdown(change["title"]))
+ return embed
+
+@formatter.compact(event="sprite/slice")
+def compact_sprite_slice(ctx: Context, change: dict):
+ author, author_url = compact_author(ctx, change)
+ link = clean_link(create_article_path(sanitize_to_url(change["title"])))
+ content = _("[{author}]({author_url}) edited the slice for [{article}]({article_url})").format(author=author,
+ author_url=author_url,
+ article=sanitize_to_markdown(change[
+ "title"]),
+ article_url=link)
+ return DiscordMessage(ctx.message_type, ctx.event, ctx.webhook_url, content=content)
diff --git a/extensions/base/translate.py b/extensions/base/translate.py
new file mode 100644
index 0000000..68349cc
--- /dev/null
+++ b/extensions/base/translate.py
@@ -0,0 +1,482 @@
+# This file is part of Recent changes Goat compatible Discord webhook (RcGcDw).
+#
+# RcGcDw is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# RcGcDw is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with RcGcDw. If not, see .
+
+import logging
+from src.discord.message import DiscordMessage
+from src.api import formatter
+from src.i18n import formatters_i18n
+from src.api.context import Context
+from src.api.util import embed_helper, compact_author, create_article_path, sanitize_to_markdown, sanitize_to_url, \
+ clean_link, compact_summary
+
+_ = formatters_i18n.gettext
+ngettext = formatters_i18n.ngettext
+
+# I cried when I realized I have to migrate Translate extension logs, but this way I atone for my countless sins
+# Translate - https://www.mediawiki.org/wiki/Extension:Translate
+# pagetranslation/mark - Marking a page for translation
+
+
+@formatter.embed(event="pagetranslation/mark")
+def embed_pagetranslation_mark(ctx: Context, change: dict):
+ embed = DiscordMessage(ctx.message_type, ctx.event, ctx.webhook_url)
+ embed_helper(ctx, embed, change)
+ link = create_article_path(sanitize_to_url(change["title"]))
+ if "?" in link:
+ embed["url"] = link + "&oldid={}".format(change["logparams"]["revision"])
+ else:
+ embed["url"] = link + "?oldid={}".format(change["logparams"]["revision"])
+ embed["title"] = _("Marked \"{article}\" for translation").format(article=sanitize_to_markdown(change["title"]))
+ return embed
+
+
+@formatter.compact(event="pagetranslation/mark")
+def compact_pagetranslation_mark(ctx: Context, change: dict):
+ author, author_url = compact_author(ctx, change)
+ link = create_article_path(sanitize_to_url(change["title"]))
+ if "?" in link:
+ link = link + "&oldid={}".format(change["logparams"]["revision"])
+ else:
+ link = link + "?oldid={}".format(change["logparams"]["revision"])
+ link = clean_link(link)
+ parsed_comment = compact_summary(ctx)
+ content = _("[{author}]({author_url}) marked [{article}]({article_url}) for translation{comment}").format(
+ author=author, author_url=author_url,
+ article=sanitize_to_markdown(change["title"]), article_url=link,
+ comment=parsed_comment
+ )
+ return DiscordMessage(ctx.message_type, ctx.event, ctx.webhook_url, content=content)
+
+# pagetranslation/unmark - Removing a page from translation system
+
+
+@formatter.embed(event="pagetranslation/unmark")
+def embed_pagetranslation_unmark(ctx: Context, change: dict):
+ embed = DiscordMessage(ctx.message_type, ctx.event, ctx.webhook_url)
+ embed_helper(ctx, embed, change)
+ embed["url"] = create_article_path(sanitize_to_url(change["title"]))
+ embed["title"] = _("Removed \"{article}\" from the translation system").format(article=sanitize_to_markdown(change["title"]))
+ return embed
+
+
+@formatter.compact(event="pagetranslation/unmark")
+def compact_pagetranslation_unmark(ctx: Context, change: dict):
+ author, author_url = compact_author(ctx, change)
+ parsed_comment = compact_summary(ctx)
+ link = clean_link(create_article_path(sanitize_to_url(change["title"])))
+ content = _(
+ "[{author}]({author_url}) removed [{article}]({article_url}) from the translation system{comment}").format(
+ author=author, author_url=author_url,
+ article=sanitize_to_markdown(change["title"]), article_url=link,
+ comment=parsed_comment
+ )
+ return DiscordMessage(ctx.message_type, ctx.event, ctx.webhook_url, content=content)
+
+# pagetranslation/moveok - Completed moving translation page
+
+
+@formatter.embed(event="pagetranslation/moveok")
+def embed_pagetranslation_moveok(ctx: Context, change: dict):
+ embed = DiscordMessage(ctx.message_type, ctx.event, ctx.webhook_url)
+ embed_helper(ctx, embed, change)
+ embed["url"] = create_article_path(sanitize_to_url(change["logparams"]["target"]))
+ embed["title"] = _("Completed moving translation pages from \"{article}\" to \"{target}\"").format(
+ article=sanitize_to_markdown(change["title"]), target=sanitize_to_markdown(change["logparams"]["target"]))
+ return embed
+
+
+@formatter.compact(event="pagetranslation/moveok")
+def compact_pagetranslation_moveok(ctx: Context, change: dict):
+ author, author_url = compact_author(ctx, change)
+ parsed_comment = compact_summary(ctx)
+ link = clean_link(create_article_path(sanitize_to_url(change["logparams"]["target"])))
+ content = _(
+ "[{author}]({author_url}) completed moving translation pages from *{article}* to [{target}]({target_url}){comment}").format(
+ author=author, author_url=author_url,
+ article=sanitize_to_markdown(change["title"]), target=sanitize_to_markdown(change["logparams"]["target"]),
+ target_url=link, comment=parsed_comment
+ )
+ return DiscordMessage(ctx.message_type, ctx.event, ctx.webhook_url, content=content)
+
+# pagetranslation/movenok - Failed while moving translation page
+
+
+@formatter.embed(event="pagetranslation/movenok")
+def embed_pagetranslation_movenok(ctx: Context, change: dict):
+ embed = DiscordMessage(ctx.message_type, ctx.event, ctx.webhook_url)
+ embed_helper(ctx, embed, change)
+ embed["url"] = create_article_path(sanitize_to_url(change["title"]))
+ embed["title"] = _("Encountered a problem while moving \"{article}\" to \"{target}\"").format(
+ article=sanitize_to_markdown(change["title"]), target=sanitize_to_markdown(change["logparams"]["target"]))
+ return embed
+
+
+@formatter.compact(event="pagetranslation/movenok")
+def compact_pagetranslation_movenok(ctx: Context, change: dict):
+ author, author_url = compact_author(ctx, change)
+ parsed_comment = compact_summary(ctx)
+ link = clean_link(create_article_path(sanitize_to_url(change["title"])))
+ target_url = clean_link(create_article_path(sanitize_to_url(change["logparams"]["target"])))
+ content = _(
+ "[{author}]({author_url}) encountered a problem while moving [{article}]({article_url}) to [{target}]({target_url}){comment}").format(
+ author=author, author_url=author_url,
+ article=sanitize_to_markdown(change["title"]), article_url=link,
+ target=sanitize_to_markdown(change["logparams"]["target"]), target_url=target_url,
+ comment=parsed_comment
+ )
+ return DiscordMessage(ctx.message_type, ctx.event, ctx.webhook_url, content=content)
+
+# pagetranslation/deletefnok - Failure in deletion of translatable page
+
+
+@formatter.embed(event="pagetranslation/deletefnok")
+def embed_pagetranslation_deletefnok(ctx: Context, change: dict):
+ embed = DiscordMessage(ctx.message_type, ctx.event, ctx.webhook_url)
+ embed_helper(ctx, embed, change)
+ embed["url"] = create_article_path(sanitize_to_url(change["title"]))
+ embed["title"] = _("Failed to delete \"{article}\" which belongs to translatable page \"{target}\"").format(
+ article=sanitize_to_markdown(change["title"]), target=sanitize_to_markdown(change["logparams"]["target"]))
+ return embed
+
+
+@formatter.compact(event="pagetranslation/deletefnok")
+def compact_pagetranslation_deletefnok(ctx: Context, change: dict):
+ author, author_url = compact_author(ctx, change)
+ parsed_comment = compact_summary(ctx)
+ link = clean_link(create_article_path(sanitize_to_url(change["title"])))
+ target_url = clean_link(create_article_path(sanitize_to_url(change["logparams"]["target"])))
+ content = _(
+ "[{author}]({author_url}) failed to delete [{article}]({article_url}) which belongs to translatable page [{target}]({target_url}){comment}").format(
+ author=author, author_url=author_url,
+ article=sanitize_to_markdown(change["title"]), article_url=link,
+ target=sanitize_to_markdown(change["logparams"]["target"]), target_url=target_url,
+ comment=parsed_comment
+ )
+ return DiscordMessage(ctx.message_type, ctx.event, ctx.webhook_url, content=content)
+
+# pagetranslation/deletelok - Completion in deleting a page?
+
+
+@formatter.embed(event="pagetranslation/deletelok")
+def embed_pagetranslation_deletelok(ctx: Context, change: dict):
+ embed = DiscordMessage(ctx.message_type, ctx.event, ctx.webhook_url)
+ embed_helper(ctx, embed, change)
+ embed["url"] = create_article_path(sanitize_to_url(change["title"]))
+ embed["title"] = _("Completed deletion of translation page \"{article}\"").format(
+ article=sanitize_to_markdown(change["title"]))
+ return embed
+
+
+@formatter.compact(event="pagetranslation/deletelok")
+def compact_pagetranslation_deletelok(ctx: Context, change: dict):
+ author, author_url = compact_author(ctx, change)
+ parsed_comment = compact_summary(ctx)
+ link = clean_link(create_article_path(sanitize_to_url(change["title"])))
+ content = _(
+ "[{author}]({author_url}) completed deletion of translation page [{article}]({article_url}){comment}").format(
+ author=author, author_url=author_url,
+ article=sanitize_to_markdown(change["title"]), article_url=link,
+ comment=parsed_comment
+ )
+ return DiscordMessage(ctx.message_type, ctx.event, ctx.webhook_url, content=content)
+
+# pagetranslation/deletelnok - Failure in deletion of article belonging to a translation page
+
+
+@formatter.embed(event="pagetranslation/deletelnok")
+def embed_pagetranslation_deletelnok(ctx: Context, change: dict):
+ embed = DiscordMessage(ctx.message_type, ctx.event, ctx.webhook_url)
+ embed_helper(ctx, embed, change)
+ embed["url"] = create_article_path(sanitize_to_url(change["title"]))
+ embed["title"] = _("Failed to delete \"{article}\" which belongs to translation page \"{target}\"").format(
+ article=sanitize_to_markdown(change["title"]), target=sanitize_to_markdown(change["logparams"]["target"]))
+ return embed
+
+
+@formatter.compact(event="pagetranslation/deletelnok")
+def compact_pagetranslation_deletelnok(ctx: Context, change: dict):
+ author, author_url = compact_author(ctx, change)
+ parsed_comment = compact_summary(ctx)
+ link = clean_link(create_article_path(sanitize_to_url(change["title"])))
+ target_url = clean_link(create_article_path(sanitize_to_url(change["logparams"]["target"])))
+ content = _(
+ "[{author}]({author_url}) failed to delete [{article}]({article_url}) which belongs to translation page [{target}]({target_url}){comment}").format(
+ author=author, author_url=author_url,
+ article=sanitize_to_markdown(change["title"]), article_url=link,
+ target=sanitize_to_markdown(change["logparams"]["target"]), target_url=target_url,
+ comment=parsed_comment
+ )
+ return DiscordMessage(ctx.message_type, ctx.event, ctx.webhook_url, content=content)
+
+# pagetranslation/encourage - Encouraging to translate an article
+
+
+@formatter.embed(event="pagetranslation/encourage")
+def embed_pagetranslation_encourage(ctx: Context, change: dict):
+ embed = DiscordMessage(ctx.message_type, ctx.event, ctx.webhook_url)
+ embed_helper(ctx, embed, change)
+ embed["url"] = create_article_path(sanitize_to_url(change["title"]))
+ embed["title"] = _("Encouraged translation of \"{article}\"").format(article=sanitize_to_markdown(change["title"]))
+ return embed
+
+
+@formatter.compact(event="pagetranslation/encourage")
+def compact_pagetranslation_encourage(ctx: Context, change: dict):
+ author, author_url = compact_author(ctx, change)
+ parsed_comment = compact_summary(ctx)
+ link = clean_link(create_article_path(sanitize_to_url(change["title"])))
+ content = _("[{author}]({author_url}) encouraged translation of [{article}]({article_url}){comment}").format(
+ author=author, author_url=author_url,
+ article=sanitize_to_markdown(change["title"]), article_url=link,
+ comment=parsed_comment
+ )
+ return DiscordMessage(ctx.message_type, ctx.event, ctx.webhook_url, content=content)
+
+# pagetranslation/discourage - Discouraging to translate an article
+
+
+@formatter.embed(event="pagetranslation/discourage")
+def embed_pagetranslation_discourage(ctx: Context, change: dict):
+ embed = DiscordMessage(ctx.message_type, ctx.event, ctx.webhook_url)
+ embed_helper(ctx, embed, change)
+ embed["url"] = create_article_path(sanitize_to_url(change["title"]))
+ embed["title"] = _("Discouraged translation of \"{article}\"").format(article=sanitize_to_markdown(change["title"]))
+ return embed
+
+
+@formatter.compact(event="pagetranslation/discourage")
+def compact_pagetranslation_discourage(ctx: Context, change: dict):
+ author, author_url = compact_author(ctx, change)
+ parsed_comment = compact_summary(ctx)
+ link = clean_link(create_article_path(sanitize_to_url(change["title"])))
+ content = _("[{author}]({author_url}) discouraged translation of [{article}]({article_url}){comment}").format(
+ author=author, author_url=author_url,
+ article=sanitize_to_markdown(change["title"]), article_url=link,
+ comment=parsed_comment
+ )
+ return DiscordMessage(ctx.message_type, ctx.event, ctx.webhook_url, content=content)
+
+# pagetranslation/prioritylanguages - Changing the priority of translations?
+
+
+@formatter.embed(event="pagetranslation/prioritylanguages")
+def embed_pagetranslation_prioritylanguages(ctx: Context, change: dict):
+ embed = DiscordMessage(ctx.message_type, ctx.event, ctx.webhook_url)
+ embed_helper(ctx, embed, change)
+ embed["url"] = create_article_path(sanitize_to_url(change["title"]))
+ if "languages" in change["logparams"]:
+ languages = "`, `".join(change["logparams"]["languages"].split(","))
+ if change["logparams"]["force"] == "on":
+ embed["title"] = _("Limited languages for \"{article}\" to `{languages}`").format(article=sanitize_to_markdown(change["title"]),
+ languages=languages)
+ else:
+ embed["title"] = _("Priority languages for \"{article}\" set to `{languages}`").format(
+ article=sanitize_to_markdown(change["title"]), languages=languages)
+ else:
+ embed["title"] = _("Removed priority languages from \"{article}\"").format(article=sanitize_to_markdown(change["title"]))
+ return embed
+
+
+@formatter.compact(event="pagetranslation/prioritylanguages")
+def compact_pagetranslation_prioritylanguages(ctx: Context, change: dict):
+ author, author_url = compact_author(ctx, change)
+ parsed_comment = compact_summary(ctx)
+ link = clean_link(create_article_path(sanitize_to_url(change["title"])))
+ if "languages" in change["logparams"]:
+ languages = "`, `".join(change["logparams"]["languages"].split(","))
+ if change["logparams"]["force"] == "on":
+ content = _(
+ "[{author}]({author_url}) limited languages for [{article}]({article_url}) to `{languages}`{comment}").format(
+ author=author, author_url=author_url,
+ article=sanitize_to_markdown(change["title"]), article_url=link,
+ languages=languages, comment=parsed_comment
+ )
+ else:
+ content = _(
+ "[{author}]({author_url}) set the priority languages for [{article}]({article_url}) to `{languages}`{comment}").format(
+ author=author, author_url=author_url,
+ article=sanitize_to_markdown(change["title"]), article_url=link,
+ languages=languages, comment=parsed_comment
+ )
+ else:
+ content = _(
+ "[{author}]({author_url}) removed priority languages from [{article}]({article_url}){comment}").format(
+ author=author, author_url=author_url,
+ article=sanitize_to_markdown(change["title"]), article_url=link,
+ comment=parsed_comment
+ )
+ return DiscordMessage(ctx.message_type, ctx.event, ctx.webhook_url, content=content)
+
+
+# pagetranslation/associate - Adding an article to translation group
+
+
+@formatter.embed(event="pagetranslation/associate")
+def embed_pagetranslation_associate(ctx: Context, change: dict):
+ embed = DiscordMessage(ctx.message_type, ctx.event, ctx.webhook_url)
+ embed_helper(ctx, embed, change)
+ embed["url"] = create_article_path(sanitize_to_url(change["title"]))
+ embed["title"] = _("Added translatable page \"{article}\" to aggregate group \"{group}\"").format(
+ article=sanitize_to_markdown(change["title"]), group=change["logparams"]["aggregategroup"])
+ return embed
+
+
+@formatter.compact(event="pagetranslation/associate")
+def compact_pagetranslation_associate(ctx: Context, change: dict):
+ author, author_url = compact_author(ctx, change)
+ parsed_comment = compact_summary(ctx)
+ link = clean_link(create_article_path(sanitize_to_url(change["title"])))
+ content = _(
+ "[{author}]({author_url}) added translatable page [{article}]({article_url}) to aggregate group \"{group}\"{comment}").format(
+ author=author, author_url=author_url,
+ article=sanitize_to_markdown(change["title"]), article_url=link,
+ group=change["logparams"]["aggregategroup"], comment=parsed_comment
+ )
+ return DiscordMessage(ctx.message_type, ctx.event, ctx.webhook_url, content=content)
+
+# pagetranslation/dissociate - Removing an article from translation group
+
+
+@formatter.embed(event="pagetranslation/dissociate")
+def embed_pagetranslation_dissociate(ctx: Context, change: dict):
+ embed = DiscordMessage(ctx.message_type, ctx.event, ctx.webhook_url)
+ embed_helper(ctx, embed, change)
+ embed["url"] = create_article_path(sanitize_to_url(change["title"]))
+ embed["title"] = _("Removed translatable page \"{article}\" from aggregate group \"{group}\"").format(
+ article=sanitize_to_markdown(change["title"]), group=change["logparams"]["aggregategroup"])
+ return embed
+
+
+@formatter.compact(event="pagetranslation/dissociate")
+def compact_pagetranslation_dissociate(ctx: Context, change: dict):
+ author, author_url = compact_author(ctx, change)
+ parsed_comment = compact_summary(ctx)
+ link = clean_link(create_article_path(sanitize_to_url(change["title"])))
+ content = _(
+ "[{author}]({author_url}) removed translatable page [{article}]({article_url}) from aggregate group \"{group}\"{comment}").format(
+ author=author, author_url=author_url,
+ article=sanitize_to_markdown(change["title"]), article_url=link,
+ group=change["logparams"]["aggregategroup"], comment=parsed_comment
+ )
+ return DiscordMessage(ctx.message_type, ctx.event, ctx.webhook_url, content=content)
+
+# translationreview/message - Reviewing translation
+
+
+@formatter.embed(event="translationreview/message")
+def embed_translationreview_message(ctx: Context, change: dict):
+ embed = DiscordMessage(ctx.message_type, ctx.event, ctx.webhook_url)
+ embed_helper(ctx, embed, change)
+ link = create_article_path(sanitize_to_url(change["title"]))
+ if "?" in link:
+ embed["url"] = link + "&oldid={}".format(change["logparams"]["revision"])
+ else:
+ embed["url"] = link + "?oldid={}".format(change["logparams"]["revision"])
+ embed["title"] = _("Reviewed translation \"{article}\"").format(article=sanitize_to_markdown(change["title"]))
+ return embed
+
+
+@formatter.compact(event="translationreview/message")
+def compact_translationreview_message(ctx: Context, change: dict):
+ author, author_url = compact_author(ctx, change)
+ parsed_comment = compact_summary(ctx)
+ link = create_article_path(sanitize_to_url(change["title"]))
+ if "?" in link:
+ link = link + "&oldid={}".format(change["logparams"]["revision"])
+ else:
+ link = link + "?oldid={}".format(change["logparams"]["revision"])
+ link = clean_link(link)
+ content = _("[{author}]({author_url}) reviewed translation [{article}]({article_url}){comment}").format(
+ author=author, author_url=author_url,
+ article=sanitize_to_markdown(change["title"]), article_url=link,
+ comment=parsed_comment
+ )
+ return DiscordMessage(ctx.message_type, ctx.event, ctx.webhook_url, content=content)
+
+# translationreview/group - Changing of state for group translation?
+
+
+@formatter.embed(event="translationreview/group")
+def embed_translationreview_group(ctx: Context, change: dict):
+ embed = DiscordMessage(ctx.message_type, ctx.event, ctx.webhook_url)
+ embed_helper(ctx, embed, change)
+ embed["url"] = create_article_path(sanitize_to_url(change["title"]))
+ embed["title"] = _("Changed the state of `{language}` translations of \"{article}\"").format(
+ language=change["logparams"]["language"], article=sanitize_to_markdown(change["title"]))
+ if "old-state" in change["logparams"]:
+ embed.add_field(_("Old state"), change["logparams"]["old-state"], inline=True)
+ embed.add_field(_("New state"), change["logparams"]["new-state"], inline=True)
+ return embed
+
+
+@formatter.compact(event="translationreview/group")
+def compact_translationreview_group(ctx: Context, change: dict):
+ author, author_url = compact_author(ctx, change)
+ parsed_comment = compact_summary(ctx)
+ link = clean_link(create_article_path(sanitize_to_url(change["title"])))
+ if "old-state" in change["logparams"]:
+ content = _(
+ "[{author}]({author_url}) changed the state of `{language}` translations of [{article}]({article_url}) from `{old_state}` to `{new_state}`{comment}").format(
+ author=author, author_url=author_url, language=change["logparams"]["language"],
+ article=sanitize_to_markdown(change["logparams"]["group-label"]), article_url=link,
+ old_state=change["logparams"]["old-state"], new_state=change["logparams"]["new-state"],
+ comment=parsed_comment
+ )
+ else:
+ content = _(
+ "[{author}]({author_url}) changed the state of `{language}` translations of [{article}]({article_url}) to `{new_state}`{comment}").format(
+ author=author, author_url=author_url, language=change["logparams"]["language"],
+ article=sanitize_to_markdown(change["logparams"]["group-label"]), article_url=link,
+ new_state=change["logparams"]["new-state"], comment=parsed_comment
+ )
+ return DiscordMessage(ctx.message_type, ctx.event, ctx.webhook_url, content=content)
+
+# pagelang/pagelang - Changing the language of a page
+
+
+def get_languages(change):
+ old_lang = "`{}`".format(change["logparams"]["oldlanguage"])
+ if change["logparams"]["oldlanguage"][-5:] == "[def]":
+ old_lang = "`{}` {}".format(change["logparams"]["oldlanguage"][:-5], _("(default)"))
+ new_lang = "`{}`".format(change["logparams"]["newlanguage"])
+ if change["logparams"]["newlanguage"][-5:] == "[def]":
+ new_lang = "`{}` {}".format(change["logparams"]["oldlanguage"][:-5], _("(default)"))
+ return old_lang, new_lang
+
+@formatter.embed(event="pagelang/pagelang")
+def embed_pagelang_pagelang(ctx: Context, change: dict):
+ embed = DiscordMessage(ctx.message_type, ctx.event, ctx.webhook_url)
+ embed_helper(ctx, embed, change)
+ embed["url"] = create_article_path(sanitize_to_url(change["title"]))
+ old_lang, new_lang = get_languages(change)
+ embed["title"] = _("Changed the language of \"{article}\"").format(article=sanitize_to_markdown(change["title"]))
+ embed.add_field(_("Old language"), old_lang, inline=True)
+ embed.add_field(_("New language"), new_lang, inline=True)
+ return embed
+
+
+@formatter.compact(event="pagelang/pagelang")
+def compact_pagelang_pagelang(ctx: Context, change: dict):
+ author, author_url = compact_author(ctx, change)
+ parsed_comment = compact_summary(ctx)
+ link = clean_link(create_article_path(sanitize_to_url(change["title"])))
+ old_lang, new_lang = get_languages(change)
+ content = _(
+ "[{author}]({author_url}) changed the language of [{article}]({article_url}) from {old_lang} to {new_lang}{comment}").format(
+ author=author, author_url=author_url,
+ article=sanitize_to_markdown(change["title"]), article_url=link,
+ old_lang=old_lang, new_lang=new_lang, comment=parsed_comment
+ )
+ return DiscordMessage(ctx.message_type, ctx.event, ctx.webhook_url, content=content)
diff --git a/extensions/hooks/__init__.py b/extensions/hooks/__init__.py
new file mode 100644
index 0000000..669ca03
--- /dev/null
+++ b/extensions/hooks/__init__.py
@@ -0,0 +1,16 @@
+# This file is part of Recent changes Goat compatible Discord webhook (RcGcDw).
+#
+# RcGcDw is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# RcGcDw is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with RcGcDw. If not, see .
+
+import extensions.hooks.example_hook
\ No newline at end of file
diff --git a/extensions/hooks/edit_alerts.py b/extensions/hooks/edit_alerts.py
new file mode 100644
index 0000000..4339aff
--- /dev/null
+++ b/extensions/hooks/edit_alerts.py
@@ -0,0 +1,133 @@
+# This file is part of Recent changes Goat compatible Discord webhook (RcGcDw).
+#
+# RcGcDw is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# RcGcDw is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with RcGcDw. If not, see .
+
+from src.api.hook import post_hook
+from src.configloader import settings
+
+# {
+# "hooks": {
+# "edit_alerts": [
+# {
+# "content": "DISCORD MARKDOWN TEXT",
+# "allowed_mentions": {
+# "users": ["USERID"],
+# "roles": ["ROLEID"]
+# },
+# "requirements": [
+# {
+# "action": [
+# "edit",
+# "delete/delete",
+# "delete"
+# ],
+# "user": [
+# "USERNAME",
+# "@__anon__",
+# "@__user__"
+# ],
+# "title": [
+# "PAGETITLE"
+# ],
+# "tags": [
+# ["EDIT TAG", "AND EDIT TAG"],
+# ["OR EDIT TAG"]
+# ],
+# "categories": [
+# {
+# "added": [
+# ["CATEGORY", "AND CATEGORY"],
+# ["OR CATEGORY"]
+# ],
+# "removed": [
+# ["CATEGORY", "AND CATEGORY"],
+# ["OR CATEGORY"]
+# ]
+# }
+# ]
+# }
+# ]
+# }
+# ]
+# }
+# }
+edit_alerts = settings.get("hooks", {}).get("edit_alerts", [])
+
+
+class RequirementNotMet(Exception):
+ """Exception raised when the requirement is not met and another requirement must be processed"""
+ pass
+
+
+def check_group_requirements(change_data: list, settings_data: list):
+ """This function resolves group discussions and raises RequirementNotMet when requirement is not met"""
+ if settings_data:
+ for required_group in settings_data:
+ # test all items in required_group are in change_data (one group fulfills the requirement) return the function
+ for required_item in required_group:
+ if required_item not in change_data:
+ break
+ else:
+ break
+ else:
+ raise RequirementNotMet
+
+
+
+@post_hook
+def edit_alerts_hook(message, metadata, context, change):
+ # For every alert in edit_alerts, they can have different functions and so on
+ for alert in edit_alerts:
+ # For every requirement, if one of the requirements passes the alert gets executed
+ for requirement in alert.get("requirements", []):
+ try:
+ req_action = requirement.get("action", [])
+ # If current action isn't in config for this requirement AND current event type is not in the requirements in settings skip this requirement
+ if req_action and context.event not in req_action and context.event.split('/', 1)[0] not in req_action:
+ raise RequirementNotMet
+ req_user = requirement.get("user", [])
+ # If current user is not in config AND checkings for anon and user fail
+ if req_user and change["user"] not in req_user and ("@__anon__" if "anon" in change else "@__user__") not in req_user:
+ raise RequirementNotMet
+ req_title = requirement.get("title", [])
+ if req_title and change["title"] not in req_title:
+ raise RequirementNotMet
+ check_group_requirements(change.get("tags", []), requirement.get("tags", []))
+ if requirement.get("categories", []):
+ for req_cats in requirement.get("categories", []):
+ try:
+ check_group_requirements(context.categories.new, req_cats.get("added", []))
+ check_group_requirements(context.categories.removed, req_cats.get("removed", []))
+ except RequirementNotMet:
+ continue
+ else:
+ break
+ else:
+ raise RequirementNotMet
+ except RequirementNotMet:
+ continue
+ else:
+ break
+ else:
+ continue
+ message.webhook_object["content"] = (message.webhook_object.get("content", "") or "") + alert["content"]
+ allowed_mentions = message.webhook_object["allowed_mentions"]
+ if alert.get("allowed_mentions", {}).get("users", []):
+ if not allowed_mentions.get("users", []):
+ allowed_mentions["users"] = []
+ allowed_mentions["users"].extend(alert["allowed_mentions"]["users"])
+ if alert.get("allowed_mentions", {}).get("roles", []):
+ if not allowed_mentions.get("roles", []):
+ allowed_mentions["roles"] = []
+ allowed_mentions["roles"].extend(alert["allowed_mentions"]["roles"])
diff --git a/extensions/hooks/example_hook.py b/extensions/hooks/example_hook.py
new file mode 100644
index 0000000..ec7f889
--- /dev/null
+++ b/extensions/hooks/example_hook.py
@@ -0,0 +1,28 @@
+# This file is part of Recent changes Goat compatible Discord webhook (RcGcDw).
+#
+# RcGcDw is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# RcGcDw is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with RcGcDw. If not, see .
+
+from src.api.hook import pre_hook, post_hook
+
+
+@pre_hook
+def example_pre_hook(context, change):
+ if context.event == "edit":
+ print("I'm an edit with {} bytes changed!".format(change.get("newlen", 0) - change.get("oldlen", 0)))
+
+
+@post_hook
+def example_post_hook(message, metadata, context, change):
+ print("Our Discord message looks as follows: ")
+ print(message)
diff --git a/extensions/hooks/usertalk.py b/extensions/hooks/usertalk.py
new file mode 100644
index 0000000..75911aa
--- /dev/null
+++ b/extensions/hooks/usertalk.py
@@ -0,0 +1,38 @@
+# This file is part of Recent changes Goat compatible Discord webhook (RcGcDw).
+#
+# RcGcDw is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# RcGcDw is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with RcGcDw. If not, see .
+
+from src.api.hook import post_hook
+from src.configloader import settings
+
+# {
+# "hooks": {
+# "usertalk": {
+# "USERNAME": "USERID"
+# }
+# }
+# }
+discord_users = settings.get("hooks", {}).get("usertalk", {})
+
+@post_hook
+def usertalk_hook(message, metadata, context, change):
+ if discord_users and change["ns"] in [2, 3, 202] and not "/" in change["title"]:
+ username = change["title"].split(':', 1)[1]
+ if discord_users.get(username, "") and username != change["user"]:
+ message.webhook_object["content"] = (message.webhook_object.get("content", "") or "") + " <@{}>".format(discord_users[username])
+ if message.webhook_object["allowed_mentions"].get("users", []):
+ if discord_users[username] not in message.webhook_object["allowed_mentions"]["users"]:
+ message.webhook_object["allowed_mentions"]["users"].append(discord_users[username])
+ else:
+ message.webhook_object["allowed_mentions"]["users"] = [discord_users[username]]
diff --git a/locale/bn/LC_MESSAGES/discussion_formatters.mo b/locale/bn/LC_MESSAGES/discussion_formatters.mo
deleted file mode 100644
index 58a9365..0000000
Binary files a/locale/bn/LC_MESSAGES/discussion_formatters.mo and /dev/null differ
diff --git a/locale/bn/LC_MESSAGES/discussion_formatters.po b/locale/bn/LC_MESSAGES/discussion_formatters.po
deleted file mode 100644
index a0ce3aa..0000000
--- a/locale/bn/LC_MESSAGES/discussion_formatters.po
+++ /dev/null
@@ -1,184 +0,0 @@
-# SOME DESCRIPTIVE TITLE.
-# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
-# This file is distributed under the same license as the RcGcDw package.
-# FIRST AUTHOR , YEAR.
-#
-msgid ""
-msgstr ""
-"Project-Id-Version: RcGcDw\n"
-"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2020-11-30 11:58+0100\n"
-"PO-Revision-Date: 2020-12-30 13:26+0000\n"
-"Last-Translator: Creeper \n"
-"Language-Team: Bengali \n"
-"Language: bn\n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=UTF-8\n"
-"Content-Transfer-Encoding: 8bit\n"
-"Plural-Forms: nplurals=2; plural=n > 1;\n"
-"X-Generator: Weblate 4.2.1\n"
-
-#: src/discussion_formatters.py:25 src/discussion_formatters.py:81
-msgid "Unregistered user"
-msgstr "রেজিস্টার না করা ব্যাবহারকারি"
-
-#: src/discussion_formatters.py:34
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) created [{title}](<{url}f/p/{threadId}>) in "
-"{forumName}"
-msgstr ""
-"[{author}]({author_url}) {forumName}তে [{title}](<{url}f/p/{threadId}>) "
-"বানিয়েছে"
-
-#: src/discussion_formatters.py:36
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) created a poll [{title}](<{url}f/p/{threadId}>) in "
-"{forumName}"
-msgstr ""
-"[{author}]({author_url}) {forumName}এ পোল [{title}](<{url}f/p/{threadId}>) "
-"বানিয়েছে"
-
-#: src/discussion_formatters.py:38
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) created a quiz [{title}](<{url}f/p/{threadId}>) in "
-"{forumName}"
-msgstr ""
-"[{author}]({author_url}) {forumName}তে একটি কুইজ [{title}](<{url}f/p/"
-"{threadId}>) বানিয়েছে"
-
-#: src/discussion_formatters.py:43
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) created a [reply](<{url}f/p/{threadId}/r/{postId}>) "
-"to [{title}](<{url}f/p/{threadId}>) in {forumName}"
-msgstr ""
-"[{author}]({author_url}) {forumName}এ [{title}](<{url}f/p/{threadId}>)তে একটি"
-" [উত্তর](<{url}f/p/{threadId}/r/{postId}>) দিয়েছে"
-
-#: src/discussion_formatters.py:45 src/discussion_formatters.py:54
-#: src/discussion_formatters.py:137 src/discussion_formatters.py:150
-msgid "unknown"
-msgstr "অজানা"
-
-#: src/discussion_formatters.py:49
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) created [{title}](<{url}wiki/Message_Wall:"
-"{user_wall}?threadId={threadId}>) on [{user}'s Message Wall](<{url}wiki/"
-"Message_Wall:{user_wall}>)"
-msgstr ""
-"[{author}]({author_url}) [{user}এর মেসেজ ওয়ালে](<{url}wiki/"
-"Message_Wall:{user_wall}>)এ [{title}](<{url}wiki/"
-"Message_Wall:{user_wall}?threadId={threadId}>) বানিয়েছে"
-
-#: src/discussion_formatters.py:51
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) created a [reply](<{url}wiki/Message_Wall:"
-"{user_wall}?threadId={threadId}#{replyId}>) to [{title}](<{url}wiki/"
-"Message_Wall:{user_wall}?threadId={threadId}>) on [{user}'s Message Wall]"
-"(<{url}wiki/Message_Wall:{user_wall}>)"
-msgstr ""
-"[{author}]({author_url}) [{user}এর মেসেজ ওয়ালে](<{url}wiki/"
-"Message_Wall:{user_wall}>) [{title}](<{url}wiki/"
-"Message_Wall:{user_wall}?threadId={threadId}>)তে একটি [উত্তর](<{url}wiki/"
-"Message_Wall:{user_wall}?threadId={threadId}#{replyId}>) দিয়েছে"
-
-#: src/discussion_formatters.py:57
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) created a [comment](<{url}?commentId={commentId}>) "
-"on [{article}](<{url}>)"
-msgstr ""
-"[{author}]({author_url}) [{article}](<{url}>)এ একটি "
-"[কমেন্ট](<{url}?commentId={commentId}>) লিখেছে"
-
-#: src/discussion_formatters.py:62
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) created a [reply](<{url}?commentId={commentId}"
-"&replyId={replyId}>) to a [comment](<{url}?commentId={commentId}>) on "
-"[{article}](<{url}>)"
-msgstr ""
-"[{author}]({author_url}) [{article}](<{url}>)এর একটি "
-"[কমেন্ট](<{url}?commentId={commentId}>)এ একটি "
-"[উত্তর](<{url}?commentId={commentId}&replyId={replyId}>) দিয়েছে"
-
-#: src/discussion_formatters.py:70
-#, python-brace-format
-msgid ""
-"Unknown event `{event}` by [{author}]({author_url}), report it on the "
-"[support server](<{support}>)."
-msgstr ""
-"[{author}]({author_url})দ্বারা অজানা ঘটনা `{event}` , [সাহায্য "
-"সার্ভারে](<{support}>) রিপোর্ট করুন।"
-
-#: src/discussion_formatters.py:98
-#, python-brace-format
-msgid "Created \"{title}\""
-msgstr "\"{title}\" বানানো হলো"
-
-#: src/discussion_formatters.py:102
-#, python-brace-format
-msgid "Created a poll \"{title}\""
-msgstr "পোল \"{title}\" বানানো হলো"
-
-#: src/discussion_formatters.py:109
-msgid "Option {}"
-msgstr "বিকল্প {}"
-
-#: src/discussion_formatters.py:110
-#, python-brace-format
-msgid "__[View image]({image_url})__"
-msgstr "__[চিত্র দেখুন]({image_url})__"
-
-#: src/discussion_formatters.py:114
-#, python-brace-format
-msgid "Created a quiz \"{title}\""
-msgstr "একটি কুইজ \"{title}\" বানানো হলো"
-
-#: src/discussion_formatters.py:129 src/discussion_formatters.py:131
-msgid "Tags"
-msgstr "ট্যাগ"
-
-#: src/discussion_formatters.py:129
-msgid "{} tags"
-msgstr "{}টি ট্যাগ"
-
-#: src/discussion_formatters.py:134
-#, python-brace-format
-msgid "Replied to \"{title}\""
-msgstr "\"{title}\"এ উত্তর দেওয়া হলো"
-
-#: src/discussion_formatters.py:143
-#, python-brace-format
-msgid "Created \"{title}\" on {user}'s Message Wall"
-msgstr "{user}এর মেসেজ ওয়ালে \"{title}\" বানানো হলো"
-
-#: src/discussion_formatters.py:147
-#, python-brace-format
-msgid "Replied to \"{title}\" on {user}'s Message Wall"
-msgstr "{user}এর মেসেজ ওয়ালের \"{title}\"তে উত্তর দেওয়া হলো"
-
-#: src/discussion_formatters.py:154
-#, python-brace-format
-msgid "Commented on {article}"
-msgstr "{article}এ কমেন্ট করা হলো"
-
-#: src/discussion_formatters.py:158
-#, python-brace-format
-msgid "Replied to a comment on {article}"
-msgstr "{article}এর একটি কমেন্টে উত্তর দেওয়া হলো"
-
-#: src/discussion_formatters.py:162
-#, python-brace-format
-msgid "Unknown event `{event}`"
-msgstr "অজানা ঘটনা `{event}`"
-
-#: src/discussion_formatters.py:168 src/discussion_formatters.py:170
-msgid "Report this on the support server"
-msgstr "এটিকে সাহায্য সার্ভারে রিপোর্ট করুন"
diff --git a/locale/bn/LC_MESSAGES/formatters.mo b/locale/bn/LC_MESSAGES/formatters.mo
new file mode 100644
index 0000000..7c7f9ba
Binary files /dev/null and b/locale/bn/LC_MESSAGES/formatters.mo differ
diff --git a/locale/bn/LC_MESSAGES/rc_formatters.po b/locale/bn/LC_MESSAGES/formatters.po
similarity index 52%
rename from locale/bn/LC_MESSAGES/rc_formatters.po
rename to locale/bn/LC_MESSAGES/formatters.po
index 764eaab..7e86532 100644
--- a/locale/bn/LC_MESSAGES/rc_formatters.po
+++ b/locale/bn/LC_MESSAGES/formatters.po
@@ -7,696 +7,763 @@ msgid ""
msgstr ""
"Project-Id-Version: RcGcDw\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2020-11-30 11:58+0100\n"
-"PO-Revision-Date: 2021-04-14 14:22+0000\n"
-"Last-Translator: R4356th \n"
-"Language-Team: Bengali \n"
+"POT-Creation-Date: 2021-05-22 18:48+0200\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: Automatically generated\n"
+"Language-Team: none\n"
"Language: bn\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n > 1;\n"
-"X-Generator: Weblate 4.4.2\n"
-#: src/rc_formatters.py:28
-msgid "None"
-msgstr "কিছুই না"
-
-#: src/rc_formatters.py:28
-msgid "Warning issued"
-msgstr "সতর্কতা জারি করা হয়েছে"
-
-#: src/rc_formatters.py:28
-msgid "**Blocked user**"
-msgstr "**অবরুদ্ধ ব্যবহারকারী**"
-
-#: src/rc_formatters.py:28
-msgid "Tagged the edit"
-msgstr "সম্পাদনা ট্যাগ করা হয়েছিল"
-
-#: src/rc_formatters.py:28
-msgid "Disallowed the action"
+#: src/api/util.py:61 src/api/util.py:66
+msgid "__Only whitespace__"
msgstr ""
-#: src/rc_formatters.py:28
-msgid "**IP range blocked**"
+#: src/api/util.py:71
+msgid "Removed"
msgstr ""
-#: src/rc_formatters.py:28
-msgid "Throttled actions"
+#: src/api/util.py:73
+msgid "Added"
msgstr ""
-#: src/rc_formatters.py:28
-msgid "Removed autoconfirmed group"
-msgstr ""
-
-#: src/rc_formatters.py:28
-msgid "**Removed from privileged groups**"
-msgstr ""
-
-#: src/rc_formatters.py:29
-msgid "Edit"
-msgstr "সম্পাদনা"
-
-#: src/rc_formatters.py:29
-msgid "Upload"
-msgstr "আপলোড"
-
-#: src/rc_formatters.py:29
-msgid "Move"
-msgstr "সরানো"
-
-#: src/rc_formatters.py:29
-msgid "Stash upload"
-msgstr "স্ট্যাশ আপলোড"
-
-#: src/rc_formatters.py:29
-msgid "Deletion"
-msgstr ""
-
-#: src/rc_formatters.py:29
-msgid "Account creation"
-msgstr ""
-
-#: src/rc_formatters.py:29
-msgid "Auto account creation"
-msgstr ""
-
-#: src/rc_formatters.py:46 src/rc_formatters.py:53 src/rc_formatters.py:60
-#: src/rc_formatters.py:75 src/rc_formatters.py:96
+#: src/api/util.py:94 src/api/util.py:126 src/api/util.py:133
+#: src/api/util.py:141 extensions/base/discussions.py:247
+#: extensions/base/discussions.py:264 extensions/base/abusefilter.py:45
msgid "Unregistered user"
msgstr ""
-#: src/rc_formatters.py:83
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) triggered *{abuse_filter}*, performing the action "
-"\"{action}\" on *[{target}]({target_url})* - action taken: {result}."
+#: src/api/util.py:160
+msgctxt "recent changes Tags"
+msgid "Tags"
msgstr ""
-#: src/rc_formatters.py:85 src/rc_formatters.py:86 src/rc_formatters.py:87
-#: src/rc_formatters.py:449 src/rc_formatters.py:452 src/rc_formatters.py:455
-#: src/rc_formatters.py:456 src/rc_formatters.py:461 src/rc_formatters.py:462
-#: src/rc_formatters.py:470 src/rc_formatters.py:474 src/rc_formatters.py:650
-#: src/rc_formatters.py:651 src/rc_formatters.py:652 src/rc_formatters.py:1103
-#: src/rc_formatters.py:1106 src/rc_formatters.py:1109
-#: src/rc_formatters.py:1111 src/rc_formatters.py:1114
-#: src/rc_formatters.py:1116 src/rc_formatters.py:1122
-#: src/rc_formatters.py:1125 src/rc_formatters.py:1200
-msgid "Unknown"
+#: src/api/util.py:162
+msgid "**Added**: "
msgstr ""
-#: src/rc_formatters.py:116
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) edited [{article}]({edit_link}){comment} {bold}"
-"({sign}{edit_size}){bold}"
+#: src/api/util.py:163
+msgid " and {} more\n"
msgstr ""
-#: src/rc_formatters.py:118
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) created [{article}]({edit_link}){comment} {bold}"
-"({sign}{edit_size}){bold}"
+#: src/api/util.py:165
+msgid "**Removed**: "
msgstr ""
-#: src/rc_formatters.py:121
-#, python-brace-format
-msgid "[{author}]({author_url}) uploaded [{file}]({file_link}){comment}"
+#: src/api/util.py:166
+msgid " and {} more"
msgstr ""
-#: src/rc_formatters.py:128
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) reverted a version of [{file}]({file_link}){comment}"
+#: src/api/util.py:168
+msgid "Changed categories"
msgstr ""
-#: src/rc_formatters.py:132
+#: extensions/base/cargo.py:37
#, python-brace-format
-msgid ""
-"[{author}]({author_url}) uploaded a new version of [{file}]({file_link})"
-"{comment}"
+msgid "Created the Cargo table \"{table}\""
msgstr ""
-#: src/rc_formatters.py:135
-#, python-brace-format
-msgid "[{author}]({author_url}) deleted [{page}]({page_link}){comment}"
-msgstr ""
-
-#: src/rc_formatters.py:141
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) deleted redirect by overwriting [{page}]"
-"({page_link}){comment}"
-msgstr ""
-
-#: src/rc_formatters.py:147 src/rc_formatters.py:152
-msgid "without making a redirect"
-msgstr "পুনঃনির্দেশ না করে"
-
-#: src/rc_formatters.py:147 src/rc_formatters.py:153
-msgid "with a redirect"
-msgstr "পুনঃনির্দেশ করে"
-
-#: src/rc_formatters.py:148
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) moved {redirect}*{article}* to [{target}]"
-"({target_url}) {made_a_redirect}{comment}"
-msgstr ""
-
-#: src/rc_formatters.py:154
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) moved {redirect}*{article}* over redirect to "
-"[{target}]({target_url}) {made_a_redirect}{comment}"
-msgstr ""
-
-#: src/rc_formatters.py:159
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) moved protection settings from {redirect}*{article}"
-"* to [{target}]({target_url}){comment}"
-msgstr ""
-
-#: src/rc_formatters.py:170 src/rc_formatters.py:823
-msgid "for infinity and beyond"
-msgstr "অনন্ত এবং এর বাইরেও"
-
-#: src/rc_formatters.py:179 src/rc_formatters.py:831
-#, python-brace-format
-msgid "for {num} {translated_length}"
-msgstr "{num} {translated_length} -এর জন্য"
-
-#: src/rc_formatters.py:185 src/rc_formatters.py:835
-msgid "until {}"
-msgstr "{} অবধি"
-
-#: src/rc_formatters.py:189
-msgid " on pages: "
-msgstr ""
-
-#: src/rc_formatters.py:196 src/rc_formatters.py:849
-msgid " and namespaces: "
-msgstr ""
-
-#: src/rc_formatters.py:198
-msgid " on namespaces: "
-msgstr ""
-
-#: src/rc_formatters.py:210
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) blocked [{user}]({user_url}) {time}"
-"{restriction_desc}{comment}"
-msgstr ""
-
-#: src/rc_formatters.py:214
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) changed block settings for [{blocked_user}]"
-"({user_url}){comment}"
-msgstr ""
-
-#: src/rc_formatters.py:218
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) unblocked [{blocked_user}]({user_url}){comment}"
-msgstr ""
-
-#: src/rc_formatters.py:223
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) left a [comment]({comment}) on {target}'s profile"
-msgstr ""
-
-#: src/rc_formatters.py:225
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) left a [comment]({comment}) on their own profile"
-msgstr ""
-
-#: src/rc_formatters.py:231
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) replied to a [comment]({comment}) on {target}'s "
-"profile"
-msgstr ""
-
-#: src/rc_formatters.py:237
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) replied to a [comment]({comment}) on their own "
-"profile"
-msgstr ""
-
-#: src/rc_formatters.py:245
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) edited a [comment]({comment}) on {target}'s profile"
-msgstr ""
-
-#: src/rc_formatters.py:251
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) edited a [comment]({comment}) on their own profile"
-msgstr ""
-
-#: src/rc_formatters.py:257
-#, python-brace-format
-msgid "[{author}]({author_url}) purged a comment on {target}'s profile"
-msgstr ""
-
-#: src/rc_formatters.py:259
-#, python-brace-format
-msgid "[{author}]({author_url}) purged a comment on their own profile"
-msgstr ""
-
-#: src/rc_formatters.py:267
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) deleted a [comment]({comment}) on {target}'s profile"
-msgstr ""
-
-#: src/rc_formatters.py:269
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) deleted a [comment]({comment}) on their own profile"
-msgstr ""
-
-#: src/rc_formatters.py:274
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) edited the {field} on [{target}]({target_url})'s "
-"profile. *({desc})*"
-msgstr ""
-
-#: src/rc_formatters.py:281
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) edited the {field} on [their own]({target_url}) "
-"profile. *({desc})*"
-msgstr ""
-
-#: src/rc_formatters.py:296 src/rc_formatters.py:298 src/rc_formatters.py:945
-#: src/rc_formatters.py:947
-msgid "none"
-msgstr "কিছুই না"
-
-#: src/rc_formatters.py:301
-#, fuzzy, python-brace-format
-msgid ""
-"[{author}]({author_url}) changed group membership for [{target}]"
-"({target_url}) from {old_groups} to {new_groups}{comment}"
-msgstr ""
-"[{author}]({author_url}) [{target}] ({target_url})-এর দলীয় সদস্যপদ "
-"{old_groups} থেকে {new_groups} -এ পরিবর্তন করেছেন {comment}"
-
-#: src/rc_formatters.py:303
-#, python-brace-format
-msgid ""
-"{author} autopromoted [{target}]({target_url}) from {old_groups} to "
-"{new_groups}{comment}"
-msgstr ""
-
-#: src/rc_formatters.py:304 src/rc_formatters.py:933
-msgid "System"
-msgstr "পদ্ধতি"
-
-#: src/rc_formatters.py:309
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) protected [{article}]({article_url}) with the "
-"following settings: {settings}{comment}"
-msgstr ""
-
-#: src/rc_formatters.py:311 src/rc_formatters.py:319 src/rc_formatters.py:955
-#: src/rc_formatters.py:961
-msgid " [cascading]"
-msgstr ""
-
-#: src/rc_formatters.py:316
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) modified protection settings of [{article}]"
-"({article_url}) to: {settings}{comment}"
-msgstr ""
-
-#: src/rc_formatters.py:323
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) removed protection from [{article}]({article_url})"
-"{comment}"
-msgstr ""
-
-#: src/rc_formatters.py:327
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) changed visibility of revision on page [{article}]"
-"({article_url}){comment}"
-msgid_plural ""
-"[{author}]({author_url}) changed visibility of {amount} revisions on page "
-"[{article}]({article_url}){comment}"
-msgstr[0] ""
-msgstr[1] ""
-
-#: src/rc_formatters.py:340
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) imported [{article}]({article_url}) with {count} "
-"revision{comment}"
-msgid_plural ""
-"[{author}]({author_url}) imported [{article}]({article_url}) with {count} "
-"revisions{comment}"
-msgstr[0] ""
-msgstr[1] ""
-
-#: src/rc_formatters.py:345
-#, python-brace-format
-msgid "[{author}]({author_url}) restored [{article}]({article_url}){comment}"
-msgstr ""
-
-#: src/rc_formatters.py:347
-#, python-brace-format
-msgid "[{author}]({author_url}) changed visibility of log events{comment}"
-msgstr ""
-
-#: src/rc_formatters.py:359
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) imported [{article}]({article_url}) with {count} "
-"revision from [{source}]({source_url}){comment}"
-msgid_plural ""
-"[{author}]({author_url}) imported [{article}]({article_url}) with {count} "
-"revisions from [{source}]({source_url}){comment}"
-msgstr[0] ""
-msgstr[1] ""
-
-#: src/rc_formatters.py:364
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) edited abuse filter [number {number}]({filter_url})"
-msgstr ""
-
-#: src/rc_formatters.py:368
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) created abuse filter [number {number}]({filter_url})"
-msgstr ""
-
-#: src/rc_formatters.py:372
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) merged revision histories of [{article}]"
-"({article_url}) into [{dest}]({dest_url}){comment}"
-msgstr ""
-
-#: src/rc_formatters.py:375
-#, python-brace-format
-msgid "Account [{author}]({author_url}) was created automatically"
-msgstr "[{author}]({author_url}) অ্যাকাউন্টটি স্বয়ংক্রিয়ভাবে তৈরি হয়েছে"
-
-#: src/rc_formatters.py:377 src/rc_formatters.py:385
-#, python-brace-format
-msgid "Account [{author}]({author_url}) was created"
-msgstr "ব্যবহারকারী অ্যাকাউন্ট [{author}]({author_url}) তৈরি করা হয়েছে"
-
-#: src/rc_formatters.py:380
-#, python-brace-format
-msgid ""
-"Account [{article}]({article_url}) was created by [{author}]({author_url})"
-"{comment}"
-msgstr ""
-
-#: src/rc_formatters.py:383
-#, python-brace-format
-msgid ""
-"Account [{article}]({article_url}) was created by [{author}]({author_url}) "
-"and password was sent by email{comment}"
-msgstr ""
-
-#: src/rc_formatters.py:388
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) added an entry to the [interwiki table]"
-"({table_url}) pointing to {website} with {prefix} prefix"
-msgstr ""
-
-#: src/rc_formatters.py:394
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) edited an entry in [interwiki table]({table_url}) "
-"pointing to {website} with {prefix} prefix"
-msgstr ""
-
-#: src/rc_formatters.py:400
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) deleted an entry in [interwiki table]({table_url})"
-msgstr ""
-
-#: src/rc_formatters.py:403
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) changed the content model of the page [{article}]"
-"({article_url}) from {old} to {new}{comment}"
-msgstr ""
-
-#: src/rc_formatters.py:407
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) edited the sprite for [{article}]({article_url})"
-msgstr ""
-
-#: src/rc_formatters.py:410
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) created the sprite sheet for [{article}]"
-"({article_url})"
-msgstr ""
-
-#: src/rc_formatters.py:413
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) edited the slice for [{article}]({article_url})"
-msgstr ""
-
-#: src/rc_formatters.py:418
+#: extensions/base/cargo.py:45
#, python-brace-format
msgid "[{author}]({author_url}) created the Cargo table \"{table}\""
msgstr ""
-#: src/rc_formatters.py:420
+#: extensions/base/cargo.py:60
#, python-brace-format
-msgid "[{author}]({author_url}) deleted the Cargo table \"{table}\""
+msgid "Recreated the Cargo table \"{table}\""
msgstr ""
-#: src/rc_formatters.py:425
+#: extensions/base/cargo.py:68
#, python-brace-format
msgid "[{author}]({author_url}) recreated the Cargo table \"{table}\""
msgstr ""
-#: src/rc_formatters.py:430
+#: extensions/base/cargo.py:83
+#, python-brace-format
+msgid "Replaced the Cargo table \"{table}\""
+msgstr ""
+
+#: extensions/base/cargo.py:91
#, python-brace-format
msgid "[{author}]({author_url}) replaced the Cargo table \"{table}\""
msgstr ""
-#: src/rc_formatters.py:433
+#: extensions/base/cargo.py:105
#, python-brace-format
-msgid "[{author}]({author_url}) created a [tag]({tag_url}) \"{tag}\""
+msgid "Deleted the Cargo table \"{table}\""
msgstr ""
-#: src/rc_formatters.py:437
+#: extensions/base/cargo.py:112
#, python-brace-format
-msgid "[{author}]({author_url}) deleted a [tag]({tag_url}) \"{tag}\""
+msgid "[{author}]({author_url}) deleted the Cargo table \"{table}\""
msgstr ""
-#: src/rc_formatters.py:441
+#: extensions/base/translate.py:41
#, python-brace-format
-msgid "[{author}]({author_url}) activated a [tag]({tag_url}) \"{tag}\""
+msgid "Marked \"{article}\" for translation"
msgstr ""
-#: src/rc_formatters.py:444
-#, python-brace-format
-msgid "[{author}]({author_url}) deactivated a [tag]({tag_url}) \"{tag}\""
-msgstr ""
-
-#: src/rc_formatters.py:446
-#, python-brace-format
-msgid "[{author}]({author_url}) changed wiki settings{reason}"
-msgstr ""
-
-#: src/rc_formatters.py:448
-#, python-brace-format
-msgid "[{author}]({author_url}) deleted a wiki *{wiki_name}*{comment}"
-msgstr ""
-
-#: src/rc_formatters.py:451
-#, python-brace-format
-msgid "[{author}]({author_url}) locked a wiki *{wiki_name}*{comment}"
-msgstr ""
-
-#: src/rc_formatters.py:454
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) modified a namespace *{namespace_name}* on "
-"*{wiki_name}*{comment}"
-msgstr ""
-
-#: src/rc_formatters.py:459
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) deleted a namespace *{namespace_name}* on "
-"*{wiki_name}*{comment}"
-msgstr ""
-
-#: src/rc_formatters.py:465
-#, python-brace-format
-msgid "[{author}]({author_url}) modified user group *{group_name}*{comment}"
-msgstr ""
-
-#: src/rc_formatters.py:469
-#, python-brace-format
-msgid "[{author}]({author_url}) restored a wiki *{wiki_name}*{comment}"
-msgstr ""
-
-#: src/rc_formatters.py:473
-#, python-brace-format
-msgid "[{author}]({author_url}) unlocked a wiki *{wiki_name}*{comment}"
-msgstr ""
-
-#: src/rc_formatters.py:484
+#: extensions/base/translate.py:55
#, python-brace-format
msgid ""
"[{author}]({author_url}) marked [{article}]({article_url}) for "
"translation{comment}"
msgstr ""
-"[{author}]({author_url}) [{article}]({article_url}) অনুবাদের জন্য চিহ্নিত "
-"করেছেন {comment}"
-#: src/rc_formatters.py:491
+#: extensions/base/translate.py:70
+#, python-brace-format
+msgid "Removed \"{article}\" from the translation system"
+msgstr ""
+
+#: extensions/base/translate.py:80
#, python-brace-format
msgid ""
"[{author}]({author_url}) removed [{article}]({article_url}) from the "
"translation system{comment}"
msgstr ""
-"[{author}]({author_url}) অনুবাদের পাতা [{article}]({article_url}) অপসারণ "
-"করেছেন {comment}"
-#: src/rc_formatters.py:498
+#: extensions/base/translate.py:95
+#, python-brace-format
+msgid "Completed moving translation pages from \"{article}\" to \"{target}\""
+msgstr ""
+
+#: extensions/base/translate.py:106
#, python-brace-format
msgid ""
"[{author}]({author_url}) completed moving translation pages from *{article}* "
"to [{target}]({target_url}){comment}"
msgstr ""
-#: src/rc_formatters.py:506
+#: extensions/base/translate.py:121
+#, python-brace-format
+msgid "Encountered a problem while moving \"{article}\" to \"{target}\""
+msgstr ""
+
+#: extensions/base/translate.py:133
#, python-brace-format
msgid ""
"[{author}]({author_url}) encountered a problem while moving [{article}]"
"({article_url}) to [{target}]({target_url}){comment}"
msgstr ""
-#: src/rc_formatters.py:514
+#: extensions/base/translate.py:149
#, python-brace-format
msgid ""
-"[{author}]({author_url}) completed deletion of translatable page [{article}]"
-"({article_url}){comment}"
+"Failed to delete \"{article}\" which belongs to translatable page "
+"\"{target}\""
msgstr ""
-#: src/rc_formatters.py:522
+#: extensions/base/translate.py:161
#, python-brace-format
msgid ""
"[{author}]({author_url}) failed to delete [{article}]({article_url}) which "
"belongs to translatable page [{target}]({target_url}){comment}"
msgstr ""
-#: src/rc_formatters.py:530
+#: extensions/base/translate.py:177
+#, python-brace-format
+msgid "Completed deletion of translation page \"{article}\""
+msgstr ""
+
+#: extensions/base/translate.py:188
#, python-brace-format
msgid ""
"[{author}]({author_url}) completed deletion of translation page [{article}]"
"({article_url}){comment}"
msgstr ""
-#: src/rc_formatters.py:538
+#: extensions/base/translate.py:203
+#, python-brace-format
+msgid ""
+"Failed to delete \"{article}\" which belongs to translation page \"{target}\""
+msgstr ""
+
+#: extensions/base/translate.py:215
#, python-brace-format
msgid ""
"[{author}]({author_url}) failed to delete [{article}]({article_url}) which "
"belongs to translation page [{target}]({target_url}){comment}"
msgstr ""
-#: src/rc_formatters.py:546
+#: extensions/base/translate.py:231
+#, python-brace-format
+msgid "Encouraged translation of \"{article}\""
+msgstr ""
+
+#: extensions/base/translate.py:240
#, python-brace-format
msgid ""
"[{author}]({author_url}) encouraged translation of [{article}]({article_url})"
"{comment}"
msgstr ""
-#: src/rc_formatters.py:553
+#: extensions/base/translate.py:255
+#, python-brace-format
+msgid "Discouraged translation of \"{article}\""
+msgstr ""
+
+#: extensions/base/translate.py:264
#, python-brace-format
msgid ""
"[{author}]({author_url}) discouraged translation of [{article}]"
"({article_url}){comment}"
msgstr ""
-#: src/rc_formatters.py:563
+#: extensions/base/translate.py:282
+#, python-brace-format
+msgid "Limited languages for \"{article}\" to `{languages}`"
+msgstr ""
+
+#: extensions/base/translate.py:285
+#, python-brace-format
+msgid "Priority languages for \"{article}\" set to `{languages}`"
+msgstr ""
+
+#: extensions/base/translate.py:288
+#, python-brace-format
+msgid "Removed priority languages from \"{article}\""
+msgstr ""
+
+#: extensions/base/translate.py:301
#, python-brace-format
msgid ""
"[{author}]({author_url}) limited languages for [{article}]({article_url}) to "
"`{languages}`{comment}"
msgstr ""
-#: src/rc_formatters.py:569
+#: extensions/base/translate.py:308
#, python-brace-format
msgid ""
"[{author}]({author_url}) set the priority languages for [{article}]"
"({article_url}) to `{languages}`{comment}"
msgstr ""
-#: src/rc_formatters.py:575
+#: extensions/base/translate.py:315
#, python-brace-format
msgid ""
"[{author}]({author_url}) removed priority languages from [{article}]"
"({article_url}){comment}"
msgstr ""
-#: src/rc_formatters.py:582
+#: extensions/base/translate.py:331
+#, python-brace-format
+msgid "Added translatable page \"{article}\" to aggregate group \"{group}\""
+msgstr ""
+
+#: extensions/base/translate.py:342
#, python-brace-format
msgid ""
"[{author}]({author_url}) added translatable page [{article}]({article_url}) "
"to aggregate group \"{group}\"{comment}"
msgstr ""
-#: src/rc_formatters.py:589
+#: extensions/base/translate.py:357
+#, python-brace-format
+msgid ""
+"Removed translatable page \"{article}\" from aggregate group \"{group}\""
+msgstr ""
+
+#: extensions/base/translate.py:368
#, python-brace-format
msgid ""
"[{author}]({author_url}) removed translatable page [{article}]"
"({article_url}) from aggregate group \"{group}\"{comment}"
msgstr ""
-#: src/rc_formatters.py:601
+#: extensions/base/translate.py:387
+#, python-brace-format
+msgid "Reviewed translation \"{article}\""
+msgstr ""
+
+#: extensions/base/translate.py:401
#, python-brace-format
msgid ""
"[{author}]({author_url}) reviewed translation [{article}]({article_url})"
"{comment}"
msgstr ""
-#: src/rc_formatters.py:609
+#: extensions/base/translate.py:416
+#, python-brace-format
+msgid "Changed the state of `{language}` translations of \"{article}\""
+msgstr ""
+
+#: extensions/base/translate.py:419
+msgid "Old state"
+msgstr ""
+
+#: extensions/base/translate.py:420
+msgid "New state"
+msgstr ""
+
+#: extensions/base/translate.py:431
#, python-brace-format
msgid ""
"[{author}]({author_url}) changed the state of `{language}` translations of "
"[{article}]({article_url}) from `{old_state}` to `{new_state}`{comment}"
msgstr ""
-#: src/rc_formatters.py:616
+#: extensions/base/translate.py:439
#, python-brace-format
msgid ""
"[{author}]({author_url}) changed the state of `{language}` translations of "
"[{article}]({article_url}) to `{new_state}`{comment}"
msgstr ""
-#: src/rc_formatters.py:625
+#: extensions/base/translate.py:452 extensions/base/translate.py:455
+msgid "(default)"
+msgstr ""
+
+#: extensions/base/translate.py:464
+#, python-brace-format
+msgid "Changed the language of \"{article}\""
+msgstr ""
+
+#: extensions/base/translate.py:465
+msgid "Old language"
+msgstr ""
+
+#: extensions/base/translate.py:466
+msgid "New language"
+msgstr ""
+
+#: extensions/base/translate.py:477
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) changed the language of [{article}]({article_url}) "
+"from {old_lang} to {new_lang}{comment}"
+msgstr ""
+
+#: extensions/base/discussions.py:148 extensions/base/discussions.py:207
+#: extensions/base/discussions.py:245 extensions/base/discussions.py:261
+#: extensions/base/discussions.py:284 extensions/base/discussions.py:306
+#: extensions/base/discussions.py:334 extensions/base/discussions.py:354
+msgid "unknown"
+msgstr ""
+
+#: extensions/base/discussions.py:157
+#, python-brace-format
+msgid "Created \"{title}\""
+msgstr ""
+
+#: extensions/base/discussions.py:161
+#, python-brace-format
+msgid "Created a poll \"{title}\""
+msgstr ""
+
+#: extensions/base/discussions.py:168
+msgid "Option {}"
+msgstr ""
+
+#: extensions/base/discussions.py:170
+#, python-brace-format
+msgid "__[View image]({image_url})__"
+msgstr ""
+
+#: extensions/base/discussions.py:174
+#, python-brace-format
+msgid "Created a quiz \"{title}\""
+msgstr ""
+
+#: extensions/base/discussions.py:193 extensions/base/discussions.py:195
+msgctxt "Fandom discussions Tags/Forums"
+msgid "Tags"
+msgstr ""
+
+#: extensions/base/discussions.py:193
+msgctxt "Fandom discussions amount of Tags/Forums"
+msgid "{} tags"
+msgstr ""
+
+#: extensions/base/discussions.py:198
+#, python-brace-format
+msgid "Replied to \"{title}\""
+msgstr ""
+
+#: extensions/base/discussions.py:214
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) created [{title}](<{url}f/p/{threadId}>) in "
+"{forumName}"
+msgstr ""
+
+#: extensions/base/discussions.py:217
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) created a poll [{title}](<{url}f/p/{threadId}>) in "
+"{forumName}"
+msgstr ""
+
+#: extensions/base/discussions.py:220
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) created a quiz [{title}](<{url}f/p/{threadId}>) in "
+"{forumName}"
+msgstr ""
+
+#: extensions/base/discussions.py:234
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) created a [reply](<{url}f/p/{threadId}/r/{postId}>) "
+"to [{title}](<{url}f/p/{threadId}>) in {forumName}"
+msgstr ""
+
+#: extensions/base/discussions.py:292
+#, python-brace-format
+msgid "Created \"{title}\" on {user}'s Message Wall"
+msgstr ""
+
+#: extensions/base/discussions.py:298
+#, python-brace-format
+msgid "Replied to \"{title}\" on {user}'s Message Wall"
+msgstr ""
+
+#: extensions/base/discussions.py:312
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) created [{title}](<{url}wiki/Message_Wall:"
+"{user_wall}?threadId={threadId}>) on [{user}'s Message Wall](<{url}wiki/"
+"Message_Wall:{user_wall}>)"
+msgstr ""
+
+#: extensions/base/discussions.py:318
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) created a [reply](<{url}wiki/Message_Wall:"
+"{user_wall}?threadId={threadId}#{replyId}>) to [{title}](<{url}wiki/"
+"Message_Wall:{user_wall}?threadId={threadId}>) on [{user}'s Message Wall]"
+"(<{url}wiki/Message_Wall:{user_wall}>)"
+msgstr ""
+
+#: extensions/base/discussions.py:338
+#, python-brace-format
+msgid "Commented on {article}"
+msgstr ""
+
+#: extensions/base/discussions.py:344
+#, python-brace-format
+msgid "Replied to a comment on {article}"
+msgstr ""
+
+#: extensions/base/discussions.py:359
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) created a [comment](<{url}?commentId={commentId}>) "
+"on [{article}](<{url}>)"
+msgstr ""
+
+#: extensions/base/discussions.py:365
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) created a [reply](<{url}?commentId={commentId}"
+"&replyId={replyId}>) to a [comment](<{url}?commentId={commentId}>) on "
+"[{article}](<{url}>)"
+msgstr ""
+
+#: extensions/base/managewiki.py:34
+msgid "Changed wiki settings"
+msgstr ""
+
+#: extensions/base/managewiki.py:44
+#, python-brace-format
+msgid "[{author}]({author_url}) changed wiki settings{reason}"
+msgstr ""
+
+#: extensions/base/managewiki.py:55
+#, python-brace-format
+msgid "Deleted a \"{wiki}\" wiki"
+msgstr ""
+
+#: extensions/base/managewiki.py:55 extensions/base/managewiki.py:67
+#: extensions/base/managewiki.py:103 extensions/base/managewiki.py:112
+#: extensions/base/managewiki.py:125 extensions/base/managewiki.py:126
+#: extensions/base/managewiki.py:135 extensions/base/managewiki.py:136
+#: extensions/base/managewiki.py:148 extensions/base/managewiki.py:149
+#: extensions/base/managewiki.py:160 extensions/base/managewiki.py:161
+#: extensions/base/managewiki.py:195 extensions/base/managewiki.py:204
+#: extensions/base/managewiki.py:217 extensions/base/managewiki.py:226
+#: extensions/base/abusefilter.py:55 extensions/base/abusefilter.py:56
+#: extensions/base/abusefilter.py:57 extensions/base/abusefilter.py:68
+#: extensions/base/abusefilter.py:69 extensions/base/abusefilter.py:70
+#: extensions/base/mediawiki.py:744
+msgid "Unknown"
+msgstr ""
+
+#: extensions/base/managewiki.py:63
+#, python-brace-format
+msgid "[{author}]({author_url}) deleted a wiki *{wiki_name}*{comment}"
+msgstr ""
+
+#: extensions/base/managewiki.py:80
+#, python-brace-format
+msgid "Deleted a \"{group}\" user group"
+msgstr ""
+
+#: extensions/base/managewiki.py:89
+#, python-brace-format
+msgid "[{author}]({author_url}) deleted a usergroup *{group}*{comment}"
+msgstr ""
+
+#: extensions/base/managewiki.py:103
+#, python-brace-format
+msgid "Locked a \"{wiki}\" wiki"
+msgstr ""
+
+#: extensions/base/managewiki.py:111
+#, python-brace-format
+msgid "[{author}]({author_url}) locked a wiki *{wiki_name}*{comment}"
+msgstr ""
+
+#: extensions/base/managewiki.py:124
+#, python-brace-format
+msgid "Modified \"{namespace_name}\" namespace"
+msgstr ""
+
+#: extensions/base/managewiki.py:126 extensions/base/managewiki.py:149
+msgid "Wiki"
+msgstr ""
+
+#: extensions/base/managewiki.py:134
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) modified namespace *{namespace_name}* on "
+"*{wiki_name}*{comment}"
+msgstr ""
+
+#: extensions/base/managewiki.py:147
+#, python-brace-format
+msgid "Deleted a \"{namespace_name}\" namespace"
+msgstr ""
+
+#: extensions/base/managewiki.py:158
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) deleted a namespace *{namespace_name}* on "
+"*{wiki_name}*{comment}"
+msgstr ""
+
+#: extensions/base/managewiki.py:173
+#, python-brace-format
+msgid "Modified \"{usergroup_name}\" usergroup"
+msgstr ""
+
+#: extensions/base/managewiki.py:182
+#, python-brace-format
+msgid "[{author}]({author_url}) modified user group *{group_name}*{comment}"
+msgstr ""
+
+#: extensions/base/managewiki.py:195
+#, python-brace-format
+msgid "Undeleted a \"{wiki}\" wiki"
+msgstr ""
+
+#: extensions/base/managewiki.py:203
+#, python-brace-format
+msgid "[{author}]({author_url}) undeleted a wiki *{wiki_name}*{comment}"
+msgstr ""
+
+#: extensions/base/managewiki.py:217
+#, python-brace-format
+msgid "Unlocked a \"{wiki}\" wiki"
+msgstr ""
+
+#: extensions/base/managewiki.py:225
+#, python-brace-format
+msgid "[{author}]({author_url}) unlocked a wiki *{wiki_name}*{comment}"
+msgstr ""
+
+#: extensions/base/datadump.py:36
+#, python-brace-format
+msgid "Generated {file} dump"
+msgstr ""
+
+#: extensions/base/datadump.py:45
+#, python-brace-format
+msgid "[{author}]({author_url}) generated *{file}* dump{comment}"
+msgstr ""
+
+#: extensions/base/datadump.py:58
+#, python-brace-format
+msgid "Deleted {file} dump"
+msgstr ""
+
+#: extensions/base/datadump.py:67
+#, python-brace-format
+msgid "[{author}]({author_url}) deleted *{file}* dump{comment}"
+msgstr ""
+
+#: extensions/base/curseprofile.py:40
+#, python-brace-format
+msgid "Edited {target}'s profile"
+msgstr ""
+
+#: extensions/base/curseprofile.py:42
+msgid "Edited their own profile"
+msgstr ""
+
+#: extensions/base/curseprofile.py:44
+#, python-brace-format
+msgid "Cleared the {field} field"
+msgstr ""
+
+#: extensions/base/curseprofile.py:46
+#, python-brace-format
+msgid "{field} field changed to: {desc}"
+msgstr ""
+
+#: extensions/base/curseprofile.py:58
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) cleared the {field} on [{target}]({target_url})'s "
+"profile."
+msgstr ""
+
+#: extensions/base/curseprofile.py:60
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) edited the {field} on [{target}]({target_url})'s "
+"profile. *({desc})*"
+msgstr ""
+
+#: extensions/base/curseprofile.py:65
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) cleared the {field} on [their own]({target_url}) "
+"profile."
+msgstr ""
+
+#: extensions/base/curseprofile.py:67
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) edited the {field} on [their own]({target_url}) "
+"profile. *({desc})*"
+msgstr ""
+
+#: extensions/base/curseprofile.py:82
+#, python-brace-format
+msgid "Left a comment on {target}'s profile"
+msgstr ""
+
+#: extensions/base/curseprofile.py:84
+msgid "Left a comment on their own profile"
+msgstr ""
+
+#: extensions/base/curseprofile.py:97
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) left a [comment]({comment}) on {target}'s profile."
+msgstr ""
+
+#: extensions/base/curseprofile.py:100
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) left a [comment]({comment}) on their own profile."
+msgstr ""
+
+#: extensions/base/curseprofile.py:113
+#, python-brace-format
+msgid "Edited a comment on {target}'s profile"
+msgstr ""
+
+#: extensions/base/curseprofile.py:115
+msgid "Edited a comment on their own profile"
+msgstr ""
+
+#: extensions/base/curseprofile.py:128
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) edited a [comment]({comment}) on {target}'s profile."
+msgstr ""
+
+#: extensions/base/curseprofile.py:131
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) edited a [comment]({comment}) on their own profile."
+msgstr ""
+
+#: extensions/base/curseprofile.py:144
+#, python-brace-format
+msgid "Replied to a comment on {target}'s profile"
+msgstr ""
+
+#: extensions/base/curseprofile.py:146
+msgid "Replied to a comment on their own profile"
+msgstr ""
+
+#: extensions/base/curseprofile.py:159
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) replied to a [comment]({comment}) on {target}'s "
+"profile."
+msgstr ""
+
+#: extensions/base/curseprofile.py:162
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) replied to a [comment]({comment}) on their own "
+"profile."
+msgstr ""
+
+#: extensions/base/curseprofile.py:175
+#, python-brace-format
+msgid "Deleted a comment on {target}'s profile"
+msgstr ""
+
+#: extensions/base/curseprofile.py:177
+msgid "Deleted a comment on their own profile"
+msgstr ""
+
+#: extensions/base/curseprofile.py:197
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) deleted a [comment]({comment}) on {target}'s "
+"profile.{reason}"
+msgstr ""
+
+#: extensions/base/curseprofile.py:200
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) deleted a [comment]({comment}) on their own profile."
+"{reason}"
+msgstr ""
+
+#: extensions/base/curseprofile.py:214
+#, python-brace-format
+msgid "Purged a comment on {target}'s profile"
+msgstr ""
+
+#: extensions/base/curseprofile.py:216
+msgid "Purged a comment on their own profile"
+msgstr ""
+
+#: extensions/base/curseprofile.py:230
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) purged a comment on [{target}]({link})'s profile."
+"{reason}"
+msgstr ""
+
+#: extensions/base/curseprofile.py:233
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) purged a comment on [their own]({link}) profile."
+"{reason}"
+msgstr ""
+
+#: extensions/base/renameuser.py:38
+#, python-brace-format
+msgid "Renamed user \"{old_name}\" with {edits} edit to \"{new_name}\""
+msgid_plural "Renamed user \"{old_name}\" with {edits} edits to \"{new_name}\""
+msgstr[0] ""
+msgstr[1] ""
+
+#: extensions/base/renameuser.py:43
+#, python-brace-format
+msgid "Renamed user \"{old_name}\" to \"{new_name}\""
+msgstr ""
+
+#: extensions/base/renameuser.py:58
#, python-brace-format
msgid ""
"[{author}]({author_url}) renamed user *{old_name}* with {edits} edit to "
@@ -707,601 +774,831 @@ msgid_plural ""
msgstr[0] ""
msgstr[1] ""
-#: src/rc_formatters.py:630
+#: extensions/base/renameuser.py:66
#, python-brace-format
msgid ""
"[{author}]({author_url}) renamed user *{old_name}* to [{new_name}]({link})"
"{comment}"
msgstr ""
-#: src/rc_formatters.py:634
-msgid "An action has been hidden by administration."
+#: extensions/base/interwiki.py:37
+msgid "Added an entry to the interwiki table"
msgstr ""
-#: src/rc_formatters.py:641
+#: extensions/base/interwiki.py:38 extensions/base/interwiki.py:65
+#, python-brace-format
+msgid "Prefix: {prefix}, website: {website} | {desc}"
+msgstr ""
+
+#: extensions/base/interwiki.py:50
#, python-brace-format
msgid ""
-"Unknown event `{event}` by [{author}]({author_url}), report it on the "
-"[support server](<{support}>)."
+"[{author}]({author_url}) added an entry to the [interwiki table]"
+"({table_url}) pointing to {website} with {prefix} prefix"
msgstr ""
-#: src/rc_formatters.py:649
+#: extensions/base/interwiki.py:64
+msgid "Edited an entry in interwiki table"
+msgstr ""
+
+#: extensions/base/interwiki.py:77
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) edited an entry in [interwiki table]({table_url}) "
+"pointing to {website} with {prefix} prefix"
+msgstr ""
+
+#: extensions/base/interwiki.py:91
+msgid "Deleted an entry in interwiki table"
+msgstr ""
+
+#: extensions/base/interwiki.py:92
+#, python-brace-format
+msgid "Prefix: {prefix} | {desc}"
+msgstr ""
+
+#: extensions/base/interwiki.py:102
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) deleted an entry in [interwiki table]({table_url})"
+"{desc}"
+msgstr ""
+
+#: extensions/base/abusefilter.py:29
+msgid "None"
+msgstr ""
+
+#: extensions/base/abusefilter.py:29
+msgid "Warning issued"
+msgstr ""
+
+#: extensions/base/abusefilter.py:29
+msgid "**Blocked user**"
+msgstr ""
+
+#: extensions/base/abusefilter.py:29
+msgid "Tagged the edit"
+msgstr ""
+
+#: extensions/base/abusefilter.py:29
+msgid "Disallowed the action"
+msgstr ""
+
+#: extensions/base/abusefilter.py:29
+msgid "**IP range blocked**"
+msgstr ""
+
+#: extensions/base/abusefilter.py:29
+msgid "Throttled actions"
+msgstr ""
+
+#: extensions/base/abusefilter.py:29
+msgid "Removed autoconfirmed group"
+msgstr ""
+
+#: extensions/base/abusefilter.py:29
+msgid "**Removed from privileged groups**"
+msgstr ""
+
+#: extensions/base/abusefilter.py:30
+msgid "Edit"
+msgstr ""
+
+#: extensions/base/abusefilter.py:30
+msgid "Upload"
+msgstr ""
+
+#: extensions/base/abusefilter.py:30
+msgid "Move"
+msgstr ""
+
+#: extensions/base/abusefilter.py:30
+msgid "Stash upload"
+msgstr ""
+
+#: extensions/base/abusefilter.py:30
+msgid "Deletion"
+msgstr ""
+
+#: extensions/base/abusefilter.py:30
+msgid "Account creation"
+msgstr ""
+
+#: extensions/base/abusefilter.py:30
+msgid "Auto account creation"
+msgstr ""
+
+#: extensions/base/abusefilter.py:54
#, python-brace-format
msgid "{user} triggered \"{abuse_filter}\""
msgstr ""
-#: src/rc_formatters.py:650
+#: extensions/base/abusefilter.py:55
msgid "Performed"
-msgstr "সম্পাদিত"
+msgstr ""
-#: src/rc_formatters.py:651
+#: extensions/base/abusefilter.py:56
msgid "Action taken"
-msgstr "ব্যবস্থা নেওয়া হয়েছে"
+msgstr ""
-#: src/rc_formatters.py:652
+#: extensions/base/abusefilter.py:57
msgid "Title"
-msgstr "শিরোনাম"
+msgstr ""
-#: src/rc_formatters.py:661 src/rc_formatters.py:948
-msgid "No description provided"
-msgstr "কোনও বিবরণ সরবরাহ করা হয়নি"
+#: extensions/base/abusefilter.py:66
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) triggered *{abuse_filter}*, performing the action "
+"\"{action}\" on *[{target}]({target_url})* - action taken: {result}."
+msgstr ""
-#: src/rc_formatters.py:685
+#: extensions/base/abusefilter.py:83
+#, python-brace-format
+msgid "Edited abuse filter number {number}"
+msgstr ""
+
+#: extensions/base/abusefilter.py:95
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) edited abuse filter [number {number}]({filter_url})"
+msgstr ""
+
+#: extensions/base/abusefilter.py:111
+#, python-brace-format
+msgid "Created abuse filter number {number}"
+msgstr ""
+
+#: extensions/base/abusefilter.py:119
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) created abuse filter [number {number}]({filter_url})"
+msgstr ""
+
+#: extensions/base/mediawiki.py:37
+msgid "director"
+msgstr ""
+
+#: extensions/base/mediawiki.py:37
+msgid "bot"
+msgstr ""
+
+#: extensions/base/mediawiki.py:37
+msgid "editor"
+msgstr ""
+
+#: extensions/base/mediawiki.py:37
+msgid "directors"
+msgstr ""
+
+#: extensions/base/mediawiki.py:37
+msgid "sysop"
+msgstr ""
+
+#: extensions/base/mediawiki.py:37
+msgid "bureaucrat"
+msgstr ""
+
+#: extensions/base/mediawiki.py:37
+msgid "reviewer"
+msgstr ""
+
+#: extensions/base/mediawiki.py:38
+msgid "autoreview"
+msgstr ""
+
+#: extensions/base/mediawiki.py:38
+msgid "autopatrol"
+msgstr ""
+
+#: extensions/base/mediawiki.py:38
+msgid "wiki_guardian"
+msgstr ""
+
+#: extensions/base/mediawiki.py:71
msgid "(N!) "
-msgstr "(N!) "
+msgstr ""
-#: src/rc_formatters.py:686
+#: extensions/base/mediawiki.py:72
msgid "m"
-msgstr "m"
+msgstr ""
-#: src/rc_formatters.py:686
+#: extensions/base/mediawiki.py:73
msgid "b"
-msgstr "b"
+msgstr ""
-#: src/rc_formatters.py:703 src/rc_formatters.py:708
-msgid "__Only whitespace__"
-msgstr "__Only whitespace__"
+#: extensions/base/mediawiki.py:112
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) edited [{article}]({edit_link}){comment} {bold}"
+"({sign}{edit_size}){bold}"
+msgstr ""
-#: src/rc_formatters.py:713
-msgid "Removed"
-msgstr "সরানো হয়েছে"
+#: extensions/base/mediawiki.py:117
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) created [{article}]({edit_link}){comment} {bold}"
+"({sign}{edit_size}){bold}"
+msgstr ""
-#: src/rc_formatters.py:715
-msgid "Added"
-msgstr "যুক্ত হয়েছে"
-
-#: src/rc_formatters.py:749 src/rc_formatters.py:788
+#: extensions/base/mediawiki.py:190 extensions/base/mediawiki.py:223
msgid "Options"
-msgstr "বিকল্পগুলি"
+msgstr ""
-#: src/rc_formatters.py:749
+#: extensions/base/mediawiki.py:190
#, python-brace-format
msgid "([preview]({link}) | [undo]({undolink}))"
msgstr ""
-#: src/rc_formatters.py:754
+#: extensions/base/mediawiki.py:195
#, python-brace-format
msgid "Uploaded a new version of {name}"
-msgstr "{name} -এর একটি নতুন সংস্করণ আপলোড হয়েছে"
+msgstr ""
-#: src/rc_formatters.py:756
+#: extensions/base/mediawiki.py:197
#, python-brace-format
msgid "Reverted a version of {name}"
msgstr ""
-#: src/rc_formatters.py:758
+#: extensions/base/mediawiki.py:199
#, python-brace-format
msgid "Uploaded {name}"
msgstr ""
-#: src/rc_formatters.py:774
+#: extensions/base/mediawiki.py:208
msgid "**No license!**"
msgstr ""
-#: src/rc_formatters.py:786
+#: extensions/base/mediawiki.py:223
+#, python-brace-format
+msgid "([preview]({link}))"
+msgstr ""
+
+#: extensions/base/mediawiki.py:228
msgid ""
"\n"
"License: {}"
msgstr ""
-#: src/rc_formatters.py:788
+#: extensions/base/mediawiki.py:237
#, python-brace-format
-msgid "([preview]({link}))"
+msgid ""
+"[{author}]({author_url}) reverted a version of [{file}]({file_link}){comment}"
msgstr ""
-#: src/rc_formatters.py:793
+#: extensions/base/mediawiki.py:248
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) uploaded a new version of [{file}]({file_link})"
+"{comment}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:259
+#, python-brace-format
+msgid "[{author}]({author_url}) uploaded [{file}]({file_link}){comment}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:274
#, python-brace-format
msgid "Deleted page {article}"
msgstr ""
-#: src/rc_formatters.py:798
+#: extensions/base/mediawiki.py:283
+#, python-brace-format
+msgid "[{author}]({author_url}) deleted [{page}]({page_link}){comment}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:298
#, python-brace-format
msgid "Deleted redirect {article} by overwriting"
msgstr ""
-#: src/rc_formatters.py:804
-msgid "No redirect has been made"
-msgstr ""
-
-#: src/rc_formatters.py:805
-msgid "A redirect has been made"
-msgstr ""
-
-#: src/rc_formatters.py:806
+#: extensions/base/mediawiki.py:308
#, python-brace-format
-msgid "Moved {redirect}{article} to {target}"
+msgid ""
+"[{author}]({author_url}) deleted redirect by overwriting [{page}]"
+"({page_link}){comment}"
msgstr ""
-#: src/rc_formatters.py:809
+#: extensions/base/mediawiki.py:322
#, python-brace-format
-msgid "Moved {redirect}{article} to {title} over redirect"
+msgid "Restored {article}"
msgstr ""
-#: src/rc_formatters.py:813
+#: extensions/base/mediawiki.py:331
#, python-brace-format
-msgid "Moved protection settings from {redirect}{article} to {title}"
+msgid "[{author}]({author_url}) restored [{article}]({article_url}){comment}"
msgstr ""
-#: src/rc_formatters.py:837
-msgid "unknown expiry time"
+#: extensions/base/mediawiki.py:348
+msgid "Changed visibility of log events"
msgstr ""
-#: src/rc_formatters.py:842
-msgid "Blocked from editing the following pages: "
-msgstr ""
-
-#: src/rc_formatters.py:851
-msgid "Blocked from editing pages on following namespaces: "
-msgstr ""
-
-#: src/rc_formatters.py:862
-msgid "Partial block details"
-msgstr ""
-
-#: src/rc_formatters.py:863
+#: extensions/base/mediawiki.py:356
#, python-brace-format
-msgid "Blocked {blocked_user} {time}"
+msgid "[{author}]({author_url}) changed visibility of log events{comment}"
msgstr ""
-#: src/rc_formatters.py:867
-#, python-brace-format
-msgid "Changed block settings for {blocked_user}"
-msgstr ""
-
-#: src/rc_formatters.py:871
-#, python-brace-format
-msgid "Unblocked {blocked_user}"
-msgstr ""
-
-#: src/rc_formatters.py:878
-#, python-brace-format
-msgid "Left a comment on {target}'s profile"
-msgstr ""
-
-#: src/rc_formatters.py:880
-msgid "Left a comment on their own profile"
-msgstr ""
-
-#: src/rc_formatters.py:887
-#, python-brace-format
-msgid "Replied to a comment on {target}'s profile"
-msgstr ""
-
-#: src/rc_formatters.py:889
-msgid "Replied to a comment on their own profile"
-msgstr ""
-
-#: src/rc_formatters.py:896
-#, python-brace-format
-msgid "Edited a comment on {target}'s profile"
-msgstr ""
-
-#: src/rc_formatters.py:898
-msgid "Edited a comment on their own profile"
-msgstr ""
-
-#: src/rc_formatters.py:903
-#, python-brace-format
-msgid "Edited {target}'s profile"
-msgstr ""
-
-#: src/rc_formatters.py:905
-msgid "Edited their own profile"
-msgstr ""
-
-#: src/rc_formatters.py:907
-#, python-brace-format
-msgid "Cleared the {field} field"
-msgstr ""
-
-#: src/rc_formatters.py:909
-#, python-brace-format
-msgid "{field} field changed to: {desc}"
-msgstr ""
-
-#: src/rc_formatters.py:914
-#, python-brace-format
-msgid "Purged a comment on {target}'s profile"
-msgstr ""
-
-#: src/rc_formatters.py:916
-msgid "Purged a comment on their own profile"
-msgstr ""
-
-#: src/rc_formatters.py:924
-#, python-brace-format
-msgid "Deleted a comment on {target}'s profile"
-msgstr ""
-
-#: src/rc_formatters.py:926
-msgid "Deleted a comment on their own profile"
-msgstr ""
-
-#: src/rc_formatters.py:930
-#, python-brace-format
-msgid "Changed group membership for {target}"
-msgstr ""
-
-#: src/rc_formatters.py:934
-#, python-brace-format
-msgid "{target} got autopromoted to a new usergroup"
-msgstr ""
-
-#: src/rc_formatters.py:949
-#, python-brace-format
-msgid "Groups changed from {old_groups} to {new_groups}{reason}"
-msgstr ""
-
-#: src/rc_formatters.py:953
-#, python-brace-format
-msgid "Protected {target}"
-msgstr ""
-
-#: src/rc_formatters.py:959
-#, python-brace-format
-msgid "Changed protection level for {article}"
-msgstr ""
-
-#: src/rc_formatters.py:965
-#, python-brace-format
-msgid "Removed protection from {article}"
-msgstr ""
-
-#: src/rc_formatters.py:969
+#: extensions/base/mediawiki.py:370
#, python-brace-format
msgid "Changed visibility of revision on page {article} "
msgid_plural "Changed visibility of {amount} revisions on page {article} "
msgstr[0] ""
msgstr[1] ""
-#: src/rc_formatters.py:981
+#: extensions/base/mediawiki.py:383
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) changed visibility of revision on page [{article}]"
+"({article_url}){comment}"
+msgid_plural ""
+"[{author}]({author_url}) changed visibility of {amount} revisions on page "
+"[{article}]({article_url}){comment}"
+msgstr[0] ""
+msgstr[1] ""
+
+#: extensions/base/mediawiki.py:399 extensions/base/mediawiki.py:432
+msgid "No redirect has been made"
+msgstr ""
+
+#: extensions/base/mediawiki.py:400 extensions/base/mediawiki.py:433
+msgid "A redirect has been made"
+msgstr ""
+
+#: extensions/base/mediawiki.py:401
+#, python-brace-format
+msgid "Moved {redirect}{article} to {target}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:412 extensions/base/mediawiki.py:444
+msgid "without making a redirect"
+msgstr ""
+
+#: extensions/base/mediawiki.py:413 extensions/base/mediawiki.py:445
+msgid "with a redirect"
+msgstr ""
+
+#: extensions/base/mediawiki.py:416
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) moved {redirect}*{article}* to [{target}]"
+"({target_url}) {made_a_redirect}{comment}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:434
+#, python-brace-format
+msgid "Moved {redirect}{article} to {title} over redirect"
+msgstr ""
+
+#: extensions/base/mediawiki.py:448
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) moved {redirect}*{article}* over redirect to "
+"[{target}]({target_url}) {made_a_redirect}{comment}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:464
+#, python-brace-format
+msgid "Moved protection settings from {redirect}{article} to {title}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:477
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) moved protection settings from {redirect}*{article}"
+"* to [{target}]({target_url}){comment}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:492
+#, python-brace-format
+msgid "Protected {target}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:495 extensions/base/mediawiki.py:510
+#: extensions/base/mediawiki.py:526 extensions/base/mediawiki.py:541
+msgid " [cascading]"
+msgstr ""
+
+#: extensions/base/mediawiki.py:506
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) protected [{article}]({article_url}) with the "
+"following settings: {settings}{comment}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:523
+#, python-brace-format
+msgid "Changed protection level for {article}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:537
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) modified protection settings of [{article}]"
+"({article_url}) to: {settings}{comment}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:554
+#, python-brace-format
+msgid "Removed protection from {article}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:563
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) removed protection from [{article}]({article_url})"
+"{comment}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:572
+msgid "for infinity and beyond"
+msgstr ""
+
+#: extensions/base/mediawiki.py:582
+msgid "for less than a minute"
+msgstr ""
+
+#: extensions/base/mediawiki.py:584
+msgid "year"
+msgid_plural "years"
+msgstr[0] ""
+msgstr[1] ""
+
+#: extensions/base/mediawiki.py:584
+msgid "day"
+msgid_plural "days"
+msgstr[0] ""
+msgstr[1] ""
+
+#: extensions/base/mediawiki.py:584
+msgid "hour"
+msgid_plural "hours"
+msgstr[0] ""
+msgstr[1] ""
+
+#: extensions/base/mediawiki.py:585
+msgid "minute"
+msgid_plural "minutes"
+msgstr[0] ""
+msgstr[1] ""
+
+#: extensions/base/mediawiki.py:590
+#, python-brace-format
+msgid "for {time_number} {time_unit}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:609
+msgid "Blocked from editing the following pages: "
+msgstr ""
+
+#: extensions/base/mediawiki.py:616 extensions/base/mediawiki.py:662
+msgid " and namespaces: "
+msgstr ""
+
+#: extensions/base/mediawiki.py:618
+msgid "Blocked from editing pages on following namespaces: "
+msgstr ""
+
+#: extensions/base/mediawiki.py:629
+msgid "Partial block details"
+msgstr ""
+
+#: extensions/base/mediawiki.py:632
+msgid "Block flags"
+msgstr ""
+
+#: extensions/base/mediawiki.py:634
+#, python-brace-format
+msgid "Blocked {blocked_user} {time}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:654
+msgid " on pages: "
+msgstr ""
+
+#: extensions/base/mediawiki.py:664
+msgid " on namespaces: "
+msgstr ""
+
+#: extensions/base/mediawiki.py:676
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) blocked [{user}]({user_url}) {time}"
+"{restriction_desc}{comment}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:694
+#, python-brace-format
+msgid "Changed block settings for {blocked_user}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:704
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) changed block settings for [{blocked_user}]"
+"({user_url}){comment}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:717
+#, python-brace-format
+msgid "Unblocked {blocked_user}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:727
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) unblocked [{blocked_user}]({user_url}){comment}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:743
+msgid "Action has been hidden by administration"
+msgstr ""
+
+#: extensions/base/mediawiki.py:750
+msgid "An action has been hidden by administration."
+msgstr ""
+
+#: extensions/base/mediawiki.py:761
#, python-brace-format
msgid "Imported {article} with {count} revision"
msgid_plural "Imported {article} with {count} revisions"
msgstr[0] ""
msgstr[1] ""
-#: src/rc_formatters.py:986
+#: extensions/base/mediawiki.py:772
#, python-brace-format
-msgid "Restored {article}"
-msgstr ""
+msgid ""
+"[{author}]({author_url}) imported [{article}]({article_url}) with {count} "
+"revision{comment}"
+msgid_plural ""
+"[{author}]({author_url}) imported [{article}]({article_url}) with {count} "
+"revisions{comment}"
+msgstr[0] ""
+msgstr[1] ""
-#: src/rc_formatters.py:989
-msgid "Changed visibility of log events"
-msgstr ""
-
-#: src/rc_formatters.py:999
+#: extensions/base/mediawiki.py:788
#, python-brace-format
msgid "Imported {article} with {count} revision from \"{source}\""
msgid_plural "Imported {article} with {count} revisions from \"{source}\""
msgstr[0] ""
msgstr[1] ""
-#: src/rc_formatters.py:1004
+#: extensions/base/mediawiki.py:803
#, python-brace-format
-msgid "Edited abuse filter number {number}"
+msgid ""
+"[{author}]({author_url}) imported [{article}]({article_url}) with {count} "
+"revision from [{source}]({source_url}){comment}"
+msgid_plural ""
+"[{author}]({author_url}) imported [{article}]({article_url}) with {count} "
+"revisions from [{source}]({source_url}){comment}"
+msgstr[0] ""
+msgstr[1] ""
+
+#: extensions/base/mediawiki.py:818
+#, python-brace-format
+msgid " (until {date_and_time})"
msgstr ""
-#: src/rc_formatters.py:1007
+#: extensions/base/mediawiki.py:835
#, python-brace-format
-msgid "Created abuse filter number {number}"
+msgid "Changed group membership for {target}"
msgstr ""
-#: src/rc_formatters.py:1010
+#: extensions/base/mediawiki.py:837
+msgid "System"
+msgstr ""
+
+#: extensions/base/mediawiki.py:838
+#, python-brace-format
+msgid "{target} got autopromoted to a new usergroup"
+msgstr ""
+
+#: extensions/base/mediawiki.py:844
+msgid "Added group"
+msgid_plural "Added groups"
+msgstr[0] ""
+msgstr[1] ""
+
+#: extensions/base/mediawiki.py:846
+msgid "Removed group"
+msgid_plural "Removed groups"
+msgstr[0] ""
+msgstr[1] ""
+
+#: extensions/base/mediawiki.py:860
+#, python-brace-format
+msgid "Added to {added} and removed from {removed}."
+msgstr ""
+
+#: extensions/base/mediawiki.py:861 extensions/base/mediawiki.py:863
+#: extensions/base/mediawiki.py:865 extensions/base/mediawiki.py:872
+msgid ", "
+msgstr ""
+
+#: extensions/base/mediawiki.py:863
+#, python-brace-format
+msgid "Added to {added}."
+msgstr ""
+
+#: extensions/base/mediawiki.py:865
+#, python-brace-format
+msgid "Removed from {removed}."
+msgstr ""
+
+#: extensions/base/mediawiki.py:866
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) changed group membership for [{target}]"
+"({target_url}): {group_changes}{comment}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:870
+#, python-brace-format
+msgid "The system autopromoted [{target}]({target_url}) to {added}.{comment}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:883
#, python-brace-format
msgid "Merged revision histories of {article} into {dest}"
msgstr ""
-#: src/rc_formatters.py:1014
+#: extensions/base/mediawiki.py:897
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) merged revision histories of [{article}]"
+"({article_url}) into [{dest}]({dest_url}){comment}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:911
msgid "Created account automatically"
msgstr ""
-#: src/rc_formatters.py:1017 src/rc_formatters.py:1026
+#: extensions/base/mediawiki.py:918
+#, python-brace-format
+msgid "Account [{author}]({author_url}) was created automatically"
+msgstr ""
+
+#: extensions/base/mediawiki.py:931 extensions/base/mediawiki.py:996
msgid "Created account"
msgstr ""
-#: src/rc_formatters.py:1020
+#: extensions/base/mediawiki.py:938 extensions/base/mediawiki.py:1003
+#, python-brace-format
+msgid "Account [{author}]({author_url}) was created"
+msgstr ""
+
+#: extensions/base/mediawiki.py:950
#, python-brace-format
msgid "Created account {article}"
msgstr ""
-#: src/rc_formatters.py:1023
+#: extensions/base/mediawiki.py:959
+#, python-brace-format
+msgid ""
+"Account [{article}]({article_url}) was created by [{author}]({author_url})"
+"{comment}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:972
#, python-brace-format
msgid "Created account {article} and password was sent by email"
msgstr ""
-#: src/rc_formatters.py:1029
-msgid "Added an entry to the interwiki table"
-msgstr ""
-
-#: src/rc_formatters.py:1030 src/rc_formatters.py:1036
+#: extensions/base/mediawiki.py:983
#, python-brace-format
-msgid "Prefix: {prefix}, website: {website} | {desc}"
+msgid ""
+"Account [{article}]({article_url}) was created by [{author}]({author_url}) "
+"and password was sent by email{comment}"
msgstr ""
-#: src/rc_formatters.py:1035
-msgid "Edited an entry in interwiki table"
-msgstr ""
-
-#: src/rc_formatters.py:1041
-msgid "Deleted an entry in interwiki table"
-msgstr ""
-
-#: src/rc_formatters.py:1042
-#, python-brace-format
-msgid "Prefix: {prefix} | {desc}"
-msgstr ""
-
-#: src/rc_formatters.py:1045
+#: extensions/base/mediawiki.py:1015
#, python-brace-format
msgid "Changed the content model of the page {article}"
msgstr ""
-#: src/rc_formatters.py:1046
+#: extensions/base/mediawiki.py:1017
#, python-brace-format
msgid "Model changed from {old} to {new}: {reason}"
msgstr ""
-#: src/rc_formatters.py:1051
+#: extensions/base/mediawiki.py:1029
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) changed the content model of the page [{article}]"
+"({article_url}) from {old} to {new}{comment}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:1044
+#, python-brace-format
+msgid "Created the page {article} using a non-default content model"
+msgstr ""
+
+#: extensions/base/mediawiki.py:1046
+#, python-brace-format
+msgid "Created with model {new}: {reason}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:1057
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) created the page [{article}]({article_url}) using a "
+"non-default content model {new}{comment}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:1072
+#, python-brace-format
+msgid "Created the tag \"{tag}\""
+msgstr ""
+
+#: extensions/base/mediawiki.py:1082
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) created the [tag]({tag_url}) \"{tag}\"{comment}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:1103
+#, python-brace-format
+msgid "Deleted the tag \"{tag}\""
+msgstr ""
+
+#: extensions/base/mediawiki.py:1105
+msgid "Removed from"
+msgstr ""
+
+#: extensions/base/mediawiki.py:1105
+msgid "{} revision or log entry"
+msgid_plural "{} revisions and/or log entries"
+msgstr[0] ""
+msgstr[1] ""
+
+#: extensions/base/mediawiki.py:1118
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) deleted the [tag]({tag_url}) \"{tag}\"{comment}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:1128
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) deleted the [tag]({tag_url}) \"{tag}\" and removed "
+"it from {count} revision or log entry{comment}"
+msgid_plural ""
+"[{author}]({author_url}) deleted the [tag]({tag_url}) \"{tag}\" and removed "
+"it from {count} revisions and/or log entries{comment}"
+msgstr[0] ""
+msgstr[1] ""
+
+#: extensions/base/mediawiki.py:1145
+#, python-brace-format
+msgid "Activated the tag \"{tag}\""
+msgstr ""
+
+#: extensions/base/mediawiki.py:1154
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) activated the [tag]({tag_url}) \"{tag}\"{comment}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:1173
+#, python-brace-format
+msgid "Deactivated the tag \"{tag}\""
+msgstr ""
+
+#: extensions/base/mediawiki.py:1182
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) deactivated the [tag]({tag_url}) \"{tag}\"{comment}"
+msgstr ""
+
+#: extensions/base/sprite.py:37
#, python-brace-format
msgid "Edited the sprite for {article}"
msgstr ""
-#: src/rc_formatters.py:1054
+#: extensions/base/sprite.py:45
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) edited the sprite for [{article}]({article_url})"
+msgstr ""
+
+#: extensions/base/sprite.py:60
#, python-brace-format
msgid "Created the sprite sheet for {article}"
msgstr ""
-#: src/rc_formatters.py:1057
+#: extensions/base/sprite.py:68
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) created the sprite sheet for [{article}]"
+"({article_url})"
+msgstr ""
+
+#: extensions/base/sprite.py:79
#, python-brace-format
msgid "Edited the slice for {article}"
msgstr ""
-#: src/rc_formatters.py:1063
-#, python-brace-format
-msgid "Created the Cargo table \"{table}\""
-msgstr ""
-
-#: src/rc_formatters.py:1067
-#, python-brace-format
-msgid "Deleted the Cargo table \"{table}\""
-msgstr ""
-
-#: src/rc_formatters.py:1074
-#, python-brace-format
-msgid "Recreated the Cargo table \"{table}\""
-msgstr ""
-
-#: src/rc_formatters.py:1081
-#, python-brace-format
-msgid "Replaced the Cargo table \"{table}\""
-msgstr ""
-
-#: src/rc_formatters.py:1085
-#, python-brace-format
-msgid "Created a tag \"{tag}\""
-msgstr ""
-
-#: src/rc_formatters.py:1089
-#, python-brace-format
-msgid "Deleted a tag \"{tag}\""
-msgstr ""
-
-#: src/rc_formatters.py:1093
-#, python-brace-format
-msgid "Activated a tag \"{tag}\""
-msgstr ""
-
-#: src/rc_formatters.py:1096
-#, python-brace-format
-msgid "Deactivated a tag \"{tag}\""
-msgstr ""
-
-#: src/rc_formatters.py:1099
-msgid "Changed wiki settings"
-msgstr ""
-
-#: src/rc_formatters.py:1103
-#, python-brace-format
-msgid "Deleted a \"{wiki}\" wiki"
-msgstr ""
-
-#: src/rc_formatters.py:1106
-#, python-brace-format
-msgid "Locked a \"{wiki}\" wiki"
-msgstr ""
-
-#: src/rc_formatters.py:1109
-#, python-brace-format
-msgid "Modified a \"{namespace_name}\" namespace"
-msgstr ""
-
-#: src/rc_formatters.py:1111 src/rc_formatters.py:1116
-msgid "Wiki"
-msgstr ""
-
-#: src/rc_formatters.py:1113
-#, python-brace-format
-msgid "Deleted a \"{namespace_name}\" namespace"
-msgstr ""
-
-#: src/rc_formatters.py:1119
-#, python-brace-format
-msgid "Modified \"{usergroup_name}\" usergroup"
-msgstr ""
-
-#: src/rc_formatters.py:1122
-#, python-brace-format
-msgid "Restored a \"{wiki}\" wiki"
-msgstr ""
-
-#: src/rc_formatters.py:1125
-#, python-brace-format
-msgid "Unlocked a \"{wiki}\" wiki"
-msgstr ""
-
-#: src/rc_formatters.py:1133
-#, python-brace-format
-msgid "Marked \"{article}\" for translation"
-msgstr ""
-
-#: src/rc_formatters.py:1136
-#, python-brace-format
-msgid "Removed \"{article}\" from the translation system"
-msgstr ""
-
-#: src/rc_formatters.py:1139
-#, python-brace-format
-msgid "Completed moving translation pages from \"{article}\" to \"{target}\""
-msgstr ""
-
-#: src/rc_formatters.py:1142
-#, python-brace-format
-msgid "Encountered a problem while moving \"{article}\" to \"{target}\""
-msgstr ""
-
-#: src/rc_formatters.py:1145
-#, python-brace-format
-msgid "Completed deletion of translatable page \"{article}\""
-msgstr ""
-
-#: src/rc_formatters.py:1148
+#: extensions/base/sprite.py:86
#, python-brace-format
msgid ""
-"Failed to delete \"{article}\" which belongs to translatable page "
-"\"{target}\""
-msgstr ""
-
-#: src/rc_formatters.py:1151
-#, python-brace-format
-msgid "Completed deletion of translation page \"{article}\""
-msgstr ""
-
-#: src/rc_formatters.py:1154
-#, python-brace-format
-msgid ""
-"Failed to delete \"{article}\" which belongs to translation page \"{target}\""
-msgstr ""
-
-#: src/rc_formatters.py:1157
-#, python-brace-format
-msgid "Encouraged translation of \"{article}\""
-msgstr ""
-
-#: src/rc_formatters.py:1160
-#, python-brace-format
-msgid "Discouraged translation of \"{article}\""
-msgstr ""
-
-#: src/rc_formatters.py:1166
-#, python-brace-format
-msgid "Limited languages for \"{article}\" to `{languages}`"
-msgstr ""
-
-#: src/rc_formatters.py:1168
-#, python-brace-format
-msgid "Priority languages for \"{article}\" set to `{languages}`"
-msgstr ""
-
-#: src/rc_formatters.py:1170
-#, python-brace-format
-msgid "Removed priority languages from \"{article}\""
-msgstr ""
-
-#: src/rc_formatters.py:1173
-#, python-brace-format
-msgid "Added translatable page \"{article}\" to aggregate group \"{group}\""
-msgstr ""
-
-#: src/rc_formatters.py:1176
-#, python-brace-format
-msgid ""
-"Removed translatable page \"{article}\" from aggregate group \"{group}\""
-msgstr ""
-
-#: src/rc_formatters.py:1183
-#, python-brace-format
-msgid "Reviewed translation \"{article}\""
-msgstr ""
-
-#: src/rc_formatters.py:1186
-#, python-brace-format
-msgid "Changed the state of `{language}` translations of \"{article}\""
-msgstr ""
-
-#: src/rc_formatters.py:1188
-msgid "Old state"
-msgstr ""
-
-#: src/rc_formatters.py:1189
-msgid "New state"
-msgstr ""
-
-#: src/rc_formatters.py:1193
-#, python-brace-format
-msgid "Renamed user \"{old_name}\" with {edits} edit to \"{new_name}\""
-msgid_plural "Renamed user \"{old_name}\" with {edits} edits to \"{new_name}\""
-msgstr[0] ""
-msgstr[1] ""
-
-#: src/rc_formatters.py:1195
-#, python-brace-format
-msgid "Renamed user \"{old_name}\" to \"{new_name}\""
-msgstr ""
-
-#: src/rc_formatters.py:1199
-msgid "Action has been hidden by administration"
-msgstr ""
-
-#: src/rc_formatters.py:1204
-#, python-brace-format
-msgid "Unknown event `{event}`"
-msgstr ""
-
-#: src/rc_formatters.py:1210 src/rc_formatters.py:1212
-msgid "Report this on the support server"
-msgstr ""
-
-#: src/rc_formatters.py:1229
-msgid "Tags"
-msgstr ""
-
-#: src/rc_formatters.py:1234
-msgid "**Added**: "
-msgstr ""
-
-#: src/rc_formatters.py:1234
-msgid " and {} more\n"
-msgstr ""
-
-#: src/rc_formatters.py:1235
-msgid "**Removed**: "
-msgstr ""
-
-#: src/rc_formatters.py:1235
-msgid " and {} more"
-msgstr ""
-
-#: src/rc_formatters.py:1236
-msgid "Changed categories"
+"[{author}]({author_url}) edited the slice for [{article}]({article_url})"
msgstr ""
diff --git a/locale/bn/LC_MESSAGES/rc_formatters.mo b/locale/bn/LC_MESSAGES/rc_formatters.mo
deleted file mode 100644
index 55f93c7..0000000
Binary files a/locale/bn/LC_MESSAGES/rc_formatters.mo and /dev/null differ
diff --git a/locale/de/LC_MESSAGES/discussion_formatters.mo b/locale/de/LC_MESSAGES/discussion_formatters.mo
deleted file mode 100644
index e393df6..0000000
Binary files a/locale/de/LC_MESSAGES/discussion_formatters.mo and /dev/null differ
diff --git a/locale/de/LC_MESSAGES/discussion_formatters.po b/locale/de/LC_MESSAGES/discussion_formatters.po
deleted file mode 100644
index ab647c4..0000000
--- a/locale/de/LC_MESSAGES/discussion_formatters.po
+++ /dev/null
@@ -1,185 +0,0 @@
-# SOME DESCRIPTIVE TITLE.
-# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
-# This file is distributed under the same license as the PACKAGE package.
-# FIRST AUTHOR , YEAR.
-#
-msgid ""
-msgstr ""
-"Project-Id-Version: \n"
-"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2020-12-23 00:28+0100\n"
-"PO-Revision-Date: 2020-12-13 14:30+0000\n"
-"Last-Translator: Frisk The Evil Goat Overlord \n"
-"Language-Team: German \n"
-"Language: de\n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=UTF-8\n"
-"Content-Transfer-Encoding: 8bit\n"
-"Plural-Forms: nplurals=2; plural=n != 1;\n"
-"X-Generator: Weblate 4.2.1\n"
-
-#: src/discussion_formatters.py:21 src/discussion_formatters.py:56
-#: src/discussion_formatters.py:67 src/discussion_formatters.py:95
-#: src/discussion_formatters.py:163 src/discussion_formatters.py:176
-msgid "unknown"
-msgstr "Unbekannt"
-
-#: src/discussion_formatters.py:27 src/discussion_formatters.py:102
-msgid "Unregistered user"
-msgstr "Nicht angemeldeter Benutzer"
-
-#: src/discussion_formatters.py:39
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) created [{title}](<{url}f/p/{threadId}>) in "
-"{forumName}"
-msgstr ""
-"[{author}]({author_url}) erstellte [{title}](<{url}f/p/{threadId}>) in "
-"{forumName}"
-
-#: src/discussion_formatters.py:42
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) created a poll [{title}](<{url}f/p/{threadId}>) in "
-"{forumName}"
-msgstr ""
-"[{author}]({author_url}) erstellte eine Umfrage [{title}](<{url}f/p/"
-"{threadId}>) in {forumName}"
-
-#: src/discussion_formatters.py:45
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) created a quiz [{title}](<{url}f/p/{threadId}>) in "
-"{forumName}"
-msgstr ""
-"[{author}]({author_url}) erstellte ein Quiz [{title}](<{url}f/p/{threadId}>) "
-"in {forumName}"
-
-#: src/discussion_formatters.py:54
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) created a [reply](<{url}f/p/{threadId}/r/{postId}>) "
-"to [{title}](<{url}f/p/{threadId}>) in {forumName}"
-msgstr ""
-"[{author}]({author_url}) erstellte eine [Antwort](<{url}f/p/{threadId}/r/"
-"{postId}>) zu [{title}](<{url}f/p/{threadId}>) in {forumName}"
-
-#: src/discussion_formatters.py:61
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) created [{title}](<{url}wiki/Message_Wall:"
-"{user_wall}?threadId={threadId}>) on [{user}'s Message Wall](<{url}wiki/"
-"Message_Wall:{user_wall}>)"
-msgstr ""
-"[{author}]({author_url}) erstellte [{title}](<{url}wiki/Message_Wall:"
-"{user_wall}?threadId={threadId}>) auf der [Nachrichtenseite von {user}]"
-"(<{url}wiki/Message_Wall:{user_wall}>)"
-
-#: src/discussion_formatters.py:64
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) created a [reply](<{url}wiki/Message_Wall:"
-"{user_wall}?threadId={threadId}#{replyId}>) to [{title}](<{url}wiki/"
-"Message_Wall:{user_wall}?threadId={threadId}>) on [{user}'s Message Wall]"
-"(<{url}wiki/Message_Wall:{user_wall}>)"
-msgstr ""
-"[{author}]({author_url}) erstellte eine [Antwort](<{url}wiki/Message_Wall:"
-"{user_wall}?threadId={threadId}#{replyId}>) auf [{title}](<{url}wiki/"
-"Message_Wall:{user_wall}?threadId={threadId}>) auf der [Nachrichtenseite von "
-"{user}](<{url}wiki/Message_Wall:{user_wall}>)"
-
-#: src/discussion_formatters.py:72
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) created a [comment](<{url}?commentId={commentId}>) "
-"on [{article}](<{url}>)"
-msgstr ""
-"[{author}]({author_url}) erstellte ein [Kommentar](<{url}?"
-"commentId={commentId}>) zu [{article}](<{url}>)"
-
-#: src/discussion_formatters.py:78
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) created a [reply](<{url}?commentId={commentId}"
-"&replyId={replyId}>) to a [comment](<{url}?commentId={commentId}>) on "
-"[{article}](<{url}>)"
-msgstr ""
-"[{author}]({author_url}) erstellte eine [Antwort](<{url}?"
-"commentId={commentId}&replyId={replyId}>) auf ein [Kommentar](<{url}?"
-"commentId={commentId}>) zu [{article}](<{url}>)"
-
-#: src/discussion_formatters.py:86
-#, python-brace-format
-msgid ""
-"Unknown event `{event}` by [{author}]({author_url}), report it on the "
-"[support server](<{support}>)."
-msgstr ""
-"Unbekanntes Event `{event}` von [{author}]({author_url}), melde es auf dem "
-"[Support-Server](<{support}>)."
-
-#: src/discussion_formatters.py:123
-#, python-brace-format
-msgid "Created \"{title}\""
-msgstr "Erstellte „{title}“"
-
-#: src/discussion_formatters.py:127
-#, python-brace-format
-msgid "Created a poll \"{title}\""
-msgstr "Erstellte eine Umfrage „{title}“"
-
-#: src/discussion_formatters.py:134
-msgid "Option {}"
-msgstr "Option {}"
-
-#: src/discussion_formatters.py:135
-#, python-brace-format
-msgid "__[View image]({image_url})__"
-msgstr "__[Bild öffnen]({image_url})__"
-
-#: src/discussion_formatters.py:139
-#, python-brace-format
-msgid "Created a quiz \"{title}\""
-msgstr "Erstellte ein Quiz „{title}“"
-
-#: src/discussion_formatters.py:155 src/discussion_formatters.py:157
-msgid "Tags"
-msgstr "Tags"
-
-#: src/discussion_formatters.py:155
-msgid "{} tags"
-msgstr "{} Tags"
-
-#: src/discussion_formatters.py:160
-#, python-brace-format
-msgid "Replied to \"{title}\""
-msgstr "Antwortete auf „{title}“"
-
-#: src/discussion_formatters.py:169
-#, python-brace-format
-msgid "Created \"{title}\" on {user}'s Message Wall"
-msgstr "Erstellte „{title}“ auf der Nachrichtenseite von {user}"
-
-#: src/discussion_formatters.py:173
-#, python-brace-format
-msgid "Replied to \"{title}\" on {user}'s Message Wall"
-msgstr "Antwortete auf „{title}“ auf der Nachrichtenseite von {user}"
-
-#: src/discussion_formatters.py:180
-#, python-brace-format
-msgid "Commented on {article}"
-msgstr "Kommentierte zu „{article}“"
-
-#: src/discussion_formatters.py:184
-#, python-brace-format
-msgid "Replied to a comment on {article}"
-msgstr "Antwortete auf ein Kommentar zu „{article}“"
-
-#: src/discussion_formatters.py:188
-#, python-brace-format
-msgid "Unknown event `{event}`"
-msgstr "Unbekanntes Event `{event}`"
-
-#: src/discussion_formatters.py:194 src/discussion_formatters.py:196
-msgid "Report this on the support server"
-msgstr "Melde es auf dem Support-Server"
diff --git a/locale/de/LC_MESSAGES/formatters.mo b/locale/de/LC_MESSAGES/formatters.mo
new file mode 100644
index 0000000..5b622a6
Binary files /dev/null and b/locale/de/LC_MESSAGES/formatters.mo differ
diff --git a/locale/de/LC_MESSAGES/formatters.po b/locale/de/LC_MESSAGES/formatters.po
new file mode 100644
index 0000000..82a6f74
--- /dev/null
+++ b/locale/de/LC_MESSAGES/formatters.po
@@ -0,0 +1,1999 @@
+# #-#-#-#-# formatters.po #-#-#-#-#
+# #-#-#-#-# discussion_formatters.po #-#-#-#-#
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR , YEAR.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: \n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2021-07-11 14:32+0200\n"
+"PO-Revision-Date: 2021-07-30 10:44+0000\n"
+"Last-Translator: MarkusRost \n"
+"Language-Team: German \n"
+"Language: de\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+"X-Generator: Weblate 4.6.2\n"
+"X-Loco-Source-Locale: de_DE\n"
+"Generated-By: pygettext.py 1.5\n"
+"X-Loco-Parser: loco_parse_po\n"
+
+#: src/api/util.py:61 src/api/util.py:66
+msgid "__Only whitespace__"
+msgstr "__Nur Leerraum__"
+
+#: src/api/util.py:71
+msgid "Removed"
+msgstr "Entfernt"
+
+#: src/api/util.py:73
+msgid "Added"
+msgstr "Hinzugefügt"
+
+#: src/api/util.py:94 src/api/util.py:126 src/api/util.py:133
+#: src/api/util.py:141 extensions/base/discussions.py:247
+#: extensions/base/discussions.py:264 extensions/base/abusefilter.py:45
+msgid "Unregistered user"
+msgstr "Nicht angemeldeter Benutzer"
+
+#: src/api/util.py:160
+msgctxt "recent changes Tags"
+msgid "Tags"
+msgstr "Markierungen"
+
+#: src/api/util.py:162
+msgid "**Added**: "
+msgstr "**Hinzugefügt:** "
+
+#: src/api/util.py:163
+msgid " and {} more\n"
+msgstr " und {} mehr\n"
+
+#: src/api/util.py:165
+msgid "**Removed**: "
+msgstr "**Entfernt:** "
+
+#: src/api/util.py:166
+msgid " and {} more"
+msgstr " und {} mehr"
+
+#: src/api/util.py:168
+msgid "Changed categories"
+msgstr "Geänderte Kategorien"
+
+#: extensions/base/cargo.py:37
+#, python-brace-format
+msgid "Created the Cargo table \"{table}\""
+msgstr "Erstellte die Cargo-Tabelle „{table}“"
+
+#: extensions/base/cargo.py:45
+#, python-brace-format
+msgid "[{author}]({author_url}) created the Cargo table \"{table}\""
+msgstr "[{author}]({author_url}) erstellte die Cargo-Tabelle „{table}“"
+
+#: extensions/base/cargo.py:60
+#, python-brace-format
+msgid "Recreated the Cargo table \"{table}\""
+msgstr "Erstellte die Cargo-Tabelle „{table}“ neu"
+
+#: extensions/base/cargo.py:68
+#, python-brace-format
+msgid "[{author}]({author_url}) recreated the Cargo table \"{table}\""
+msgstr "[{author}]({author_url}) erstellte die Cargo-Tabelle „{table}“ neu"
+
+#: extensions/base/cargo.py:83
+#, python-brace-format
+msgid "Replaced the Cargo table \"{table}\""
+msgstr "Ersetzte die Cargo-Tabelle „{table}“"
+
+#: extensions/base/cargo.py:91
+#, python-brace-format
+msgid "[{author}]({author_url}) replaced the Cargo table \"{table}\""
+msgstr "[{author}]({author_url}) ersetzte die Cargo-Tabelle „{table}“"
+
+#: extensions/base/cargo.py:105
+#, python-brace-format
+msgid "Deleted the Cargo table \"{table}\""
+msgstr "Löschte die Cargo-Tabelle „{table}“"
+
+#: extensions/base/cargo.py:112
+#, python-brace-format
+msgid "[{author}]({author_url}) deleted the Cargo table \"{table}\""
+msgstr "[{author}]({author_url}) löschte die Cargo-Tabelle „{table}“"
+
+#: extensions/base/translate.py:41
+#, python-brace-format
+msgid "Marked \"{article}\" for translation"
+msgstr "Markierte „{article}“ zum Übersetzen"
+
+#: extensions/base/translate.py:55
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) marked [{article}]({article_url}) for "
+"translation{comment}"
+msgstr ""
+"[{author}]({author_url}) markierte [{article}]({article_url}) zur "
+"Übersetzung{comment}"
+
+#: extensions/base/translate.py:70
+#, python-brace-format
+msgid "Removed \"{article}\" from the translation system"
+msgstr "Entfernte „{article}“ aus dem Übersetzungssystem"
+
+#: extensions/base/translate.py:80
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) removed [{article}]({article_url}) from the "
+"translation system{comment}"
+msgstr ""
+"[{author}]({author_url}) entfernte [{article}]({article_url}) aus dem "
+"Übersetzungssystem{comment}"
+
+#: extensions/base/translate.py:95
+#, python-brace-format
+msgid "Completed moving translation pages from \"{article}\" to \"{target}\""
+msgstr ""
+"Schloss die Verschiebung der Übersetzungsseiten von „{article}“ nach "
+"„{target}“ ab"
+
+#: extensions/base/translate.py:106
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) completed moving translation pages from *{article}* "
+"to [{target}]({target_url}){comment}"
+msgstr ""
+"[{author}]({author_url}) schloss die Umbenennung der übersetzbaren Seite von "
+"*{article}* nach [{target}]({target_url}) ab{comment}"
+
+#: extensions/base/translate.py:121
+#, python-brace-format
+msgid "Encountered a problem while moving \"{article}\" to \"{target}\""
+msgstr "Hatte ein Problem beim Verschieben von „{article}“ nach „{target}“"
+
+#: extensions/base/translate.py:133
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) encountered a problem while moving [{article}]"
+"({article_url}) to [{target}]({target_url}){comment}"
+msgstr ""
+"[{author}]({author_url}) hatte ein Problem beim Verschieben der Seite von "
+"[{article}]({article_url}) nach [{target}]({target_url}){comment}"
+
+#: extensions/base/translate.py:149
+#, python-brace-format
+msgid ""
+"Failed to delete \"{article}\" which belongs to translatable page "
+"\"{target}\""
+msgstr ""
+"Konnte „{article}“ nicht löschen, die zur übersetzbaren Seite „{target}“ "
+"gehört"
+
+#: extensions/base/translate.py:161
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) failed to delete [{article}]({article_url}) which "
+"belongs to translatable page [{target}]({target_url}){comment}"
+msgstr ""
+"[{author}]({author_url}) konnte die Seite [{article}]({article_url}) nicht "
+"löschen, die zur übersetzbaren Seite [{target}]({target_url}) gehört{comment}"
+
+#: extensions/base/translate.py:177
+#, python-brace-format
+msgid "Completed deletion of translation page \"{article}\""
+msgstr "Schloss die Löschung der Übersetzungsseite „{article}“ ab"
+
+#: extensions/base/translate.py:188
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) completed deletion of translation page [{article}]"
+"({article_url}){comment}"
+msgstr ""
+"[{author}]({author_url}) schloss die Löschung der Übersetzungsseite "
+"[{article}]({article_url}) ab{comment}"
+
+#: extensions/base/translate.py:203
+#, python-brace-format
+msgid ""
+"Failed to delete \"{article}\" which belongs to translation page \"{target}\""
+msgstr ""
+"Konnte „{article}“ nicht löschen, die zur Übersetzungsseite „{target}“ gehört"
+
+#: extensions/base/translate.py:215
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) failed to delete [{article}]({article_url}) which "
+"belongs to translation page [{target}]({target_url}){comment}"
+msgstr ""
+"[{author}]({author_url}) konnte die Seite [{article}]({article_url}) nicht "
+"löschen, die zur Übersetzungsseite [{target}]({target_url}) gehört{comment}"
+
+#: extensions/base/translate.py:231
+#, python-brace-format
+msgid "Encouraged translation of \"{article}\""
+msgstr "Empfahl die Übersetzung von „{article}“"
+
+#: extensions/base/translate.py:240
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) encouraged translation of [{article}]({article_url})"
+"{comment}"
+msgstr ""
+"[{author}]({author_url}) empfahl die Übersetzung der Seite [{article}]"
+"({article_url}){comment}"
+
+#: extensions/base/translate.py:255
+#, python-brace-format
+msgid "Discouraged translation of \"{article}\""
+msgstr "Riet von der Übersetzung von „{article}“ ab"
+
+#: extensions/base/translate.py:264
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) discouraged translation of [{article}]"
+"({article_url}){comment}"
+msgstr ""
+"[{author}]({author_url}) riet von der Übersetzung der Seite [{article}]"
+"({article_url}) ab{comment}"
+
+#: extensions/base/translate.py:282
+#, python-brace-format
+msgid "Limited languages for \"{article}\" to `{languages}`"
+msgstr "Begrenzte die Sprachen für „{article}“ auf `{languages}`"
+
+#: extensions/base/translate.py:285
+#, python-brace-format
+msgid "Priority languages for \"{article}\" set to `{languages}`"
+msgstr ""
+"Legte die priorisierten Sprachen für „{article}“ auf `{languages}` fest"
+
+#: extensions/base/translate.py:288
+#, python-brace-format
+msgid "Removed priority languages from \"{article}\""
+msgstr "Entfernte die priorisierten Sprachen von „{article}“"
+
+#: extensions/base/translate.py:301
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) limited languages for [{article}]({article_url}) to "
+"`{languages}`{comment}"
+msgstr ""
+"[{author}]({author_url}) begrenzte die Sprachen für [{article}]"
+"({article_url}) auf `{languages}`{comment}"
+
+#: extensions/base/translate.py:308
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) set the priority languages for [{article}]"
+"({article_url}) to `{languages}`{comment}"
+msgstr ""
+"[{author}]({author_url}) legte die priorisierten Sprachen für [{article}]"
+"({article_url}) auf `{languages}` fest{comment}"
+
+#: extensions/base/translate.py:315
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) removed priority languages from [{article}]"
+"({article_url}){comment}"
+msgstr ""
+"[{author}]({author_url}) entfernte die priorisierten Sprachen von [{article}]"
+"({article_url}){comment}"
+
+#: extensions/base/translate.py:331
+#, python-brace-format
+msgid "Added translatable page \"{article}\" to aggregate group \"{group}\""
+msgstr ""
+"Fügte die übersetzbare Seite „{article}“ zur zusammenfassenden Gruppe "
+"„{group}“ hinzu"
+
+#: extensions/base/translate.py:342
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) added translatable page [{article}]({article_url}) "
+"to aggregate group \"{group}\"{comment}"
+msgstr ""
+"[{author}]({author_url}) fügte die übersetzbare Seite [{article}]"
+"({article_url}) zur zusammenfassenden Gruppe „{group}“ hinzu{comment}"
+
+#: extensions/base/translate.py:357
+#, python-brace-format
+msgid ""
+"Removed translatable page \"{article}\" from aggregate group \"{group}\""
+msgstr ""
+"Entfernte die übersetzbare Seite „{article}“ von der zusammenfassenden "
+"Gruppe „{group}“"
+
+#: extensions/base/translate.py:368
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) removed translatable page [{article}]"
+"({article_url}) from aggregate group \"{group}\"{comment}"
+msgstr ""
+"[{author}]({author_url}) entfernte die übersetzbare Seite [{article}]"
+"({article_url}) von der zusammenfassenden Gruppe „{group}“{comment}"
+
+#: extensions/base/translate.py:387
+#, python-brace-format
+msgid "Reviewed translation \"{article}\""
+msgstr "Überprüfte die Übersetzung „{article}“"
+
+#: extensions/base/translate.py:401
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) reviewed translation [{article}]({article_url})"
+"{comment}"
+msgstr ""
+"[{author}]({author_url}) überprüfte die Übersetzung [{article}]"
+"({article_url}){comment}"
+
+#: extensions/base/translate.py:416
+#, python-brace-format
+msgid "Changed the state of `{language}` translations of \"{article}\""
+msgstr "Änderte den Status der Übersetzungen in `{language}` für „{article}“"
+
+#: extensions/base/translate.py:419
+msgid "Old state"
+msgstr "Alter Status"
+
+#: extensions/base/translate.py:420
+msgid "New state"
+msgstr "Neuer Status"
+
+#: extensions/base/translate.py:431
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) changed the state of `{language}` translations of "
+"[{article}]({article_url}) from `{old_state}` to `{new_state}`{comment}"
+msgstr ""
+"[{author}]({author_url}) änderte den Status der Übersetzungen in der Sprache "
+"`{language}` der Seite [{article}]({article_url}) von `{old_state}` in "
+"`{new_state}`{comment}"
+
+#: extensions/base/translate.py:439
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) changed the state of `{language}` translations of "
+"[{article}]({article_url}) to `{new_state}`{comment}"
+msgstr ""
+"[{author}]({author_url}) änderte den Status der Übersetzungen in der Sprache "
+"`{language}` der Seite [{article}]({article_url}) in `{new_state}`{comment}"
+
+#: extensions/base/translate.py:452 extensions/base/translate.py:455
+msgid "(default)"
+msgstr "(Standard)"
+
+#: extensions/base/translate.py:464
+#, python-brace-format
+msgid "Changed the language of \"{article}\""
+msgstr "Änderte die Sprache für „{article}“"
+
+#: extensions/base/translate.py:465
+msgid "Old language"
+msgstr "Alte Sprache"
+
+#: extensions/base/translate.py:466
+msgid "New language"
+msgstr "Neue Sprache"
+
+#: extensions/base/translate.py:477
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) changed the language of [{article}]({article_url}) "
+"from {old_lang} to {new_lang}{comment}"
+msgstr ""
+"[{author}]({author_url}) änderte die Sprache für [{article}]({article_url}) "
+"von {old_lang} zu {new_lang}{comment}"
+
+#: extensions/base/discussions.py:148 extensions/base/discussions.py:207
+#: extensions/base/discussions.py:245 extensions/base/discussions.py:261
+#: extensions/base/discussions.py:284 extensions/base/discussions.py:306
+#: extensions/base/discussions.py:334 extensions/base/discussions.py:354
+msgid "unknown"
+msgstr "Unbekannt"
+
+#: extensions/base/discussions.py:157
+#, python-brace-format
+msgid "Created \"{title}\""
+msgstr "Erstellte „{title}“"
+
+#: extensions/base/discussions.py:161
+#, python-brace-format
+msgid "Created a poll \"{title}\""
+msgstr "Erstellte eine Umfrage „{title}“"
+
+#: extensions/base/discussions.py:168
+msgid "Option {}"
+msgstr "Option {}"
+
+#: extensions/base/discussions.py:170
+#, python-brace-format
+msgid "__[View image]({image_url})__"
+msgstr "__[Bild öffnen]({image_url})__"
+
+#: extensions/base/discussions.py:174
+#, python-brace-format
+msgid "Created a quiz \"{title}\""
+msgstr "Erstellte ein Quiz „{title}“"
+
+#: extensions/base/discussions.py:193 extensions/base/discussions.py:195
+msgctxt "Fandom discussions Tags/Forums"
+msgid "Tags"
+msgstr "Tags"
+
+#: extensions/base/discussions.py:193
+msgctxt "Fandom discussions amount of Tags/Forums"
+msgid "{} tags"
+msgstr "{} Tags"
+
+#: extensions/base/discussions.py:198
+#, python-brace-format
+msgid "Replied to \"{title}\""
+msgstr "Antwortete auf „{title}“"
+
+#: extensions/base/discussions.py:214
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) created [{title}](<{url}f/p/{threadId}>) in "
+"{forumName}"
+msgstr ""
+"[{author}]({author_url}) erstellte [{title}](<{url}f/p/{threadId}>) in "
+"{forumName}"
+
+#: extensions/base/discussions.py:217
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) created a poll [{title}](<{url}f/p/{threadId}>) in "
+"{forumName}"
+msgstr ""
+"[{author}]({author_url}) erstellte eine Umfrage [{title}](<{url}f/p/"
+"{threadId}>) in {forumName}"
+
+#: extensions/base/discussions.py:220
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) created a quiz [{title}](<{url}f/p/{threadId}>) in "
+"{forumName}"
+msgstr ""
+"[{author}]({author_url}) erstellte ein Quiz [{title}](<{url}f/p/{threadId}>) "
+"in {forumName}"
+
+#: extensions/base/discussions.py:234
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) created a [reply](<{url}f/p/{threadId}/r/{postId}>) "
+"to [{title}](<{url}f/p/{threadId}>) in {forumName}"
+msgstr ""
+"[{author}]({author_url}) erstellte eine [Antwort](<{url}f/p/{threadId}/r/"
+"{postId}>) zu [{title}](<{url}f/p/{threadId}>) in {forumName}"
+
+#: extensions/base/discussions.py:292
+#, python-brace-format
+msgid "Created \"{title}\" on {user}'s Message Wall"
+msgstr "Erstellte „{title}“ auf der Nachrichtenseite von {user}"
+
+#: extensions/base/discussions.py:298
+#, python-brace-format
+msgid "Replied to \"{title}\" on {user}'s Message Wall"
+msgstr "Antwortete auf „{title}“ auf der Nachrichtenseite von {user}"
+
+#: extensions/base/discussions.py:312
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) created [{title}](<{url}wiki/Message_Wall:"
+"{user_wall}?threadId={threadId}>) on [{user}'s Message Wall](<{url}wiki/"
+"Message_Wall:{user_wall}>)"
+msgstr ""
+"[{author}]({author_url}) erstellte [{title}](<{url}wiki/Message_Wall:"
+"{user_wall}?threadId={threadId}>) auf der [Nachrichtenseite von {user}]"
+"(<{url}wiki/Message_Wall:{user_wall}>)"
+
+#: extensions/base/discussions.py:318
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) created a [reply](<{url}wiki/Message_Wall:"
+"{user_wall}?threadId={threadId}#{replyId}>) to [{title}](<{url}wiki/"
+"Message_Wall:{user_wall}?threadId={threadId}>) on [{user}'s Message Wall]"
+"(<{url}wiki/Message_Wall:{user_wall}>)"
+msgstr ""
+"[{author}]({author_url}) erstellte eine [Antwort](<{url}wiki/Message_Wall:"
+"{user_wall}?threadId={threadId}#{replyId}>) auf [{title}](<{url}wiki/"
+"Message_Wall:{user_wall}?threadId={threadId}>) auf der [Nachrichtenseite von "
+"{user}](<{url}wiki/Message_Wall:{user_wall}>)"
+
+#: extensions/base/discussions.py:338
+#, python-brace-format
+msgid "Commented on {article}"
+msgstr "Kommentierte zu „{article}“"
+
+#: extensions/base/discussions.py:344
+#, python-brace-format
+msgid "Replied to a comment on {article}"
+msgstr "Antwortete auf ein Kommentar zu „{article}“"
+
+#: extensions/base/discussions.py:359
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) created a [comment](<{url}?commentId={commentId}>) "
+"on [{article}](<{url}>)"
+msgstr ""
+"[{author}]({author_url}) erstellte ein [Kommentar](<{url}?"
+"commentId={commentId}>) zu [{article}](<{url}>)"
+
+#: extensions/base/discussions.py:365
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) created a [reply](<{url}?commentId={commentId}"
+"&replyId={replyId}>) to a [comment](<{url}?commentId={commentId}>) on "
+"[{article}](<{url}>)"
+msgstr ""
+"[{author}]({author_url}) erstellte eine [Antwort](<{url}?"
+"commentId={commentId}&replyId={replyId}>) auf ein [Kommentar](<{url}?"
+"commentId={commentId}>) zu [{article}](<{url}>)"
+
+#: extensions/base/managewiki.py:34
+msgid "Changed wiki settings"
+msgstr "Änderte Wiki-Einstellungen"
+
+#: extensions/base/managewiki.py:44
+#, python-brace-format
+msgid "[{author}]({author_url}) changed wiki settings{reason}"
+msgstr "[{author}]({author_url}) änderte Wiki-Einstellungen{reason}"
+
+#: extensions/base/managewiki.py:55
+#, python-brace-format
+msgid "Deleted a \"{wiki}\" wiki"
+msgstr "Löschte das Wiki „{wiki}“"
+
+#: extensions/base/managewiki.py:55 extensions/base/managewiki.py:67
+#: extensions/base/managewiki.py:103 extensions/base/managewiki.py:112
+#: extensions/base/managewiki.py:125 extensions/base/managewiki.py:126
+#: extensions/base/managewiki.py:135 extensions/base/managewiki.py:136
+#: extensions/base/managewiki.py:148 extensions/base/managewiki.py:149
+#: extensions/base/managewiki.py:160 extensions/base/managewiki.py:161
+#: extensions/base/managewiki.py:195 extensions/base/managewiki.py:204
+#: extensions/base/managewiki.py:217 extensions/base/managewiki.py:226
+#: extensions/base/abusefilter.py:55 extensions/base/abusefilter.py:56
+#: extensions/base/abusefilter.py:57 extensions/base/abusefilter.py:68
+#: extensions/base/abusefilter.py:69 extensions/base/abusefilter.py:70
+#: extensions/base/mediawiki.py:743
+msgid "Unknown"
+msgstr "Unbekannt"
+
+#: extensions/base/managewiki.py:63
+#, python-brace-format
+msgid "[{author}]({author_url}) deleted a wiki *{wiki_name}*{comment}"
+msgstr "[{author}]({author_url}) löschte das Wiki *{wiki_name}*{comment}"
+
+#: extensions/base/managewiki.py:80
+#, python-brace-format
+msgid "Deleted a \"{group}\" user group"
+msgstr "Löschte die Benutzergruppe „{group}“"
+
+#: extensions/base/managewiki.py:89
+#, python-brace-format
+msgid "[{author}]({author_url}) deleted a usergroup *{group}*{comment}"
+msgstr "[{author}]({author_url}) löschte die Benutzergruppe *{group}*{comment}"
+
+#: extensions/base/managewiki.py:103
+#, python-brace-format
+msgid "Locked a \"{wiki}\" wiki"
+msgstr "Sperrte das Wiki „{wiki}“"
+
+#: extensions/base/managewiki.py:111
+#, python-brace-format
+msgid "[{author}]({author_url}) locked a wiki *{wiki_name}*{comment}"
+msgstr "[{author}]({author_url}) sperrte das Wiki *{wiki_name}*{comment}"
+
+#: extensions/base/managewiki.py:124
+#, python-brace-format
+msgid "Modified \"{namespace_name}\" namespace"
+msgstr "Bearbeitete den Namensraum „{namespace_name}“"
+
+#: extensions/base/managewiki.py:126 extensions/base/managewiki.py:149
+msgid "Wiki"
+msgstr "Wiki"
+
+#: extensions/base/managewiki.py:134
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) modified namespace *{namespace_name}* on "
+"*{wiki_name}*{comment}"
+msgstr ""
+"[{author}]({author_url}) bearbeitete den Namensraum *{namespace_name}* für "
+"*{wiki_name}*{comment}"
+
+#: extensions/base/managewiki.py:147
+#, python-brace-format
+msgid "Deleted a \"{namespace_name}\" namespace"
+msgstr "Löschte den Namensraum „{namespace_name}“"
+
+#: extensions/base/managewiki.py:158
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) deleted a namespace *{namespace_name}* on "
+"*{wiki_name}*{comment}"
+msgstr ""
+"[{author}]({author_url}) löschte den Namesraum *{namespace_name}* für "
+"*{wiki_name}*{comment}"
+
+#: extensions/base/managewiki.py:173
+#, python-brace-format
+msgid "Modified \"{usergroup_name}\" usergroup"
+msgstr "Bearbeitete die Benutzergruppe „{usergroup_name}“"
+
+#: extensions/base/managewiki.py:182
+#, python-brace-format
+msgid "[{author}]({author_url}) modified user group *{group_name}*{comment}"
+msgstr ""
+"[{author}]({author_url}) bearbeitete die Benutzergruppe *{group_name}"
+"*{comment}"
+
+#: extensions/base/managewiki.py:195
+#, python-brace-format
+msgid "Undeleted a \"{wiki}\" wiki"
+msgstr "Stellte das Wiki „{wiki}“ wieder her"
+
+#: extensions/base/managewiki.py:203
+#, python-brace-format
+msgid "[{author}]({author_url}) undeleted a wiki *{wiki_name}*{comment}"
+msgstr ""
+"[{author}]({author_url}) stellte das Wiki *{wiki_name}* wieder her{comment}"
+
+#: extensions/base/managewiki.py:217
+#, python-brace-format
+msgid "Unlocked a \"{wiki}\" wiki"
+msgstr "Entsperrte das Wiki „{wiki}“"
+
+#: extensions/base/managewiki.py:225
+#, python-brace-format
+msgid "[{author}]({author_url}) unlocked a wiki *{wiki_name}*{comment}"
+msgstr "[{author}]({author_url}) entsperrte das Wiki *{wiki_name}*{comment}"
+
+#: extensions/base/datadump.py:36
+#, python-brace-format
+msgid "Generated {file} dump"
+msgstr "Generierte {file} Dump"
+
+#: extensions/base/datadump.py:45
+#, python-brace-format
+msgid "[{author}]({author_url}) generated *{file}* dump{comment}"
+msgstr "[{author}]({author_url}) generierte *{file}* Dump{comment}"
+
+#: extensions/base/datadump.py:58
+#, python-brace-format
+msgid "Deleted {file} dump"
+msgstr "Löschte {file} Dump"
+
+#: extensions/base/datadump.py:67
+#, python-brace-format
+msgid "[{author}]({author_url}) deleted *{file}* dump{comment}"
+msgstr "[{author}]({author_url}) löschte *{file}* Dump{comment}"
+
+#: extensions/base/curseprofile.py:40
+#, python-brace-format
+msgid "Edited {target}'s profile"
+msgstr "Bearbeitete das Profil von {target}"
+
+#: extensions/base/curseprofile.py:42
+msgid "Edited their own profile"
+msgstr "Bearbeitete das eigene Profil"
+
+#: extensions/base/curseprofile.py:44
+#, python-brace-format
+msgid "Cleared the {field} field"
+msgstr "Entfernte den {field}"
+
+#: extensions/base/curseprofile.py:46
+#, python-brace-format
+msgid "{field} field changed to: {desc}"
+msgstr "{field} geändert zu: {desc}"
+
+#: extensions/base/curseprofile.py:58
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) cleared the {field} on [{target}]({target_url})'s "
+"profile."
+msgstr ""
+"[{author}]({author_url}) leerte den {field} auf dem Profil von [{target}]"
+"({target_url})."
+
+#: extensions/base/curseprofile.py:60
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) edited the {field} on [{target}]({target_url})'s "
+"profile. *({desc})*"
+msgstr ""
+"[{author}]({author_url}) bearbeitete den {field} auf dem Profil von "
+"[{target}]({target_url}). *({desc})*"
+
+#: extensions/base/curseprofile.py:65
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) cleared the {field} on [their own]({target_url}) "
+"profile."
+msgstr ""
+"[{author}]({author_url}) leerte den {field} auf dem [eigenen Profil]"
+"({target_url})."
+
+#: extensions/base/curseprofile.py:67
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) edited the {field} on [their own]({target_url}) "
+"profile. *({desc})*"
+msgstr ""
+"[{author}]({author_url}) bearbeitete den {field} auf dem [eigenen Profil]"
+"({target_url}). *({desc})*"
+
+#: extensions/base/curseprofile.py:82
+#, python-brace-format
+msgid "Left a comment on {target}'s profile"
+msgstr "Hinterließ ein Kommentar auf dem Profil von {target}"
+
+#: extensions/base/curseprofile.py:84
+msgid "Left a comment on their own profile"
+msgstr "Hinterließ ein Kommentar auf dem eigenen Profil"
+
+#: extensions/base/curseprofile.py:97
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) left a [comment]({comment}) on {target}'s profile."
+msgstr ""
+"[{author}]({author_url}) hinterließ einen [Kommentar]({comment}) auf dem "
+"Profil von {target}."
+
+#: extensions/base/curseprofile.py:100
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) left a [comment]({comment}) on their own profile."
+msgstr ""
+"[{author}]({author_url}) hinterließ einen [Kommentar]({comment}) auf dem "
+"eigenen Profil."
+
+#: extensions/base/curseprofile.py:113
+#, python-brace-format
+msgid "Edited a comment on {target}'s profile"
+msgstr "Bearbeitete ein Kommentar auf dem Profil von {target}"
+
+#: extensions/base/curseprofile.py:115
+msgid "Edited a comment on their own profile"
+msgstr "Bearbeitete ein Kommentar auf dem eigenen Profil"
+
+#: extensions/base/curseprofile.py:128
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) edited a [comment]({comment}) on {target}'s profile."
+msgstr ""
+"[{author}]({author_url}) bearbeitete einen [Kommentar]({comment}) auf dem "
+"Profil von {target}."
+
+#: extensions/base/curseprofile.py:131
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) edited a [comment]({comment}) on their own profile."
+msgstr ""
+"[{author}]({author_url}) bearbeitete einen [Kommentar]({comment}) auf dem "
+"eigenen Profil."
+
+#: extensions/base/curseprofile.py:144
+#, python-brace-format
+msgid "Replied to a comment on {target}'s profile"
+msgstr "Antwortete auf ein Kommentar auf dem Profil von {target}"
+
+#: extensions/base/curseprofile.py:146
+msgid "Replied to a comment on their own profile"
+msgstr "Antwortete auf ein Kommentar auf dem eigenen Profil"
+
+#: extensions/base/curseprofile.py:159
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) replied to a [comment]({comment}) on {target}'s "
+"profile."
+msgstr ""
+"[{author}]({author_url}) antwortete auf einen [Kommentar]({comment}) auf dem "
+"Profil von {target}."
+
+#: extensions/base/curseprofile.py:162
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) replied to a [comment]({comment}) on their own "
+"profile."
+msgstr ""
+"[{author}]({author_url}) antwortete auf einen [Kommentar]({comment}) auf dem "
+"eigenen Profil."
+
+#: extensions/base/curseprofile.py:175
+#, python-brace-format
+msgid "Deleted a comment on {target}'s profile"
+msgstr "Löschte ein Kommentar auf dem Profil von {target}"
+
+#: extensions/base/curseprofile.py:177
+msgid "Deleted a comment on their own profile"
+msgstr "Löschte ein Kommentar auf dem eigenen Profil"
+
+#: extensions/base/curseprofile.py:197
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) deleted a [comment]({comment}) on {target}'s "
+"profile.{reason}"
+msgstr ""
+"[{author}]({author_url}) löschte einen [Kommentar]({comment}) auf dem Profil "
+"von {target}.{reason}"
+
+#: extensions/base/curseprofile.py:200
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) deleted a [comment]({comment}) on their own profile."
+"{reason}"
+msgstr ""
+"[{author}]({author_url}) löschte einen [Kommentar]({comment}) auf dem "
+"eigenen Profil.{reason}"
+
+#: extensions/base/curseprofile.py:214
+#, python-brace-format
+msgid "Purged a comment on {target}'s profile"
+msgstr "Löschte ein Kommentar auf dem Profil von {target} dauerhaft"
+
+#: extensions/base/curseprofile.py:216
+msgid "Purged a comment on their own profile"
+msgstr "Löschte ein Kommentar auf dem eigenen Profil dauerhaft"
+
+#: extensions/base/curseprofile.py:230
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) purged a comment on [{target}]({link})'s profile."
+"{reason}"
+msgstr ""
+"[{author}]({author_url}) löschte einen Kommentar auf dem Profil von "
+"[{target}]({link}) dauerhaft.{reason}"
+
+#: extensions/base/curseprofile.py:233
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) purged a comment on [their own]({link}) profile."
+"{reason}"
+msgstr ""
+"[{author}]({author_url}) löschte einen Kommentar auf dem [eigenen]({link}) "
+"Profil dauerhaft.{reason}"
+
+#: extensions/base/renameuser.py:38
+#, python-brace-format
+msgid "Renamed user \"{old_name}\" with {edits} edit to \"{new_name}\""
+msgid_plural "Renamed user \"{old_name}\" with {edits} edits to \"{new_name}\""
+msgstr[0] ""
+"Nannte den Benutzer „{old_name}“ mit einer Bearbeitung zu „{new_name}“ um"
+msgstr[1] ""
+"Nannte den Benutzer „{old_name}“ mit {edits} Bearbeitungen zu „{new_name}“ um"
+
+#: extensions/base/renameuser.py:43
+#, python-brace-format
+msgid "Renamed user \"{old_name}\" to \"{new_name}\""
+msgstr "Nannte den Benutzer „{old_name}“ zu „{new_name}“ um"
+
+#: extensions/base/renameuser.py:58
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) renamed user *{old_name}* with {edits} edit to "
+"[{new_name}]({link}){comment}"
+msgid_plural ""
+"[{author}]({author_url}) renamed user *{old_name}* with {edits} edits to "
+"[{new_name}]({link}){comment}"
+msgstr[0] ""
+"[{author}]({author_url}) hat den Benutzer *{old_name}* mit einer Bearbeitung "
+"zu [{new_name}]({link}) umbenannt{comment}"
+msgstr[1] ""
+"[{author}]({author_url}) hat den Benutzer *{old_name}* mit {edits} "
+"Bearbeitungen zu [{new_name}]({link}) umbenannt{comment}"
+
+#: extensions/base/renameuser.py:66
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) renamed user *{old_name}* to [{new_name}]({link})"
+"{comment}"
+msgstr ""
+"[{author}]({author_url}) hat den Benutzer *{old_name}* zu [{new_name}]"
+"({link}) umbenannt{comment}"
+
+#: extensions/base/interwiki.py:37
+msgid "Added an entry to the interwiki table"
+msgstr "Fügte ein Interwiki-Präfix hinzu"
+
+#: extensions/base/interwiki.py:38 extensions/base/interwiki.py:65
+#, python-brace-format
+msgid "Prefix: {prefix}, website: {website} | {desc}"
+msgstr "Präfix: {prefix}, URL: {website} | {desc}"
+
+#: extensions/base/interwiki.py:50
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) added an entry to the [interwiki table]"
+"({table_url}) pointing to {website} with {prefix} prefix"
+msgstr ""
+"[{author}]({author_url}) erstellte den [Interwiki-Präfix]({table_url}) "
+"{prefix} nach {website}"
+
+#: extensions/base/interwiki.py:64
+msgid "Edited an entry in interwiki table"
+msgstr "Änderte ein Interwiki-Präfix"
+
+#: extensions/base/interwiki.py:77
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) edited an entry in [interwiki table]({table_url}) "
+"pointing to {website} with {prefix} prefix"
+msgstr ""
+"[{author}]({author_url}) bearbeitete den [Interwiki-Präfix]({table_url}) "
+"{prefix} nach {website}"
+
+#: extensions/base/interwiki.py:91
+msgid "Deleted an entry in interwiki table"
+msgstr "Entfernte ein Interwiki-Präfix"
+
+#: extensions/base/interwiki.py:92
+#, python-brace-format
+msgid "Prefix: {prefix} | {desc}"
+msgstr "Präfix: {prefix} | {desc}"
+
+#: extensions/base/interwiki.py:102
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) deleted an entry in [interwiki table]({table_url})"
+"{desc}"
+msgstr ""
+"[{author}]({author_url}) entfernte ein [Interwiki-Präfix]({table_url}){desc}"
+
+#: extensions/base/abusefilter.py:29
+msgid "None"
+msgstr "Keine"
+
+#: extensions/base/abusefilter.py:29
+msgid "Warning issued"
+msgstr "Gewarnt"
+
+#: extensions/base/abusefilter.py:29
+msgid "**Blocked user**"
+msgstr "**Benutzer gesperrt**"
+
+#: extensions/base/abusefilter.py:29
+msgid "Tagged the edit"
+msgstr "Änderung markiert"
+
+#: extensions/base/abusefilter.py:29
+msgid "Disallowed the action"
+msgstr "Aktion verhindert"
+
+#: extensions/base/abusefilter.py:29
+msgid "**IP range blocked**"
+msgstr "**IP-Adressbereich gesperrt**"
+
+#: extensions/base/abusefilter.py:29
+msgid "Throttled actions"
+msgstr "Aktionen gedrosselt"
+
+#: extensions/base/abusefilter.py:29
+msgid "Removed autoconfirmed group"
+msgstr "„Automatisch bestätigter Benutzer“-Status entzogen"
+
+#: extensions/base/abusefilter.py:29
+msgid "**Removed from privileged groups**"
+msgstr "**Gruppen mit Sonderrechten entfernt**"
+
+#: extensions/base/abusefilter.py:30
+msgid "Edit"
+msgstr "Bearbeitung"
+
+#: extensions/base/abusefilter.py:30
+msgid "Upload"
+msgstr "Hochladen"
+
+#: extensions/base/abusefilter.py:30
+msgid "Move"
+msgstr "Verschieben"
+
+#: extensions/base/abusefilter.py:30
+msgid "Stash upload"
+msgstr "Hochladen vom Zwischenspeicher"
+
+#: extensions/base/abusefilter.py:30
+msgid "Deletion"
+msgstr "Löschung"
+
+#: extensions/base/abusefilter.py:30
+msgid "Account creation"
+msgstr "Benutzerkontenerstellung"
+
+#: extensions/base/abusefilter.py:30
+msgid "Auto account creation"
+msgstr "Automatische Benutzerkontenerstellung"
+
+#: extensions/base/abusefilter.py:54
+#, python-brace-format
+msgid "{user} triggered \"{abuse_filter}\""
+msgstr "{user} löste „{abuse_filter}“ aus"
+
+#: extensions/base/abusefilter.py:55
+msgid "Performed"
+msgstr "Aktion"
+
+#: extensions/base/abusefilter.py:56
+msgid "Action taken"
+msgstr "Maßnahmen"
+
+#: extensions/base/abusefilter.py:57
+msgid "Title"
+msgstr "Seite"
+
+#: extensions/base/abusefilter.py:66
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) triggered *{abuse_filter}*, performing the action "
+"\"{action}\" on *[{target}]({target_url})* - action taken: {result}."
+msgstr ""
+"[{author}]({author_url}) löste durch die Aktion „{action}“ auf der Seite "
+"*[{target}]({target_url})* den Filter *{abuse_filter}* aus. Ergriffene "
+"Maßnahmen: {result}."
+
+#: extensions/base/abusefilter.py:83
+#, python-brace-format
+msgid "Edited abuse filter number {number}"
+msgstr "Änderte Missbrauchsfilter {number}"
+
+#: extensions/base/abusefilter.py:95
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) edited abuse filter [number {number}]({filter_url})"
+msgstr ""
+"[{author}]({author_url}) änderte [Missbrauchsfilter {number}]({filter_url})"
+
+#: extensions/base/abusefilter.py:111
+#, python-brace-format
+msgid "Created abuse filter number {number}"
+msgstr "Erstellte Missbrauchsfilter {number}"
+
+#: extensions/base/abusefilter.py:119
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) created abuse filter [number {number}]({filter_url})"
+msgstr ""
+"[{author}]({author_url}) erstellte [Missbrauchsfilter {number}]({filter_url})"
+
+#: extensions/base/mediawiki.py:37
+msgid "director"
+msgstr "Direktor"
+
+#: extensions/base/mediawiki.py:37
+msgid "bot"
+msgstr "Bot"
+
+#: extensions/base/mediawiki.py:37
+msgid "editor"
+msgstr "editor"
+
+#: extensions/base/mediawiki.py:37
+msgid "directors"
+msgstr "Direktor"
+
+#: extensions/base/mediawiki.py:37
+msgid "sysop"
+msgstr "Administrator"
+
+#: extensions/base/mediawiki.py:37
+msgid "bureaucrat"
+msgstr "Bürokrat"
+
+#: extensions/base/mediawiki.py:37
+msgid "reviewer"
+msgstr "Prüfer"
+
+#: extensions/base/mediawiki.py:38
+msgid "autoreview"
+msgstr "Passive Sichter"
+
+#: extensions/base/mediawiki.py:38
+msgid "autopatrol"
+msgstr "Automatisch kontrolliert"
+
+#: extensions/base/mediawiki.py:38
+msgid "wiki_guardian"
+msgstr "Wiki Guardian"
+
+#: extensions/base/mediawiki.py:70
+msgid "(N!) "
+msgstr "(N!) "
+
+#: extensions/base/mediawiki.py:71
+msgid "m"
+msgstr "K"
+
+#: extensions/base/mediawiki.py:72
+msgid "b"
+msgstr "B"
+
+#: extensions/base/mediawiki.py:112
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) edited [{article}]({edit_link}){comment} {bold}"
+"({sign}{edit_size}){bold}"
+msgstr ""
+"[{author}]({author_url}) bearbeitete [{article}]({edit_link}){comment} {bold}"
+"({sign}{edit_size}){bold}"
+
+#: extensions/base/mediawiki.py:117
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) created [{article}]({edit_link}){comment} {bold}"
+"({sign}{edit_size}){bold}"
+msgstr ""
+"[{author}]({author_url}) erstellte [{article}]({edit_link}){comment} {bold}"
+"({sign}{edit_size}){bold}"
+
+#: extensions/base/mediawiki.py:190 extensions/base/mediawiki.py:223
+msgid "Options"
+msgstr "Optionen"
+
+#: extensions/base/mediawiki.py:190
+#, python-brace-format
+msgid "([preview]({link}) | [undo]({undolink}))"
+msgstr "([Vorschau]({link}) | [zurücksetzen]({undolink}))"
+
+#: extensions/base/mediawiki.py:195
+#, python-brace-format
+msgid "Uploaded a new version of {name}"
+msgstr "Neue Dateiversion {name}"
+
+#: extensions/base/mediawiki.py:197
+#, python-brace-format
+msgid "Reverted a version of {name}"
+msgstr "Setzte {name} auf eine alte Version zurück"
+
+#: extensions/base/mediawiki.py:199
+#, python-brace-format
+msgid "Uploaded {name}"
+msgstr "Neue Datei {name}"
+
+#: extensions/base/mediawiki.py:208
+msgid "**No license!**"
+msgstr "**Keine Lizenz!**"
+
+#: extensions/base/mediawiki.py:223
+#, python-brace-format
+msgid "([preview]({link}))"
+msgstr "([Vorschau]({link}))"
+
+#: extensions/base/mediawiki.py:228
+msgid ""
+"\n"
+"License: {}"
+msgstr ""
+"\n"
+"Lizenz: {}"
+
+#: extensions/base/mediawiki.py:237
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) reverted a version of [{file}]({file_link}){comment}"
+msgstr ""
+"[{author}]({author_url}) setzte [{file}]({file_link}) auf eine alte Version "
+"zurück{comment}"
+
+#: extensions/base/mediawiki.py:248
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) uploaded a new version of [{file}]({file_link})"
+"{comment}"
+msgstr ""
+"[{author}]({author_url}) lud eine neue Version von [{file}]({file_link}) "
+"hoch{comment}"
+
+#: extensions/base/mediawiki.py:259
+#, python-brace-format
+msgid "[{author}]({author_url}) uploaded [{file}]({file_link}){comment}"
+msgstr "[{author}]({author_url}) lud [{file}]({file_link}) hoch{comment}"
+
+#: extensions/base/mediawiki.py:274
+#, python-brace-format
+msgid "Deleted page {article}"
+msgstr "Löschte {article}"
+
+#: extensions/base/mediawiki.py:283
+#, python-brace-format
+msgid "[{author}]({author_url}) deleted [{page}]({page_link}){comment}"
+msgstr "[{author}]({author_url}) löschte [{page}]({page_link}){comment}"
+
+#: extensions/base/mediawiki.py:298
+#, python-brace-format
+msgid "Deleted redirect {article} by overwriting"
+msgstr "Löschte die Weiterleitung {article} um Platz zu machen"
+
+#: extensions/base/mediawiki.py:308
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) deleted redirect by overwriting [{page}]"
+"({page_link}){comment}"
+msgstr ""
+"[{author}]({author_url}) löschte die Weiterleitung [{page}]({page_link}) "
+"durch Überschreiben{comment}"
+
+#: extensions/base/mediawiki.py:322
+#, python-brace-format
+msgid "Restored {article}"
+msgstr "Stellte {article} wieder her"
+
+#: extensions/base/mediawiki.py:331
+#, python-brace-format
+msgid "[{author}]({author_url}) restored [{article}]({article_url}){comment}"
+msgstr ""
+"[{author}]({author_url}) stellte [{article}]({article_url}) wieder "
+"her{comment}"
+
+#: extensions/base/mediawiki.py:348
+msgid "Changed visibility of log events"
+msgstr "Änderte die Sichtbarkeit eines Logbucheintrags"
+
+#: extensions/base/mediawiki.py:356
+#, python-brace-format
+msgid "[{author}]({author_url}) changed visibility of log events{comment}"
+msgstr ""
+"[{author}]({author_url}) änderte die Sichtbarkeit eines "
+"Logbucheintrags{comment}"
+
+#: extensions/base/mediawiki.py:370
+#, python-brace-format
+msgid "Changed visibility of revision on page {article} "
+msgid_plural "Changed visibility of {amount} revisions on page {article} "
+msgstr[0] "Änderte die Sichtbarkeit einer Versionen von {article} "
+msgstr[1] "Änderte die Sichtbarkeit von {amount} Versionen von {article} "
+
+#: extensions/base/mediawiki.py:383
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) changed visibility of revision on page [{article}]"
+"({article_url}){comment}"
+msgid_plural ""
+"[{author}]({author_url}) changed visibility of {amount} revisions on page "
+"[{article}]({article_url}){comment}"
+msgstr[0] ""
+"[{author}]({author_url}) änderte die Sichtbarkeit einer Version von "
+"[{article}]({article_url}){comment}"
+msgstr[1] ""
+"[{author}]({author_url}) änderte die Sichtbarkeit von {amount} Versionen von "
+"[{article}]({article_url}){comment}"
+
+#: extensions/base/mediawiki.py:399 extensions/base/mediawiki.py:432
+msgid "No redirect has been made"
+msgstr "Die Erstellung einer Weiterleitung wurde unterdrückt"
+
+#: extensions/base/mediawiki.py:400 extensions/base/mediawiki.py:433
+msgid "A redirect has been made"
+msgstr "Eine Weiterleitung wurde erstellt"
+
+#: extensions/base/mediawiki.py:401
+#, python-brace-format
+msgid "Moved {redirect}{article} to {target}"
+msgstr "Verschob {redirect}{article} nach {target}"
+
+#: extensions/base/mediawiki.py:412 extensions/base/mediawiki.py:444
+msgid "without making a redirect"
+msgstr "ohne eine Weiterleitung zu erstellen"
+
+#: extensions/base/mediawiki.py:413 extensions/base/mediawiki.py:445
+msgid "with a redirect"
+msgstr "und erstellte eine Weiterleitung"
+
+#: extensions/base/mediawiki.py:416
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) moved {redirect}*{article}* to [{target}]"
+"({target_url}) {made_a_redirect}{comment}"
+msgstr ""
+"[{author}]({author_url}) verschob {redirect}*{article}* nach [{target}]"
+"({target_url}) {made_a_redirect}{comment}"
+
+#: extensions/base/mediawiki.py:434
+#, python-brace-format
+msgid "Moved {redirect}{article} to {title} over redirect"
+msgstr ""
+"Verschob {redirect}{article} nach {title} und überschrieb eine Weiterleitung"
+
+#: extensions/base/mediawiki.py:448
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) moved {redirect}*{article}* over redirect to "
+"[{target}]({target_url}) {made_a_redirect}{comment}"
+msgstr ""
+"[{author}]({author_url}) verschob {redirect}*{article}* nach [{target}]"
+"({target_url}) und überschrieb eine Weiterleitung {made_a_redirect}{comment}"
+
+#: extensions/base/mediawiki.py:464
+#, python-brace-format
+msgid "Moved protection settings from {redirect}{article} to {title}"
+msgstr "Verschob die Schutzeinstellungen von {redirect}{article} nach {title}"
+
+#: extensions/base/mediawiki.py:477
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) moved protection settings from {redirect}*{article}"
+"* to [{target}]({target_url}){comment}"
+msgstr ""
+"[{author}]({author_url}) verschob die Schutzeinstellungen von {redirect}"
+"*{article}* nach [{target}]({target_url}){comment}"
+
+#: extensions/base/mediawiki.py:492
+#, python-brace-format
+msgid "Protected {target}"
+msgstr "Schützte {target}"
+
+#: extensions/base/mediawiki.py:495 extensions/base/mediawiki.py:510
+#: extensions/base/mediawiki.py:526 extensions/base/mediawiki.py:541
+msgid " [cascading]"
+msgstr " [kaskadierend]"
+
+#: extensions/base/mediawiki.py:506
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) protected [{article}]({article_url}) with the "
+"following settings: {settings}{comment}"
+msgstr ""
+"[{author}]({author_url}) schützte [{article}]({article_url}) {settings}"
+"{comment}"
+
+#: extensions/base/mediawiki.py:523
+#, python-brace-format
+msgid "Changed protection level for {article}"
+msgstr "Änderte den Schutzstatus von {article}"
+
+#: extensions/base/mediawiki.py:537
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) modified protection settings of [{article}]"
+"({article_url}) to: {settings}{comment}"
+msgstr ""
+"[{author}]({author_url}) änderte den Schutzstatus von [{article}]"
+"({article_url}) {settings}{comment}"
+
+#: extensions/base/mediawiki.py:554
+#, python-brace-format
+msgid "Removed protection from {article}"
+msgstr "Entfernte den Schutz von {article}"
+
+#: extensions/base/mediawiki.py:563
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) removed protection from [{article}]({article_url})"
+"{comment}"
+msgstr ""
+"[{author}]({author_url}) entfernte den Schutz von [{article}]({article_url})"
+"{comment}"
+
+#: extensions/base/mediawiki.py:572
+msgid "for infinity and beyond"
+msgstr "für alle Ewigkeit"
+
+#: extensions/base/mediawiki.py:581
+msgid "for less than a minute"
+msgstr "für weniger als eine Minute"
+
+#: extensions/base/mediawiki.py:583
+msgid "year"
+msgid_plural "years"
+msgstr[0] "Jahr"
+msgstr[1] "Jahre"
+
+#: extensions/base/mediawiki.py:583
+msgid "day"
+msgid_plural "days"
+msgstr[0] "Tag"
+msgstr[1] "Tage"
+
+#: extensions/base/mediawiki.py:583
+msgid "hour"
+msgid_plural "hours"
+msgstr[0] "Stunde"
+msgstr[1] "Stunden"
+
+#: extensions/base/mediawiki.py:584
+msgid "minute"
+msgid_plural "minutes"
+msgstr[0] "Minute"
+msgstr[1] "Minuten"
+
+#: extensions/base/mediawiki.py:589
+#, python-brace-format
+msgid "for {time_number} {time_unit}"
+msgstr "für {time_number} {time_unit}"
+
+#: extensions/base/mediawiki.py:608
+msgid "Blocked from editing the following pages: "
+msgstr "Bearbeiten von folgenden Seiten gesperrt: "
+
+#: extensions/base/mediawiki.py:615 extensions/base/mediawiki.py:661
+msgid " and namespaces: "
+msgstr " und Namensräumen: "
+
+#: extensions/base/mediawiki.py:617
+msgid "Blocked from editing pages on following namespaces: "
+msgstr "Bearbeiten von Seiten in folgenden Namensräumen gesperrt: "
+
+#: extensions/base/mediawiki.py:628
+msgid "Partial block details"
+msgstr "Teilweise Sperre"
+
+#: extensions/base/mediawiki.py:631
+msgid "Block flags"
+msgstr "Sperroptionen"
+
+#: extensions/base/mediawiki.py:633
+#, python-brace-format
+msgid "Blocked {blocked_user} {time}"
+msgstr "Sperrte {blocked_user} {time}"
+
+#: extensions/base/mediawiki.py:653
+msgid " on pages: "
+msgstr " auf Seiten: "
+
+#: extensions/base/mediawiki.py:663
+msgid " on namespaces: "
+msgstr " in Namensräumen: "
+
+#: extensions/base/mediawiki.py:675
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) blocked [{user}]({user_url}) {time}"
+"{restriction_desc}{comment}"
+msgstr ""
+"[{author}]({author_url}) sperrte [{user}]({user_url}) {time}"
+"{restriction_desc}{comment}"
+
+#: extensions/base/mediawiki.py:693
+#, python-brace-format
+msgid "Changed block settings for {blocked_user}"
+msgstr "Änderte die Sperreinstellungen für {blocked_user}"
+
+#: extensions/base/mediawiki.py:703
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) changed block settings for [{blocked_user}]"
+"({user_url}){comment}"
+msgstr ""
+"[{author}]({author_url}) änderte die Sperreinstellungen für [{blocked_user}]"
+"({user_url}){comment}"
+
+#: extensions/base/mediawiki.py:716
+#, python-brace-format
+msgid "Unblocked {blocked_user}"
+msgstr "Hob die Sperre von {blocked_user} auf"
+
+#: extensions/base/mediawiki.py:726
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) unblocked [{blocked_user}]({user_url}){comment}"
+msgstr ""
+"[{author}]({author_url}) hob die Sperre von [{blocked_user}]({user_url}) "
+"auf{comment}"
+
+#: extensions/base/mediawiki.py:742
+msgid "Action has been hidden by administration"
+msgstr "Aktion wurde versteckt"
+
+#: extensions/base/mediawiki.py:749
+msgid "An action has been hidden by administration."
+msgstr "Eine Aktion wurde versteckt."
+
+#: extensions/base/mediawiki.py:760
+#, python-brace-format
+msgid "Imported {article} with {count} revision"
+msgid_plural "Imported {article} with {count} revisions"
+msgstr[0] "Importierte {article} mit einer Version"
+msgstr[1] "Importierte {article} mit {count} Versionen"
+
+#: extensions/base/mediawiki.py:771
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) imported [{article}]({article_url}) with {count} "
+"revision{comment}"
+msgid_plural ""
+"[{author}]({author_url}) imported [{article}]({article_url}) with {count} "
+"revisions{comment}"
+msgstr[0] ""
+"[{author}]({author_url}) importierte [{article}]({article_url}) mit einer "
+"Version{comment}"
+msgstr[1] ""
+"[{author}]({author_url}) importierte [{article}]({article_url}) mit {count} "
+"Versionen{comment}"
+
+#: extensions/base/mediawiki.py:787
+#, python-brace-format
+msgid "Imported {article} with {count} revision from \"{source}\""
+msgid_plural "Imported {article} with {count} revisions from \"{source}\""
+msgstr[0] "Importierte {article} mit einer Version von „{source}“"
+msgstr[1] "Importierte {article} mit {count} Versionen von „{source}“"
+
+#: extensions/base/mediawiki.py:802
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) imported [{article}]({article_url}) with {count} "
+"revision from [{source}]({source_url}){comment}"
+msgid_plural ""
+"[{author}]({author_url}) imported [{article}]({article_url}) with {count} "
+"revisions from [{source}]({source_url}){comment}"
+msgstr[0] ""
+"[{author}]({author_url}) importierte [{article}]({article_url}) mit einer "
+"Version von [{source}]({source_url}){comment}"
+msgstr[1] ""
+"[{author}]({author_url}) importierte [{article}]({article_url}) mit {count} "
+"Versionen von [{source}]({source_url}){comment}"
+
+#: extensions/base/mediawiki.py:817
+#, python-brace-format
+msgid " (until {date_and_time})"
+msgstr " (bis {date_and_time})"
+
+#: extensions/base/mediawiki.py:834
+#, python-brace-format
+msgid "Changed group membership for {target}"
+msgstr "Änderte die Gruppenzugehörigkeit von {target}"
+
+#: extensions/base/mediawiki.py:836
+msgid "System"
+msgstr "System"
+
+#: extensions/base/mediawiki.py:837
+#, python-brace-format
+msgid "{target} got autopromoted to a new usergroup"
+msgstr "{target} wurde automatisch einer neuen Benutzergruppe zugeordnet"
+
+#: extensions/base/mediawiki.py:843
+msgid "Added group"
+msgid_plural "Added groups"
+msgstr[0] "Hinzugefügte Gruppe"
+msgstr[1] "Hinzugefügte Gruppen"
+
+#: extensions/base/mediawiki.py:845
+msgid "Removed group"
+msgid_plural "Removed groups"
+msgstr[0] "Entfernte Gruppe"
+msgstr[1] "Entfernte Gruppen"
+
+#: extensions/base/mediawiki.py:859
+#, python-brace-format
+msgid "Added to {added} and removed from {removed}."
+msgstr "Hinzugefügt zu {added} und entfernt von {removed}."
+
+#: extensions/base/mediawiki.py:860 extensions/base/mediawiki.py:862
+#: extensions/base/mediawiki.py:864 extensions/base/mediawiki.py:871
+msgid ", "
+msgstr ", "
+
+#: extensions/base/mediawiki.py:862
+#, python-brace-format
+msgid "Added to {added}."
+msgstr "Hinzugefügt zu {added}."
+
+#: extensions/base/mediawiki.py:864
+#, python-brace-format
+msgid "Removed from {removed}."
+msgstr "Entfernt von {removed}."
+
+#: extensions/base/mediawiki.py:865
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) changed group membership for [{target}]"
+"({target_url}): {group_changes}{comment}"
+msgstr ""
+"[{author}]({author_url}) änderte die Benutzergruppen für [{target}]"
+"({target_url}): {group_changes}{comment}"
+
+#: extensions/base/mediawiki.py:869
+#, python-brace-format
+msgid "The system autopromoted [{target}]({target_url}) to {added}.{comment}"
+msgstr ""
+"[{target}]({target_url}) wurde automatisch zu {added} hinzugefügt.{comment}"
+
+#: extensions/base/mediawiki.py:882
+#, python-brace-format
+msgid "Merged revision histories of {article} into {dest}"
+msgstr "Vereinigte Versionen von {article} in {dest}"
+
+#: extensions/base/mediawiki.py:896
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) merged revision histories of [{article}]"
+"({article_url}) into [{dest}]({dest_url}){comment}"
+msgstr ""
+"[{author}]({author_url}) vereinigte Versionen von [{article}]({article_url}) "
+"in [{dest}]({dest_url}){comment}"
+
+#: extensions/base/mediawiki.py:910
+msgid "Created account automatically"
+msgstr "Erstellte Konto automatisch"
+
+#: extensions/base/mediawiki.py:917
+#, python-brace-format
+msgid "Account [{author}]({author_url}) was created automatically"
+msgstr "Konto [{author}]({author_url}) wurde automtisch erstellt"
+
+#: extensions/base/mediawiki.py:930 extensions/base/mediawiki.py:995
+msgid "Created account"
+msgstr "Erstellte Konto"
+
+#: extensions/base/mediawiki.py:937 extensions/base/mediawiki.py:1002
+#, python-brace-format
+msgid "Account [{author}]({author_url}) was created"
+msgstr "Konto [{author}]({author_url}) wurde erstellt"
+
+#: extensions/base/mediawiki.py:949
+#, python-brace-format
+msgid "Created account {article}"
+msgstr "Erstellte Konto {article}"
+
+#: extensions/base/mediawiki.py:958
+#, python-brace-format
+msgid ""
+"Account [{article}]({article_url}) was created by [{author}]({author_url})"
+"{comment}"
+msgstr ""
+"Konto [{article}]({article_url}) wurde von [{author}]({author_url}) "
+"erstellt{comment}"
+
+#: extensions/base/mediawiki.py:971
+#, python-brace-format
+msgid "Created account {article} and password was sent by email"
+msgstr "Erstellte Konto {article} und das Passwort wurde per E-Mail zugesandt"
+
+#: extensions/base/mediawiki.py:982
+#, python-brace-format
+msgid ""
+"Account [{article}]({article_url}) was created by [{author}]({author_url}) "
+"and password was sent by email{comment}"
+msgstr ""
+"Konto [{article}]({article_url}) wurde von [{author}]({author_url}) erstellt "
+"und das Passwort wurde per E-Mail zugesandt{comment}"
+
+#: extensions/base/mediawiki.py:1014
+#, python-brace-format
+msgid "Changed the content model of the page {article}"
+msgstr "Änderte das Inhaltsmodell von {article}"
+
+#: extensions/base/mediawiki.py:1016
+#, python-brace-format
+msgid "Model changed from {old} to {new}: {reason}"
+msgstr "Modell geändert von {old} zu {new}: {reason}"
+
+#: extensions/base/mediawiki.py:1028
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) changed the content model of the page [{article}]"
+"({article_url}) from {old} to {new}{comment}"
+msgstr ""
+"[{author}]({author_url}) änderte das Inhaltsmodell der Seite [{article}]"
+"({article_url}) von {old} zu {new}{comment}"
+
+#: extensions/base/mediawiki.py:1043
+#, python-brace-format
+msgid "Created the page {article} using a non-default content model"
+msgstr "Erstellte die Seite {article}mit einem nicht-standard Inhaltsmodell"
+
+#: extensions/base/mediawiki.py:1045
+#, python-brace-format
+msgid "Created with model {new}: {reason}"
+msgstr "Erstellt mit Modell {new}: {reason}"
+
+#: extensions/base/mediawiki.py:1056
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) created the page [{article}]({article_url}) using a "
+"non-default content model {new}{comment}"
+msgstr ""
+"[{author}]({author_url}) erstellte die Seite [{article}]({article_url}) mit "
+"dem Inhaltsmodell {new}{comment}"
+
+#: extensions/base/mediawiki.py:1071
+#, python-brace-format
+msgid "Created the tag \"{tag}\""
+msgstr "Erstellte die Markierung „{tag}“"
+
+#: extensions/base/mediawiki.py:1081
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) created the [tag]({tag_url}) \"{tag}\"{comment}"
+msgstr ""
+"[{author}]({author_url}) erstellte eine [Markierung]({tag_url}) "
+"„{tag}“{comment}"
+
+#: extensions/base/mediawiki.py:1102
+#, python-brace-format
+msgid "Deleted the tag \"{tag}\""
+msgstr "Löschte die Markierung „{tag}“"
+
+#: extensions/base/mediawiki.py:1104
+msgid "Removed from"
+msgstr "Entfernt von"
+
+#: extensions/base/mediawiki.py:1104
+msgid "{} revision or log entry"
+msgid_plural "{} revisions and/or log entries"
+msgstr[0] "{} Version oder Logbucheintrag"
+msgstr[1] "{} Versionen und/oder Logbucheinträgen"
+
+#: extensions/base/mediawiki.py:1117
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) deleted the [tag]({tag_url}) \"{tag}\"{comment}"
+msgstr ""
+"[{author}]({author_url}) löschte eine [Markierung]({tag_url}) "
+"„{tag}“{comment}"
+
+#: extensions/base/mediawiki.py:1127
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) deleted the [tag]({tag_url}) \"{tag}\" and removed "
+"it from {count} revision or log entry{comment}"
+msgid_plural ""
+"[{author}]({author_url}) deleted the [tag]({tag_url}) \"{tag}\" and removed "
+"it from {count} revisions and/or log entries{comment}"
+msgstr[0] ""
+"[{author}]({author_url}) löschte die [Markierung]({tag_url}) „{tag}“ und "
+"entfernte diese von {count} Version oder Logbucheintrag{comment}"
+msgstr[1] ""
+"[{author}]({author_url}) löschte die [Markierung]({tag_url}) „{tag}“ und "
+"entfernte diese von {count} Versionen und/oder Logbucheinträgen{comment}"
+
+#: extensions/base/mediawiki.py:1144
+#, python-brace-format
+msgid "Activated the tag \"{tag}\""
+msgstr "Aktivierte die Markierung „{tag}“"
+
+#: extensions/base/mediawiki.py:1153
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) activated the [tag]({tag_url}) \"{tag}\"{comment}"
+msgstr ""
+"[{author}]({author_url}) aktivierte die [Markierung]({tag_url}) "
+"„{tag}“{comment}"
+
+#: extensions/base/mediawiki.py:1172
+#, python-brace-format
+msgid "Deactivated the tag \"{tag}\""
+msgstr "Deaktivierte die Markierung „{tag}“"
+
+#: extensions/base/mediawiki.py:1181
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) deactivated the [tag]({tag_url}) \"{tag}\"{comment}"
+msgstr ""
+"[{author}]({author_url}) deaktivierte die [Markierung]({tag_url}) "
+"„{tag}“{comment}"
+
+#: extensions/base/sprite.py:37
+#, python-brace-format
+msgid "Edited the sprite for {article}"
+msgstr "Änderte das Sprite für {article}"
+
+#: extensions/base/sprite.py:45
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) edited the sprite for [{article}]({article_url})"
+msgstr ""
+"[{author}]({author_url}) änderte das Sprite für [{article}]({article_url})"
+
+#: extensions/base/sprite.py:60
+#, python-brace-format
+msgid "Created the sprite sheet for {article}"
+msgstr "Erstellte das Sprite-sheet für {article}"
+
+#: extensions/base/sprite.py:68
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) created the sprite sheet for [{article}]"
+"({article_url})"
+msgstr ""
+"[{author}]({author_url}) erstellte das Sprite-sheet für [{article}]"
+"({article_url})"
+
+#: extensions/base/sprite.py:79
+#, python-brace-format
+msgid "Edited the slice for {article}"
+msgstr "Änderte das Stück für {article}"
+
+#: extensions/base/sprite.py:86
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) edited the slice for [{article}]({article_url})"
+msgstr ""
+"[{author}]({author_url}) änderte das Stück für [{article}]({article_url})"
+
+#, python-brace-format
+#~ msgid ""
+#~ "{reason}\n"
+#~ "{added}{linebreak}{removed}"
+#~ msgstr ""
+#~ "{reason}\n"
+#~ "{added}{linebreak}{removed}"
+
+#, python-brace-format
+#~ msgid "{value} (avg. {avg})"
+#~ msgstr "{value} (vgl. {avg})"
+
+#~ msgid "Daily overview"
+#~ msgstr "Tägliche Übersicht"
+
+#~ msgid "No activity"
+#~ msgstr "Keine Aktivität"
+
+#~ msgid " ({} action)"
+#~ msgid_plural " ({} actions)"
+#~ msgstr[0] " (eine Aktion)"
+#~ msgstr[1] " ({} Aktionen)"
+
+#~ msgid " ({} edit)"
+#~ msgid_plural " ({} edits)"
+#~ msgstr[0] " (eine Änderung)"
+#~ msgstr[1] " ({} Änderungen)"
+
+#~ msgid " UTC ({} action)"
+#~ msgid_plural " UTC ({} actions)"
+#~ msgstr[0] " UTC (eine Aktion)"
+#~ msgstr[1] " UTC ({} Aktionen)"
+
+#~ msgid "But nobody came"
+#~ msgstr "Keine Aktivität"
+
+#~ msgid "Most active user"
+#~ msgid_plural "Most active users"
+#~ msgstr[0] "Aktivster Benutzer"
+#~ msgstr[1] "Aktivste Benutzer"
+
+#~ msgid "Most edited article"
+#~ msgid_plural "Most edited articles"
+#~ msgstr[0] "Meist bearbeiteter Artikel"
+#~ msgstr[1] "Meist bearbeitete Artikel"
+
+#~ msgid "Edits made"
+#~ msgstr "Bearbeitungen"
+
+#~ msgid "New files"
+#~ msgstr "Neue Dateien"
+
+#~ msgid "Admin actions"
+#~ msgstr "Admin-Aktionen"
+
+#~ msgid "Bytes changed"
+#~ msgstr "Bytes geändert"
+
+#~ msgid "New articles"
+#~ msgstr "Neue Artikel"
+
+#~ msgid "Unique contributors"
+#~ msgstr "Einzelne Autoren"
+
+#~ msgid "Most active hour"
+#~ msgid_plural "Most active hours"
+#~ msgstr[0] "Aktivste Stunde"
+#~ msgstr[1] "Aktivste Stunden"
+
+#~ msgid "Day score"
+#~ msgstr "Tageswert"
+
+#~ msgid "No description provided"
+#~ msgstr "Keine Zusammenfassung angegeben"
+
+#~ msgid "second"
+#~ msgid_plural "seconds"
+#~ msgstr[0] "Sekunde"
+#~ msgstr[1] "Sekunden"
+
+#~ msgid "week"
+#~ msgid_plural "weeks"
+#~ msgstr[0] "Woche"
+#~ msgstr[1] "Wochen"
+
+#~ msgid "month"
+#~ msgid_plural "months"
+#~ msgstr[0] "Monat"
+#~ msgstr[1] "Monate"
+
+#~ msgid "millennium"
+#~ msgid_plural "millennia"
+#~ msgstr[0] "Jahrtausend"
+#~ msgstr[1] "Jahrtausende"
+
+#~ msgid "decade"
+#~ msgid_plural "decades"
+#~ msgstr[0] "Jahrzehnt"
+#~ msgstr[1] "Jahrzehnte"
+
+#~ msgid "century"
+#~ msgid_plural "centuries"
+#~ msgstr[0] "Jahrhundert"
+#~ msgstr[1] "Jahrhunderte"
+
+#, python-brace-format
+#~ msgid ""
+#~ "Unknown event `{event}` by [{author}]({author_url}), report it on the "
+#~ "[support server](<{support}>)."
+#~ msgstr ""
+#~ "Unbekanntes Event `{event}` von [{author}]({author_url}), melde es auf "
+#~ "dem [Support-Server](<{support}>)."
+
+#, python-brace-format
+#~ msgid "Unknown event `{event}`"
+#~ msgstr "Unbekanntes Event `{event}`"
+
+#~ msgid "Report this on the support server"
+#~ msgstr "Melde es auf dem Support-Server"
+
+#, python-brace-format
+#~ msgid "for {num} {translated_length}"
+#~ msgstr "für {num} {translated_length}"
+
+#~ msgid "until {}"
+#~ msgstr "bis {}"
+
+#~ msgid "none"
+#~ msgstr "keine"
+
+#, python-brace-format
+#~ msgid ""
+#~ "[{author}]({author_url}) completed deletion of translatable page "
+#~ "[{article}]({article_url}){comment}"
+#~ msgstr ""
+#~ "[{author}]({author_url}) schloss die Löschung der übersetzbaren Seite "
+#~ "[{article}]({article_url}) ab{comment}"
+
+#~ msgid "unknown expiry time"
+#~ msgstr "unbekannte Ablaufdauer"
+
+#, python-brace-format
+#~ msgid "Groups changed from {old_groups} to {new_groups}{reason}"
+#~ msgstr ""
+#~ "Änderte die Gruppenzugehörigkeit von {old_groups} auf {new_groups}{reason}"
+
+#, python-brace-format
+#~ msgid "Completed deletion of translatable page \"{article}\""
+#~ msgstr "Schloss die Löschung der übersetzbaren Seite „{article}“ ab"
+
+#, python-brace-format
+#~ msgid "[{author}]({author_url}) restored a wiki *{wiki_name}*{comment}"
+#~ msgstr ""
+#~ "[{author}]({author_url}) stellte das Wiki *{wiki_name}* wieder "
+#~ "her{comment}"
+
+#, python-brace-format
+#~ msgid "Restored a \"{wiki}\" wiki"
+#~ msgstr "Stellte das Wiki „{wiki}“ wieder her"
+
+#, python-brace-format
+#~ msgid "[{author}]({author_url}) deleted a comment on {target}'s profile"
+#~ msgstr ""
+#~ "[{author}]({author_url}) löschte einen Kommentar auf dem Profil von "
+#~ "{target}"
+
+#, python-brace-format
+#~ msgid "[{author}]({author_url}) deleted a comment on their own profile"
+#~ msgstr ""
+#~ "[{author}]({author_url}) löschte einen Kommentar auf dem eigenen Profil"
+
+#, python-brace-format
+#~ msgid "[{author}]({author_url}) imported interwiki{comment}"
+#~ msgstr "[{author}]({author_url}) importierte Interwiki{comment}"
+
+#~ msgid "Imported interwiki"
+#~ msgstr "Importierte Interwiki"
+
+#~ msgid "their own profile"
+#~ msgstr "das eigene Profil"
+
+#~ msgid "their own"
+#~ msgstr "sich selbst"
+
+#, python-brace-format
+#~ msgid "[{target}]({target_url})'s"
+#~ msgstr "dem Profil von [{target}]({target_url})"
+
+#, python-brace-format
+#~ msgid "[their own]({target_url})"
+#~ msgstr "dem [eigenen Profil]({target_url})"
diff --git a/locale/de/LC_MESSAGES/misc.po b/locale/de/LC_MESSAGES/misc.po
index c4349dd..75e47be 100644
--- a/locale/de/LC_MESSAGES/misc.po
+++ b/locale/de/LC_MESSAGES/misc.po
@@ -2,7 +2,7 @@ msgid ""
msgstr ""
"Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2020-11-28 23:45+0100\n"
+"POT-Creation-Date: 2021-07-11 14:32+0200\n"
"PO-Revision-Date: 2020-08-03 13:44+0000\n"
"Last-Translator: MarkusRost <>\n"
"Language-Team: German \n"
+"PO-Revision-Date: 2021-05-06 14:10+0000\n"
+"Last-Translator: magiczocker \n"
"Language-Team: German \n"
"Language: de\n"
@@ -12,7 +12,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
-"X-Generator: Weblate 4.2.1\n"
+"X-Generator: Weblate 4.6\n"
"X-Loco-Source-Locale: de_DE\n"
"Generated-By: pygettext.py 1.5\n"
"X-Loco-Parser: loco_parse_po\n"
@@ -601,20 +601,23 @@ msgid "[{author}]({author_url}) replaced the Cargo table \"{table}\""
msgstr "[{author}]({author_url}) ersetzte die Cargo-Tabelle „{table}“"
#: src/rc_formatters.py:436
-#, fuzzy, python-brace-format
+#, python-brace-format
msgid ""
"[{author}]({author_url}) created the [tag]({tag_url}) \"{tag}\"{comment}"
msgstr ""
-"[{author}]({author_url}) erstellte eine [Markierung]({tag_url}) „{tag}“"
+"[{author}]({author_url}) erstellte eine [Markierung]({tag_url}) "
+"„{tag}“{comment}"
#: src/rc_formatters.py:441
-#, fuzzy, python-brace-format
+#, python-brace-format
msgid ""
"[{author}]({author_url}) deleted the [tag]({tag_url}) \"{tag}\"{comment}"
-msgstr "[{author}]({author_url}) löschte eine [Markierung]({tag_url}) „{tag}“"
+msgstr ""
+"[{author}]({author_url}) löschte eine [Markierung]({tag_url}) "
+"„{tag}“{comment}"
#: src/rc_formatters.py:443
-#, fuzzy, python-brace-format
+#, python-brace-format
msgid ""
"[{author}]({author_url}) deleted the [tag]({tag_url}) \"{tag}\" and removed "
"it from {count} revision or log entry{comment}"
@@ -622,25 +625,27 @@ msgid_plural ""
"[{author}]({author_url}) deleted the [tag]({tag_url}) \"{tag}\" and removed "
"it from {count} revisions and/or log entries{comment}"
msgstr[0] ""
-"[{author}]({author_url}) importierte [{article}]({article_url}) mit einer "
-"Version{comment}"
+"[{author}]({author_url}) löschte die [Markierung]({tag_url}) „{tag}“ und "
+"entfernte diese von {count} Version oder Logeintrag{comment}"
msgstr[1] ""
-"[{author}]({author_url}) importierte [{article}]({article_url}) mit {count} "
-"Versionen{comment}"
+"[{author}]({author_url}) löschte die [Markierung]({tag_url}) „{tag}“ und "
+"entfernte diese von {count} Versionen und/oder Logeinträgen{comment}"
#: src/rc_formatters.py:449
-#, fuzzy, python-brace-format
+#, python-brace-format
msgid ""
"[{author}]({author_url}) activated the [tag]({tag_url}) \"{tag}\"{comment}"
msgstr ""
-"[{author}]({author_url}) aktivierte eine [Markierung]({tag_url}) „{tag}“"
+"[{author}]({author_url}) aktivierte eine [Markierung]({tag_url}) "
+"„{tag}“{comment}"
#: src/rc_formatters.py:452
-#, fuzzy, python-brace-format
+#, python-brace-format
msgid ""
"[{author}]({author_url}) deactivated the [tag]({tag_url}) \"{tag}\"{comment}"
msgstr ""
-"[{author}]({author_url}) deaktivierte eine [Markierung]({tag_url}) „{tag}“"
+"[{author}]({author_url}) deaktivierte eine [Markierung]({tag_url}) "
+"„{tag}“{comment}"
#: src/rc_formatters.py:454
#, python-brace-format
@@ -658,7 +663,7 @@ msgid "[{author}]({author_url}) locked a wiki *{wiki_name}*{comment}"
msgstr "[{author}]({author_url}) sperrte das Wiki *{wiki_name}*{comment}"
#: src/rc_formatters.py:462
-#, fuzzy, python-brace-format
+#, python-brace-format
msgid ""
"[{author}]({author_url}) modified namespace *{namespace_name}* on "
"*{wiki_name}*{comment}"
@@ -683,9 +688,11 @@ msgstr ""
"*{comment}"
#: src/rc_formatters.py:477
-#, fuzzy, python-brace-format
+#, python-brace-format
msgid "[{author}]({author_url}) undeleted a wiki *{wiki_name}*{comment}"
-msgstr "[{author}]({author_url}) löschte das Wiki *{wiki_name}*{comment}"
+msgstr ""
+"[{author}]({author_url}) hat das Wiki *{wiki_name}* wiederhergestellt "
+"{comment}"
#: src/rc_formatters.py:481
#, python-brace-format
@@ -1303,33 +1310,32 @@ msgid "Replaced the Cargo table \"{table}\""
msgstr "Ersetzte die Cargo-Tabelle „{table}“"
#: src/rc_formatters.py:1121
-#, fuzzy, python-brace-format
+#, python-brace-format
msgid "Created the tag \"{tag}\""
msgstr "Erstellte die Markierung „{tag}“"
#: src/rc_formatters.py:1125
-#, fuzzy, python-brace-format
+#, python-brace-format
msgid "Deleted the tag \"{tag}\""
msgstr "Löschte die Markierung „{tag}“"
#: src/rc_formatters.py:1127
-#, fuzzy
msgid "Removed from"
-msgstr "Entfernt"
+msgstr "Entfernt von"
#: src/rc_formatters.py:1127
msgid "{} revision or log entry"
msgid_plural "{} revisions and/or log entries"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "{} Version oder Logeintrag"
+msgstr[1] "{} Versionen und/oder Logeinträge"
#: src/rc_formatters.py:1131
-#, fuzzy, python-brace-format
+#, python-brace-format
msgid "Activated the tag \"{tag}\""
msgstr "Aktivierte die Markierung „{tag}“"
#: src/rc_formatters.py:1134
-#, fuzzy, python-brace-format
+#, python-brace-format
msgid "Deactivated the tag \"{tag}\""
msgstr "Deaktivierte die Markierung „{tag}“"
@@ -1348,7 +1354,7 @@ msgid "Locked a \"{wiki}\" wiki"
msgstr "Sperrte das Wiki „{wiki}“"
#: src/rc_formatters.py:1147
-#, fuzzy, python-brace-format
+#, python-brace-format
msgid "Modified \"{namespace_name}\" namespace"
msgstr "Bearbeitete den Namensraum „{namespace_name}“"
@@ -1367,9 +1373,9 @@ msgid "Modified \"{usergroup_name}\" usergroup"
msgstr "Bearbeitete die Benutzergruppe „{usergroup_name}“"
#: src/rc_formatters.py:1160
-#, fuzzy, python-brace-format
+#, python-brace-format
msgid "Undeleted a \"{wiki}\" wiki"
-msgstr "Löschte das Wiki „{wiki}“"
+msgstr "Das „{wiki}“ Wiki wiederhergestellt"
#: src/rc_formatters.py:1163
#, python-brace-format
diff --git a/locale/de/LC_MESSAGES/rcgcdw.mo b/locale/de/LC_MESSAGES/rcgcdw.mo
index c8e8b5b..3befaa2 100644
Binary files a/locale/de/LC_MESSAGES/rcgcdw.mo and b/locale/de/LC_MESSAGES/rcgcdw.mo differ
diff --git a/locale/de/LC_MESSAGES/rcgcdw.po b/locale/de/LC_MESSAGES/rcgcdw.po
index 7eb52d8..40ecbf8 100644
--- a/locale/de/LC_MESSAGES/rcgcdw.po
+++ b/locale/de/LC_MESSAGES/rcgcdw.po
@@ -2,199 +2,190 @@ msgid ""
msgstr ""
"Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2020-12-23 00:28+0100\n"
-"PO-Revision-Date: 2020-09-03 13:14+0200\n"
-"Last-Translator: MarkusRost <>\n"
-"Language-Team: German \n"
+"Language-Team: German \n"
"Language: de\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
-"X-Generator: Poedit 2.4.1\n"
+"X-Generator: Weblate 4.6\n"
"X-Loco-Source-Locale: de_DE\n"
"Generated-By: pygettext.py 1.5\n"
"X-Loco-Parser: loco_parse_po\n"
-#: src/rcgcdw.py:115 src/rcgcdw.py:117 src/rcgcdw.py:119 src/rcgcdw.py:121
-#: src/rcgcdw.py:123 src/rcgcdw.py:125 src/rcgcdw.py:127
+#: src/rcgcdw.py:117
#, python-brace-format
msgid "{value} (avg. {avg})"
msgstr "{value} (vgl. {avg})"
-#: src/rcgcdw.py:147
+#: src/rcgcdw.py:136
msgid "Daily overview"
msgstr "Tägliche Übersicht"
-#: src/rcgcdw.py:154
+#: src/rcgcdw.py:143
msgid "No activity"
msgstr "Keine Aktivität"
-#: src/rcgcdw.py:178
+#: src/rcgcdw.py:167
msgid " ({} action)"
msgid_plural " ({} actions)"
msgstr[0] " (eine Aktion)"
msgstr[1] " ({} Aktionen)"
-#: src/rcgcdw.py:180
+#: src/rcgcdw.py:169
msgid " ({} edit)"
msgid_plural " ({} edits)"
msgstr[0] " (eine Änderung)"
msgstr[1] " ({} Änderungen)"
-#: src/rcgcdw.py:185
+#: src/rcgcdw.py:174
msgid " UTC ({} action)"
msgid_plural " UTC ({} actions)"
msgstr[0] " UTC (eine Aktion)"
msgstr[1] " UTC ({} Aktionen)"
-#: src/rcgcdw.py:187 src/rcgcdw.py:188 src/rcgcdw.py:192
+#: src/rcgcdw.py:176 src/rcgcdw.py:179
msgid "But nobody came"
msgstr "Keine Aktivität"
-#: src/rcgcdw.py:195
+#: src/rcgcdw.py:183
msgid "Most active user"
msgid_plural "Most active users"
msgstr[0] "Aktivster Benutzer"
msgstr[1] "Aktivste Benutzer"
-#: src/rcgcdw.py:196
+#: src/rcgcdw.py:184
msgid "Most edited article"
msgid_plural "Most edited articles"
msgstr[0] "Meist bearbeiteter Artikel"
msgstr[1] "Meist bearbeitete Artikel"
-#: src/rcgcdw.py:197
+#: src/rcgcdw.py:185
msgid "Edits made"
msgstr "Bearbeitungen"
-#: src/rcgcdw.py:197
+#: src/rcgcdw.py:185
msgid "New files"
msgstr "Neue Dateien"
-#: src/rcgcdw.py:197
+#: src/rcgcdw.py:186
msgid "Admin actions"
msgstr "Admin-Aktionen"
-#: src/rcgcdw.py:198
+#: src/rcgcdw.py:186
msgid "Bytes changed"
msgstr "Bytes geändert"
-#: src/rcgcdw.py:198
+#: src/rcgcdw.py:187
msgid "New articles"
msgstr "Neue Artikel"
-#: src/rcgcdw.py:199
+#: src/rcgcdw.py:187
msgid "Unique contributors"
msgstr "Einzelne Autoren"
-#: src/rcgcdw.py:200
+#: src/rcgcdw.py:188
msgid "Most active hour"
msgid_plural "Most active hours"
msgstr[0] "Aktivste Stunde"
msgstr[1] "Aktivste Stunden"
-#: src/rcgcdw.py:201
+#: src/rcgcdw.py:189
msgid "Day score"
msgstr "Tageswert"
-#: src/rcgcdw.py:243
-msgid "director"
-msgstr "Direktor"
+#: src/rcgcdw.py:223
+msgid "~~hidden~~"
+msgstr "~~versteckt~~"
-#: src/rcgcdw.py:243
-msgid "bot"
-msgstr "Bot"
+#: src/rcgcdw.py:225
+msgid "No description provided"
+msgstr "Keine Zusammenfassung angegeben"
-#: src/rcgcdw.py:243
-msgid "editor"
-msgstr "editor"
+#: src/rcgcdw.py:228
+msgid "hidden"
+msgstr "versteckt"
-#: src/rcgcdw.py:243
-msgid "directors"
-msgstr "Direktor"
+#~ msgid "director"
+#~ msgstr "Direktor"
-#: src/rcgcdw.py:243
-msgid "sysop"
-msgstr "Administrator"
+#~ msgid "bot"
+#~ msgstr "Bot"
-#: src/rcgcdw.py:243
-msgid "bureaucrat"
-msgstr "Bürokrat"
+#~ msgid "editor"
+#~ msgstr "editor"
-#: src/rcgcdw.py:243
-msgid "reviewer"
-msgstr "Prüfer"
+#~ msgid "directors"
+#~ msgstr "Direktor"
-#: src/rcgcdw.py:244
-msgid "autoreview"
-msgstr "Passive Sichter"
+#~ msgid "sysop"
+#~ msgstr "Administrator"
-#: src/rcgcdw.py:244
-msgid "autopatrol"
-msgstr "autopatrol"
+#~ msgid "bureaucrat"
+#~ msgstr "Bürokrat"
-#: src/rcgcdw.py:244
-msgid "wiki_guardian"
-msgstr "Wiki Guardian"
+#~ msgid "reviewer"
+#~ msgstr "Prüfer"
-#: src/rcgcdw.py:244
-msgid "second"
-msgid_plural "seconds"
-msgstr[0] "Sekunde"
-msgstr[1] "Sekunden"
+#~ msgid "autoreview"
+#~ msgstr "Passive Sichter"
-#: src/rcgcdw.py:244
-msgid "minute"
-msgid_plural "minutes"
-msgstr[0] "Minute"
-msgstr[1] "Minuten"
+#~ msgid "autopatrol"
+#~ msgstr "autopatrol"
-#: src/rcgcdw.py:244
-msgid "hour"
-msgid_plural "hours"
-msgstr[0] "Stunde"
-msgstr[1] "Stunden"
+#~ msgid "wiki_guardian"
+#~ msgstr "Wiki Guardian"
-#: src/rcgcdw.py:244
-msgid "day"
-msgid_plural "days"
-msgstr[0] "Tag"
-msgstr[1] "Tage"
+#~ msgid "second"
+#~ msgid_plural "seconds"
+#~ msgstr[0] "Sekunde"
+#~ msgstr[1] "Sekunden"
-#: src/rcgcdw.py:244
-msgid "week"
-msgid_plural "weeks"
-msgstr[0] "Woche"
-msgstr[1] "Wochen"
+#~ msgid "minute"
+#~ msgid_plural "minutes"
+#~ msgstr[0] "Minute"
+#~ msgstr[1] "Minuten"
-#: src/rcgcdw.py:244
-msgid "month"
-msgid_plural "months"
-msgstr[0] "Monat"
-msgstr[1] "Monate"
+#~ msgid "hour"
+#~ msgid_plural "hours"
+#~ msgstr[0] "Stunde"
+#~ msgstr[1] "Stunden"
-#: src/rcgcdw.py:244
-msgid "year"
-msgid_plural "years"
-msgstr[0] "Jahr"
-msgstr[1] "Jahre"
+#~ msgid "day"
+#~ msgid_plural "days"
+#~ msgstr[0] "Tag"
+#~ msgstr[1] "Tage"
-#: src/rcgcdw.py:244
-msgid "millennium"
-msgid_plural "millennia"
-msgstr[0] "Jahrtausend"
-msgstr[1] "Jahrtausende"
+#~ msgid "week"
+#~ msgid_plural "weeks"
+#~ msgstr[0] "Woche"
+#~ msgstr[1] "Wochen"
-#: src/rcgcdw.py:244
-msgid "decade"
-msgid_plural "decades"
-msgstr[0] "Jahrzehnt"
-msgstr[1] "Jahrzehnte"
+#~ msgid "month"
+#~ msgid_plural "months"
+#~ msgstr[0] "Monat"
+#~ msgstr[1] "Monate"
-#: src/rcgcdw.py:244
-msgid "century"
-msgid_plural "centuries"
-msgstr[0] "Jahrhundert"
-msgstr[1] "Jahrhunderte"
+#~ msgid "year"
+#~ msgid_plural "years"
+#~ msgstr[0] "Jahr"
+#~ msgstr[1] "Jahre"
+
+#~ msgid "millennium"
+#~ msgid_plural "millennia"
+#~ msgstr[0] "Jahrtausend"
+#~ msgstr[1] "Jahrtausende"
+
+#~ msgid "decade"
+#~ msgid_plural "decades"
+#~ msgstr[0] "Jahrzehnt"
+#~ msgstr[1] "Jahrzehnte"
+
+#~ msgid "century"
+#~ msgid_plural "centuries"
+#~ msgstr[0] "Jahrhundert"
+#~ msgstr[1] "Jahrhunderte"
diff --git a/locale/de/LC_MESSAGES/redaction.mo b/locale/de/LC_MESSAGES/redaction.mo
index 1321f36..3850a03 100644
Binary files a/locale/de/LC_MESSAGES/redaction.mo and b/locale/de/LC_MESSAGES/redaction.mo differ
diff --git a/locale/de/LC_MESSAGES/redaction.po b/locale/de/LC_MESSAGES/redaction.po
index d3c7a61..a30f841 100644
--- a/locale/de/LC_MESSAGES/redaction.po
+++ b/locale/de/LC_MESSAGES/redaction.po
@@ -7,19 +7,25 @@ msgid ""
msgstr ""
"Project-Id-Version: RcGcDw\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2020-12-23 00:28+0100\n"
-"PO-Revision-Date: 2020-11-20 09:22+0000\n"
+"POT-Creation-Date: 2021-07-11 14:32+0200\n"
+"PO-Revision-Date: 2021-07-30 10:44+0000\n"
"Last-Translator: MarkusRost \n"
-"Language-Team: German \n"
+"Language-Team: German \n"
"Language: de\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
-"X-Generator: Weblate 4.2.1\n"
+"X-Generator: Weblate 4.6.2\n"
-#: src/discord/redaction.py:62 src/discord/redaction.py:65
-#: src/discord/redaction.py:70
-msgid "Removed"
-msgstr "Versteckt"
+#: src/discord/redaction.py:77
+msgid "hidden"
+msgstr "versteckt"
+
+#: src/discord/redaction.py:80 src/discord/redaction.py:85
+msgid "~~hidden~~"
+msgstr "~~versteckt~~"
+
+#~ msgid "Removed"
+#~ msgstr "Versteckt"
diff --git a/locale/es/LC_MESSAGES/discussion_formatters.mo b/locale/es/LC_MESSAGES/discussion_formatters.mo
deleted file mode 100644
index 8a62e21..0000000
Binary files a/locale/es/LC_MESSAGES/discussion_formatters.mo and /dev/null differ
diff --git a/locale/es/LC_MESSAGES/formatters.mo b/locale/es/LC_MESSAGES/formatters.mo
new file mode 100644
index 0000000..0bd9a5a
Binary files /dev/null and b/locale/es/LC_MESSAGES/formatters.mo differ
diff --git a/locale/es/LC_MESSAGES/formatters.po b/locale/es/LC_MESSAGES/formatters.po
new file mode 100644
index 0000000..11a5d40
--- /dev/null
+++ b/locale/es/LC_MESSAGES/formatters.po
@@ -0,0 +1,2013 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the RcGcDw package.
+# FIRST AUTHOR , YEAR.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: RcGcDw\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2021-07-11 14:32+0200\n"
+"PO-Revision-Date: 2021-07-30 10:44+0000\n"
+"Last-Translator: Tamara Carvallo \n"
+"Language-Team: Spanish \n"
+"Language: es\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+"X-Generator: Weblate 4.6.2\n"
+
+#: src/api/util.py:61 src/api/util.py:66
+msgid "__Only whitespace__"
+msgstr "__Sólo espacios en blanco__"
+
+#: src/api/util.py:71
+msgid "Removed"
+msgstr "Eliminado"
+
+#: src/api/util.py:73
+msgid "Added"
+msgstr "Agregado"
+
+#: src/api/util.py:94 src/api/util.py:126 src/api/util.py:133
+#: src/api/util.py:141 extensions/base/discussions.py:247
+#: extensions/base/discussions.py:264 extensions/base/abusefilter.py:45
+msgid "Unregistered user"
+msgstr "Usuario no registrado"
+
+#: src/api/util.py:160
+#, fuzzy
+msgctxt "recent changes Tags"
+msgid "Tags"
+msgstr "Etiquetas"
+
+#: src/api/util.py:162
+msgid "**Added**: "
+msgstr "**Agregó**: "
+
+#: src/api/util.py:163
+msgid " and {} more\n"
+msgstr " y {} más\n"
+
+#: src/api/util.py:165
+msgid "**Removed**: "
+msgstr "**Eliminó**: "
+
+#: src/api/util.py:166
+msgid " and {} more"
+msgstr " y {} más"
+
+#: src/api/util.py:168
+msgid "Changed categories"
+msgstr "Cambio las categorías"
+
+#: extensions/base/cargo.py:37
+#, python-brace-format
+msgid "Created the Cargo table \"{table}\""
+msgstr "Creó la tabla Cargo \"{table}\""
+
+#: extensions/base/cargo.py:45
+#, python-brace-format
+msgid "[{author}]({author_url}) created the Cargo table \"{table}\""
+msgstr "[{author}]({author_url}) creó la tabla Cargo \"{table}\""
+
+#: extensions/base/cargo.py:60
+#, python-brace-format
+msgid "Recreated the Cargo table \"{table}\""
+msgstr "Recreó la tabla Cargo \"{table}\""
+
+#: extensions/base/cargo.py:68
+#, python-brace-format
+msgid "[{author}]({author_url}) recreated the Cargo table \"{table}\""
+msgstr "[{author}]({author_url}) recreó la tabla Cargo \"{table}\""
+
+#: extensions/base/cargo.py:83
+#, python-brace-format
+msgid "Replaced the Cargo table \"{table}\""
+msgstr "Reemplazó la tabla Cargo \"{table}\""
+
+#: extensions/base/cargo.py:91
+#, python-brace-format
+msgid "[{author}]({author_url}) replaced the Cargo table \"{table}\""
+msgstr "[{author}]({author_url}) reemplazó la tabla Cargo \"{table}\""
+
+#: extensions/base/cargo.py:105
+#, python-brace-format
+msgid "Deleted the Cargo table \"{table}\""
+msgstr "Eliminó la tabla Cargo \"{table}\""
+
+#: extensions/base/cargo.py:112
+#, python-brace-format
+msgid "[{author}]({author_url}) deleted the Cargo table \"{table}\""
+msgstr "[{author}]({author_url}) eliminó la tabla Cargo \"{table}\""
+
+#: extensions/base/translate.py:41
+#, python-brace-format
+msgid "Marked \"{article}\" for translation"
+msgstr "Marcó \"{article}\" para traducir"
+
+#: extensions/base/translate.py:55
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) marked [{article}]({article_url}) for "
+"translation{comment}"
+msgstr ""
+"[{author}]({author_url}) marcó [{article}]({article_url}) para "
+"traducción{comment}"
+
+#: extensions/base/translate.py:70
+#, python-brace-format
+msgid "Removed \"{article}\" from the translation system"
+msgstr "Eliminó \"{article}\" del sistema de traducción"
+
+#: extensions/base/translate.py:80
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) removed [{article}]({article_url}) from the "
+"translation system{comment}"
+msgstr ""
+"[{author}]({author_url}) eliminó [{article}]({article_url}) del sistema de "
+"traducción{comment}"
+
+#: extensions/base/translate.py:95
+#, python-brace-format
+msgid "Completed moving translation pages from \"{article}\" to \"{target}\""
+msgstr ""
+"Completó el traslado de las páginas de traducción de \"{article}\" a \""
+"{target}\""
+
+#: extensions/base/translate.py:106
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) completed moving translation pages from *{article}* "
+"to [{target}]({target_url}){comment}"
+msgstr ""
+"[{author}]({author_url}) movió la configuración de protección de *{article}* "
+"a [{target}]({target_url}){comment}"
+
+#: extensions/base/translate.py:121
+#, python-brace-format
+msgid "Encountered a problem while moving \"{article}\" to \"{target}\""
+msgstr "Se encontró un problema al mover \"{article}\" a \"{target}\""
+
+#: extensions/base/translate.py:133
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) encountered a problem while moving [{article}]"
+"({article_url}) to [{target}]({target_url}){comment}"
+msgstr ""
+"[{author}]({author_url}) encontró un problema al mover "
+"[{article}]({article_url}) a [{target}]({target_url}){comment}"
+
+#: extensions/base/translate.py:149
+#, python-brace-format
+msgid ""
+"Failed to delete \"{article}\" which belongs to translatable page "
+"\"{target}\""
+msgstr ""
+"No se pudo borrar \"{article}\" que pertenece a la página traducible \""
+"{target}\""
+
+#: extensions/base/translate.py:161
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) failed to delete [{article}]({article_url}) which "
+"belongs to translatable page [{target}]({target_url}){comment}"
+msgstr ""
+"[{author}]({author_url}) no pudo borrar [{article}]({article_url}) que "
+"pertenece a la página traducible [{target}]({target_url}){comment}"
+
+#: extensions/base/translate.py:177
+#, python-brace-format
+msgid "Completed deletion of translation page \"{article}\""
+msgstr "Se eliminó completamente la página de traducción \"{article}\""
+
+#: extensions/base/translate.py:188
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) completed deletion of translation page [{article}]"
+"({article_url}){comment}"
+msgstr ""
+"[{author}]({author_url}) eliminó la página de traducción "
+"[{article}]({article_url}){comment}"
+
+#: extensions/base/translate.py:203
+#, python-brace-format
+msgid ""
+"Failed to delete \"{article}\" which belongs to translation page \"{target}\""
+msgstr ""
+"No se pudo borrar \"{article}\" que pertenece a la página de traducción \""
+"{target}\""
+
+#: extensions/base/translate.py:215
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) failed to delete [{article}]({article_url}) which "
+"belongs to translation page [{target}]({target_url}){comment}"
+msgstr ""
+"[{author}]({author_url}) no pudo borrar [{article}]({article_url}) que "
+"pertenece a la página de traducción [{target}]({target_url}){comment}"
+
+#: extensions/base/translate.py:231
+#, python-brace-format
+msgid "Encouraged translation of \"{article}\""
+msgstr "Traducción recomendada de \"{article}\""
+
+#: extensions/base/translate.py:240
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) encouraged translation of [{article}]({article_url})"
+"{comment}"
+msgstr ""
+"[{author}]({author_url}) recomendó la traducción de "
+"[{article}]({article_url}){comment}"
+
+#: extensions/base/translate.py:255
+#, python-brace-format
+msgid "Discouraged translation of \"{article}\""
+msgstr "Traducción desaconsejada de \"{article}\""
+
+#: extensions/base/translate.py:264
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) discouraged translation of [{article}]"
+"({article_url}){comment}"
+msgstr ""
+"[{author}]({author_url}) desaconsejó la traducción de "
+"[{article}]({article_url}){comment}"
+
+#: extensions/base/translate.py:282
+#, python-brace-format
+msgid "Limited languages for \"{article}\" to `{languages}`"
+msgstr "Idiomas limitados para \"{article}\" a `{languages}`"
+
+#: extensions/base/translate.py:285
+#, python-brace-format
+msgid "Priority languages for \"{article}\" set to `{languages}`"
+msgstr ""
+"Los idiomas prioritarios para \"{article}\" se establecieron en `{languages}`"
+
+#: extensions/base/translate.py:288
+#, python-brace-format
+msgid "Removed priority languages from \"{article}\""
+msgstr "Se quitaron los idiomas prioritarios de \"{article}\""
+
+#: extensions/base/translate.py:301
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) limited languages for [{article}]({article_url}) to "
+"`{languages}`{comment}"
+msgstr ""
+"[{author}]({author_url}) limitó los idiomas para [{article}]({article_url}) "
+"a `{languages}`{comment}"
+
+#: extensions/base/translate.py:308
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) set the priority languages for [{article}]"
+"({article_url}) to `{languages}`{comment}"
+msgstr ""
+"[{author}]({author_url}) estableció los idiomas de prioridad para "
+"[{article}]({article_url}) en `{languages}`{comment}"
+
+#: extensions/base/translate.py:315
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) removed priority languages from [{article}]"
+"({article_url}){comment}"
+msgstr ""
+"[{author}]({author_url}) eliminó los idiomas prioritarios de "
+"[{article}]({article_url}){comment}"
+
+#: extensions/base/translate.py:331
+#, python-brace-format
+msgid "Added translatable page \"{article}\" to aggregate group \"{group}\""
+msgstr ""
+"Se agregó la página traducible \"{article}\" al grupo agregado \"{group}\""
+
+#: extensions/base/translate.py:342
+#, fuzzy, python-brace-format
+msgid ""
+"[{author}]({author_url}) added translatable page [{article}]({article_url}) "
+"to aggregate group \"{group}\"{comment}"
+msgstr ""
+"[{author}]({author_url}) cambió el modelo de contenido de la página "
+"[{article}]({article_url}) de {old} a {new}{comment}"
+
+#: extensions/base/translate.py:357
+#, python-brace-format
+msgid ""
+"Removed translatable page \"{article}\" from aggregate group \"{group}\""
+msgstr ""
+
+#: extensions/base/translate.py:368
+#, fuzzy, python-brace-format
+msgid ""
+"[{author}]({author_url}) removed translatable page [{article}]"
+"({article_url}) from aggregate group \"{group}\"{comment}"
+msgstr ""
+"#-#-#-#-# rcgcdw.po (RcGcDw) #-#-#-#-#\n"
+"[{author}]({author_url}) eliminó la protección de [{article}]({article_url})"
+"{comment}\n"
+"#-#-#-#-# formatters.po (RcGcDw) #-#-#-#-#\n"
+"[{author}]({author_url}) quitó la protección de [{article}]({article_url})"
+"{comment}"
+
+#: extensions/base/translate.py:387
+#, fuzzy, python-brace-format
+msgid "Reviewed translation \"{article}\""
+msgstr "Respondió a un comentario en {article}"
+
+#: extensions/base/translate.py:401
+#, fuzzy, python-brace-format
+msgid ""
+"[{author}]({author_url}) reviewed translation [{article}]({article_url})"
+"{comment}"
+msgstr "[{author}]({author_url}) restauró [{article}]({article_url}){comment}"
+
+#: extensions/base/translate.py:416
+#, python-brace-format
+msgid "Changed the state of `{language}` translations of \"{article}\""
+msgstr ""
+
+#: extensions/base/translate.py:419
+msgid "Old state"
+msgstr ""
+
+#: extensions/base/translate.py:420
+msgid "New state"
+msgstr ""
+
+#: extensions/base/translate.py:431
+#, fuzzy, python-brace-format
+msgid ""
+"[{author}]({author_url}) changed the state of `{language}` translations of "
+"[{article}]({article_url}) from `{old_state}` to `{new_state}`{comment}"
+msgstr ""
+"[{author}]({author_url}) cambió el modelo de contenido de la página "
+"[{article}]({article_url}) de {old} a {new}{comment}"
+
+#: extensions/base/translate.py:439
+#, fuzzy, python-brace-format
+msgid ""
+"[{author}]({author_url}) changed the state of `{language}` translations of "
+"[{article}]({article_url}) to `{new_state}`{comment}"
+msgstr ""
+"[{author}]({author_url}) cambió el modelo de contenido de la página "
+"[{article}]({article_url}) de {old} a {new}{comment}"
+
+#: extensions/base/translate.py:452 extensions/base/translate.py:455
+msgid "(default)"
+msgstr ""
+
+#: extensions/base/translate.py:464
+#, fuzzy, python-brace-format
+msgid "Changed the language of \"{article}\""
+msgstr ""
+"#-#-#-#-# rcgcdw.po (RcGcDw) #-#-#-#-#\n"
+"Cambió el nivel de protección de {article}\n"
+"#-#-#-#-# formatters.po (RcGcDw) #-#-#-#-#\n"
+"Modificó el nivel de protección de {article}"
+
+#: extensions/base/translate.py:465
+msgid "Old language"
+msgstr ""
+
+#: extensions/base/translate.py:466
+msgid "New language"
+msgstr ""
+
+#: extensions/base/translate.py:477
+#, fuzzy, python-brace-format
+msgid ""
+"[{author}]({author_url}) changed the language of [{article}]({article_url}) "
+"from {old_lang} to {new_lang}{comment}"
+msgstr ""
+"[{author}]({author_url}) cambió el modelo de contenido de la página "
+"[{article}]({article_url}) de {old} a {new}{comment}"
+
+#: extensions/base/discussions.py:148 extensions/base/discussions.py:207
+#: extensions/base/discussions.py:245 extensions/base/discussions.py:261
+#: extensions/base/discussions.py:284 extensions/base/discussions.py:306
+#: extensions/base/discussions.py:334 extensions/base/discussions.py:354
+msgid "unknown"
+msgstr "desconocido"
+
+#: extensions/base/discussions.py:157
+#, python-brace-format
+msgid "Created \"{title}\""
+msgstr "Creó \"{title}\""
+
+#: extensions/base/discussions.py:161
+#, python-brace-format
+msgid "Created a poll \"{title}\""
+msgstr "Creó una encuesta \"{title}\""
+
+#: extensions/base/discussions.py:168
+msgid "Option {}"
+msgstr "Opción {}"
+
+#: extensions/base/discussions.py:170
+#, python-brace-format
+msgid "__[View image]({image_url})__"
+msgstr "__[Ver imagen]({image_url})__"
+
+#: extensions/base/discussions.py:174
+#, python-brace-format
+msgid "Created a quiz \"{title}\""
+msgstr "Creó un cuestionario \"{title}\""
+
+#: extensions/base/discussions.py:193 extensions/base/discussions.py:195
+#, fuzzy
+msgctxt "Fandom discussions Tags/Forums"
+msgid "Tags"
+msgstr "Etiquetas"
+
+#: extensions/base/discussions.py:193
+#, fuzzy
+msgctxt "Fandom discussions amount of Tags/Forums"
+msgid "{} tags"
+msgstr "{} etiquetas"
+
+#: extensions/base/discussions.py:198
+#, python-brace-format
+msgid "Replied to \"{title}\""
+msgstr "Respondió a \"{title}\""
+
+#: extensions/base/discussions.py:214
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) created [{title}](<{url}f/p/{threadId}>) in "
+"{forumName}"
+msgstr ""
+"[{author}]({author_url}) creó [{title}](<{url}f/p/{threadId}>) en {forumName}"
+
+#: extensions/base/discussions.py:217
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) created a poll [{title}](<{url}f/p/{threadId}>) in "
+"{forumName}"
+msgstr ""
+"[{author}]({author_url}) creó una encuesta [{title}](<{url}f/p/{threadId}>) "
+"en {forumName}"
+
+#: extensions/base/discussions.py:220
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) created a quiz [{title}](<{url}f/p/{threadId}>) in "
+"{forumName}"
+msgstr ""
+"[{author}]({author_url}) creó un cuestionario [{title}](<{url}f/p/{threadId}"
+">) en {forumName}"
+
+#: extensions/base/discussions.py:234
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) created a [reply](<{url}f/p/{threadId}/r/{postId}>) "
+"to [{title}](<{url}f/p/{threadId}>) in {forumName}"
+msgstr ""
+"[{author}]({author_url}) creó una [respuesta](<{url}f/p/{threadId}/r/{postId}"
+">) a [{title}](<{url}f/p/{threadId}>) en {forumName}"
+
+#: extensions/base/discussions.py:292
+#, python-brace-format
+msgid "Created \"{title}\" on {user}'s Message Wall"
+msgstr "Creó \"{title}\" en el muro de mensajes de {user}"
+
+#: extensions/base/discussions.py:298
+#, python-brace-format
+msgid "Replied to \"{title}\" on {user}'s Message Wall"
+msgstr "Respondió a \"{title}\" en el muro de mensajes de {user}"
+
+#: extensions/base/discussions.py:312
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) created [{title}](<{url}wiki/Message_Wall:"
+"{user_wall}?threadId={threadId}>) on [{user}'s Message Wall](<{url}wiki/"
+"Message_Wall:{user_wall}>)"
+msgstr ""
+"[{author}]({author_url}) creó [{title}](<{url}wiki/Message_Wall:{user_wall}?"
+"threadId={threadId}>) en [{user}'s Message Wall](<{url}wiki/Message_Wall:"
+"{user_wall}>)"
+
+#: extensions/base/discussions.py:318
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) created a [reply](<{url}wiki/Message_Wall:"
+"{user_wall}?threadId={threadId}#{replyId}>) to [{title}](<{url}wiki/"
+"Message_Wall:{user_wall}?threadId={threadId}>) on [{user}'s Message Wall]"
+"(<{url}wiki/Message_Wall:{user_wall}>)"
+msgstr ""
+"[{author}]({author_url}) creó una [respuesta](<{url}wiki/Message_Wall:"
+"{user_wall}?threadId={threadId}#{replyId}>) a [{title}](<{url}wiki/"
+"Message_Wall:{user_wall}?threadId={threadId}>) en el [{user} Muro de "
+"Mensajes](<{url}wiki/Message_Wall:{user_wall}>)"
+
+#: extensions/base/discussions.py:338
+#, python-brace-format
+msgid "Commented on {article}"
+msgstr "Comentó en {article}"
+
+#: extensions/base/discussions.py:344
+#, python-brace-format
+msgid "Replied to a comment on {article}"
+msgstr "Respondió a un comentario en {article}"
+
+#: extensions/base/discussions.py:359
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) created a [comment](<{url}?commentId={commentId}>) "
+"on [{article}](<{url}>)"
+msgstr ""
+"[{author}]({author_url}) creó un [comentario](<{url}?commentId={commentId}>) "
+"en [{article}](<{url}>)"
+
+#: extensions/base/discussions.py:365
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) created a [reply](<{url}?commentId={commentId}"
+"&replyId={replyId}>) to a [comment](<{url}?commentId={commentId}>) on "
+"[{article}](<{url}>)"
+msgstr ""
+"[{author}]({author_url}) creó una [respuesta](<{url}?commentId={commentId}"
+"&replyId={replyId}>) a un [comentario](<{url}?commentId={commentId}>) en "
+"[{article}](<{url}>)"
+
+#: extensions/base/managewiki.py:34
+#, fuzzy
+msgid "Changed wiki settings"
+msgstr ""
+"#-#-#-#-# rcgcdw.po (RcGcDw) #-#-#-#-#\n"
+"Cambió la configuración del wiki\n"
+"#-#-#-#-# formatters.po (RcGcDw) #-#-#-#-#\n"
+"Modificó la configuración del wiki"
+
+#: extensions/base/managewiki.py:44
+#, fuzzy, python-brace-format
+msgid "[{author}]({author_url}) changed wiki settings{reason}"
+msgstr "[{author}]({author_url}) cambió la configuración del wiki ({reason})"
+
+#: extensions/base/managewiki.py:55
+#, python-brace-format
+msgid "Deleted a \"{wiki}\" wiki"
+msgstr "Eliminó un wiki \"{wiki}\""
+
+#: extensions/base/managewiki.py:55 extensions/base/managewiki.py:67
+#: extensions/base/managewiki.py:103 extensions/base/managewiki.py:112
+#: extensions/base/managewiki.py:125 extensions/base/managewiki.py:126
+#: extensions/base/managewiki.py:135 extensions/base/managewiki.py:136
+#: extensions/base/managewiki.py:148 extensions/base/managewiki.py:149
+#: extensions/base/managewiki.py:160 extensions/base/managewiki.py:161
+#: extensions/base/managewiki.py:195 extensions/base/managewiki.py:204
+#: extensions/base/managewiki.py:217 extensions/base/managewiki.py:226
+#: extensions/base/abusefilter.py:55 extensions/base/abusefilter.py:56
+#: extensions/base/abusefilter.py:57 extensions/base/abusefilter.py:68
+#: extensions/base/abusefilter.py:69 extensions/base/abusefilter.py:70
+#: extensions/base/mediawiki.py:743
+msgid "Unknown"
+msgstr "Desconocido"
+
+#: extensions/base/managewiki.py:63
+#, fuzzy, python-brace-format
+msgid "[{author}]({author_url}) deleted a wiki *{wiki_name}*{comment}"
+msgstr "[{author}]({author_url}) eliminó un wiki *{wiki_name}* ({comment})"
+
+#: extensions/base/managewiki.py:80
+#, fuzzy, python-brace-format
+msgid "Deleted a \"{group}\" user group"
+msgstr "Modificó el grupo de usuarios \"{usergroup_name}\""
+
+#: extensions/base/managewiki.py:89
+#, fuzzy, python-brace-format
+msgid "[{author}]({author_url}) deleted a usergroup *{group}*{comment}"
+msgstr ""
+"[{author}]({author_url}) modificó el grupo de usuarios *{group_name}* "
+"({comment})"
+
+#: extensions/base/managewiki.py:103
+#, python-brace-format
+msgid "Locked a \"{wiki}\" wiki"
+msgstr "Protegió un wiki \"{wiki}\""
+
+#: extensions/base/managewiki.py:111
+#, fuzzy, python-brace-format
+msgid "[{author}]({author_url}) locked a wiki *{wiki_name}*{comment}"
+msgstr "[{author}]({author_url}) protegió un wiki *{wiki_name}* ({comment})"
+
+#: extensions/base/managewiki.py:124
+#, fuzzy, python-brace-format
+msgid "Modified \"{namespace_name}\" namespace"
+msgstr "Modificó un espacio de nombres \"{namespace_name}\""
+
+#: extensions/base/managewiki.py:126 extensions/base/managewiki.py:149
+msgid "Wiki"
+msgstr "Wiki"
+
+#: extensions/base/managewiki.py:134
+#, fuzzy, python-brace-format
+msgid ""
+"[{author}]({author_url}) modified namespace *{namespace_name}* on "
+"*{wiki_name}*{comment}"
+msgstr ""
+"[{author}]({author_url}) modificó un espacio de nombres *{namespace_name}* "
+"en *{wiki_name}* ({comment})"
+
+#: extensions/base/managewiki.py:147
+#, python-brace-format
+msgid "Deleted a \"{namespace_name}\" namespace"
+msgstr "Eliminó un espacio de nombres \"{namespace_name}\""
+
+#: extensions/base/managewiki.py:158
+#, fuzzy, python-brace-format
+msgid ""
+"[{author}]({author_url}) deleted a namespace *{namespace_name}* on "
+"*{wiki_name}*{comment}"
+msgstr ""
+"[{author}]({author_url}) eliminó un espacio de nombres *{namespace_name}* en "
+"*{wiki_name}* ({comment})"
+
+#: extensions/base/managewiki.py:173
+#, python-brace-format
+msgid "Modified \"{usergroup_name}\" usergroup"
+msgstr "Modificó el grupo de usuarios \"{usergroup_name}\""
+
+#: extensions/base/managewiki.py:182
+#, fuzzy, python-brace-format
+msgid "[{author}]({author_url}) modified user group *{group_name}*{comment}"
+msgstr ""
+"[{author}]({author_url}) modificó el grupo de usuarios *{group_name}* "
+"({comment})"
+
+#: extensions/base/managewiki.py:195
+#, fuzzy, python-brace-format
+msgid "Undeleted a \"{wiki}\" wiki"
+msgstr "Eliminó un wiki \"{wiki}\""
+
+#: extensions/base/managewiki.py:203
+#, fuzzy, python-brace-format
+msgid "[{author}]({author_url}) undeleted a wiki *{wiki_name}*{comment}"
+msgstr "[{author}]({author_url}) eliminó un wiki *{wiki_name}* ({comment})"
+
+#: extensions/base/managewiki.py:217
+#, fuzzy, python-brace-format
+msgid "Unlocked a \"{wiki}\" wiki"
+msgstr ""
+"#-#-#-#-# rcgcdw.po (RcGcDw) #-#-#-#-#\n"
+"Desbloqueó un wiki \"{wiki}\"\n"
+"#-#-#-#-# formatters.po (RcGcDw) #-#-#-#-#\n"
+"Desprotegió un wiki \"{wiki}\""
+
+#: extensions/base/managewiki.py:225
+#, fuzzy, python-brace-format
+msgid "[{author}]({author_url}) unlocked a wiki *{wiki_name}*{comment}"
+msgstr "[{author}]({author_url}) desprotegió un wiki *{wiki_name}* ({comment})"
+
+#: extensions/base/datadump.py:36
+#, python-brace-format
+msgid "Generated {file} dump"
+msgstr ""
+
+#: extensions/base/datadump.py:45
+#, fuzzy, python-brace-format
+msgid "[{author}]({author_url}) generated *{file}* dump{comment}"
+msgstr "[{author}]({author_url}) eliminó un wiki *{wiki_name}* ({comment})"
+
+#: extensions/base/datadump.py:58
+#, fuzzy, python-brace-format
+msgid "Deleted {file} dump"
+msgstr ""
+"#-#-#-#-# rcgcdw.po (RcGcDw) #-#-#-#-#\n"
+"Eliminó la página {article}\n"
+"#-#-#-#-# formatters.po (RcGcDw) #-#-#-#-#\n"
+"Página eliminada {article}"
+
+#: extensions/base/datadump.py:67
+#, fuzzy, python-brace-format
+msgid "[{author}]({author_url}) deleted *{file}* dump{comment}"
+msgstr "[{author}]({author_url}) eliminó un wiki *{wiki_name}* ({comment})"
+
+#: extensions/base/curseprofile.py:40
+#, python-brace-format
+msgid "Edited {target}'s profile"
+msgstr "Editó el perfil de {target}"
+
+#: extensions/base/curseprofile.py:42
+msgid "Edited their own profile"
+msgstr "Editó su propio perfil"
+
+#: extensions/base/curseprofile.py:44
+#, python-brace-format
+msgid "Cleared the {field} field"
+msgstr "Borró el campo {field}"
+
+#: extensions/base/curseprofile.py:46
+#, python-brace-format
+msgid "{field} field changed to: {desc}"
+msgstr "El campo {field} cambió a: {desc}"
+
+#: extensions/base/curseprofile.py:58
+#, fuzzy, python-brace-format
+msgid ""
+"[{author}]({author_url}) cleared the {field} on [{target}]({target_url})'s "
+"profile."
+msgstr ""
+"[{author}]({author_url}) editó el {field} en el perfil de {target}. "
+"*({desc})*"
+
+#: extensions/base/curseprofile.py:60
+#, fuzzy, python-brace-format
+msgid ""
+"[{author}]({author_url}) edited the {field} on [{target}]({target_url})'s "
+"profile. *({desc})*"
+msgstr ""
+"[{author}]({author_url}) editó el {field} en el perfil de {target}. "
+"*({desc})*"
+
+#: extensions/base/curseprofile.py:65
+#, fuzzy, python-brace-format
+msgid ""
+"[{author}]({author_url}) cleared the {field} on [their own]({target_url}) "
+"profile."
+msgstr ""
+"[{author}]({author_url}) editó el {field} en su propio perfil. *({desc})*"
+
+#: extensions/base/curseprofile.py:67
+#, fuzzy, python-brace-format
+msgid ""
+"[{author}]({author_url}) edited the {field} on [their own]({target_url}) "
+"profile. *({desc})*"
+msgstr ""
+"[{author}]({author_url}) editó el {field} en su propio perfil. *({desc})*"
+
+#: extensions/base/curseprofile.py:82
+#, python-brace-format
+msgid "Left a comment on {target}'s profile"
+msgstr "Dejó un comentario en el perfil de {target}"
+
+#: extensions/base/curseprofile.py:84
+msgid "Left a comment on their own profile"
+msgstr "Dejó un comentario en su propio perfil"
+
+#: extensions/base/curseprofile.py:97
+#, fuzzy, python-brace-format
+msgid ""
+"[{author}]({author_url}) left a [comment]({comment}) on {target}'s profile."
+msgstr ""
+"[{author}]({author_url}) dejó un [comentario]({comment}) en el perfil de "
+"{target}"
+
+#: extensions/base/curseprofile.py:100
+#, fuzzy, python-brace-format
+msgid ""
+"[{author}]({author_url}) left a [comment]({comment}) on their own profile."
+msgstr ""
+"[{author}]({author_url}) dejó un [comentario]({comment}) en su propio perfil"
+
+#: extensions/base/curseprofile.py:113
+#, python-brace-format
+msgid "Edited a comment on {target}'s profile"
+msgstr "Editó un comentario en el perfil de {target}"
+
+#: extensions/base/curseprofile.py:115
+msgid "Edited a comment on their own profile"
+msgstr "Editó un comentario en su propio perfil"
+
+#: extensions/base/curseprofile.py:128
+#, fuzzy, python-brace-format
+msgid ""
+"[{author}]({author_url}) edited a [comment]({comment}) on {target}'s profile."
+msgstr ""
+"[{author}]({author_url}) editó un [comentario]({comment}) en el perfil de "
+"{target}"
+
+#: extensions/base/curseprofile.py:131
+#, fuzzy, python-brace-format
+msgid ""
+"[{author}]({author_url}) edited a [comment]({comment}) on their own profile."
+msgstr ""
+"[{author}]({author_url}) editó un [comentario]({comment}) en su propio perfil"
+
+#: extensions/base/curseprofile.py:144
+#, python-brace-format
+msgid "Replied to a comment on {target}'s profile"
+msgstr "Respondió a un comentario en el perfil de {target}"
+
+#: extensions/base/curseprofile.py:146
+msgid "Replied to a comment on their own profile"
+msgstr "Respondió a un comentario en su propio perfil"
+
+#: extensions/base/curseprofile.py:159
+#, fuzzy, python-brace-format
+msgid ""
+"[{author}]({author_url}) replied to a [comment]({comment}) on {target}'s "
+"profile."
+msgstr ""
+"[{author}]({author_url}) respondió a un [comentario]({comment}) en el perfil "
+"de {target}"
+
+#: extensions/base/curseprofile.py:162
+#, fuzzy, python-brace-format
+msgid ""
+"[{author}]({author_url}) replied to a [comment]({comment}) on their own "
+"profile."
+msgstr ""
+"[{author}]({author_url}) respondió a un [comentario]({comment}) en su propio "
+"perfil"
+
+#: extensions/base/curseprofile.py:175
+#, python-brace-format
+msgid "Deleted a comment on {target}'s profile"
+msgstr "Eliminó un comentario en el perfil de {target}"
+
+#: extensions/base/curseprofile.py:177
+#, fuzzy
+msgid "Deleted a comment on their own profile"
+msgstr "Editó un comentario en su propio perfil"
+
+#: extensions/base/curseprofile.py:197
+#, fuzzy, python-brace-format
+msgid ""
+"[{author}]({author_url}) deleted a [comment]({comment}) on {target}'s "
+"profile.{reason}"
+msgstr ""
+"[{author}]({author_url}) editó un [comentario]({comment}) en el perfil de "
+"{target}"
+
+#: extensions/base/curseprofile.py:200
+#, fuzzy, python-brace-format
+msgid ""
+"[{author}]({author_url}) deleted a [comment]({comment}) on their own profile."
+"{reason}"
+msgstr ""
+"[{author}]({author_url}) editó un [comentario]({comment}) en su propio perfil"
+
+#: extensions/base/curseprofile.py:214
+#, python-brace-format
+msgid "Purged a comment on {target}'s profile"
+msgstr "Borró un comentario en el perfil de {target}"
+
+#: extensions/base/curseprofile.py:216
+#, fuzzy
+msgid "Purged a comment on their own profile"
+msgstr "Editó un comentario en su propio perfil"
+
+#: extensions/base/curseprofile.py:230
+#, fuzzy, python-brace-format
+msgid ""
+"[{author}]({author_url}) purged a comment on [{target}]({link})'s profile."
+"{reason}"
+msgstr ""
+"#-#-#-#-# rcgcdw.po (RcGcDw) #-#-#-#-#\n"
+"[{author}]({author_url}) borró un comentario en el perfil de {target}\n"
+"#-#-#-#-# formatters.po (RcGcDw) #-#-#-#-#\n"
+"[{author}]({author_url}) eliminó un comentario en el perfil de {target}"
+
+#: extensions/base/curseprofile.py:233
+#, fuzzy, python-brace-format
+msgid ""
+"[{author}]({author_url}) purged a comment on [their own]({link}) profile."
+"{reason}"
+msgstr ""
+"#-#-#-#-# rcgcdw.po (RcGcDw) #-#-#-#-#\n"
+"[{author}]({author_url}) borró un comentario en su propio perfil\n"
+"#-#-#-#-# formatters.po (RcGcDw) #-#-#-#-#\n"
+"[{author}]({author_url}) eliminó un comentario en su propio perfil"
+
+#: extensions/base/renameuser.py:38
+#, python-brace-format
+msgid "Renamed user \"{old_name}\" with {edits} edit to \"{new_name}\""
+msgid_plural "Renamed user \"{old_name}\" with {edits} edits to \"{new_name}\""
+msgstr[0] ""
+msgstr[1] ""
+
+#: extensions/base/renameuser.py:43
+#, python-brace-format
+msgid "Renamed user \"{old_name}\" to \"{new_name}\""
+msgstr ""
+
+#: extensions/base/renameuser.py:58
+#, fuzzy, python-brace-format
+msgid ""
+"[{author}]({author_url}) renamed user *{old_name}* with {edits} edit to "
+"[{new_name}]({link}){comment}"
+msgid_plural ""
+"[{author}]({author_url}) renamed user *{old_name}* with {edits} edits to "
+"[{new_name}]({link}){comment}"
+msgstr[0] "[{author}]({author_url}) eliminó [{page}]({page_link}){comment}"
+msgstr[1] "[{author}]({author_url}) eliminó [{page}]({page_link}){comment}"
+
+#: extensions/base/renameuser.py:66
+#, fuzzy, python-brace-format
+msgid ""
+"[{author}]({author_url}) renamed user *{old_name}* to [{new_name}]({link})"
+"{comment}"
+msgstr "[{author}]({author_url}) eliminó [{page}]({page_link}){comment}"
+
+#: extensions/base/interwiki.py:37
+msgid "Added an entry to the interwiki table"
+msgstr "Agregó una entrada a la tabla interwiki"
+
+#: extensions/base/interwiki.py:38 extensions/base/interwiki.py:65
+#, python-brace-format
+msgid "Prefix: {prefix}, website: {website} | {desc}"
+msgstr "Prefijo: {prefix}, sitio web: {website} | {desc}"
+
+#: extensions/base/interwiki.py:50
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) added an entry to the [interwiki table]"
+"({table_url}) pointing to {website} with {prefix} prefix"
+msgstr ""
+"[{author}]({author_url}) agregó una entrada a la [tabla interwiki]"
+"({table_url}) que apunta a {website} con el prefijo {prefix}"
+
+#: extensions/base/interwiki.py:64
+#, fuzzy
+msgid "Edited an entry in interwiki table"
+msgstr ""
+"#-#-#-#-# rcgcdw.po (RcGcDw) #-#-#-#-#\n"
+"Editó una entrada en la tabla de interwiki\n"
+"#-#-#-#-# formatters.po (RcGcDw) #-#-#-#-#\n"
+"Editó una entrada en la tabla interwiki"
+
+#: extensions/base/interwiki.py:77
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) edited an entry in [interwiki table]({table_url}) "
+"pointing to {website} with {prefix} prefix"
+msgstr ""
+"[{author}]({author_url}) editó una entrada en la [tabla interwiki]"
+"({table_url}) que apunta a {website} con el prefijo {prefix}"
+
+#: extensions/base/interwiki.py:91
+msgid "Deleted an entry in interwiki table"
+msgstr "Eliminó una entrada en la tabla interwiki"
+
+#: extensions/base/interwiki.py:92
+#, python-brace-format
+msgid "Prefix: {prefix} | {desc}"
+msgstr "Prefijo: {prefix} | {desc}"
+
+#: extensions/base/interwiki.py:102
+#, fuzzy, python-brace-format
+msgid ""
+"[{author}]({author_url}) deleted an entry in [interwiki table]({table_url})"
+"{desc}"
+msgstr ""
+"[{author}]({author_url}) eliminó una entrada en la [tabla interwiki]"
+"({table_url})"
+
+#: extensions/base/abusefilter.py:29
+#, fuzzy
+msgid "None"
+msgstr ""
+"#-#-#-#-# rcgcdw.po (RcGcDw) #-#-#-#-#\n"
+"Ninguno\n"
+"#-#-#-#-# formatters.po (RcGcDw) #-#-#-#-#\n"
+"Ninguna"
+
+#: extensions/base/abusefilter.py:29
+msgid "Warning issued"
+msgstr "Advertencia emitida"
+
+#: extensions/base/abusefilter.py:29
+msgid "**Blocked user**"
+msgstr "**Usuario bloqueado**"
+
+#: extensions/base/abusefilter.py:29
+#, fuzzy
+msgid "Tagged the edit"
+msgstr ""
+"#-#-#-#-# rcgcdw.po (RcGcDw) #-#-#-#-#\n"
+"Etiqueto la edición\n"
+"#-#-#-#-# formatters.po (RcGcDw) #-#-#-#-#\n"
+"Etiquetó la edición"
+
+#: extensions/base/abusefilter.py:29
+msgid "Disallowed the action"
+msgstr "Anuló la acción"
+
+#: extensions/base/abusefilter.py:29
+msgid "**IP range blocked**"
+msgstr "**Rango de IP bloqueado**"
+
+#: extensions/base/abusefilter.py:29
+msgid "Throttled actions"
+msgstr "Limitó acciones"
+
+#: extensions/base/abusefilter.py:29
+#, fuzzy
+msgid "Removed autoconfirmed group"
+msgstr ""
+"#-#-#-#-# rcgcdw.po (RcGcDw) #-#-#-#-#\n"
+"Eliminó el grupo autoconfirmado\n"
+"#-#-#-#-# formatters.po (RcGcDw) #-#-#-#-#\n"
+"Eliminó grupo autoconfirmado"
+
+#: extensions/base/abusefilter.py:29
+#, fuzzy
+msgid "**Removed from privileged groups**"
+msgstr ""
+"#-#-#-#-# rcgcdw.po (RcGcDw) #-#-#-#-#\n"
+"**Eliminado de los grupos privilegiados**\n"
+"#-#-#-#-# formatters.po (RcGcDw) #-#-#-#-#\n"
+"** Eliminado de los grupos privilegiados **"
+
+#: extensions/base/abusefilter.py:30
+msgid "Edit"
+msgstr "Edición"
+
+#: extensions/base/abusefilter.py:30
+msgid "Upload"
+msgstr "Carga"
+
+#: extensions/base/abusefilter.py:30
+msgid "Move"
+msgstr "Traslado"
+
+#: extensions/base/abusefilter.py:30
+msgid "Stash upload"
+msgstr "Carga de archivos"
+
+#: extensions/base/abusefilter.py:30
+#, fuzzy
+msgid "Deletion"
+msgstr ""
+"#-#-#-#-# rcgcdw.po (RcGcDw) #-#-#-#-#\n"
+"Borrado\n"
+"#-#-#-#-# formatters.po (RcGcDw) #-#-#-#-#\n"
+"Eliminación"
+
+#: extensions/base/abusefilter.py:30
+msgid "Account creation"
+msgstr "Creación de cuenta"
+
+#: extensions/base/abusefilter.py:30
+msgid "Auto account creation"
+msgstr "Creación de cuenta automática"
+
+#: extensions/base/abusefilter.py:54
+#, python-brace-format
+msgid "{user} triggered \"{abuse_filter}\""
+msgstr "{user} activó \"{abuse_filter}\""
+
+#: extensions/base/abusefilter.py:55
+msgid "Performed"
+msgstr "Realizó"
+
+#: extensions/base/abusefilter.py:56
+msgid "Action taken"
+msgstr "Acción tomada"
+
+#: extensions/base/abusefilter.py:57
+msgid "Title"
+msgstr "Título"
+
+#: extensions/base/abusefilter.py:66
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) triggered *{abuse_filter}*, performing the action "
+"\"{action}\" on *[{target}]({target_url})* - action taken: {result}."
+msgstr ""
+"[{author}]({author_url}) activó *{abuse_filter}*, realizando la acción "
+"\"{action}\" en *[{target}]({target_url})* - acción tomada: {result}."
+
+#: extensions/base/abusefilter.py:83
+#, fuzzy, python-brace-format
+msgid "Edited abuse filter number {number}"
+msgstr ""
+"#-#-#-#-# rcgcdw.po (RcGcDw) #-#-#-#-#\n"
+"Editó el número de filtro de abuso {number}\n"
+"#-#-#-#-# formatters.po (RcGcDw) #-#-#-#-#\n"
+"Editó el número del filtro de abuso {number}"
+
+#: extensions/base/abusefilter.py:95
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) edited abuse filter [number {number}]({filter_url})"
+msgstr ""
+"[{author}]({author_url}) editó el filtro de abuso [número {number}]"
+"({filter_url})"
+
+#: extensions/base/abusefilter.py:111
+#, fuzzy, python-brace-format
+msgid "Created abuse filter number {number}"
+msgstr ""
+"#-#-#-#-# rcgcdw.po (RcGcDw) #-#-#-#-#\n"
+"Creó el filtro de abuso número {number}\n"
+"#-#-#-#-# formatters.po (RcGcDw) #-#-#-#-#\n"
+"Creó el número de filtro de abuso {number}"
+
+#: extensions/base/abusefilter.py:119
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) created abuse filter [number {number}]({filter_url})"
+msgstr ""
+"[{author}]({author_url}) creó el filtro de abuso [número {number}]"
+"({filter_url})"
+
+#: extensions/base/mediawiki.py:37
+msgid "director"
+msgstr ""
+
+#: extensions/base/mediawiki.py:37
+msgid "bot"
+msgstr ""
+
+#: extensions/base/mediawiki.py:37
+msgid "editor"
+msgstr ""
+
+#: extensions/base/mediawiki.py:37
+msgid "directors"
+msgstr ""
+
+#: extensions/base/mediawiki.py:37
+msgid "sysop"
+msgstr ""
+
+#: extensions/base/mediawiki.py:37
+msgid "bureaucrat"
+msgstr ""
+
+#: extensions/base/mediawiki.py:37
+msgid "reviewer"
+msgstr ""
+
+#: extensions/base/mediawiki.py:38
+msgid "autoreview"
+msgstr ""
+
+#: extensions/base/mediawiki.py:38
+msgid "autopatrol"
+msgstr ""
+
+#: extensions/base/mediawiki.py:38
+msgid "wiki_guardian"
+msgstr ""
+
+#: extensions/base/mediawiki.py:70
+msgid "(N!) "
+msgstr "(N!) "
+
+#: extensions/base/mediawiki.py:71
+msgid "m"
+msgstr "m"
+
+#: extensions/base/mediawiki.py:72
+msgid "b"
+msgstr "b"
+
+#: extensions/base/mediawiki.py:112
+#, fuzzy, python-brace-format
+msgid ""
+"[{author}]({author_url}) edited [{article}]({edit_link}){comment} {bold}"
+"({sign}{edit_size}){bold}"
+msgstr ""
+"[{author}]({author_url}) editó [{article}]({edit_link}){comment} ({bold}"
+"{sign}{edit_size}{bold})"
+
+#: extensions/base/mediawiki.py:117
+#, fuzzy, python-brace-format
+msgid ""
+"[{author}]({author_url}) created [{article}]({edit_link}){comment} {bold}"
+"({sign}{edit_size}){bold}"
+msgstr ""
+"[{author}]({author_url}) creó [{article}]({edit_link}){comment} ({bold}{sign}"
+"{edit_size}{bold})"
+
+#: extensions/base/mediawiki.py:190 extensions/base/mediawiki.py:223
+msgid "Options"
+msgstr "Opciones"
+
+#: extensions/base/mediawiki.py:190
+#, python-brace-format
+msgid "([preview]({link}) | [undo]({undolink}))"
+msgstr "([vista previa]({link}) | [deshacer]({undolink}))"
+
+#: extensions/base/mediawiki.py:195
+#, python-brace-format
+msgid "Uploaded a new version of {name}"
+msgstr "Subió una nueva versión de {name}"
+
+#: extensions/base/mediawiki.py:197
+#, python-brace-format
+msgid "Reverted a version of {name}"
+msgstr "Revirtió una versión de {name}"
+
+#: extensions/base/mediawiki.py:199
+#, python-brace-format
+msgid "Uploaded {name}"
+msgstr "Subió {name}"
+
+#: extensions/base/mediawiki.py:208
+msgid "**No license!**"
+msgstr "**¡Sin licencia!**"
+
+#: extensions/base/mediawiki.py:223
+#, python-brace-format
+msgid "([preview]({link}))"
+msgstr "([vista previa]({link}))"
+
+#: extensions/base/mediawiki.py:228
+msgid ""
+"\n"
+"License: {}"
+msgstr ""
+"\n"
+"Licencia: {}"
+
+#: extensions/base/mediawiki.py:237
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) reverted a version of [{file}]({file_link}){comment}"
+msgstr ""
+"[{author}]({author_url}) revirtió una versión de [{file}]({file_link})"
+"{comment}"
+
+#: extensions/base/mediawiki.py:248
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) uploaded a new version of [{file}]({file_link})"
+"{comment}"
+msgstr ""
+"[{author}]({author_url}) subió una nueva versión de [{file}]({file_link})"
+"{comment}"
+
+#: extensions/base/mediawiki.py:259
+#, python-brace-format
+msgid "[{author}]({author_url}) uploaded [{file}]({file_link}){comment}"
+msgstr "[{author}]({author_url}) subió [{file}]({file_link}){comment}"
+
+#: extensions/base/mediawiki.py:274
+#, fuzzy, python-brace-format
+msgid "Deleted page {article}"
+msgstr ""
+"#-#-#-#-# rcgcdw.po (RcGcDw) #-#-#-#-#\n"
+"Eliminó la página {article}\n"
+"#-#-#-#-# formatters.po (RcGcDw) #-#-#-#-#\n"
+"Página eliminada {article}"
+
+#: extensions/base/mediawiki.py:283
+#, python-brace-format
+msgid "[{author}]({author_url}) deleted [{page}]({page_link}){comment}"
+msgstr "[{author}]({author_url}) eliminó [{page}]({page_link}){comment}"
+
+#: extensions/base/mediawiki.py:298
+#, fuzzy, python-brace-format
+msgid "Deleted redirect {article} by overwriting"
+msgstr ""
+"#-#-#-#-# rcgcdw.po (RcGcDw) #-#-#-#-#\n"
+"Eliminó la redirección {article} sobrescribiendola\n"
+"#-#-#-#-# formatters.po (RcGcDw) #-#-#-#-#\n"
+"Eliminó la redirección {article} sobrescribiéndola"
+
+#: extensions/base/mediawiki.py:308
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) deleted redirect by overwriting [{page}]"
+"({page_link}){comment}"
+msgstr ""
+"[{author}]({author_url}) eliminó la redirección al sobrescribir [{page}]"
+"({page_link}){comment}"
+
+#: extensions/base/mediawiki.py:322
+#, python-brace-format
+msgid "Restored {article}"
+msgstr "Restauró {article}"
+
+#: extensions/base/mediawiki.py:331
+#, python-brace-format
+msgid "[{author}]({author_url}) restored [{article}]({article_url}){comment}"
+msgstr "[{author}]({author_url}) restauró [{article}]({article_url}){comment}"
+
+#: extensions/base/mediawiki.py:348
+#, fuzzy
+msgid "Changed visibility of log events"
+msgstr ""
+"#-#-#-#-# rcgcdw.po (RcGcDw) #-#-#-#-#\n"
+"Cambió la visibilidad del registro de eventos\n"
+"#-#-#-#-# formatters.po (RcGcDw) #-#-#-#-#\n"
+"Modificó la visibilidad del registro de eventos"
+
+#: extensions/base/mediawiki.py:356
+#, python-brace-format
+msgid "[{author}]({author_url}) changed visibility of log events{comment}"
+msgstr ""
+"[{author}]({author_url}) cambió la visibilidad del registro de "
+"eventos{comment}"
+
+#: extensions/base/mediawiki.py:370
+#, python-brace-format
+msgid "Changed visibility of revision on page {article} "
+msgid_plural "Changed visibility of {amount} revisions on page {article} "
+msgstr[0] "Modificó la visibilidad de la revisión en la página {article} "
+msgstr[1] ""
+"Modificó la visibilidad de {amount} revisiones en la página {article} "
+
+#: extensions/base/mediawiki.py:383
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) changed visibility of revision on page [{article}]"
+"({article_url}){comment}"
+msgid_plural ""
+"[{author}]({author_url}) changed visibility of {amount} revisions on page "
+"[{article}]({article_url}){comment}"
+msgstr[0] ""
+"[{author}]({author_url}) cambió la visibilidad de la revisión en la página "
+"[{article}]({article_url}){comment}"
+msgstr[1] ""
+"[{author}]({author_url}) cambió la visibilidad de {amount} revisiones en la "
+"página [{article}]({article_url}){comment}"
+
+#: extensions/base/mediawiki.py:399 extensions/base/mediawiki.py:432
+msgid "No redirect has been made"
+msgstr "No se ha creado una redirección"
+
+#: extensions/base/mediawiki.py:400 extensions/base/mediawiki.py:433
+#, fuzzy
+msgid "A redirect has been made"
+msgstr ""
+"#-#-#-#-# rcgcdw.po (RcGcDw) #-#-#-#-#\n"
+"Se ha creado una redirección\n"
+"#-#-#-#-# formatters.po (RcGcDw) #-#-#-#-#\n"
+"Se creó una redirección"
+
+#: extensions/base/mediawiki.py:401
+#, python-brace-format
+msgid "Moved {redirect}{article} to {target}"
+msgstr "Movió {redirect}{article} a {target}"
+
+#: extensions/base/mediawiki.py:412 extensions/base/mediawiki.py:444
+msgid "without making a redirect"
+msgstr "sin crear una redirección"
+
+#: extensions/base/mediawiki.py:413 extensions/base/mediawiki.py:445
+msgid "with a redirect"
+msgstr "con una redirección"
+
+#: extensions/base/mediawiki.py:416
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) moved {redirect}*{article}* to [{target}]"
+"({target_url}) {made_a_redirect}{comment}"
+msgstr ""
+"[{author}]({author_url}) movió {redirect}*{article}* a [{target}]"
+"({target_url}) {made_a_redirect}{comment}"
+
+#: extensions/base/mediawiki.py:434
+#, python-brace-format
+msgid "Moved {redirect}{article} to {title} over redirect"
+msgstr "Movió {redirect}{article} a {title} sobre la redirección"
+
+#: extensions/base/mediawiki.py:448
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) moved {redirect}*{article}* over redirect to "
+"[{target}]({target_url}) {made_a_redirect}{comment}"
+msgstr ""
+"[{author}]({author_url}) movió {redirect}*{article}* sobre la redirección a "
+"[{target}]({target_url}) {made_a_redirect}{comment}"
+
+#: extensions/base/mediawiki.py:464
+#, python-brace-format
+msgid "Moved protection settings from {redirect}{article} to {title}"
+msgstr "Movió la configuración de protección de {redirect}{article} a {title}"
+
+#: extensions/base/mediawiki.py:477
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) moved protection settings from {redirect}*{article}"
+"* to [{target}]({target_url}){comment}"
+msgstr ""
+"[{author}]({author_url}) movió la configuración de protección de {redirect}"
+"*{article}* a [{target}]({target_url}){comment}"
+
+#: extensions/base/mediawiki.py:492
+#, fuzzy, python-brace-format
+msgid "Protected {target}"
+msgstr ""
+"#-#-#-#-# rcgcdw.po (RcGcDw) #-#-#-#-#\n"
+"Protegió a {target}\n"
+"#-#-#-#-# formatters.po (RcGcDw) #-#-#-#-#\n"
+"Protegió {target}"
+
+#: extensions/base/mediawiki.py:495 extensions/base/mediawiki.py:510
+#: extensions/base/mediawiki.py:526 extensions/base/mediawiki.py:541
+msgid " [cascading]"
+msgstr " [en cascada]"
+
+#: extensions/base/mediawiki.py:506
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) protected [{article}]({article_url}) with the "
+"following settings: {settings}{comment}"
+msgstr ""
+"[{author}]({author_url}) protegió [{article}]({article_url}) con la "
+"siguiente configuración: {settings}{comment}"
+
+#: extensions/base/mediawiki.py:523
+#, fuzzy, python-brace-format
+msgid "Changed protection level for {article}"
+msgstr ""
+"#-#-#-#-# rcgcdw.po (RcGcDw) #-#-#-#-#\n"
+"Cambió el nivel de protección de {article}\n"
+"#-#-#-#-# formatters.po (RcGcDw) #-#-#-#-#\n"
+"Modificó el nivel de protección de {article}"
+
+#: extensions/base/mediawiki.py:537
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) modified protection settings of [{article}]"
+"({article_url}) to: {settings}{comment}"
+msgstr ""
+"[{author}]({author_url}) modificó la configuración de protección de "
+"[{article}]({article_url}) a: {settings}{comment}"
+
+#: extensions/base/mediawiki.py:554
+#, fuzzy, python-brace-format
+msgid "Removed protection from {article}"
+msgstr ""
+"#-#-#-#-# rcgcdw.po (RcGcDw) #-#-#-#-#\n"
+"Quitó la protección de {article}\n"
+"#-#-#-#-# formatters.po (RcGcDw) #-#-#-#-#\n"
+"Eliminó la protección de {article}"
+
+#: extensions/base/mediawiki.py:563
+#, fuzzy, python-brace-format
+msgid ""
+"[{author}]({author_url}) removed protection from [{article}]({article_url})"
+"{comment}"
+msgstr ""
+"#-#-#-#-# rcgcdw.po (RcGcDw) #-#-#-#-#\n"
+"[{author}]({author_url}) eliminó la protección de [{article}]({article_url})"
+"{comment}\n"
+"#-#-#-#-# formatters.po (RcGcDw) #-#-#-#-#\n"
+"[{author}]({author_url}) quitó la protección de [{article}]({article_url})"
+"{comment}"
+
+#: extensions/base/mediawiki.py:572
+#, fuzzy
+msgid "for infinity and beyond"
+msgstr ""
+"#-#-#-#-# rcgcdw.po (RcGcDw) #-#-#-#-#\n"
+"hasta el fin de nuestros días\n"
+"#-#-#-#-# formatters.po (RcGcDw) #-#-#-#-#\n"
+"por toda la eternidad"
+
+#: extensions/base/mediawiki.py:581
+msgid "for less than a minute"
+msgstr ""
+
+#: extensions/base/mediawiki.py:583
+msgid "year"
+msgid_plural "years"
+msgstr[0] ""
+msgstr[1] ""
+
+#: extensions/base/mediawiki.py:583
+msgid "day"
+msgid_plural "days"
+msgstr[0] ""
+msgstr[1] ""
+
+#: extensions/base/mediawiki.py:583
+msgid "hour"
+msgid_plural "hours"
+msgstr[0] ""
+msgstr[1] ""
+
+#: extensions/base/mediawiki.py:584
+msgid "minute"
+msgid_plural "minutes"
+msgstr[0] ""
+msgstr[1] ""
+
+#: extensions/base/mediawiki.py:589
+#, python-brace-format
+msgid "for {time_number} {time_unit}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:608
+msgid "Blocked from editing the following pages: "
+msgstr "Bloqueado de editar las siguientes páginas: "
+
+#: extensions/base/mediawiki.py:615 extensions/base/mediawiki.py:661
+#, fuzzy
+msgid " and namespaces: "
+msgstr ""
+"#-#-#-#-# rcgcdw.po (RcGcDw) #-#-#-#-#\n"
+" y los espacios de nombres: \n"
+"#-#-#-#-# formatters.po (RcGcDw) #-#-#-#-#\n"
+" y espacios de nombres: "
+
+#: extensions/base/mediawiki.py:617
+msgid "Blocked from editing pages on following namespaces: "
+msgstr "Bloqueado de editar páginas en los siguientes espacios de nombres: "
+
+#: extensions/base/mediawiki.py:628
+msgid "Partial block details"
+msgstr "Detalles del bloqueo parcial"
+
+#: extensions/base/mediawiki.py:631
+msgid "Block flags"
+msgstr ""
+
+#: extensions/base/mediawiki.py:633
+#, fuzzy, python-brace-format
+msgid "Blocked {blocked_user} {time}"
+msgstr ""
+"#-#-#-#-# rcgcdw.po (RcGcDw) #-#-#-#-#\n"
+"Bloqueó a {blocked_user} {time}\n"
+"#-#-#-#-# formatters.po (RcGcDw) #-#-#-#-#\n"
+"Bloqueado {blocked_user}{time}"
+
+#: extensions/base/mediawiki.py:653
+msgid " on pages: "
+msgstr " en las páginas: "
+
+#: extensions/base/mediawiki.py:663
+#, fuzzy
+msgid " on namespaces: "
+msgstr ""
+"#-#-#-#-# rcgcdw.po (RcGcDw) #-#-#-#-#\n"
+" en los espacios de nombres: \n"
+"#-#-#-#-# formatters.po (RcGcDw) #-#-#-#-#\n"
+" en espacios de nombres: "
+
+#: extensions/base/mediawiki.py:675
+#, fuzzy, python-brace-format
+msgid ""
+"[{author}]({author_url}) blocked [{user}]({user_url}) {time}"
+"{restriction_desc}{comment}"
+msgstr ""
+"#-#-#-#-# rcgcdw.po (RcGcDw) #-#-#-#-#\n"
+"[{author}]({author_url}) bloqueó [{user}]({user_url}) {time}"
+"{restriction_desc}{comment}\n"
+"#-#-#-#-# formatters.po (RcGcDw) #-#-#-#-#\n"
+"[{author}]({author_url}) bloqueó a [{user}]({user_url}) {time}"
+"{restriction_desc}{comment}"
+
+#: extensions/base/mediawiki.py:693
+#, fuzzy, python-brace-format
+msgid "Changed block settings for {blocked_user}"
+msgstr ""
+"#-#-#-#-# rcgcdw.po (RcGcDw) #-#-#-#-#\n"
+"Modificó la configuración de bloqueo de {blocked_user}\n"
+"#-#-#-#-# formatters.po (RcGcDw) #-#-#-#-#\n"
+"Se modificó la configuración de bloqueo de {blocked_user}"
+
+#: extensions/base/mediawiki.py:703
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) changed block settings for [{blocked_user}]"
+"({user_url}){comment}"
+msgstr ""
+"[{author}]({author_url}) cambió la configuración de bloqueo de "
+"[{blocked_user}]({user_url}){comment}"
+
+#: extensions/base/mediawiki.py:716
+#, fuzzy, python-brace-format
+msgid "Unblocked {blocked_user}"
+msgstr ""
+"#-#-#-#-# rcgcdw.po (RcGcDw) #-#-#-#-#\n"
+"Desbloqueó a {blocked_user}\n"
+"#-#-#-#-# formatters.po (RcGcDw) #-#-#-#-#\n"
+"Desbloqueado {blocked_user}"
+
+#: extensions/base/mediawiki.py:726
+#, fuzzy, python-brace-format
+msgid ""
+"[{author}]({author_url}) unblocked [{blocked_user}]({user_url}){comment}"
+msgstr ""
+"#-#-#-#-# rcgcdw.po (RcGcDw) #-#-#-#-#\n"
+"[{author}]({author_url}) desbloqueó [{blocked_user}]({user_url}){comment}\n"
+"#-#-#-#-# formatters.po (RcGcDw) #-#-#-#-#\n"
+"[{author}]({author_url}) desbloqueó a [{blocked_user}]({user_url}){comment}"
+
+#: extensions/base/mediawiki.py:742
+msgid "Action has been hidden by administration"
+msgstr "La administración ha ocultado la acción"
+
+#: extensions/base/mediawiki.py:749
+msgid "An action has been hidden by administration."
+msgstr "La administración ha ocultado una acción."
+
+#: extensions/base/mediawiki.py:760
+#, python-brace-format
+msgid "Imported {article} with {count} revision"
+msgid_plural "Imported {article} with {count} revisions"
+msgstr[0] "Importó {article} con {count} revisión"
+msgstr[1] "Importó {article} con {count} revisiones"
+
+#: extensions/base/mediawiki.py:771
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) imported [{article}]({article_url}) with {count} "
+"revision{comment}"
+msgid_plural ""
+"[{author}]({author_url}) imported [{article}]({article_url}) with {count} "
+"revisions{comment}"
+msgstr[0] ""
+"[{author}]({author_url}) importó [{article}]({article_url}) con {count} "
+"revisión{comment}"
+msgstr[1] ""
+"[{author}]({author_url}) importó [{article}]({article_url}) con {count} "
+"revisiones{comment}"
+
+#: extensions/base/mediawiki.py:787
+#, fuzzy, python-brace-format
+msgid "Imported {article} with {count} revision from \"{source}\""
+msgid_plural "Imported {article} with {count} revisions from \"{source}\""
+msgstr[0] "Importó {article} con {count} revisión"
+msgstr[1] "Importó {article} con {count} revisiones"
+
+#: extensions/base/mediawiki.py:802
+#, fuzzy, python-brace-format
+msgid ""
+"[{author}]({author_url}) imported [{article}]({article_url}) with {count} "
+"revision from [{source}]({source_url}){comment}"
+msgid_plural ""
+"[{author}]({author_url}) imported [{article}]({article_url}) with {count} "
+"revisions from [{source}]({source_url}){comment}"
+msgstr[0] ""
+"[{author}]({author_url}) importó [{article}]({article_url}) con {count} "
+"revisión{comment}"
+msgstr[1] ""
+"[{author}]({author_url}) importó [{article}]({article_url}) con {count} "
+"revisiones{comment}"
+
+#: extensions/base/mediawiki.py:817
+#, python-brace-format
+msgid " (until {date_and_time})"
+msgstr ""
+
+#: extensions/base/mediawiki.py:834
+#, fuzzy, python-brace-format
+msgid "Changed group membership for {target}"
+msgstr ""
+"#-#-#-#-# rcgcdw.po (RcGcDw) #-#-#-#-#\n"
+"Cambió la membresía del grupo para {target}\n"
+"#-#-#-#-# formatters.po (RcGcDw) #-#-#-#-#\n"
+"Modificó el grupo de {target}"
+
+#: extensions/base/mediawiki.py:836
+msgid "System"
+msgstr "Sistema"
+
+#: extensions/base/mediawiki.py:837
+#, python-brace-format
+msgid "{target} got autopromoted to a new usergroup"
+msgstr "{target} obtuvo una promoción automática a un nuevo grupo de usuarios"
+
+#: extensions/base/mediawiki.py:843
+#, fuzzy
+msgid "Added group"
+msgid_plural "Added groups"
+msgstr[0] "Eliminado"
+msgstr[1] "Eliminado"
+
+#: extensions/base/mediawiki.py:845
+#, fuzzy
+msgid "Removed group"
+msgid_plural "Removed groups"
+msgstr[0] "Eliminado"
+msgstr[1] "Eliminado"
+
+#: extensions/base/mediawiki.py:859
+#, python-brace-format
+msgid "Added to {added} and removed from {removed}."
+msgstr ""
+
+#: extensions/base/mediawiki.py:860 extensions/base/mediawiki.py:862
+#: extensions/base/mediawiki.py:864 extensions/base/mediawiki.py:871
+msgid ", "
+msgstr ""
+
+#: extensions/base/mediawiki.py:862
+#, python-brace-format
+msgid "Added to {added}."
+msgstr ""
+
+#: extensions/base/mediawiki.py:864
+#, fuzzy, python-brace-format
+msgid "Removed from {removed}."
+msgstr "Eliminado"
+
+#: extensions/base/mediawiki.py:865
+#, fuzzy, python-brace-format
+msgid ""
+"[{author}]({author_url}) changed group membership for [{target}]"
+"({target_url}): {group_changes}{comment}"
+msgstr ""
+"#-#-#-#-# rcgcdw.po (RcGcDw) #-#-#-#-#\n"
+"[{author}]({author_url}) cambió la pertenencia al grupo de [{target}]"
+"({target_url}) de {old_groups} a {new_groups}{comment}\n"
+"#-#-#-#-# formatters.po (RcGcDw) #-#-#-#-#\n"
+"[{author}]({author_url}) cambió el grupo de [{target}]({target_url}) de "
+"{old_groups} a {new_groups}{comment}"
+
+#: extensions/base/mediawiki.py:869
+#, fuzzy, python-brace-format
+msgid "The system autopromoted [{target}]({target_url}) to {added}.{comment}"
+msgstr ""
+"#-#-#-#-# rcgcdw.po (RcGcDw) #-#-#-#-#\n"
+"{author} promovió automáticamente a [{target}]({target_url}) de {old_groups} "
+"a {new_groups}{comment}\n"
+"#-#-#-#-# formatters.po (RcGcDw) #-#-#-#-#\n"
+"{author} promovió automáticamente [{target}]({target_url}) de {old_groups} a "
+"{new_groups}{comment}"
+
+#: extensions/base/mediawiki.py:882
+#, python-brace-format
+msgid "Merged revision histories of {article} into {dest}"
+msgstr "Fusionó los historiales de revisión de {article} en {dest}"
+
+#: extensions/base/mediawiki.py:896
+#, fuzzy, python-brace-format
+msgid ""
+"[{author}]({author_url}) merged revision histories of [{article}]"
+"({article_url}) into [{dest}]({dest_url}){comment}"
+msgstr ""
+"#-#-#-#-# rcgcdw.po (RcGcDw) #-#-#-#-#\n"
+"[{author}]({author_url}) fusionó los historiales de revisión de [{article}]"
+"({article_url}) con [{dest}]({dest_url}){comment}\n"
+"#-#-#-#-# formatters.po (RcGcDw) #-#-#-#-#\n"
+"[{author}]({author_url}) fusionó los historiales de revisión de [{article}]"
+"({article_url}) en [{dest}]({dest_url}){comment}"
+
+#: extensions/base/mediawiki.py:910
+#, fuzzy
+msgid "Created account automatically"
+msgstr ""
+"#-#-#-#-# rcgcdw.po (RcGcDw) #-#-#-#-#\n"
+"Creó la cuenta automáticamente\n"
+"#-#-#-#-# formatters.po (RcGcDw) #-#-#-#-#\n"
+"Creó una cuenta automáticamente"
+
+#: extensions/base/mediawiki.py:917
+#, python-brace-format
+msgid "Account [{author}]({author_url}) was created automatically"
+msgstr "La cuenta [{author}]({author_url}) se creó automáticamente"
+
+#: extensions/base/mediawiki.py:930 extensions/base/mediawiki.py:995
+#, fuzzy
+msgid "Created account"
+msgstr ""
+"#-#-#-#-# rcgcdw.po (RcGcDw) #-#-#-#-#\n"
+"Creó la cuenta\n"
+"#-#-#-#-# formatters.po (RcGcDw) #-#-#-#-#\n"
+"Creó una cuenta"
+
+#: extensions/base/mediawiki.py:937 extensions/base/mediawiki.py:1002
+#, python-brace-format
+msgid "Account [{author}]({author_url}) was created"
+msgstr "Se creó la cuenta [{author}]({author_url})"
+
+#: extensions/base/mediawiki.py:949
+#, python-brace-format
+msgid "Created account {article}"
+msgstr "Creó la cuenta {article}"
+
+#: extensions/base/mediawiki.py:958
+#, python-brace-format
+msgid ""
+"Account [{article}]({article_url}) was created by [{author}]({author_url})"
+"{comment}"
+msgstr ""
+"La cuenta [{article}]({article_url}) fue creada por [{author}]({author_url})"
+"{comment}"
+
+#: extensions/base/mediawiki.py:971
+#, python-brace-format
+msgid "Created account {article} and password was sent by email"
+msgstr ""
+"Creó la cuenta {article} y la contraseña se envió por correo electrónico"
+
+#: extensions/base/mediawiki.py:982
+#, python-brace-format
+msgid ""
+"Account [{article}]({article_url}) was created by [{author}]({author_url}) "
+"and password was sent by email{comment}"
+msgstr ""
+"La cuenta [{article}]({article_url}) fue creada por [{author}]({author_url}) "
+"y la contraseña se envió por correo electrónico{comment}"
+
+#: extensions/base/mediawiki.py:1014
+#, fuzzy, python-brace-format
+msgid "Changed the content model of the page {article}"
+msgstr ""
+"#-#-#-#-# rcgcdw.po (RcGcDw) #-#-#-#-#\n"
+"Modificó el modelo de contenido de la página {article}\n"
+"#-#-#-#-# formatters.po (RcGcDw) #-#-#-#-#\n"
+"Cambió el modelo de contenido de la página {article}"
+
+#: extensions/base/mediawiki.py:1016
+#, python-brace-format
+msgid "Model changed from {old} to {new}: {reason}"
+msgstr "El modelo cambió de {old} a {new}: {reason}"
+
+#: extensions/base/mediawiki.py:1028
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) changed the content model of the page [{article}]"
+"({article_url}) from {old} to {new}{comment}"
+msgstr ""
+"[{author}]({author_url}) cambió el modelo de contenido de la página "
+"[{article}]({article_url}) de {old} a {new}{comment}"
+
+#: extensions/base/mediawiki.py:1043
+#, python-brace-format
+msgid "Created the page {article} using a non-default content model"
+msgstr ""
+
+#: extensions/base/mediawiki.py:1045
+#, fuzzy, python-brace-format
+msgid "Created with model {new}: {reason}"
+msgstr "El modelo cambió de {old} a {new}: {reason}"
+
+#: extensions/base/mediawiki.py:1056
+#, fuzzy, python-brace-format
+msgid ""
+"[{author}]({author_url}) created the page [{article}]({article_url}) using a "
+"non-default content model {new}{comment}"
+msgstr ""
+"[{author}]({author_url}) cambió el modelo de contenido de la página "
+"[{article}]({article_url}) de {old} a {new}{comment}"
+
+#: extensions/base/mediawiki.py:1071
+#, fuzzy, python-brace-format
+msgid "Created the tag \"{tag}\""
+msgstr "Creó una etiqueta \"{tag}\""
+
+#: extensions/base/mediawiki.py:1081
+#, fuzzy, python-brace-format
+msgid ""
+"[{author}]({author_url}) created the [tag]({tag_url}) \"{tag}\"{comment}"
+msgstr "[{author}]({author_url}) creó una [etiqueta]({tag_url}) \"{tag}\""
+
+#: extensions/base/mediawiki.py:1102
+#, fuzzy, python-brace-format
+msgid "Deleted the tag \"{tag}\""
+msgstr "Eliminó una etiqueta \"{tag}\""
+
+#: extensions/base/mediawiki.py:1104
+#, fuzzy
+msgid "Removed from"
+msgstr "Eliminado"
+
+#: extensions/base/mediawiki.py:1104
+msgid "{} revision or log entry"
+msgid_plural "{} revisions and/or log entries"
+msgstr[0] ""
+msgstr[1] ""
+
+#: extensions/base/mediawiki.py:1117
+#, fuzzy, python-brace-format
+msgid ""
+"[{author}]({author_url}) deleted the [tag]({tag_url}) \"{tag}\"{comment}"
+msgstr "[{author}]({author_url}) eliminó una [etiqueta]({tag_url}) \"{tag}\""
+
+#: extensions/base/mediawiki.py:1127
+#, fuzzy, python-brace-format
+msgid ""
+"[{author}]({author_url}) deleted the [tag]({tag_url}) \"{tag}\" and removed "
+"it from {count} revision or log entry{comment}"
+msgid_plural ""
+"[{author}]({author_url}) deleted the [tag]({tag_url}) \"{tag}\" and removed "
+"it from {count} revisions and/or log entries{comment}"
+msgstr[0] ""
+"[{author}]({author_url}) importó [{article}]({article_url}) con {count} "
+"revisión{comment}"
+msgstr[1] ""
+"[{author}]({author_url}) importó [{article}]({article_url}) con {count} "
+"revisiones{comment}"
+
+#: extensions/base/mediawiki.py:1144
+#, fuzzy, python-brace-format
+msgid "Activated the tag \"{tag}\""
+msgstr "Activó una etiqueta \"{tag}\""
+
+#: extensions/base/mediawiki.py:1153
+#, fuzzy, python-brace-format
+msgid ""
+"[{author}]({author_url}) activated the [tag]({tag_url}) \"{tag}\"{comment}"
+msgstr "[{author}]({author_url}) activó una [etiqueta]({tag_url}) \"{tag}\""
+
+#: extensions/base/mediawiki.py:1172
+#, fuzzy, python-brace-format
+msgid "Deactivated the tag \"{tag}\""
+msgstr "Desactivó una etiqueta \"{tag}\""
+
+#: extensions/base/mediawiki.py:1181
+#, fuzzy, python-brace-format
+msgid ""
+"[{author}]({author_url}) deactivated the [tag]({tag_url}) \"{tag}\"{comment}"
+msgstr "[{author}]({author_url}) desactivó una [etiqueta]({tag_url}) \"{tag}\""
+
+#: extensions/base/sprite.py:37
+#, python-brace-format
+msgid "Edited the sprite for {article}"
+msgstr "Editó el sprite de {article}"
+
+#: extensions/base/sprite.py:45
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) edited the sprite for [{article}]({article_url})"
+msgstr "[{author}]({author_url}) editó el sprite de [{article}]({article_url})"
+
+#: extensions/base/sprite.py:60
+#, python-brace-format
+msgid "Created the sprite sheet for {article}"
+msgstr "Creó la hoja de sprites de {article}"
+
+#: extensions/base/sprite.py:68
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) created the sprite sheet for [{article}]"
+"({article_url})"
+msgstr ""
+"[{author}]({author_url}) creó la hoja de sprites de [{article}]"
+"({article_url})"
+
+#: extensions/base/sprite.py:79
+#, python-brace-format
+msgid "Edited the slice for {article}"
+msgstr "Editó el sector de {article}"
+
+#: extensions/base/sprite.py:86
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) edited the slice for [{article}]({article_url})"
+msgstr "[{author}]({author_url}) editó el sector de [{article}]({article_url})"
+
+#, python-brace-format
+#~ msgid "for {num} {translated_length}"
+#~ msgstr "por {num}{translated_length}"
+
+#~ msgid "until {}"
+#~ msgstr "hasta {}"
+
+#, python-brace-format
+#~ msgid "[{author}]({author_url}) deleted a comment on {target}'s profile"
+#~ msgstr ""
+#~ "[{author}]({author_url}) eliminó un comentario en el perfil de {target}"
+
+#, python-brace-format
+#~ msgid "[{author}]({author_url}) deleted a comment on their own profile"
+#~ msgstr "[{author}]({author_url}) eliminó un comentario en su propio perfil"
+
+#~ msgid "none"
+#~ msgstr "ninguno"
+
+#, python-brace-format
+#~ msgid "[{author}]({author_url}) imported interwiki{comment}"
+#~ msgstr "[{author}]({author_url}) importó interwiki{comment}"
+
+#, python-brace-format
+#~ msgid "[{author}]({author_url}) restored a wiki *{wiki_name}* ({comment})"
+#~ msgstr "[{author}]({author_url}) restauró un wiki *{wiki_name}* ({comment})"
+
+#, python-brace-format
+#~ msgid ""
+#~ "Unknown event `{event}` by [{author}]({author_url}), report it on the "
+#~ "[support server](<{support}>)."
+#~ msgstr ""
+#~ "Evento desconocido `{event}` por [{author}]({author_url}), repórtalo en "
+#~ "el [servidor de soporte](<{support}>)."
+
+#, fuzzy
+#~ msgid "No description provided"
+#~ msgstr ""
+#~ "#-#-#-#-# rcgcdw.po (RcGcDw) #-#-#-#-#\n"
+#~ "No se proporcionó descripción\n"
+#~ "#-#-#-#-# formatters.po (RcGcDw) #-#-#-#-#\n"
+#~ "No se proporcionó una descripción"
+
+#~ msgid "unknown expiry time"
+#~ msgstr "tiempo de caducidad desconocido"
+
+#, python-brace-format
+#~ msgid "Groups changed from {old_groups} to {new_groups}{reason}"
+#~ msgstr "Los grupos cambiaron de {old_groups} a {new_groups}{reason}"
+
+#~ msgid "Imported interwiki"
+#~ msgstr "Importó interwiki"
+
+#, python-brace-format
+#~ msgid "Restored a \"{wiki}\" wiki"
+#~ msgstr "Restauró un wiki \"{wiki}\""
+
+#, python-brace-format
+#~ msgid "Unknown event `{event}`"
+#~ msgstr "Evento desconocido `{event}`"
+
+#, fuzzy
+#~ msgid "Report this on the support server"
+#~ msgstr ""
+#~ "#-#-#-#-# rcgcdw.po (RcGcDw) #-#-#-#-#\n"
+#~ "Reportar esto en el servidor de soporte\n"
+#~ "#-#-#-#-# formatters.po (RcGcDw) #-#-#-#-#\n"
+#~ "Reporta esto en el servidor de soporte"
diff --git a/locale/es/LC_MESSAGES/misc.po b/locale/es/LC_MESSAGES/misc.po
index 0651905..360648c 100644
--- a/locale/es/LC_MESSAGES/misc.po
+++ b/locale/es/LC_MESSAGES/misc.po
@@ -7,11 +7,11 @@ msgid ""
msgstr ""
"Project-Id-Version: RcGcDw\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2020-11-18 14:13+0100\n"
+"POT-Creation-Date: 2021-07-11 14:32+0200\n"
"PO-Revision-Date: 2020-11-28 22:44+0000\n"
"Last-Translator: Tamara Carvallo \n"
-"Language-Team: Spanish "
-"\n"
+"Language-Team: Spanish \n"
"Language: es\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -71,7 +71,7 @@ msgstr "ID de Discord"
msgid "Battle.net handle"
msgstr "Cuenta en Battle.net"
-#: src/misc.py:114
+#: src/misc.py:139
msgid ""
"\n"
"__And more__"
@@ -79,10 +79,10 @@ msgstr ""
"\n"
"__Y más__"
-#: src/misc.py:271
+#: src/misc.py:328
msgid "Unknown"
msgstr "Desconocido"
-#: src/misc.py:273
+#: src/misc.py:330
msgid "unknown"
msgstr "desconocido"
diff --git a/locale/es/LC_MESSAGES/rc.po b/locale/es/LC_MESSAGES/rc.po
index ebfdcb9..b52ab93 100644
--- a/locale/es/LC_MESSAGES/rc.po
+++ b/locale/es/LC_MESSAGES/rc.po
@@ -7,11 +7,11 @@ msgid ""
msgstr ""
"Project-Id-Version: RcGcDw\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2020-11-18 14:13+0100\n"
+"POT-Creation-Date: 2021-04-14 16:24+0200\n"
"PO-Revision-Date: 2020-12-06 14:17+0000\n"
"Last-Translator: Tamara Carvallo \n"
-"Language-Team: Spanish "
-"\n"
+"Language-Team: Spanish \n"
"Language: es\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -19,24 +19,24 @@ msgstr ""
"Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Generator: Weblate 4.2.1\n"
-#: src/rc.py:319
+#: src/rc.py:322
#, python-brace-format
msgid "{wiki} seems to be down or unreachable."
msgstr "{wiki} parece estar caído o no alcanzable."
-#: src/rc.py:320 src/rc.py:332
+#: src/rc.py:323 src/rc.py:335
msgid "Connection status"
msgstr "Estado de la conexión"
-#: src/rc.py:330
+#: src/rc.py:333
#, python-brace-format
msgid "Connection to {wiki} seems to be stable now."
msgstr "La conexión a {wiki} parece estar estable ahora."
-#: src/rc.py:401
+#: src/rc.py:404
msgid "~~hidden~~"
msgstr "~~oculto~~"
-#: src/rc.py:405
+#: src/rc.py:408
msgid "hidden"
msgstr "oculto"
diff --git a/locale/es/LC_MESSAGES/rc_formatters.mo b/locale/es/LC_MESSAGES/rc_formatters.mo
deleted file mode 100644
index d25e423..0000000
Binary files a/locale/es/LC_MESSAGES/rc_formatters.mo and /dev/null differ
diff --git a/locale/es/LC_MESSAGES/rcgcdw.po b/locale/es/LC_MESSAGES/rcgcdw.po
index e25bbf0..09b0718 100644
--- a/locale/es/LC_MESSAGES/rcgcdw.po
+++ b/locale/es/LC_MESSAGES/rcgcdw.po
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: RcGcDw\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2020-11-18 14:13+0100\n"
+"POT-Creation-Date: 2021-07-11 14:32+0200\n"
"PO-Revision-Date: 2021-01-22 13:58+0000\n"
"Last-Translator: Tamara Carvallo \n"
"Language-Team: Spanish )."
-msgstr ""
-"Evento desconocido `{event}` por [{author}]({author_url}), repórtalo en el ["
-"servidor de soporte](<{support}>)."
-
-#: src/rc_formatters.py:488
-#, python-brace-format
-msgid "{user} triggered \"{abuse_filter}\""
-msgstr "{user} activó \"{abuse_filter}\""
-
-#: src/rc_formatters.py:489
-msgid "Performed"
-msgstr "Realizó"
-
-#: src/rc_formatters.py:490
-msgid "Action taken"
-msgstr "Acción tomada"
-
-#: src/rc_formatters.py:491
-msgid "Title"
-msgstr "Título"
-
-#: src/rc_formatters.py:500 src/rc_formatters.py:768
+#: src/rcgcdw.py:225
msgid "No description provided"
msgstr "No se proporcionó descripción"
-#: src/rc_formatters.py:524
-msgid "(N!) "
-msgstr "(N!) "
-
-#: src/rc_formatters.py:525
-msgid "m"
-msgstr "m"
-
-#: src/rc_formatters.py:525
-msgid "b"
-msgstr "b"
-
-#: src/rc_formatters.py:542 src/rc_formatters.py:547
-msgid "__Only whitespace__"
-msgstr "__Sólo espacios en blanco__"
-
-#: src/rc_formatters.py:552
-msgid "Removed"
-msgstr "Eliminado"
-
-#: src/rc_formatters.py:554
-msgid "Added"
-msgstr "Agregado"
-
-#: src/rc_formatters.py:588 src/rc_formatters.py:627
-msgid "Options"
-msgstr "Opciones"
-
-#: src/rc_formatters.py:588
-#, python-brace-format
-msgid "([preview]({link}) | [undo]({undolink}))"
-msgstr "([vista previa]({link}) | [deshacer]({undolink}))"
-
-#: src/rc_formatters.py:593
-#, python-brace-format
-msgid "Uploaded a new version of {name}"
-msgstr "Subió una nueva versión de {name}"
-
-#: src/rc_formatters.py:595
-#, python-brace-format
-msgid "Reverted a version of {name}"
-msgstr "Revirtió una versión de {name}"
-
-#: src/rc_formatters.py:597
-#, python-brace-format
-msgid "Uploaded {name}"
-msgstr "Subió {name}"
-
-#: src/rc_formatters.py:613
-msgid "**No license!**"
-msgstr "**¡Sin licencia!**"
-
-#: src/rc_formatters.py:625
-msgid ""
-"\n"
-"License: {}"
+#: src/rcgcdw.py:228
+msgid "hidden"
msgstr ""
-"\n"
-"Licencia: {}"
-#: src/rc_formatters.py:627
+#~ msgid "None"
+#~ msgstr "Ninguno"
+
+#~ msgid "Warning issued"
+#~ msgstr "Advertencia emitida"
+
+#~ msgid "**Blocked user**"
+#~ msgstr "**Usuario bloqueado**"
+
+#~ msgid "Tagged the edit"
+#~ msgstr "Etiqueto la edición"
+
+#~ msgid "Disallowed the action"
+#~ msgstr "Anuló la acción"
+
+#~ msgid "**IP range blocked**"
+#~ msgstr "**Rango de IP bloqueado**"
+
+#~ msgid "Removed autoconfirmed group"
+#~ msgstr "Eliminó el grupo autoconfirmado"
+
+#~ msgid "**Removed from privileged groups**"
+#~ msgstr "**Eliminado de los grupos privilegiados**"
+
+#~ msgid "Edit"
+#~ msgstr "Edición"
+
+#~ msgid "Upload"
+#~ msgstr "Carga"
+
+#~ msgid "Move"
+#~ msgstr "Traslado"
+
+#~ msgid "Stash upload"
+#~ msgstr "Carga de archivos"
+
+#~ msgid "Deletion"
+#~ msgstr "Borrado"
+
+#~ msgid "Account creation"
+#~ msgstr "Creación de cuenta"
+
+#~ msgid "Auto account creation"
+#~ msgstr "Creación de cuenta automática"
+
+#~ msgid "Unregistered user"
+#~ msgstr "Usuario no registrado"
+
#, python-brace-format
-msgid "([preview]({link}))"
-msgstr "([vista previa]({link}))"
+#~ msgid ""
+#~ "[{author}]({author_url}) triggered *{abuse_filter}*, performing the "
+#~ "action \"{action}\" on *[{target}]({target_url})* - action taken: "
+#~ "{result}."
+#~ msgstr ""
+#~ "[{author}]({author_url}) activó *{abuse_filter}*, realizando la acción "
+#~ "\"{action}\" en *[{target}]({target_url})* - acción tomada: {result}."
+
+#~ msgid "Unknown"
+#~ msgstr "Desconocido"
-#: src/rc_formatters.py:632
#, python-brace-format
-msgid "Deleted page {article}"
-msgstr "Eliminó la página {article}"
+#~ msgid ""
+#~ "[{author}]({author_url}) edited [{article}]({edit_link}){comment} ({bold}"
+#~ "{sign}{edit_size}{bold})"
+#~ msgstr ""
+#~ "[{author}]({author_url}) editó [{article}]({edit_link}){comment} ({bold}"
+#~ "{sign}{edit_size}{bold})"
-#: src/rc_formatters.py:637
#, python-brace-format
-msgid "Deleted redirect {article} by overwriting"
-msgstr "Eliminó la redirección {article} sobrescribiendola"
+#~ msgid ""
+#~ "[{author}]({author_url}) created [{article}]({edit_link}){comment} ({bold}"
+#~ "{sign}{edit_size}{bold})"
+#~ msgstr ""
+#~ "[{author}]({author_url}) creó [{article}]({edit_link}){comment} ({bold}"
+#~ "{sign}{edit_size}{bold})"
-#: src/rc_formatters.py:643
-msgid "No redirect has been made"
-msgstr "No se ha creado una redirección"
-
-#: src/rc_formatters.py:644
-msgid "A redirect has been made"
-msgstr "Se ha creado una redirección"
-
-#: src/rc_formatters.py:645
#, python-brace-format
-msgid "Moved {redirect}{article} to {target}"
-msgstr "Movió {redirect}{article} a {target}"
+#~ msgid "[{author}]({author_url}) uploaded [{file}]({file_link}){comment}"
+#~ msgstr "[{author}]({author_url}) subió [{file}]({file_link}){comment}"
-#: src/rc_formatters.py:648
#, python-brace-format
-msgid "Moved {redirect}{article} to {title} over redirect"
-msgstr "Movió {redirect}{article} a {title} sobre la redirección"
+#~ msgid ""
+#~ "[{author}]({author_url}) reverted a version of [{file}]({file_link})"
+#~ "{comment}"
+#~ msgstr ""
+#~ "[{author}]({author_url}) revirtió una versión de [{file}]({file_link})"
+#~ "{comment}"
-#: src/rc_formatters.py:652
#, python-brace-format
-msgid "Moved protection settings from {redirect}{article} to {title}"
-msgstr "Movió la configuración de protección de {redirect}{article} a {title}"
+#~ msgid ""
+#~ "[{author}]({author_url}) uploaded a new version of [{file}]({file_link})"
+#~ "{comment}"
+#~ msgstr ""
+#~ "[{author}]({author_url}) subió una nueva versión de [{file}]({file_link})"
+#~ "{comment}"
-#: src/rc_formatters.py:676
-msgid "unknown expiry time"
-msgstr "tiempo de caducidad desconocido"
-
-#: src/rc_formatters.py:680
-msgid "Blocked from editing the following pages: "
-msgstr "Bloqueado de editar las siguientes páginas: "
-
-#: src/rc_formatters.py:689
-msgid "Blocked from editing pages on following namespaces: "
-msgstr "Bloqueado de editar páginas en los siguientes espacios de nombres: "
-
-#: src/rc_formatters.py:700
-msgid "Partial block details"
-msgstr "Detalles del bloqueo parcial"
-
-#: src/rc_formatters.py:701
#, python-brace-format
-msgid "Blocked {blocked_user} {time}"
-msgstr "Bloqueó a {blocked_user} {time}"
+#~ msgid "[{author}]({author_url}) deleted [{page}]({page_link}){comment}"
+#~ msgstr "[{author}]({author_url}) eliminó [{page}]({page_link}){comment}"
-#: src/rc_formatters.py:705
#, python-brace-format
-msgid "Changed block settings for {blocked_user}"
-msgstr "Modificó la configuración de bloqueo de {blocked_user}"
+#~ msgid ""
+#~ "[{author}]({author_url}) deleted redirect by overwriting [{page}]"
+#~ "({page_link}){comment}"
+#~ msgstr ""
+#~ "[{author}]({author_url}) eliminó la redirección al sobrescribir [{page}]"
+#~ "({page_link}){comment}"
+
+#~ msgid "without making a redirect"
+#~ msgstr "sin crear una redirección"
+
+#~ msgid "with a redirect"
+#~ msgstr "con una redirección"
-#: src/rc_formatters.py:709
#, python-brace-format
-msgid "Unblocked {blocked_user}"
-msgstr "Desbloqueó a {blocked_user}"
+#~ msgid ""
+#~ "[{author}]({author_url}) moved {redirect}*{article}* to [{target}]"
+#~ "({target_url}) {made_a_redirect}{comment}"
+#~ msgstr ""
+#~ "[{author}]({author_url}) movió {redirect}*{article}* a [{target}]"
+#~ "({target_url}) {made_a_redirect}{comment}"
-#: src/rc_formatters.py:714
#, python-brace-format
-msgid "Left a comment on {target}'s profile"
-msgstr "Dejó un comentario en el perfil de {target}"
+#~ msgid ""
+#~ "[{author}]({author_url}) moved {redirect}*{article}* over redirect to "
+#~ "[{target}]({target_url}) {made_a_redirect}{comment}"
+#~ msgstr ""
+#~ "[{author}]({author_url}) movió {redirect}*{article}* sobre la redirección "
+#~ "a [{target}]({target_url}) {made_a_redirect}{comment}"
-#: src/rc_formatters.py:716
-msgid "Left a comment on their own profile"
-msgstr "Dejó un comentario en su propio perfil"
-
-#: src/rc_formatters.py:721
#, python-brace-format
-msgid "Replied to a comment on {target}'s profile"
-msgstr "Respondió a un comentario en el perfil de {target}"
+#~ msgid ""
+#~ "[{author}]({author_url}) moved protection settings from {redirect}"
+#~ "*{article}* to [{target}]({target_url}){comment}"
+#~ msgstr ""
+#~ "[{author}]({author_url}) movió la configuración de protección de "
+#~ "{redirect}*{article}* a [{target}]({target_url}){comment}"
-#: src/rc_formatters.py:723
-msgid "Replied to a comment on their own profile"
-msgstr "Respondió a un comentario en su propio perfil"
+#~ msgid "for infinity and beyond"
+#~ msgstr "hasta el fin de nuestros días"
-#: src/rc_formatters.py:728
#, python-brace-format
-msgid "Edited a comment on {target}'s profile"
-msgstr "Editó un comentario en el perfil de {target}"
+#~ msgid "for {num} {translated_length}"
+#~ msgstr "por {num}{translated_length}"
-#: src/rc_formatters.py:730
-msgid "Edited a comment on their own profile"
-msgstr "Editó un comentario en su propio perfil"
+#~ msgid "until {}"
+#~ msgstr "hasta {}"
+
+#~ msgid " on pages: "
+#~ msgstr " en las páginas: "
+
+#~ msgid " and namespaces: "
+#~ msgstr " y los espacios de nombres: "
+
+#~ msgid " on namespaces: "
+#~ msgstr " en los espacios de nombres: "
-#: src/rc_formatters.py:733
#, python-brace-format
-msgid "Edited {target}'s profile"
-msgstr "Editó el perfil de {target}"
+#~ msgid ""
+#~ "[{author}]({author_url}) blocked [{user}]({user_url}) {time}"
+#~ "{restriction_desc}{comment}"
+#~ msgstr ""
+#~ "[{author}]({author_url}) bloqueó [{user}]({user_url}) {time}"
+#~ "{restriction_desc}{comment}"
-#: src/rc_formatters.py:733
-msgid "Edited their own profile"
-msgstr "Editó su propio perfil"
-
-#: src/rc_formatters.py:735
#, python-brace-format
-msgid "Cleared the {field} field"
-msgstr "Borró el campo {field}"
+#~ msgid ""
+#~ "[{author}]({author_url}) changed block settings for [{blocked_user}]"
+#~ "({user_url}){comment}"
+#~ msgstr ""
+#~ "[{author}]({author_url}) cambió la configuración de bloqueo de "
+#~ "[{blocked_user}]({user_url}){comment}"
-#: src/rc_formatters.py:737
#, python-brace-format
-msgid "{field} field changed to: {desc}"
-msgstr "El campo {field} cambió a: {desc}"
+#~ msgid ""
+#~ "[{author}]({author_url}) unblocked [{blocked_user}]({user_url}){comment}"
+#~ msgstr ""
+#~ "[{author}]({author_url}) desbloqueó [{blocked_user}]({user_url}){comment}"
-#: src/rc_formatters.py:740
#, python-brace-format
-msgid "Purged a comment on {target}'s profile"
-msgstr "Borró un comentario en el perfil de {target}"
+#~ msgid ""
+#~ "[{author}]({author_url}) left a [comment]({comment}) on {target}'s profile"
+#~ msgstr ""
+#~ "[{author}]({author_url}) dejó un [comentario]({comment}) en el perfil de "
+#~ "{target}"
-#: src/rc_formatters.py:746
#, python-brace-format
-msgid "Deleted a comment on {target}'s profile"
-msgstr "Eliminó un comentario en el perfil de {target}"
+#~ msgid ""
+#~ "[{author}]({author_url}) left a [comment]({comment}) on their own profile"
+#~ msgstr ""
+#~ "[{author}]({author_url}) dejó un [comentario]({comment}) en su propio "
+#~ "perfil"
-#: src/rc_formatters.py:750
#, python-brace-format
-msgid "Changed group membership for {target}"
-msgstr "Cambió la membresía del grupo para {target}"
+#~ msgid ""
+#~ "[{author}]({author_url}) replied to a [comment]({comment}) on {target}'s "
+#~ "profile"
+#~ msgstr ""
+#~ "[{author}]({author_url}) respondió a un [comentario]({comment}) en el "
+#~ "perfil de {target}"
-#: src/rc_formatters.py:754
#, python-brace-format
-msgid "{target} got autopromoted to a new usergroup"
-msgstr "{target} obtuvo una promoción automática a un nuevo grupo de usuarios"
+#~ msgid ""
+#~ "[{author}]({author_url}) replied to a [comment]({comment}) on their own "
+#~ "profile"
+#~ msgstr ""
+#~ "[{author}]({author_url}) respondió a un [comentario]({comment}) en su "
+#~ "propio perfil"
-#: src/rc_formatters.py:769
#, python-brace-format
-msgid "Groups changed from {old_groups} to {new_groups}{reason}"
-msgstr "Los grupos cambiaron de {old_groups} a {new_groups}{reason}"
+#~ msgid ""
+#~ "[{author}]({author_url}) edited a [comment]({comment}) on {target}'s "
+#~ "profile"
+#~ msgstr ""
+#~ "[{author}]({author_url}) editó un [comentario]({comment}) en el perfil de "
+#~ "{target}"
-#: src/rc_formatters.py:773
#, python-brace-format
-msgid "Protected {target}"
-msgstr "Protegió a {target}"
+#~ msgid ""
+#~ "[{author}]({author_url}) edited a [comment]({comment}) on their own "
+#~ "profile"
+#~ msgstr ""
+#~ "[{author}]({author_url}) editó un [comentario]({comment}) en su propio "
+#~ "perfil"
-#: src/rc_formatters.py:779
#, python-brace-format
-msgid "Changed protection level for {article}"
-msgstr "Cambió el nivel de protección de {article}"
+#~ msgid "[{author}]({author_url}) purged a comment on {target}'s profile"
+#~ msgstr ""
+#~ "[{author}]({author_url}) borró un comentario en el perfil de {target}"
-#: src/rc_formatters.py:785
#, python-brace-format
-msgid "Removed protection from {article}"
-msgstr "Quitó la protección de {article}"
+#~ msgid "[{author}]({author_url}) purged a comment on their own profile"
+#~ msgstr "[{author}]({author_url}) borró un comentario en su propio perfil"
-#: src/rc_formatters.py:789
#, python-brace-format
-msgid "Changed visibility of revision on page {article} "
-msgid_plural "Changed visibility of {amount} revisions on page {article} "
-msgstr[0] "Modificó la visibilidad de la revisión en la página {article} "
-msgstr[1] "Modificó la visibilidad de {amount} revisiones en la página {article} "
+#~ msgid "[{author}]({author_url}) deleted a comment on {target}'s profile"
+#~ msgstr ""
+#~ "[{author}]({author_url}) eliminó un comentario en el perfil de {target}"
-#: src/rc_formatters.py:801
#, python-brace-format
-msgid "Imported {article} with {count} revision"
-msgid_plural "Imported {article} with {count} revisions"
-msgstr[0] "Importó {article} con {count} revisión"
-msgstr[1] "Importó {article} con {count} revisiones"
+#~ msgid "[{author}]({author_url}) deleted a comment on their own profile"
+#~ msgstr "[{author}]({author_url}) eliminó un comentario en su propio perfil"
-#: src/rc_formatters.py:806
#, python-brace-format
-msgid "Restored {article}"
-msgstr "Restauró {article}"
+#~ msgid ""
+#~ "[{author}]({author_url}) edited the {field} on {target}'s profile. "
+#~ "*({desc})*"
+#~ msgstr ""
+#~ "[{author}]({author_url}) editó el {field} en el perfil de {target}. "
+#~ "*({desc})*"
-#: src/rc_formatters.py:809
-msgid "Changed visibility of log events"
-msgstr "Cambió la visibilidad del registro de eventos"
-
-#: src/rc_formatters.py:819
-msgid "Imported interwiki"
-msgstr "Importó interwiki"
-
-#: src/rc_formatters.py:822
#, python-brace-format
-msgid "Edited abuse filter number {number}"
-msgstr "Editó el número de filtro de abuso {number}"
+#~ msgid ""
+#~ "[{author}]({author_url}) edited the {field} on their own profile. "
+#~ "*({desc})*"
+#~ msgstr ""
+#~ "[{author}]({author_url}) editó el {field} en su propio perfil. *({desc})*"
+
+#~ msgid "none"
+#~ msgstr "ninguno"
-#: src/rc_formatters.py:825
#, python-brace-format
-msgid "Created abuse filter number {number}"
-msgstr "Creó el filtro de abuso número {number}"
+#~ msgid ""
+#~ "[{author}]({author_url}) changed group membership for [{target}]"
+#~ "({target_url}) from {old_groups} to {new_groups}{comment}"
+#~ msgstr ""
+#~ "[{author}]({author_url}) cambió la pertenencia al grupo de [{target}]"
+#~ "({target_url}) de {old_groups} a {new_groups}{comment}"
-#: src/rc_formatters.py:828
#, python-brace-format
-msgid "Merged revision histories of {article} into {dest}"
-msgstr "Fusionó los historiales de revisión de {article} en {dest}"
+#~ msgid ""
+#~ "{author} autopromoted [{target}]({target_url}) from {old_groups} to "
+#~ "{new_groups}{comment}"
+#~ msgstr ""
+#~ "{author} promovió automáticamente a [{target}]({target_url}) de "
+#~ "{old_groups} a {new_groups}{comment}"
-#: src/rc_formatters.py:832
-msgid "Created account automatically"
-msgstr "Creó la cuenta automáticamente"
+#~ msgid "System"
+#~ msgstr "Sistema"
-#: src/rc_formatters.py:835 src/rc_formatters.py:844
-msgid "Created account"
-msgstr "Creó la cuenta"
-
-#: src/rc_formatters.py:838
#, python-brace-format
-msgid "Created account {article}"
-msgstr "Creó la cuenta {article}"
+#~ msgid ""
+#~ "[{author}]({author_url}) protected [{article}]({article_url}) with the "
+#~ "following settings: {settings}{comment}"
+#~ msgstr ""
+#~ "[{author}]({author_url}) protegió [{article}]({article_url}) con la "
+#~ "siguiente configuración: {settings}{comment}"
+
+#~ msgid " [cascading]"
+#~ msgstr " [en cascada]"
-#: src/rc_formatters.py:841
#, python-brace-format
-msgid "Created account {article} and password was sent by email"
-msgstr ""
-"Creó la cuenta {article} y la contraseña se envió por correo electrónico"
+#~ msgid ""
+#~ "[{author}]({author_url}) modified protection settings of [{article}]"
+#~ "({article_url}) to: {settings}{comment}"
+#~ msgstr ""
+#~ "[{author}]({author_url}) modificó la configuración de protección de "
+#~ "[{article}]({article_url}) a: {settings}{comment}"
-#: src/rc_formatters.py:847
-msgid "Added an entry to the interwiki table"
-msgstr "Agregó una entrada a la tabla interwiki"
-
-#: src/rc_formatters.py:848 src/rc_formatters.py:854
#, python-brace-format
-msgid "Prefix: {prefix}, website: {website} | {desc}"
-msgstr "Prefijo: {prefix}, sitio web: {website} | {desc}"
+#~ msgid ""
+#~ "[{author}]({author_url}) removed protection from [{article}]"
+#~ "({article_url}){comment}"
+#~ msgstr ""
+#~ "[{author}]({author_url}) eliminó la protección de [{article}]"
+#~ "({article_url}){comment}"
-#: src/rc_formatters.py:853
-msgid "Edited an entry in interwiki table"
-msgstr "Editó una entrada en la tabla de interwiki"
-
-#: src/rc_formatters.py:859
-msgid "Deleted an entry in interwiki table"
-msgstr "Eliminó una entrada en la tabla interwiki"
-
-#: src/rc_formatters.py:860
#, python-brace-format
-msgid "Prefix: {prefix} | {desc}"
-msgstr "Prefijo: {prefix} | {desc}"
+#~ msgid ""
+#~ "[{author}]({author_url}) changed visibility of revision on page "
+#~ "[{article}]({article_url}){comment}"
+#~ msgid_plural ""
+#~ "[{author}]({author_url}) changed visibility of {amount} revisions on page "
+#~ "[{article}]({article_url}){comment}"
+#~ msgstr[0] ""
+#~ "[{author}]({author_url}) cambió la visibilidad de la revisión en la "
+#~ "página [{article}]({article_url}){comment}"
+#~ msgstr[1] ""
+#~ "[{author}]({author_url}) cambió la visibilidad de {amount} revisiones en "
+#~ "la página [{article}]({article_url}){comment}"
-#: src/rc_formatters.py:863
#, python-brace-format
-msgid "Changed the content model of the page {article}"
-msgstr "Modificó el modelo de contenido de la página {article}"
+#~ msgid ""
+#~ "[{author}]({author_url}) imported [{article}]({article_url}) with {count} "
+#~ "revision{comment}"
+#~ msgid_plural ""
+#~ "[{author}]({author_url}) imported [{article}]({article_url}) with {count} "
+#~ "revisions{comment}"
+#~ msgstr[0] ""
+#~ "[{author}]({author_url}) importó [{article}]({article_url}) con {count} "
+#~ "revisión{comment}"
+#~ msgstr[1] ""
+#~ "[{author}]({author_url}) importó [{article}]({article_url}) con {count} "
+#~ "revisiones{comment}"
-#: src/rc_formatters.py:864
#, python-brace-format
-msgid "Model changed from {old} to {new}: {reason}"
-msgstr "El modelo cambió de {old} a {new}: {reason}"
+#~ msgid ""
+#~ "[{author}]({author_url}) restored [{article}]({article_url}){comment}"
+#~ msgstr ""
+#~ "[{author}]({author_url}) restauró [{article}]({article_url}){comment}"
-#: src/rc_formatters.py:869
#, python-brace-format
-msgid "Edited the sprite for {article}"
-msgstr "Editó el sprite de {article}"
+#~ msgid "[{author}]({author_url}) changed visibility of log events{comment}"
+#~ msgstr ""
+#~ "[{author}]({author_url}) cambió la visibilidad del registro de "
+#~ "eventos{comment}"
-#: src/rc_formatters.py:872
#, python-brace-format
-msgid "Created the sprite sheet for {article}"
-msgstr "Creó la hoja de sprites de {article}"
+#~ msgid "[{author}]({author_url}) imported interwiki{comment}"
+#~ msgstr "[{author}]({author_url}) importó interwiki{comment}"
-#: src/rc_formatters.py:875
#, python-brace-format
-msgid "Edited the slice for {article}"
-msgstr "Editó el sector de {article}"
+#~ msgid ""
+#~ "[{author}]({author_url}) edited abuse filter [number {number}]"
+#~ "({filter_url})"
+#~ msgstr ""
+#~ "[{author}]({author_url}) editó el filtro de abuso [número {number}]"
+#~ "({filter_url})"
-#: src/rc_formatters.py:881
#, python-brace-format
-msgid "Created the Cargo table \"{table}\""
-msgstr "Creó la tabla Cargo \"{table}\""
+#~ msgid ""
+#~ "[{author}]({author_url}) created abuse filter [number {number}]"
+#~ "({filter_url})"
+#~ msgstr ""
+#~ "[{author}]({author_url}) creó el filtro de abuso [número {number}]"
+#~ "({filter_url})"
-#: src/rc_formatters.py:885
#, python-brace-format
-msgid "Deleted the Cargo table \"{table}\""
-msgstr "Eliminó la tabla Cargo \"{table}\""
+#~ msgid ""
+#~ "[{author}]({author_url}) merged revision histories of [{article}]"
+#~ "({article_url}) into [{dest}]({dest_url}){comment}"
+#~ msgstr ""
+#~ "[{author}]({author_url}) fusionó los historiales de revisión de "
+#~ "[{article}]({article_url}) con [{dest}]({dest_url}){comment}"
-#: src/rc_formatters.py:892
#, python-brace-format
-msgid "Recreated the Cargo table \"{table}\""
-msgstr "Recreó la tabla Cargo \"{table}\""
+#~ msgid "Account [{author}]({author_url}) was created automatically"
+#~ msgstr "La cuenta [{author}]({author_url}) se creó automáticamente"
-#: src/rc_formatters.py:899
#, python-brace-format
-msgid "Replaced the Cargo table \"{table}\""
-msgstr "Reemplazó la tabla Cargo \"{table}\""
+#~ msgid "Account [{author}]({author_url}) was created"
+#~ msgstr "Se creó la cuenta [{author}]({author_url})"
-#: src/rc_formatters.py:903
#, python-brace-format
-msgid "Created a tag \"{tag}\""
-msgstr "Creó una etiqueta \"{tag}\""
+#~ msgid ""
+#~ "Account [{article}]({article_url}) was created by [{author}]({author_url})"
+#~ "{comment}"
+#~ msgstr ""
+#~ "La cuenta [{article}]({article_url}) fue creada por [{author}]"
+#~ "({author_url}){comment}"
-#: src/rc_formatters.py:907
#, python-brace-format
-msgid "Deleted a tag \"{tag}\""
-msgstr "Eliminó una etiqueta \"{tag}\""
+#~ msgid ""
+#~ "Account [{article}]({article_url}) was created by [{author}]"
+#~ "({author_url}) and password was sent by email{comment}"
+#~ msgstr ""
+#~ "La cuenta [{article}]({article_url}) fue creada por [{author}]"
+#~ "({author_url}) y la contraseña se envió por correo electrónico{comment}"
-#: src/rc_formatters.py:911
#, python-brace-format
-msgid "Activated a tag \"{tag}\""
-msgstr "Activó una etiqueta \"{tag}\""
+#~ msgid ""
+#~ "[{author}]({author_url}) added an entry to the [interwiki table]"
+#~ "({table_url}) pointing to {website} with {prefix} prefix"
+#~ msgstr ""
+#~ "[{author}]({author_url}) agregó una entrada a la [tabla interwiki]"
+#~ "({table_url}) que apunta a {website} con el prefijo {prefix}"
-#: src/rc_formatters.py:914
#, python-brace-format
-msgid "Deactivated a tag \"{tag}\""
-msgstr "Desactivó una etiqueta \"{tag}\""
+#~ msgid ""
+#~ "[{author}]({author_url}) edited an entry in [interwiki table]"
+#~ "({table_url}) pointing to {website} with {prefix} prefix"
+#~ msgstr ""
+#~ "[{author}]({author_url}) editó una entrada en la [tabla interwiki]"
+#~ "({table_url}) que apunta a {website} con el prefijo {prefix}"
-#: src/rc_formatters.py:917
-msgid "Changed wiki settings"
-msgstr "Cambió la configuración del wiki"
-
-#: src/rc_formatters.py:921
#, python-brace-format
-msgid "Deleted a \"{wiki}\" wiki"
-msgstr "Eliminó un wiki \"{wiki}\""
+#~ msgid ""
+#~ "[{author}]({author_url}) deleted an entry in [interwiki table]"
+#~ "({table_url})"
+#~ msgstr ""
+#~ "[{author}]({author_url}) eliminó una entrada en la [tabla interwiki]"
+#~ "({table_url})"
-#: src/rc_formatters.py:924
#, python-brace-format
-msgid "Locked a \"{wiki}\" wiki"
-msgstr "Protegió un wiki \"{wiki}\""
+#~ msgid ""
+#~ "[{author}]({author_url}) changed the content model of the page [{article}]"
+#~ "({article_url}) from {old} to {new}{comment}"
+#~ msgstr ""
+#~ "[{author}]({author_url}) cambió el modelo de contenido de la página "
+#~ "[{article}]({article_url}) de {old} a {new}{comment}"
-#: src/rc_formatters.py:927
#, python-brace-format
-msgid "Modified a \"{namespace_name}\" namespace"
-msgstr "Modificó un espacio de nombres \"{namespace_name}\""
+#~ msgid ""
+#~ "[{author}]({author_url}) edited the sprite for [{article}]({article_url})"
+#~ msgstr ""
+#~ "[{author}]({author_url}) editó el sprite de [{article}]({article_url})"
-#: src/rc_formatters.py:929 src/rc_formatters.py:934
-msgid "Wiki"
-msgstr "Wiki"
-
-#: src/rc_formatters.py:931
#, python-brace-format
-msgid "Deleted a \"{namespace_name}\" namespace"
-msgstr "Eliminó un espacio de nombres \"{namespace_name}\""
+#~ msgid ""
+#~ "[{author}]({author_url}) created the sprite sheet for [{article}]"
+#~ "({article_url})"
+#~ msgstr ""
+#~ "[{author}]({author_url}) creó la hoja de sprites de [{article}]"
+#~ "({article_url})"
-#: src/rc_formatters.py:936
#, python-brace-format
-msgid "Modified \"{usergroup_name}\" usergroup"
-msgstr "Modificó el grupo de usuarios \"{usergroup_name}\""
+#~ msgid ""
+#~ "[{author}]({author_url}) edited the slice for [{article}]({article_url})"
+#~ msgstr ""
+#~ "[{author}]({author_url}) editó el sector de [{article}]({article_url})"
-#: src/rc_formatters.py:939
#, python-brace-format
-msgid "Restored a \"{wiki}\" wiki"
-msgstr "Restauró un wiki \"{wiki}\""
+#~ msgid "[{author}]({author_url}) created the Cargo table \"{table}\""
+#~ msgstr "[{author}]({author_url}) creó la tabla Cargo \"{table}\""
-#: src/rc_formatters.py:942
#, python-brace-format
-msgid "Unlocked a \"{wiki}\" wiki"
-msgstr "Desbloqueó un wiki \"{wiki}\""
+#~ msgid "[{author}]({author_url}) deleted the Cargo table \"{table}\""
+#~ msgstr "[{author}]({author_url}) eliminó la tabla Cargo \"{table}\""
-#: src/rc_formatters.py:946
-msgid "Action has been hidden by administration"
-msgstr "La administración ha ocultado la acción"
-
-#: src/rc_formatters.py:951
#, python-brace-format
-msgid "Unknown event `{event}`"
-msgstr "Evento desconocido `{event}`"
+#~ msgid "[{author}]({author_url}) recreated the Cargo table \"{table}\""
+#~ msgstr "[{author}]({author_url}) recreó la tabla Cargo \"{table}\""
-#: src/rc_formatters.py:957 src/rc_formatters.py:959
-msgid "Report this on the support server"
-msgstr "Reportar esto en el servidor de soporte"
+#, python-brace-format
+#~ msgid "[{author}]({author_url}) replaced the Cargo table \"{table}\""
+#~ msgstr "[{author}]({author_url}) reemplazó la tabla Cargo \"{table}\""
-#: src/rc_formatters.py:976
-msgid "Tags"
-msgstr "Etiquetas"
+#, python-brace-format
+#~ msgid "[{author}]({author_url}) created a [tag]({tag_url}) \"{tag}\""
+#~ msgstr "[{author}]({author_url}) creó una [etiqueta]({tag_url}) \"{tag}\""
-#: src/rc_formatters.py:979
-msgid "**Added**: "
-msgstr "**Añadió**: "
+#, python-brace-format
+#~ msgid "[{author}]({author_url}) deleted a [tag]({tag_url}) \"{tag}\""
+#~ msgstr ""
+#~ "[{author}]({author_url}) eliminó una [etiqueta]({tag_url}) \"{tag}\""
-#: src/rc_formatters.py:979
-msgid " and {} more\n"
-msgstr " y {} más\n"
+#, python-brace-format
+#~ msgid "[{author}]({author_url}) activated a [tag]({tag_url}) \"{tag}\""
+#~ msgstr "[{author}]({author_url}) activó una [etiqueta]({tag_url}) \"{tag}\""
-#: src/rc_formatters.py:980
-msgid "**Removed**: "
-msgstr "**Eliminó**: "
+#, python-brace-format
+#~ msgid "[{author}]({author_url}) deactivated a [tag]({tag_url}) \"{tag}\""
+#~ msgstr ""
+#~ "[{author}]({author_url}) desactivó una [etiqueta]({tag_url}) \"{tag}\""
-#: src/rc_formatters.py:980
-msgid " and {} more"
-msgstr " y {} más"
+#, python-brace-format
+#~ msgid "[{author}]({author_url}) changed wiki settings ({reason})"
+#~ msgstr ""
+#~ "[{author}]({author_url}) cambió la configuración del wiki ({reason})"
-#: src/rc_formatters.py:981
-msgid "Changed categories"
-msgstr "Cambió de categorías"
+#, python-brace-format
+#~ msgid "[{author}]({author_url}) deleted a wiki *{wiki_name}* ({comment})"
+#~ msgstr "[{author}]({author_url}) eliminó un wiki *{wiki_name}* ({comment})"
+
+#, python-brace-format
+#~ msgid "[{author}]({author_url}) locked a wiki *{wiki_name}* ({comment})"
+#~ msgstr "[{author}]({author_url}) protegió un wiki *{wiki_name}* ({comment})"
+
+#, python-brace-format
+#~ msgid ""
+#~ "[{author}]({author_url}) modified a namespace *{namespace_name}* on "
+#~ "*{wiki_name}* ({comment})"
+#~ msgstr ""
+#~ "[{author}]({author_url}) modificó un espacio de nombres *{namespace_name}"
+#~ "* en *{wiki_name}* ({comment})"
+
+#, python-brace-format
+#~ msgid ""
+#~ "[{author}]({author_url}) deleted a namespace *{namespace_name}* on "
+#~ "*{wiki_name}* ({comment})"
+#~ msgstr ""
+#~ "[{author}]({author_url}) eliminó un espacio de nombres *{namespace_name}* "
+#~ "en *{wiki_name}* ({comment})"
+
+#, python-brace-format
+#~ msgid ""
+#~ "[{author}]({author_url}) modified user group *{group_name}* ({comment})"
+#~ msgstr ""
+#~ "[{author}]({author_url}) modificó el grupo de usuarios *{group_name}* "
+#~ "({comment})"
+
+#, python-brace-format
+#~ msgid "[{author}]({author_url}) restored a wiki *{wiki_name}* ({comment})"
+#~ msgstr "[{author}]({author_url}) restauró un wiki *{wiki_name}* ({comment})"
+
+#, python-brace-format
+#~ msgid "[{author}]({author_url}) unlocked a wiki *{wiki_name}* ({comment})"
+#~ msgstr ""
+#~ "[{author}]({author_url}) desprotegió un wiki *{wiki_name}* ({comment})"
+
+#~ msgid "An action has been hidden by administration."
+#~ msgstr "La administración ha ocultado una acción."
+
+#, python-brace-format
+#~ msgid ""
+#~ "Unknown event `{event}` by [{author}]({author_url}), report it on the "
+#~ "[support server](<{support}>)."
+#~ msgstr ""
+#~ "Evento desconocido `{event}` por [{author}]({author_url}), repórtalo en "
+#~ "el [servidor de soporte](<{support}>)."
+
+#, python-brace-format
+#~ msgid "{user} triggered \"{abuse_filter}\""
+#~ msgstr "{user} activó \"{abuse_filter}\""
+
+#~ msgid "Performed"
+#~ msgstr "Realizó"
+
+#~ msgid "Action taken"
+#~ msgstr "Acción tomada"
+
+#~ msgid "Title"
+#~ msgstr "Título"
+
+#~ msgid "(N!) "
+#~ msgstr "(N!) "
+
+#~ msgid "m"
+#~ msgstr "m"
+
+#~ msgid "b"
+#~ msgstr "b"
+
+#~ msgid "__Only whitespace__"
+#~ msgstr "__Sólo espacios en blanco__"
+
+#~ msgid "Removed"
+#~ msgstr "Eliminado"
+
+#~ msgid "Added"
+#~ msgstr "Agregado"
+
+#~ msgid "Options"
+#~ msgstr "Opciones"
+
+#, python-brace-format
+#~ msgid "([preview]({link}) | [undo]({undolink}))"
+#~ msgstr "([vista previa]({link}) | [deshacer]({undolink}))"
+
+#, python-brace-format
+#~ msgid "Uploaded a new version of {name}"
+#~ msgstr "Subió una nueva versión de {name}"
+
+#, python-brace-format
+#~ msgid "Reverted a version of {name}"
+#~ msgstr "Revirtió una versión de {name}"
+
+#, python-brace-format
+#~ msgid "Uploaded {name}"
+#~ msgstr "Subió {name}"
+
+#~ msgid "**No license!**"
+#~ msgstr "**¡Sin licencia!**"
+
+#~ msgid ""
+#~ "\n"
+#~ "License: {}"
+#~ msgstr ""
+#~ "\n"
+#~ "Licencia: {}"
+
+#, python-brace-format
+#~ msgid "([preview]({link}))"
+#~ msgstr "([vista previa]({link}))"
+
+#, python-brace-format
+#~ msgid "Deleted page {article}"
+#~ msgstr "Eliminó la página {article}"
+
+#, python-brace-format
+#~ msgid "Deleted redirect {article} by overwriting"
+#~ msgstr "Eliminó la redirección {article} sobrescribiendola"
+
+#~ msgid "No redirect has been made"
+#~ msgstr "No se ha creado una redirección"
+
+#~ msgid "A redirect has been made"
+#~ msgstr "Se ha creado una redirección"
+
+#, python-brace-format
+#~ msgid "Moved {redirect}{article} to {target}"
+#~ msgstr "Movió {redirect}{article} a {target}"
+
+#, python-brace-format
+#~ msgid "Moved {redirect}{article} to {title} over redirect"
+#~ msgstr "Movió {redirect}{article} a {title} sobre la redirección"
+
+#, python-brace-format
+#~ msgid "Moved protection settings from {redirect}{article} to {title}"
+#~ msgstr ""
+#~ "Movió la configuración de protección de {redirect}{article} a {title}"
+
+#~ msgid "unknown expiry time"
+#~ msgstr "tiempo de caducidad desconocido"
+
+#~ msgid "Blocked from editing the following pages: "
+#~ msgstr "Bloqueado de editar las siguientes páginas: "
+
+#~ msgid "Blocked from editing pages on following namespaces: "
+#~ msgstr "Bloqueado de editar páginas en los siguientes espacios de nombres: "
+
+#~ msgid "Partial block details"
+#~ msgstr "Detalles del bloqueo parcial"
+
+#, python-brace-format
+#~ msgid "Blocked {blocked_user} {time}"
+#~ msgstr "Bloqueó a {blocked_user} {time}"
+
+#, python-brace-format
+#~ msgid "Changed block settings for {blocked_user}"
+#~ msgstr "Modificó la configuración de bloqueo de {blocked_user}"
+
+#, python-brace-format
+#~ msgid "Unblocked {blocked_user}"
+#~ msgstr "Desbloqueó a {blocked_user}"
+
+#, python-brace-format
+#~ msgid "Left a comment on {target}'s profile"
+#~ msgstr "Dejó un comentario en el perfil de {target}"
+
+#~ msgid "Left a comment on their own profile"
+#~ msgstr "Dejó un comentario en su propio perfil"
+
+#, python-brace-format
+#~ msgid "Replied to a comment on {target}'s profile"
+#~ msgstr "Respondió a un comentario en el perfil de {target}"
+
+#~ msgid "Replied to a comment on their own profile"
+#~ msgstr "Respondió a un comentario en su propio perfil"
+
+#, python-brace-format
+#~ msgid "Edited a comment on {target}'s profile"
+#~ msgstr "Editó un comentario en el perfil de {target}"
+
+#~ msgid "Edited a comment on their own profile"
+#~ msgstr "Editó un comentario en su propio perfil"
+
+#, python-brace-format
+#~ msgid "Edited {target}'s profile"
+#~ msgstr "Editó el perfil de {target}"
+
+#~ msgid "Edited their own profile"
+#~ msgstr "Editó su propio perfil"
+
+#, python-brace-format
+#~ msgid "Cleared the {field} field"
+#~ msgstr "Borró el campo {field}"
+
+#, python-brace-format
+#~ msgid "{field} field changed to: {desc}"
+#~ msgstr "El campo {field} cambió a: {desc}"
+
+#, python-brace-format
+#~ msgid "Purged a comment on {target}'s profile"
+#~ msgstr "Borró un comentario en el perfil de {target}"
+
+#, python-brace-format
+#~ msgid "Deleted a comment on {target}'s profile"
+#~ msgstr "Eliminó un comentario en el perfil de {target}"
+
+#, python-brace-format
+#~ msgid "Changed group membership for {target}"
+#~ msgstr "Cambió la membresía del grupo para {target}"
+
+#, python-brace-format
+#~ msgid "{target} got autopromoted to a new usergroup"
+#~ msgstr ""
+#~ "{target} obtuvo una promoción automática a un nuevo grupo de usuarios"
+
+#, python-brace-format
+#~ msgid "Groups changed from {old_groups} to {new_groups}{reason}"
+#~ msgstr "Los grupos cambiaron de {old_groups} a {new_groups}{reason}"
+
+#, python-brace-format
+#~ msgid "Protected {target}"
+#~ msgstr "Protegió a {target}"
+
+#, python-brace-format
+#~ msgid "Changed protection level for {article}"
+#~ msgstr "Cambió el nivel de protección de {article}"
+
+#, python-brace-format
+#~ msgid "Removed protection from {article}"
+#~ msgstr "Quitó la protección de {article}"
+
+#, python-brace-format
+#~ msgid "Changed visibility of revision on page {article} "
+#~ msgid_plural "Changed visibility of {amount} revisions on page {article} "
+#~ msgstr[0] "Modificó la visibilidad de la revisión en la página {article} "
+#~ msgstr[1] ""
+#~ "Modificó la visibilidad de {amount} revisiones en la página {article} "
+
+#, python-brace-format
+#~ msgid "Imported {article} with {count} revision"
+#~ msgid_plural "Imported {article} with {count} revisions"
+#~ msgstr[0] "Importó {article} con {count} revisión"
+#~ msgstr[1] "Importó {article} con {count} revisiones"
+
+#~ msgid "Changed visibility of log events"
+#~ msgstr "Cambió la visibilidad del registro de eventos"
+
+#~ msgid "Imported interwiki"
+#~ msgstr "Importó interwiki"
+
+#, python-brace-format
+#~ msgid "Edited abuse filter number {number}"
+#~ msgstr "Editó el número de filtro de abuso {number}"
+
+#, python-brace-format
+#~ msgid "Created abuse filter number {number}"
+#~ msgstr "Creó el filtro de abuso número {number}"
+
+#, python-brace-format
+#~ msgid "Merged revision histories of {article} into {dest}"
+#~ msgstr "Fusionó los historiales de revisión de {article} en {dest}"
+
+#~ msgid "Created account automatically"
+#~ msgstr "Creó la cuenta automáticamente"
+
+#~ msgid "Created account"
+#~ msgstr "Creó la cuenta"
+
+#, python-brace-format
+#~ msgid "Created account {article}"
+#~ msgstr "Creó la cuenta {article}"
+
+#, python-brace-format
+#~ msgid "Created account {article} and password was sent by email"
+#~ msgstr ""
+#~ "Creó la cuenta {article} y la contraseña se envió por correo electrónico"
+
+#~ msgid "Added an entry to the interwiki table"
+#~ msgstr "Agregó una entrada a la tabla interwiki"
+
+#, python-brace-format
+#~ msgid "Prefix: {prefix}, website: {website} | {desc}"
+#~ msgstr "Prefijo: {prefix}, sitio web: {website} | {desc}"
+
+#~ msgid "Edited an entry in interwiki table"
+#~ msgstr "Editó una entrada en la tabla de interwiki"
+
+#~ msgid "Deleted an entry in interwiki table"
+#~ msgstr "Eliminó una entrada en la tabla interwiki"
+
+#, python-brace-format
+#~ msgid "Prefix: {prefix} | {desc}"
+#~ msgstr "Prefijo: {prefix} | {desc}"
+
+#, python-brace-format
+#~ msgid "Changed the content model of the page {article}"
+#~ msgstr "Modificó el modelo de contenido de la página {article}"
+
+#, python-brace-format
+#~ msgid "Model changed from {old} to {new}: {reason}"
+#~ msgstr "El modelo cambió de {old} a {new}: {reason}"
+
+#, python-brace-format
+#~ msgid "Edited the sprite for {article}"
+#~ msgstr "Editó el sprite de {article}"
+
+#, python-brace-format
+#~ msgid "Created the sprite sheet for {article}"
+#~ msgstr "Creó la hoja de sprites de {article}"
+
+#, python-brace-format
+#~ msgid "Edited the slice for {article}"
+#~ msgstr "Editó el sector de {article}"
+
+#, python-brace-format
+#~ msgid "Created the Cargo table \"{table}\""
+#~ msgstr "Creó la tabla Cargo \"{table}\""
+
+#, python-brace-format
+#~ msgid "Deleted the Cargo table \"{table}\""
+#~ msgstr "Eliminó la tabla Cargo \"{table}\""
+
+#, python-brace-format
+#~ msgid "Recreated the Cargo table \"{table}\""
+#~ msgstr "Recreó la tabla Cargo \"{table}\""
+
+#, python-brace-format
+#~ msgid "Replaced the Cargo table \"{table}\""
+#~ msgstr "Reemplazó la tabla Cargo \"{table}\""
+
+#, python-brace-format
+#~ msgid "Created a tag \"{tag}\""
+#~ msgstr "Creó una etiqueta \"{tag}\""
+
+#, python-brace-format
+#~ msgid "Deleted a tag \"{tag}\""
+#~ msgstr "Eliminó una etiqueta \"{tag}\""
+
+#, python-brace-format
+#~ msgid "Activated a tag \"{tag}\""
+#~ msgstr "Activó una etiqueta \"{tag}\""
+
+#, python-brace-format
+#~ msgid "Deactivated a tag \"{tag}\""
+#~ msgstr "Desactivó una etiqueta \"{tag}\""
+
+#~ msgid "Changed wiki settings"
+#~ msgstr "Cambió la configuración del wiki"
+
+#, python-brace-format
+#~ msgid "Deleted a \"{wiki}\" wiki"
+#~ msgstr "Eliminó un wiki \"{wiki}\""
+
+#, python-brace-format
+#~ msgid "Locked a \"{wiki}\" wiki"
+#~ msgstr "Protegió un wiki \"{wiki}\""
+
+#, python-brace-format
+#~ msgid "Modified a \"{namespace_name}\" namespace"
+#~ msgstr "Modificó un espacio de nombres \"{namespace_name}\""
+
+#~ msgid "Wiki"
+#~ msgstr "Wiki"
+
+#, python-brace-format
+#~ msgid "Deleted a \"{namespace_name}\" namespace"
+#~ msgstr "Eliminó un espacio de nombres \"{namespace_name}\""
+
+#, python-brace-format
+#~ msgid "Modified \"{usergroup_name}\" usergroup"
+#~ msgstr "Modificó el grupo de usuarios \"{usergroup_name}\""
+
+#, python-brace-format
+#~ msgid "Restored a \"{wiki}\" wiki"
+#~ msgstr "Restauró un wiki \"{wiki}\""
+
+#, python-brace-format
+#~ msgid "Unlocked a \"{wiki}\" wiki"
+#~ msgstr "Desbloqueó un wiki \"{wiki}\""
+
+#~ msgid "Action has been hidden by administration"
+#~ msgstr "La administración ha ocultado la acción"
+
+#, python-brace-format
+#~ msgid "Unknown event `{event}`"
+#~ msgstr "Evento desconocido `{event}`"
+
+#~ msgid "Report this on the support server"
+#~ msgstr "Reportar esto en el servidor de soporte"
+
+#~ msgid "Tags"
+#~ msgstr "Etiquetas"
+
+#~ msgid "**Added**: "
+#~ msgstr "**Añadió**: "
+
+#~ msgid " and {} more\n"
+#~ msgstr " y {} más\n"
+
+#~ msgid "**Removed**: "
+#~ msgstr "**Eliminó**: "
+
+#~ msgid " and {} more"
+#~ msgstr " y {} más"
+
+#~ msgid "Changed categories"
+#~ msgstr "Cambió de categorías"
diff --git a/locale/es/LC_MESSAGES/redaction.po b/locale/es/LC_MESSAGES/redaction.po
index b92e082..211efcf 100644
--- a/locale/es/LC_MESSAGES/redaction.po
+++ b/locale/es/LC_MESSAGES/redaction.po
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: RcGcDw\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2020-11-30 11:58+0100\n"
+"POT-Creation-Date: 2021-07-11 14:32+0200\n"
"PO-Revision-Date: 2020-12-06 14:17+0000\n"
"Last-Translator: Tamara Carvallo \n"
"Language-Team: Spanish , YEAR.
-#
-msgid ""
-msgstr ""
-"Project-Id-Version: \n"
-"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2020-12-23 00:28+0100\n"
-"PO-Revision-Date: 2020-07-04 01:08+0200\n"
-"Last-Translator: \n"
-"Language-Team: \n"
-"Language: fr\n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=UTF-8\n"
-"Content-Transfer-Encoding: 8bit\n"
-"X-Generator: Poedit 2.3\n"
-"Plural-Forms: nplurals=2; plural=(n > 1);\n"
-
-#: src/discussion_formatters.py:21 src/discussion_formatters.py:56
-#: src/discussion_formatters.py:67 src/discussion_formatters.py:95
-#: src/discussion_formatters.py:163 src/discussion_formatters.py:176
-msgid "unknown"
-msgstr "inconnu"
-
-#: src/discussion_formatters.py:27 src/discussion_formatters.py:102
-msgid "Unregistered user"
-msgstr ""
-
-#: src/discussion_formatters.py:39
-#, fuzzy, python-brace-format
-msgid ""
-"[{author}]({author_url}) created [{title}](<{url}f/p/{threadId}>) in "
-"{forumName}"
-msgstr ""
-"Création de [{title}](<{url}f/p/{threadId}>) par [{author}](<{url}f/u/"
-"{creatorId}>) dans {forumName}"
-
-#: src/discussion_formatters.py:42
-#, fuzzy, python-brace-format
-msgid ""
-"[{author}]({author_url}) created a poll [{title}](<{url}f/p/{threadId}>) in "
-"{forumName}"
-msgstr ""
-"Création de [{title}](<{url}f/p/{threadId}>) par [{author}](<{url}f/u/"
-"{creatorId}>) dans {forumName}"
-
-#: src/discussion_formatters.py:45
-#, fuzzy, python-brace-format
-msgid ""
-"[{author}]({author_url}) created a quiz [{title}](<{url}f/p/{threadId}>) in "
-"{forumName}"
-msgstr ""
-"Création de [{title}](<{url}f/p/{threadId}>) par [{author}](<{url}f/u/"
-"{creatorId}>) dans {forumName}"
-
-#: src/discussion_formatters.py:54
-#, fuzzy, python-brace-format
-msgid ""
-"[{author}]({author_url}) created a [reply](<{url}f/p/{threadId}/r/{postId}>) "
-"to [{title}](<{url}f/p/{threadId}>) in {forumName}"
-msgstr ""
-"[Réponse](<{url}f/p/{threadId}/r/{postId}>) de [{author}](<{url}f/u/"
-"{creatorId}>) à [{title}](<{url}f/p/{threadId}>) dans {forumName}"
-
-#: src/discussion_formatters.py:61
-#, fuzzy, python-brace-format
-msgid ""
-"[{author}]({author_url}) created [{title}](<{url}wiki/Message_Wall:"
-"{user_wall}?threadId={threadId}>) on [{user}'s Message Wall](<{url}wiki/"
-"Message_Wall:{user_wall}>)"
-msgstr ""
-"Création de [{title}](<{url}f/p/{threadId}>) par [{author}](<{url}f/u/"
-"{creatorId}>) dans {forumName}"
-
-#: src/discussion_formatters.py:64
-#, fuzzy, python-brace-format
-msgid ""
-"[{author}]({author_url}) created a [reply](<{url}wiki/Message_Wall:"
-"{user_wall}?threadId={threadId}#{replyId}>) to [{title}](<{url}wiki/"
-"Message_Wall:{user_wall}?threadId={threadId}>) on [{user}'s Message Wall]"
-"(<{url}wiki/Message_Wall:{user_wall}>)"
-msgstr ""
-"Création de [{title}](<{url}f/p/{threadId}>) par [{author}](<{url}f/u/"
-"{creatorId}>) dans {forumName}"
-
-#: src/discussion_formatters.py:72
-#, fuzzy, python-brace-format
-msgid ""
-"[{author}]({author_url}) created a [comment](<{url}?commentId={commentId}>) "
-"on [{article}](<{url}>)"
-msgstr ""
-"[Réponse](<{url}f/p/{threadId}/r/{postId}>) de [{author}](<{url}f/u/"
-"{creatorId}>) à [{title}](<{url}f/p/{threadId}>) dans {forumName}"
-
-#: src/discussion_formatters.py:78
-#, fuzzy, python-brace-format
-msgid ""
-"[{author}]({author_url}) created a [reply](<{url}?commentId={commentId}"
-"&replyId={replyId}>) to a [comment](<{url}?commentId={commentId}>) on "
-"[{article}](<{url}>)"
-msgstr ""
-"[Réponse](<{url}f/p/{threadId}/r/{postId}>) de [{author}](<{url}f/u/"
-"{creatorId}>) à [{title}](<{url}f/p/{threadId}>) dans {forumName}"
-
-#: src/discussion_formatters.py:86
-#, python-brace-format
-msgid ""
-"Unknown event `{event}` by [{author}]({author_url}), report it on the "
-"[support server](<{support}>)."
-msgstr ""
-
-#: src/discussion_formatters.py:123
-#, python-brace-format
-msgid "Created \"{title}\""
-msgstr "Création de {title}"
-
-#: src/discussion_formatters.py:127
-#, fuzzy, python-brace-format
-msgid "Created a poll \"{title}\""
-msgstr "Création de {title}"
-
-#: src/discussion_formatters.py:134
-msgid "Option {}"
-msgstr ""
-
-#: src/discussion_formatters.py:135
-#, python-brace-format
-msgid "__[View image]({image_url})__"
-msgstr ""
-
-#: src/discussion_formatters.py:139
-#, fuzzy, python-brace-format
-msgid "Created a quiz \"{title}\""
-msgstr "Création de {title}"
-
-#: src/discussion_formatters.py:155 src/discussion_formatters.py:157
-msgid "Tags"
-msgstr ""
-
-#: src/discussion_formatters.py:155
-msgid "{} tags"
-msgstr ""
-
-#: src/discussion_formatters.py:160
-#, python-brace-format
-msgid "Replied to \"{title}\""
-msgstr "A répondu à « {title} »"
-
-#: src/discussion_formatters.py:169
-#, python-brace-format
-msgid "Created \"{title}\" on {user}'s Message Wall"
-msgstr "Création de « {title} » sur le mur de {user}"
-
-#: src/discussion_formatters.py:173
-#, python-brace-format
-msgid "Replied to \"{title}\" on {user}'s Message Wall"
-msgstr "Réponse à « {title} » sur le mur de {user}"
-
-#: src/discussion_formatters.py:180
-#, fuzzy, python-brace-format
-msgid "Commented on {article}"
-msgstr "Création de {title}"
-
-#: src/discussion_formatters.py:184
-#, fuzzy, python-brace-format
-msgid "Replied to a comment on {article}"
-msgstr "A répondu à « {title} »"
-
-#: src/discussion_formatters.py:188
-#, python-brace-format
-msgid "Unknown event `{event}`"
-msgstr ""
-
-#: src/discussion_formatters.py:194 src/discussion_formatters.py:196
-msgid "Report this on the support server"
-msgstr ""
diff --git a/locale/fr/LC_MESSAGES/formatters.mo b/locale/fr/LC_MESSAGES/formatters.mo
new file mode 100644
index 0000000..3c49978
Binary files /dev/null and b/locale/fr/LC_MESSAGES/formatters.mo differ
diff --git a/locale/fr/LC_MESSAGES/formatters.po b/locale/fr/LC_MESSAGES/formatters.po
new file mode 100644
index 0000000..1a42074
--- /dev/null
+++ b/locale/fr/LC_MESSAGES/formatters.po
@@ -0,0 +1,1811 @@
+# #-#-#-#-# rcgcdw.po #-#-#-#-#
+# UN TITRE MERVEILLEUSEMENT DESCRIPTIF
+# COPYRIGHT HAHAHAHA I WISH J'AI PAS DE COPYRIGHT
+# AUTEUR #1 C'EST MOI MWAHAHAHAHAHA
+#
+# #-#-#-#-# formatters.po #-#-#-#-#
+# #-#-#-#-# discussion_formatters.po #-#-#-#-#
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR , YEAR.
+#
+# #-#-#-#-# rc_formatters.po #-#-#-#-#
+# UN TITRE MERVEILLEUSEMENT DESCRIPTIF
+# COPYRIGHT HAHAHAHA I WISH J'AI PAS DE COPYRIGHT
+# AUTEUR #1 C'EST MOI MWAHAHAHAHAHA
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: \n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2021-07-11 14:32+0200\n"
+"PO-Revision-Date: 2020-03-17 21:40+0100\n"
+"Last-Translator: Frisk <>\n"
+"Language-Team: \n"
+"Language: fr\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"#-#-#-#-# rcgcdw.po #-#-#-#-#\n"
+"Plural-Forms: nplurals=2; plural=n > 1;\n"
+"X-Generator: Weblate 4.2.1\n"
+"Generated-By: pygettext.py 1.5\n"
+"X-Poedit-Basepath: ../../..\n"
+"X-Poedit-SearchPath-0: rcgcdw.pot\n"
+"#-#-#-#-# formatters.po #-#-#-#-#\n"
+"#-#-#-#-# discussion_formatters.po #-#-#-#-#\n"
+"X-Generator: Poedit 2.3\n"
+"Plural-Forms: nplurals=2; plural=(n > 1);\n"
+"#-#-#-#-# rc_formatters.po #-#-#-#-#\n"
+"Generated-By: pygettext.py 1.5\n"
+"X-Generator: Poedit 2.3\n"
+"X-Poedit-Basepath: ../../..\n"
+"Plural-Forms: nplurals=2; plural=(n > 1);\n"
+"X-Poedit-SearchPath-0: rcgcdw.pot\n"
+
+#: src/api/util.py:61 src/api/util.py:66
+msgid "__Only whitespace__"
+msgstr "__Espaces uniquement__"
+
+#: src/api/util.py:71
+msgid "Removed"
+msgstr "Retirés"
+
+#: src/api/util.py:73
+msgid "Added"
+msgstr "Ajoutés"
+
+#: src/api/util.py:94 src/api/util.py:126 src/api/util.py:133
+#: src/api/util.py:141 extensions/base/discussions.py:247
+#: extensions/base/discussions.py:264 extensions/base/abusefilter.py:45
+msgid "Unregistered user"
+msgstr ""
+
+#: src/api/util.py:160
+#, fuzzy
+msgctxt "recent changes Tags"
+msgid "Tags"
+msgstr "Tags"
+
+#: src/api/util.py:162
+msgid "**Added**: "
+msgstr "**Ajoutées : ** "
+
+#: src/api/util.py:163
+msgid " and {} more\n"
+msgstr " et {} autres\n"
+
+#: src/api/util.py:165
+msgid "**Removed**: "
+msgstr "**Retirées : ** "
+
+#: src/api/util.py:166
+msgid " and {} more"
+msgstr " et {} autres"
+
+#: src/api/util.py:168
+msgid "Changed categories"
+msgstr "Catégories modifiées"
+
+#: extensions/base/cargo.py:37
+#, python-brace-format
+msgid "Created the Cargo table \"{table}\""
+msgstr "Création du tableau Cargo « {table} »"
+
+#: extensions/base/cargo.py:45
+#, python-brace-format
+msgid "[{author}]({author_url}) created the Cargo table \"{table}\""
+msgstr "[{author}]({author_url}) a créé le tableau Cargo « {table} »"
+
+#: extensions/base/cargo.py:60
+#, python-brace-format
+msgid "Recreated the Cargo table \"{table}\""
+msgstr "Recréation du tableau Cargo « {table} »"
+
+#: extensions/base/cargo.py:68
+#, python-brace-format
+msgid "[{author}]({author_url}) recreated the Cargo table \"{table}\""
+msgstr "[{author}]({author_url}) a recréé le tableau Cargo « {table} »"
+
+#: extensions/base/cargo.py:83
+#, python-brace-format
+msgid "Replaced the Cargo table \"{table}\""
+msgstr "Remplacement du tableau Cargo « {table} »"
+
+#: extensions/base/cargo.py:91
+#, python-brace-format
+msgid "[{author}]({author_url}) replaced the Cargo table \"{table}\""
+msgstr "[{author}]({author_url}) a remplacé le tableau cargo « {table} »"
+
+#: extensions/base/cargo.py:105
+#, python-brace-format
+msgid "Deleted the Cargo table \"{table}\""
+msgstr "Suppression du tableau Cargo « {table} »"
+
+#: extensions/base/cargo.py:112
+#, python-brace-format
+msgid "[{author}]({author_url}) deleted the Cargo table \"{table}\""
+msgstr "[{author}]({author_url}) a supprimé le tableau Cargo « {table} »"
+
+#: extensions/base/translate.py:41
+#, python-brace-format
+msgid "Marked \"{article}\" for translation"
+msgstr ""
+
+#: extensions/base/translate.py:55
+#, fuzzy, python-brace-format
+msgid ""
+"[{author}]({author_url}) marked [{article}]({article_url}) for "
+"translation{comment}"
+msgstr "Modification de la visibilité d'une révision de la page {article} "
+
+#: extensions/base/translate.py:70
+#, python-brace-format
+msgid "Removed \"{article}\" from the translation system"
+msgstr ""
+
+#: extensions/base/translate.py:80
+#, fuzzy, python-brace-format
+msgid ""
+"[{author}]({author_url}) removed [{article}]({article_url}) from the "
+"translation system{comment}"
+msgstr "Modification des paramètres de blocage pour {blocked_user}"
+
+#: extensions/base/translate.py:95
+#, python-brace-format
+msgid "Completed moving translation pages from \"{article}\" to \"{target}\""
+msgstr ""
+
+#: extensions/base/translate.py:106
+#, fuzzy, python-brace-format
+msgid ""
+"[{author}]({author_url}) completed moving translation pages from *{article}* "
+"to [{target}]({target_url}){comment}"
+msgstr ""
+"Transfert des paramètres de protection de {redirect}{article} vers {title}"
+
+#: extensions/base/translate.py:121
+#, python-brace-format
+msgid "Encountered a problem while moving \"{article}\" to \"{target}\""
+msgstr ""
+
+#: extensions/base/translate.py:133
+#, fuzzy, python-brace-format
+msgid ""
+"[{author}]({author_url}) encountered a problem while moving [{article}]"
+"({article_url}) to [{target}]({target_url}){comment}"
+msgstr ""
+"Transfert des paramètres de protection de {redirect}{article} vers {title}"
+
+#: extensions/base/translate.py:149
+#, python-brace-format
+msgid ""
+"Failed to delete \"{article}\" which belongs to translatable page "
+"\"{target}\""
+msgstr ""
+
+#: extensions/base/translate.py:161
+#, fuzzy, python-brace-format
+msgid ""
+"[{author}]({author_url}) failed to delete [{article}]({article_url}) which "
+"belongs to translatable page [{target}]({target_url}){comment}"
+msgstr "Modification des paramètres de blocage pour {blocked_user}"
+
+#: extensions/base/translate.py:177
+#, fuzzy, python-brace-format
+msgid "Completed deletion of translation page \"{article}\""
+msgstr "Modification de la visibilité d'une révision de la page {article} "
+
+#: extensions/base/translate.py:188
+#, fuzzy, python-brace-format
+msgid ""
+"[{author}]({author_url}) completed deletion of translation page [{article}]"
+"({article_url}){comment}"
+msgstr "Modification de la visibilité d'une révision de la page {article} "
+
+#: extensions/base/translate.py:203
+#, python-brace-format
+msgid ""
+"Failed to delete \"{article}\" which belongs to translation page \"{target}\""
+msgstr ""
+
+#: extensions/base/translate.py:215
+#, fuzzy, python-brace-format
+msgid ""
+"[{author}]({author_url}) failed to delete [{article}]({article_url}) which "
+"belongs to translation page [{target}]({target_url}){comment}"
+msgstr "Modification des paramètres de blocage pour {blocked_user}"
+
+#: extensions/base/translate.py:231
+#, fuzzy, python-brace-format
+msgid "Encouraged translation of \"{article}\""
+msgstr "Retrait de la protection de {article}"
+
+#: extensions/base/translate.py:240
+#, fuzzy, python-brace-format
+msgid ""
+"[{author}]({author_url}) encouraged translation of [{article}]({article_url})"
+"{comment}"
+msgstr "Création d'une feuille de sprite pour {article}"
+
+#: extensions/base/translate.py:255
+#, python-brace-format
+msgid "Discouraged translation of \"{article}\""
+msgstr ""
+
+#: extensions/base/translate.py:264
+#, fuzzy, python-brace-format
+msgid ""
+"[{author}]({author_url}) discouraged translation of [{article}]"
+"({article_url}){comment}"
+msgstr "Modification de la visibilité d'une révision de la page {article} "
+
+#: extensions/base/translate.py:282
+#, python-brace-format
+msgid "Limited languages for \"{article}\" to `{languages}`"
+msgstr ""
+
+#: extensions/base/translate.py:285
+#, python-brace-format
+msgid "Priority languages for \"{article}\" set to `{languages}`"
+msgstr ""
+
+#: extensions/base/translate.py:288
+#, fuzzy, python-brace-format
+msgid "Removed priority languages from \"{article}\""
+msgstr "Retrait de la protection de {article}"
+
+#: extensions/base/translate.py:301
+#, fuzzy, python-brace-format
+msgid ""
+"[{author}]({author_url}) limited languages for [{article}]({article_url}) to "
+"`{languages}`{comment}"
+msgstr ""
+"Transfert des paramètres de protection de {redirect}{article} vers {title}"
+
+#: extensions/base/translate.py:308
+#, fuzzy, python-brace-format
+msgid ""
+"[{author}]({author_url}) set the priority languages for [{article}]"
+"({article_url}) to `{languages}`{comment}"
+msgstr ""
+"Transfert des paramètres de protection de {redirect}{article} vers {title}"
+
+#: extensions/base/translate.py:315
+#, fuzzy, python-brace-format
+msgid ""
+"[{author}]({author_url}) removed priority languages from [{article}]"
+"({article_url}){comment}"
+msgstr "Création d'une feuille de sprite pour {article}"
+
+#: extensions/base/translate.py:331
+#, python-brace-format
+msgid "Added translatable page \"{article}\" to aggregate group \"{group}\""
+msgstr ""
+
+#: extensions/base/translate.py:342
+#, fuzzy, python-brace-format
+msgid ""
+"[{author}]({author_url}) added translatable page [{article}]({article_url}) "
+"to aggregate group \"{group}\"{comment}"
+msgstr "Modification de la visibilité d'une révision de la page {article} "
+
+#: extensions/base/translate.py:357
+#, python-brace-format
+msgid ""
+"Removed translatable page \"{article}\" from aggregate group \"{group}\""
+msgstr ""
+
+#: extensions/base/translate.py:368
+#, fuzzy, python-brace-format
+msgid ""
+"[{author}]({author_url}) removed translatable page [{article}]"
+"({article_url}) from aggregate group \"{group}\"{comment}"
+msgstr "Création d'une feuille de sprite pour {article}"
+
+#: extensions/base/translate.py:387
+#, fuzzy, python-brace-format
+msgid "Reviewed translation \"{article}\""
+msgstr "Retrait de la protection de {article}"
+
+#: extensions/base/translate.py:401
+#, fuzzy, python-brace-format
+msgid ""
+"[{author}]({author_url}) reviewed translation [{article}]({article_url})"
+"{comment}"
+msgstr "Modification de la visibilité d'une révision de la page {article} "
+
+#: extensions/base/translate.py:416
+#, python-brace-format
+msgid "Changed the state of `{language}` translations of \"{article}\""
+msgstr ""
+
+#: extensions/base/translate.py:419
+msgid "Old state"
+msgstr ""
+
+#: extensions/base/translate.py:420
+msgid "New state"
+msgstr ""
+
+#: extensions/base/translate.py:431
+#, fuzzy, python-brace-format
+msgid ""
+"[{author}]({author_url}) changed the state of `{language}` translations of "
+"[{article}]({article_url}) from `{old_state}` to `{new_state}`{comment}"
+msgstr "Modification de la visibilité d'une révision de la page {article} "
+
+#: extensions/base/translate.py:439
+#, fuzzy, python-brace-format
+msgid ""
+"[{author}]({author_url}) changed the state of `{language}` translations of "
+"[{article}]({article_url}) to `{new_state}`{comment}"
+msgstr "Modification de la visibilité d'une révision de la page {article} "
+
+#: extensions/base/translate.py:452 extensions/base/translate.py:455
+msgid "(default)"
+msgstr ""
+
+#: extensions/base/translate.py:464
+#, fuzzy, python-brace-format
+msgid "Changed the language of \"{article}\""
+msgstr "Retrait de la protection de {article}"
+
+#: extensions/base/translate.py:465
+msgid "Old language"
+msgstr ""
+
+#: extensions/base/translate.py:466
+msgid "New language"
+msgstr ""
+
+#: extensions/base/translate.py:477
+#, fuzzy, python-brace-format
+msgid ""
+"[{author}]({author_url}) changed the language of [{article}]({article_url}) "
+"from {old_lang} to {new_lang}{comment}"
+msgstr "Modification de la visibilité d'une révision de la page {article} "
+
+#: extensions/base/discussions.py:148 extensions/base/discussions.py:207
+#: extensions/base/discussions.py:245 extensions/base/discussions.py:261
+#: extensions/base/discussions.py:284 extensions/base/discussions.py:306
+#: extensions/base/discussions.py:334 extensions/base/discussions.py:354
+msgid "unknown"
+msgstr "inconnu"
+
+#: extensions/base/discussions.py:157
+#, python-brace-format
+msgid "Created \"{title}\""
+msgstr "Création de {title}"
+
+#: extensions/base/discussions.py:161
+#, fuzzy, python-brace-format
+msgid "Created a poll \"{title}\""
+msgstr "Création de {title}"
+
+#: extensions/base/discussions.py:168
+msgid "Option {}"
+msgstr ""
+
+#: extensions/base/discussions.py:170
+#, python-brace-format
+msgid "__[View image]({image_url})__"
+msgstr ""
+
+#: extensions/base/discussions.py:174
+#, fuzzy, python-brace-format
+msgid "Created a quiz \"{title}\""
+msgstr "Création de {title}"
+
+#: extensions/base/discussions.py:193 extensions/base/discussions.py:195
+#, fuzzy
+msgctxt "Fandom discussions Tags/Forums"
+msgid "Tags"
+msgstr "Tags"
+
+#: extensions/base/discussions.py:193
+msgctxt "Fandom discussions amount of Tags/Forums"
+msgid "{} tags"
+msgstr ""
+
+#: extensions/base/discussions.py:198
+#, python-brace-format
+msgid "Replied to \"{title}\""
+msgstr "A répondu à « {title} »"
+
+#: extensions/base/discussions.py:214
+#, fuzzy, python-brace-format
+msgid ""
+"[{author}]({author_url}) created [{title}](<{url}f/p/{threadId}>) in "
+"{forumName}"
+msgstr ""
+"Création de [{title}](<{url}f/p/{threadId}>) par [{author}](<{url}f/u/"
+"{creatorId}>) dans {forumName}"
+
+#: extensions/base/discussions.py:217
+#, fuzzy, python-brace-format
+msgid ""
+"[{author}]({author_url}) created a poll [{title}](<{url}f/p/{threadId}>) in "
+"{forumName}"
+msgstr ""
+"Création de [{title}](<{url}f/p/{threadId}>) par [{author}](<{url}f/u/"
+"{creatorId}>) dans {forumName}"
+
+#: extensions/base/discussions.py:220
+#, fuzzy, python-brace-format
+msgid ""
+"[{author}]({author_url}) created a quiz [{title}](<{url}f/p/{threadId}>) in "
+"{forumName}"
+msgstr ""
+"Création de [{title}](<{url}f/p/{threadId}>) par [{author}](<{url}f/u/"
+"{creatorId}>) dans {forumName}"
+
+#: extensions/base/discussions.py:234
+#, fuzzy, python-brace-format
+msgid ""
+"[{author}]({author_url}) created a [reply](<{url}f/p/{threadId}/r/{postId}>) "
+"to [{title}](<{url}f/p/{threadId}>) in {forumName}"
+msgstr ""
+"[Réponse](<{url}f/p/{threadId}/r/{postId}>) de [{author}](<{url}f/u/"
+"{creatorId}>) à [{title}](<{url}f/p/{threadId}>) dans {forumName}"
+
+#: extensions/base/discussions.py:292
+#, python-brace-format
+msgid "Created \"{title}\" on {user}'s Message Wall"
+msgstr "Création de « {title} » sur le mur de {user}"
+
+#: extensions/base/discussions.py:298
+#, python-brace-format
+msgid "Replied to \"{title}\" on {user}'s Message Wall"
+msgstr "Réponse à « {title} » sur le mur de {user}"
+
+#: extensions/base/discussions.py:312
+#, fuzzy, python-brace-format
+msgid ""
+"[{author}]({author_url}) created [{title}](<{url}wiki/Message_Wall:"
+"{user_wall}?threadId={threadId}>) on [{user}'s Message Wall](<{url}wiki/"
+"Message_Wall:{user_wall}>)"
+msgstr ""
+"Création de [{title}](<{url}f/p/{threadId}>) par [{author}](<{url}f/u/"
+"{creatorId}>) dans {forumName}"
+
+#: extensions/base/discussions.py:318
+#, fuzzy, python-brace-format
+msgid ""
+"[{author}]({author_url}) created a [reply](<{url}wiki/Message_Wall:"
+"{user_wall}?threadId={threadId}#{replyId}>) to [{title}](<{url}wiki/"
+"Message_Wall:{user_wall}?threadId={threadId}>) on [{user}'s Message Wall]"
+"(<{url}wiki/Message_Wall:{user_wall}>)"
+msgstr ""
+"Création de [{title}](<{url}f/p/{threadId}>) par [{author}](<{url}f/u/"
+"{creatorId}>) dans {forumName}"
+
+#: extensions/base/discussions.py:338
+#, fuzzy, python-brace-format
+msgid "Commented on {article}"
+msgstr "Création de {title}"
+
+#: extensions/base/discussions.py:344
+#, fuzzy, python-brace-format
+msgid "Replied to a comment on {article}"
+msgstr "A répondu à « {title} »"
+
+#: extensions/base/discussions.py:359
+#, fuzzy, python-brace-format
+msgid ""
+"[{author}]({author_url}) created a [comment](<{url}?commentId={commentId}>) "
+"on [{article}](<{url}>)"
+msgstr ""
+"[Réponse](<{url}f/p/{threadId}/r/{postId}>) de [{author}](<{url}f/u/"
+"{creatorId}>) à [{title}](<{url}f/p/{threadId}>) dans {forumName}"
+
+#: extensions/base/discussions.py:365
+#, fuzzy, python-brace-format
+msgid ""
+"[{author}]({author_url}) created a [reply](<{url}?commentId={commentId}"
+"&replyId={replyId}>) to a [comment](<{url}?commentId={commentId}>) on "
+"[{article}](<{url}>)"
+msgstr ""
+"[Réponse](<{url}f/p/{threadId}/r/{postId}>) de [{author}](<{url}f/u/"
+"{creatorId}>) à [{title}](<{url}f/p/{threadId}>) dans {forumName}"
+
+#: extensions/base/managewiki.py:34
+msgid "Changed wiki settings"
+msgstr ""
+
+#: extensions/base/managewiki.py:44
+#, fuzzy, python-brace-format
+msgid "[{author}]({author_url}) changed wiki settings{reason}"
+msgstr "Modification de la visibilité d'évènements des journaux"
+
+#: extensions/base/managewiki.py:55
+#, fuzzy, python-brace-format
+msgid "Deleted a \"{wiki}\" wiki"
+msgstr "Suppression du tag « {tag} »"
+
+#: extensions/base/managewiki.py:55 extensions/base/managewiki.py:67
+#: extensions/base/managewiki.py:103 extensions/base/managewiki.py:112
+#: extensions/base/managewiki.py:125 extensions/base/managewiki.py:126
+#: extensions/base/managewiki.py:135 extensions/base/managewiki.py:136
+#: extensions/base/managewiki.py:148 extensions/base/managewiki.py:149
+#: extensions/base/managewiki.py:160 extensions/base/managewiki.py:161
+#: extensions/base/managewiki.py:195 extensions/base/managewiki.py:204
+#: extensions/base/managewiki.py:217 extensions/base/managewiki.py:226
+#: extensions/base/abusefilter.py:55 extensions/base/abusefilter.py:56
+#: extensions/base/abusefilter.py:57 extensions/base/abusefilter.py:68
+#: extensions/base/abusefilter.py:69 extensions/base/abusefilter.py:70
+#: extensions/base/mediawiki.py:743
+msgid "Unknown"
+msgstr "Inconnu"
+
+#: extensions/base/managewiki.py:63
+#, fuzzy, python-brace-format
+msgid "[{author}]({author_url}) deleted a wiki *{wiki_name}*{comment}"
+msgstr "Modification de la visibilité d'évènements des journaux"
+
+#: extensions/base/managewiki.py:80
+#, python-brace-format
+msgid "Deleted a \"{group}\" user group"
+msgstr ""
+
+#: extensions/base/managewiki.py:89
+#, fuzzy, python-brace-format
+msgid "[{author}]({author_url}) deleted a usergroup *{group}*{comment}"
+msgstr "Modification de la visibilité d'évènements des journaux"
+
+#: extensions/base/managewiki.py:103
+#, python-brace-format
+msgid "Locked a \"{wiki}\" wiki"
+msgstr ""
+
+#: extensions/base/managewiki.py:111
+#, fuzzy, python-brace-format
+msgid "[{author}]({author_url}) locked a wiki *{wiki_name}*{comment}"
+msgstr "Modification de la visibilité d'évènements des journaux"
+
+#: extensions/base/managewiki.py:124
+#, python-brace-format
+msgid "Modified \"{namespace_name}\" namespace"
+msgstr ""
+
+#: extensions/base/managewiki.py:126 extensions/base/managewiki.py:149
+msgid "Wiki"
+msgstr ""
+
+#: extensions/base/managewiki.py:134
+#, fuzzy, python-brace-format
+msgid ""
+"[{author}]({author_url}) modified namespace *{namespace_name}* on "
+"*{wiki_name}*{comment}"
+msgstr "Modification de la visibilité d'une révision de la page {article} "
+
+#: extensions/base/managewiki.py:147
+#, python-brace-format
+msgid "Deleted a \"{namespace_name}\" namespace"
+msgstr ""
+
+#: extensions/base/managewiki.py:158
+#, fuzzy, python-brace-format
+msgid ""
+"[{author}]({author_url}) deleted a namespace *{namespace_name}* on "
+"*{wiki_name}*{comment}"
+msgstr "[{author}]({author_url}) a supprimé le tableau Cargo « {table} »"
+
+#: extensions/base/managewiki.py:173
+#, python-brace-format
+msgid "Modified \"{usergroup_name}\" usergroup"
+msgstr ""
+
+#: extensions/base/managewiki.py:182
+#, fuzzy, python-brace-format
+msgid "[{author}]({author_url}) modified user group *{group_name}*{comment}"
+msgstr "Modification de la visibilité d'évènements des journaux"
+
+#: extensions/base/managewiki.py:195
+#, fuzzy, python-brace-format
+msgid "Undeleted a \"{wiki}\" wiki"
+msgstr "Suppression du tag « {tag} »"
+
+#: extensions/base/managewiki.py:203
+#, fuzzy, python-brace-format
+msgid "[{author}]({author_url}) undeleted a wiki *{wiki_name}*{comment}"
+msgstr "Modification de la visibilité d'évènements des journaux"
+
+#: extensions/base/managewiki.py:217
+#, python-brace-format
+msgid "Unlocked a \"{wiki}\" wiki"
+msgstr ""
+
+#: extensions/base/managewiki.py:225
+#, fuzzy, python-brace-format
+msgid "[{author}]({author_url}) unlocked a wiki *{wiki_name}*{comment}"
+msgstr "Modification de la visibilité d'évènements des journaux"
+
+#: extensions/base/datadump.py:36
+#, python-brace-format
+msgid "Generated {file} dump"
+msgstr ""
+
+#: extensions/base/datadump.py:45
+#, fuzzy, python-brace-format
+msgid "[{author}]({author_url}) generated *{file}* dump{comment}"
+msgstr "Modification de la visibilité d'évènements des journaux"
+
+#: extensions/base/datadump.py:58
+#, fuzzy, python-brace-format
+msgid "Deleted {file} dump"
+msgstr "Suppression de la page {article}"
+
+#: extensions/base/datadump.py:67
+#, fuzzy, python-brace-format
+msgid "[{author}]({author_url}) deleted *{file}* dump{comment}"
+msgstr "Modification de la visibilité d'évènements des journaux"
+
+#: extensions/base/curseprofile.py:40
+#, python-brace-format
+msgid "Edited {target}'s profile"
+msgstr "Modification du profil de {target}"
+
+#: extensions/base/curseprofile.py:42
+msgid "Edited their own profile"
+msgstr "Modification de son propre profil"
+
+#: extensions/base/curseprofile.py:44
+#, python-brace-format
+msgid "Cleared the {field} field"
+msgstr ""
+
+#: extensions/base/curseprofile.py:46
+#, python-brace-format
+msgid "{field} field changed to: {desc}"
+msgstr "{field} modifié pour: {desc}"
+
+#: extensions/base/curseprofile.py:58
+#, fuzzy, python-brace-format
+msgid ""
+"[{author}]({author_url}) cleared the {field} on [{target}]({target_url})'s "
+"profile."
+msgstr "Retrait d'un commentaire sur le profil de {target}"
+
+#: extensions/base/curseprofile.py:60
+#, fuzzy, python-brace-format
+msgid ""
+"[{author}]({author_url}) edited the {field} on [{target}]({target_url})'s "
+"profile. *({desc})*"
+msgstr "Retrait d'un commentaire sur le profil de {target}"
+
+#: extensions/base/curseprofile.py:65
+#, fuzzy, python-brace-format
+msgid ""
+"[{author}]({author_url}) cleared the {field} on [their own]({target_url}) "
+"profile."
+msgstr "Retrait d'un commentaire sur le profil de {target}"
+
+#: extensions/base/curseprofile.py:67
+#, fuzzy, python-brace-format
+msgid ""
+"[{author}]({author_url}) edited the {field} on [their own]({target_url}) "
+"profile. *({desc})*"
+msgstr "Retrait d'un commentaire sur le profil de {target}"
+
+#: extensions/base/curseprofile.py:82
+#, python-brace-format
+msgid "Left a comment on {target}'s profile"
+msgstr "Ajout d'un commentaire sur le profil de {target}"
+
+#: extensions/base/curseprofile.py:84
+msgid "Left a comment on their own profile"
+msgstr "Ajout d'un commentaire sur son propre profil"
+
+#: extensions/base/curseprofile.py:97
+#, fuzzy, python-brace-format
+msgid ""
+"[{author}]({author_url}) left a [comment]({comment}) on {target}'s profile."
+msgstr "Ajout d'un commentaire sur le profil de {target}"
+
+#: extensions/base/curseprofile.py:100
+#, fuzzy, python-brace-format
+msgid ""
+"[{author}]({author_url}) left a [comment]({comment}) on their own profile."
+msgstr "Ajout d'un commentaire sur le profil de {target}"
+
+#: extensions/base/curseprofile.py:113
+#, python-brace-format
+msgid "Edited a comment on {target}'s profile"
+msgstr "Édition d'un commentaire sur le profil de {target}"
+
+#: extensions/base/curseprofile.py:115
+msgid "Edited a comment on their own profile"
+msgstr "Modification d'un commentaire sur son propre profil"
+
+#: extensions/base/curseprofile.py:128
+#, fuzzy, python-brace-format
+msgid ""
+"[{author}]({author_url}) edited a [comment]({comment}) on {target}'s profile."
+msgstr "Édition d'un commentaire sur le profil de {target}"
+
+#: extensions/base/curseprofile.py:131
+#, fuzzy, python-brace-format
+msgid ""
+"[{author}]({author_url}) edited a [comment]({comment}) on their own profile."
+msgstr "Édition d'un commentaire sur le profil de {target}"
+
+#: extensions/base/curseprofile.py:144
+#, python-brace-format
+msgid "Replied to a comment on {target}'s profile"
+msgstr "Réponse à un commentaire sur le profil de {target}"
+
+#: extensions/base/curseprofile.py:146
+msgid "Replied to a comment on their own profile"
+msgstr "Réponse à un commentaire sur son propre profil"
+
+#: extensions/base/curseprofile.py:159
+#, fuzzy, python-brace-format
+msgid ""
+"[{author}]({author_url}) replied to a [comment]({comment}) on {target}'s "
+"profile."
+msgstr "Réponse à un commentaire sur le profil de {target}"
+
+#: extensions/base/curseprofile.py:162
+#, fuzzy, python-brace-format
+msgid ""
+"[{author}]({author_url}) replied to a [comment]({comment}) on their own "
+"profile."
+msgstr "Réponse à un commentaire sur le profil de {target}"
+
+#: extensions/base/curseprofile.py:175
+#, python-brace-format
+msgid "Deleted a comment on {target}'s profile"
+msgstr "Retrait d'un commentaire sur le profil de {target}"
+
+#: extensions/base/curseprofile.py:177
+#, fuzzy
+msgid "Deleted a comment on their own profile"
+msgstr "Modification d'un commentaire sur son propre profil"
+
+#: extensions/base/curseprofile.py:197
+#, fuzzy, python-brace-format
+msgid ""
+"[{author}]({author_url}) deleted a [comment]({comment}) on {target}'s "
+"profile.{reason}"
+msgstr "Édition d'un commentaire sur le profil de {target}"
+
+#: extensions/base/curseprofile.py:200
+#, fuzzy, python-brace-format
+msgid ""
+"[{author}]({author_url}) deleted a [comment]({comment}) on their own profile."
+"{reason}"
+msgstr "Édition d'un commentaire sur le profil de {target}"
+
+#: extensions/base/curseprofile.py:214
+#, python-brace-format
+msgid "Purged a comment on {target}'s profile"
+msgstr "Retrait d'un commentaire sur le profil de {target}."
+
+#: extensions/base/curseprofile.py:216
+#, fuzzy
+msgid "Purged a comment on their own profile"
+msgstr "Modification d'un commentaire sur son propre profil"
+
+#: extensions/base/curseprofile.py:230
+#, fuzzy, python-brace-format
+msgid ""
+"[{author}]({author_url}) purged a comment on [{target}]({link})'s profile."
+"{reason}"
+msgstr ""
+"[{author}]({author_url}) a retiré un commentaire sur le profil de {target}."
+
+#: extensions/base/curseprofile.py:233
+#, fuzzy, python-brace-format
+msgid ""
+"[{author}]({author_url}) purged a comment on [their own]({link}) profile."
+"{reason}"
+msgstr ""
+"[{author}]({author_url}) a retiré un commentaire sur le profil de {target}."
+
+#: extensions/base/renameuser.py:38
+#, python-brace-format
+msgid "Renamed user \"{old_name}\" with {edits} edit to \"{new_name}\""
+msgid_plural "Renamed user \"{old_name}\" with {edits} edits to \"{new_name}\""
+msgstr[0] ""
+msgstr[1] ""
+
+#: extensions/base/renameuser.py:43
+#, python-brace-format
+msgid "Renamed user \"{old_name}\" to \"{new_name}\""
+msgstr ""
+
+#: extensions/base/renameuser.py:58
+#, fuzzy, python-brace-format
+msgid ""
+"[{author}]({author_url}) renamed user *{old_name}* with {edits} edit to "
+"[{new_name}]({link}){comment}"
+msgid_plural ""
+"[{author}]({author_url}) renamed user *{old_name}* with {edits} edits to "
+"[{new_name}]({link}){comment}"
+msgstr[0] "[{author}]({author_url}) a supprimé le tableau Cargo « {table} »"
+msgstr[1] "[{author}]({author_url}) a supprimé le tableau Cargo « {table} »"
+
+#: extensions/base/renameuser.py:66
+#, fuzzy, python-brace-format
+msgid ""
+"[{author}]({author_url}) renamed user *{old_name}* to [{new_name}]({link})"
+"{comment}"
+msgstr "[{author}]({author_url}) a supprimé le tableau Cargo « {table} »"
+
+#: extensions/base/interwiki.py:37
+msgid "Added an entry to the interwiki table"
+msgstr "Ajout d'une entrée à la table interwiki"
+
+#: extensions/base/interwiki.py:38 extensions/base/interwiki.py:65
+#, python-brace-format
+msgid "Prefix: {prefix}, website: {website} | {desc}"
+msgstr "Préfixe: {prefix}, site: {website} | {desc}"
+
+#: extensions/base/interwiki.py:50
+#, fuzzy, python-brace-format
+msgid ""
+"[{author}]({author_url}) added an entry to the [interwiki table]"
+"({table_url}) pointing to {website} with {prefix} prefix"
+msgstr "Retrait d'une entrée de la table interwiki"
+
+#: extensions/base/interwiki.py:64
+msgid "Edited an entry in interwiki table"
+msgstr "Modification d'une entrée de la table interwiki"
+
+#: extensions/base/interwiki.py:77
+#, fuzzy, python-brace-format
+msgid ""
+"[{author}]({author_url}) edited an entry in [interwiki table]({table_url}) "
+"pointing to {website} with {prefix} prefix"
+msgstr "Retrait d'une entrée de la table interwiki"
+
+#: extensions/base/interwiki.py:91
+msgid "Deleted an entry in interwiki table"
+msgstr "Retrait d'une entrée de la table interwiki"
+
+#: extensions/base/interwiki.py:92
+#, python-brace-format
+msgid "Prefix: {prefix} | {desc}"
+msgstr "Préfixe: {prefix} | {desc}"
+
+#: extensions/base/interwiki.py:102
+#, fuzzy, python-brace-format
+msgid ""
+"[{author}]({author_url}) deleted an entry in [interwiki table]({table_url})"
+"{desc}"
+msgstr "Retrait d'une entrée de la table interwiki"
+
+#: extensions/base/abusefilter.py:29
+msgid "None"
+msgstr ""
+
+#: extensions/base/abusefilter.py:29
+msgid "Warning issued"
+msgstr ""
+
+#: extensions/base/abusefilter.py:29
+msgid "**Blocked user**"
+msgstr ""
+
+#: extensions/base/abusefilter.py:29
+msgid "Tagged the edit"
+msgstr ""
+
+#: extensions/base/abusefilter.py:29
+msgid "Disallowed the action"
+msgstr ""
+
+#: extensions/base/abusefilter.py:29
+msgid "**IP range blocked**"
+msgstr ""
+
+#: extensions/base/abusefilter.py:29
+msgid "Throttled actions"
+msgstr ""
+
+#: extensions/base/abusefilter.py:29
+msgid "Removed autoconfirmed group"
+msgstr ""
+
+#: extensions/base/abusefilter.py:29
+msgid "**Removed from privileged groups**"
+msgstr ""
+
+#: extensions/base/abusefilter.py:30
+msgid "Edit"
+msgstr ""
+
+#: extensions/base/abusefilter.py:30
+msgid "Upload"
+msgstr ""
+
+#: extensions/base/abusefilter.py:30
+msgid "Move"
+msgstr ""
+
+#: extensions/base/abusefilter.py:30
+msgid "Stash upload"
+msgstr ""
+
+#: extensions/base/abusefilter.py:30
+msgid "Deletion"
+msgstr ""
+
+#: extensions/base/abusefilter.py:30
+msgid "Account creation"
+msgstr ""
+
+#: extensions/base/abusefilter.py:30
+msgid "Auto account creation"
+msgstr ""
+
+#: extensions/base/abusefilter.py:54
+#, python-brace-format
+msgid "{user} triggered \"{abuse_filter}\""
+msgstr ""
+
+#: extensions/base/abusefilter.py:55
+msgid "Performed"
+msgstr ""
+
+#: extensions/base/abusefilter.py:56
+msgid "Action taken"
+msgstr ""
+
+#: extensions/base/abusefilter.py:57
+msgid "Title"
+msgstr ""
+
+#: extensions/base/abusefilter.py:66
+#, fuzzy, python-brace-format
+msgid ""
+"[{author}]({author_url}) triggered *{abuse_filter}*, performing the action "
+"\"{action}\" on *[{target}]({target_url})* - action taken: {result}."
+msgstr ""
+"Transfert des paramètres de protection de {redirect}{article} vers {title}"
+
+#: extensions/base/abusefilter.py:83
+#, python-brace-format
+msgid "Edited abuse filter number {number}"
+msgstr "Édition de la règle {number} du filtre anti-abus"
+
+#: extensions/base/abusefilter.py:95
+#, fuzzy, python-brace-format
+msgid ""
+"[{author}]({author_url}) edited abuse filter [number {number}]({filter_url})"
+msgstr "Édition de la règle {number} du filtre anti-abus"
+
+#: extensions/base/abusefilter.py:111
+#, fuzzy, python-brace-format
+msgid "Created abuse filter number {number}"
+msgstr "Édition de la règle {number} du filtre anti-abus"
+
+#: extensions/base/abusefilter.py:119
+#, fuzzy, python-brace-format
+msgid ""
+"[{author}]({author_url}) created abuse filter [number {number}]({filter_url})"
+msgstr "Édition de la règle {number} du filtre anti-abus"
+
+#: extensions/base/mediawiki.py:37
+msgid "director"
+msgstr "Directeur"
+
+#: extensions/base/mediawiki.py:37
+msgid "bot"
+msgstr "Robot"
+
+#: extensions/base/mediawiki.py:37
+msgid "editor"
+msgstr "editor"
+
+#: extensions/base/mediawiki.py:37
+msgid "directors"
+msgstr "Directeur"
+
+#: extensions/base/mediawiki.py:37
+msgid "sysop"
+msgstr "Administrateur"
+
+#: extensions/base/mediawiki.py:37
+msgid "bureaucrat"
+msgstr "Bureaucrate"
+
+#: extensions/base/mediawiki.py:37
+msgid "reviewer"
+msgstr "reviewer"
+
+#: extensions/base/mediawiki.py:38
+msgid "autoreview"
+msgstr "autoreview"
+
+#: extensions/base/mediawiki.py:38
+msgid "autopatrol"
+msgstr "autopatrol"
+
+#: extensions/base/mediawiki.py:38
+msgid "wiki_guardian"
+msgstr "Gardien du wiki"
+
+#: extensions/base/mediawiki.py:70
+msgid "(N!) "
+msgstr "(N!) "
+
+#: extensions/base/mediawiki.py:71
+msgid "m"
+msgstr "m"
+
+#: extensions/base/mediawiki.py:72
+msgid "b"
+msgstr "b"
+
+#: extensions/base/mediawiki.py:112
+#, fuzzy, python-brace-format
+msgid ""
+"[{author}]({author_url}) edited [{article}]({edit_link}){comment} {bold}"
+"({sign}{edit_size}){bold}"
+msgstr "Édition d'un commentaire sur le profil de {target}"
+
+#: extensions/base/mediawiki.py:117
+#, fuzzy, python-brace-format
+msgid ""
+"[{author}]({author_url}) created [{article}]({edit_link}){comment} {bold}"
+"({sign}{edit_size}){bold}"
+msgstr "Création d'une feuille de sprite pour {article}"
+
+#: extensions/base/mediawiki.py:190 extensions/base/mediawiki.py:223
+msgid "Options"
+msgstr "Options"
+
+#: extensions/base/mediawiki.py:190
+#, python-brace-format
+msgid "([preview]({link}) | [undo]({undolink}))"
+msgstr "([Aperçu]({link}) | [Annuler]({undolink}))"
+
+#: extensions/base/mediawiki.py:195
+#, python-brace-format
+msgid "Uploaded a new version of {name}"
+msgstr "Téléversement d'une nouvelle version de {name}"
+
+#: extensions/base/mediawiki.py:197
+#, python-brace-format
+msgid "Reverted a version of {name}"
+msgstr "Rétablissement d'une version de {name}"
+
+#: extensions/base/mediawiki.py:199
+#, python-brace-format
+msgid "Uploaded {name}"
+msgstr "Téléversement de {name}"
+
+#: extensions/base/mediawiki.py:208
+msgid "**No license!**"
+msgstr "**Aucune license!**"
+
+#: extensions/base/mediawiki.py:223
+#, python-brace-format
+msgid "([preview]({link}))"
+msgstr "([Aperçu]({link}))"
+
+#: extensions/base/mediawiki.py:228
+msgid ""
+"\n"
+"License: {}"
+msgstr ""
+"\n"
+"License: {}"
+
+#: extensions/base/mediawiki.py:237
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) reverted a version of [{file}]({file_link}){comment}"
+msgstr ""
+"[{author}]({author_url}) a rétabli une version de [{file}]({file_link})"
+"{comment}"
+
+#: extensions/base/mediawiki.py:248
+#, fuzzy, python-brace-format
+msgid ""
+"[{author}]({author_url}) uploaded a new version of [{file}]({file_link})"
+"{comment}"
+msgstr "Modification de la visibilité d'une révision de la page {article} "
+
+#: extensions/base/mediawiki.py:259
+#, fuzzy, python-brace-format
+msgid "[{author}]({author_url}) uploaded [{file}]({file_link}){comment}"
+msgstr "Modification de la visibilité d'évènements des journaux"
+
+#: extensions/base/mediawiki.py:274
+#, python-brace-format
+msgid "Deleted page {article}"
+msgstr "Suppression de la page {article}"
+
+#: extensions/base/mediawiki.py:283
+#, fuzzy, python-brace-format
+msgid "[{author}]({author_url}) deleted [{page}]({page_link}){comment}"
+msgstr "[{author}]({author_url}) a supprimé le tableau Cargo « {table} »"
+
+#: extensions/base/mediawiki.py:298
+#, python-brace-format
+msgid "Deleted redirect {article} by overwriting"
+msgstr "Suppression par écrasement de la redirection {article}"
+
+#: extensions/base/mediawiki.py:308
+#, fuzzy, python-brace-format
+msgid ""
+"[{author}]({author_url}) deleted redirect by overwriting [{page}]"
+"({page_link}){comment}"
+msgstr ""
+"Transfert des paramètres de protection de {redirect}{article} vers {title}"
+
+#: extensions/base/mediawiki.py:322
+#, python-brace-format
+msgid "Restored {article}"
+msgstr "Restauration de {article}"
+
+#: extensions/base/mediawiki.py:331
+#, fuzzy, python-brace-format
+msgid "[{author}]({author_url}) restored [{article}]({article_url}){comment}"
+msgstr "Modification de la visibilité d'une révision de la page {article} "
+
+#: extensions/base/mediawiki.py:348
+msgid "Changed visibility of log events"
+msgstr "Modification de la visibilité d'évènements des journaux"
+
+#: extensions/base/mediawiki.py:356
+#, fuzzy, python-brace-format
+msgid "[{author}]({author_url}) changed visibility of log events{comment}"
+msgstr "Modification de la visibilité d'évènements des journaux"
+
+#: extensions/base/mediawiki.py:370
+#, python-brace-format
+msgid "Changed visibility of revision on page {article} "
+msgid_plural "Changed visibility of {amount} revisions on page {article} "
+msgstr[0] "Modification de la visibilité d'une révision de la page {article} "
+msgstr[1] ""
+"Modification de la visibilité de {amount} révisions sur la page {article} "
+
+#: extensions/base/mediawiki.py:383
+#, fuzzy, python-brace-format
+msgid ""
+"[{author}]({author_url}) changed visibility of revision on page [{article}]"
+"({article_url}){comment}"
+msgid_plural ""
+"[{author}]({author_url}) changed visibility of {amount} revisions on page "
+"[{article}]({article_url}){comment}"
+msgstr[0] "Modification de la visibilité d'une révision de la page {article} "
+msgstr[1] ""
+"Modification de la visibilité de {amount} révisions sur la page {article} "
+
+#: extensions/base/mediawiki.py:399 extensions/base/mediawiki.py:432
+msgid "No redirect has been made"
+msgstr "Aucune redirection créée"
+
+#: extensions/base/mediawiki.py:400 extensions/base/mediawiki.py:433
+msgid "A redirect has been made"
+msgstr "Une redirection a été créée"
+
+#: extensions/base/mediawiki.py:401
+#, python-brace-format
+msgid "Moved {redirect}{article} to {target}"
+msgstr "Déplacement de {redirect}{article} vers {target}"
+
+#: extensions/base/mediawiki.py:412 extensions/base/mediawiki.py:444
+msgid "without making a redirect"
+msgstr ""
+
+#: extensions/base/mediawiki.py:413 extensions/base/mediawiki.py:445
+msgid "with a redirect"
+msgstr ""
+
+#: extensions/base/mediawiki.py:416
+#, fuzzy, python-brace-format
+msgid ""
+"[{author}]({author_url}) moved {redirect}*{article}* to [{target}]"
+"({target_url}) {made_a_redirect}{comment}"
+msgstr ""
+"Transfert des paramètres de protection de {redirect}{article} vers {title}"
+
+#: extensions/base/mediawiki.py:434
+#, python-brace-format
+msgid "Moved {redirect}{article} to {title} over redirect"
+msgstr "Déplacement de {redirect}{article} vers {title} par redirection"
+
+#: extensions/base/mediawiki.py:448
+#, fuzzy, python-brace-format
+msgid ""
+"[{author}]({author_url}) moved {redirect}*{article}* over redirect to "
+"[{target}]({target_url}) {made_a_redirect}{comment}"
+msgstr ""
+"Transfert des paramètres de protection de {redirect}{article} vers {title}"
+
+#: extensions/base/mediawiki.py:464
+#, python-brace-format
+msgid "Moved protection settings from {redirect}{article} to {title}"
+msgstr ""
+"Transfert des paramètres de protection de {redirect}{article} vers {title}"
+
+#: extensions/base/mediawiki.py:477
+#, fuzzy, python-brace-format
+msgid ""
+"[{author}]({author_url}) moved protection settings from {redirect}*{article}"
+"* to [{target}]({target_url}){comment}"
+msgstr ""
+"Transfert des paramètres de protection de {redirect}{article} vers {title}"
+
+#: extensions/base/mediawiki.py:492
+#, python-brace-format
+msgid "Protected {target}"
+msgstr "Protection de {target}"
+
+#: extensions/base/mediawiki.py:495 extensions/base/mediawiki.py:510
+#: extensions/base/mediawiki.py:526 extensions/base/mediawiki.py:541
+msgid " [cascading]"
+msgstr " [protection en cascade]"
+
+#: extensions/base/mediawiki.py:506
+#, fuzzy, python-brace-format
+msgid ""
+"[{author}]({author_url}) protected [{article}]({article_url}) with the "
+"following settings: {settings}{comment}"
+msgstr "Modification des paramètres de blocage pour {blocked_user}"
+
+#: extensions/base/mediawiki.py:523
+#, python-brace-format
+msgid "Changed protection level for {article}"
+msgstr "Modification du niveau de protection de {article}"
+
+#: extensions/base/mediawiki.py:537
+#, fuzzy, python-brace-format
+msgid ""
+"[{author}]({author_url}) modified protection settings of [{article}]"
+"({article_url}) to: {settings}{comment}"
+msgstr ""
+"Transfert des paramètres de protection de {redirect}{article} vers {title}"
+
+#: extensions/base/mediawiki.py:554
+#, python-brace-format
+msgid "Removed protection from {article}"
+msgstr "Retrait de la protection de {article}"
+
+#: extensions/base/mediawiki.py:563
+#, fuzzy, python-brace-format
+msgid ""
+"[{author}]({author_url}) removed protection from [{article}]({article_url})"
+"{comment}"
+msgstr "Création d'une feuille de sprite pour {article}"
+
+#: extensions/base/mediawiki.py:572
+#, fuzzy
+msgid "for infinity and beyond"
+msgstr "toujours"
+
+#: extensions/base/mediawiki.py:581
+msgid "for less than a minute"
+msgstr ""
+
+#: extensions/base/mediawiki.py:583
+msgid "year"
+msgid_plural "years"
+msgstr[0] "année"
+msgstr[1] "années"
+
+#: extensions/base/mediawiki.py:583
+msgid "day"
+msgid_plural "days"
+msgstr[0] "jour"
+msgstr[1] "jours"
+
+#: extensions/base/mediawiki.py:583
+msgid "hour"
+msgid_plural "hours"
+msgstr[0] "heure"
+msgstr[1] "heures"
+
+#: extensions/base/mediawiki.py:584
+msgid "minute"
+msgid_plural "minutes"
+msgstr[0] "minute"
+msgstr[1] "minutes"
+
+#: extensions/base/mediawiki.py:589
+#, python-brace-format
+msgid "for {time_number} {time_unit}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:608
+msgid "Blocked from editing the following pages: "
+msgstr "Ne peut plus modifier les pages suivantes : "
+
+#: extensions/base/mediawiki.py:615 extensions/base/mediawiki.py:661
+msgid " and namespaces: "
+msgstr " et ces espaces de noms: "
+
+#: extensions/base/mediawiki.py:617
+msgid "Blocked from editing pages on following namespaces: "
+msgstr "Ne peut plus modifier les pages des espaces de noms suivants : "
+
+#: extensions/base/mediawiki.py:628
+msgid "Partial block details"
+msgstr "Détails partiaux du blocage"
+
+#: extensions/base/mediawiki.py:631
+msgid "Block flags"
+msgstr ""
+
+#: extensions/base/mediawiki.py:633
+#, fuzzy, python-brace-format
+msgid "Blocked {blocked_user} {time}"
+msgstr "{blocked_user} a été bloqué pour {time}"
+
+#: extensions/base/mediawiki.py:653
+msgid " on pages: "
+msgstr " on pages: "
+
+#: extensions/base/mediawiki.py:663
+msgid " on namespaces: "
+msgstr " on namespaces: "
+
+#: extensions/base/mediawiki.py:675
+#, fuzzy, python-brace-format
+msgid ""
+"[{author}]({author_url}) blocked [{user}]({user_url}) {time}"
+"{restriction_desc}{comment}"
+msgstr "Modification des paramètres de blocage pour {blocked_user}"
+
+#: extensions/base/mediawiki.py:693
+#, python-brace-format
+msgid "Changed block settings for {blocked_user}"
+msgstr "Modification des paramètres de blocage pour {blocked_user}"
+
+#: extensions/base/mediawiki.py:703
+#, fuzzy, python-brace-format
+msgid ""
+"[{author}]({author_url}) changed block settings for [{blocked_user}]"
+"({user_url}){comment}"
+msgstr "Modification des paramètres de blocage pour {blocked_user}"
+
+#: extensions/base/mediawiki.py:716
+#, python-brace-format
+msgid "Unblocked {blocked_user}"
+msgstr "{blocked_user} a été débloqué"
+
+#: extensions/base/mediawiki.py:726
+#, fuzzy, python-brace-format
+msgid ""
+"[{author}]({author_url}) unblocked [{blocked_user}]({user_url}){comment}"
+msgstr "Modification des paramètres de blocage pour {blocked_user}"
+
+#: extensions/base/mediawiki.py:742
+#, fuzzy
+msgid "Action has been hidden by administration"
+msgstr "L'action a été masquée par le personnel de Gamepedia."
+
+#: extensions/base/mediawiki.py:749
+#, fuzzy
+msgid "An action has been hidden by administration."
+msgstr "L'action a été masquée par le personnel de Gamepedia."
+
+#: extensions/base/mediawiki.py:760
+#, python-brace-format
+msgid "Imported {article} with {count} revision"
+msgid_plural "Imported {article} with {count} revisions"
+msgstr[0] "Article {article} importé avec {count} révision"
+msgstr[1] "Article {article} importé avec {count} révisions"
+
+#: extensions/base/mediawiki.py:771
+#, fuzzy, python-brace-format
+msgid ""
+"[{author}]({author_url}) imported [{article}]({article_url}) with {count} "
+"revision{comment}"
+msgid_plural ""
+"[{author}]({author_url}) imported [{article}]({article_url}) with {count} "
+"revisions{comment}"
+msgstr[0] "Modification des paramètres de blocage pour {blocked_user}"
+msgstr[1] "Modification des paramètres de blocage pour {blocked_user}"
+
+#: extensions/base/mediawiki.py:787
+#, fuzzy, python-brace-format
+msgid "Imported {article} with {count} revision from \"{source}\""
+msgid_plural "Imported {article} with {count} revisions from \"{source}\""
+msgstr[0] "Article {article} importé avec {count} révision"
+msgstr[1] "Article {article} importé avec {count} révisions"
+
+#: extensions/base/mediawiki.py:802
+#, fuzzy, python-brace-format
+msgid ""
+"[{author}]({author_url}) imported [{article}]({article_url}) with {count} "
+"revision from [{source}]({source_url}){comment}"
+msgid_plural ""
+"[{author}]({author_url}) imported [{article}]({article_url}) with {count} "
+"revisions from [{source}]({source_url}){comment}"
+msgstr[0] "Modification des paramètres de blocage pour {blocked_user}"
+msgstr[1] "Modification des paramètres de blocage pour {blocked_user}"
+
+#: extensions/base/mediawiki.py:817
+#, python-brace-format
+msgid " (until {date_and_time})"
+msgstr ""
+
+#: extensions/base/mediawiki.py:834
+#, python-brace-format
+msgid "Changed group membership for {target}"
+msgstr "Modification des groupes pour {target}"
+
+#: extensions/base/mediawiki.py:836
+msgid "System"
+msgstr "Système"
+
+#: extensions/base/mediawiki.py:837
+#, python-brace-format
+msgid "{target} got autopromoted to a new usergroup"
+msgstr "{target} a été auto-promu dans un nouveau groupe"
+
+#: extensions/base/mediawiki.py:843
+#, fuzzy
+msgid "Added group"
+msgid_plural "Added groups"
+msgstr[0] "Retirés"
+msgstr[1] "Retirés"
+
+#: extensions/base/mediawiki.py:845
+#, fuzzy
+msgid "Removed group"
+msgid_plural "Removed groups"
+msgstr[0] "Retirés"
+msgstr[1] "Retirés"
+
+#: extensions/base/mediawiki.py:859
+#, python-brace-format
+msgid "Added to {added} and removed from {removed}."
+msgstr ""
+
+#: extensions/base/mediawiki.py:860 extensions/base/mediawiki.py:862
+#: extensions/base/mediawiki.py:864 extensions/base/mediawiki.py:871
+msgid ", "
+msgstr ""
+
+#: extensions/base/mediawiki.py:862
+#, python-brace-format
+msgid "Added to {added}."
+msgstr ""
+
+#: extensions/base/mediawiki.py:864
+#, fuzzy, python-brace-format
+msgid "Removed from {removed}."
+msgstr "Retirés"
+
+#: extensions/base/mediawiki.py:865
+#, fuzzy, python-brace-format
+msgid ""
+"[{author}]({author_url}) changed group membership for [{target}]"
+"({target_url}): {group_changes}{comment}"
+msgstr "Modification de la visibilité d'une révision de la page {article} "
+
+#: extensions/base/mediawiki.py:869
+#, fuzzy, python-brace-format
+msgid "The system autopromoted [{target}]({target_url}) to {added}.{comment}"
+msgstr "Modification de la visibilité d'une révision de la page {article} "
+
+#: extensions/base/mediawiki.py:882
+#, python-brace-format
+msgid "Merged revision histories of {article} into {dest}"
+msgstr "Fusion de l'historique de {article} vers {dest}"
+
+#: extensions/base/mediawiki.py:896
+#, fuzzy, python-brace-format
+msgid ""
+"[{author}]({author_url}) merged revision histories of [{article}]"
+"({article_url}) into [{dest}]({dest_url}){comment}"
+msgstr ""
+"Transfert des paramètres de protection de {redirect}{article} vers {title}"
+
+#: extensions/base/mediawiki.py:910
+msgid "Created account automatically"
+msgstr ""
+
+#: extensions/base/mediawiki.py:917
+#, fuzzy, python-brace-format
+msgid "Account [{author}]({author_url}) was created automatically"
+msgstr "[{author}]({author_url}) a créé le tableau Cargo « {table} »"
+
+#: extensions/base/mediawiki.py:930 extensions/base/mediawiki.py:995
+msgid "Created account"
+msgstr ""
+
+#: extensions/base/mediawiki.py:937 extensions/base/mediawiki.py:1002
+#, fuzzy, python-brace-format
+msgid "Account [{author}]({author_url}) was created"
+msgstr "[{author}]({author_url}) a créé le tableau Cargo « {table} »"
+
+#: extensions/base/mediawiki.py:949
+#, fuzzy, python-brace-format
+msgid "Created account {article}"
+msgstr "Suppression de la page {article}"
+
+#: extensions/base/mediawiki.py:958
+#, fuzzy, python-brace-format
+msgid ""
+"Account [{article}]({article_url}) was created by [{author}]({author_url})"
+"{comment}"
+msgstr "Modification de la visibilité d'une révision de la page {article} "
+
+#: extensions/base/mediawiki.py:971
+#, python-brace-format
+msgid "Created account {article} and password was sent by email"
+msgstr ""
+
+#: extensions/base/mediawiki.py:982
+#, python-brace-format
+msgid ""
+"Account [{article}]({article_url}) was created by [{author}]({author_url}) "
+"and password was sent by email{comment}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:1014
+#, python-brace-format
+msgid "Changed the content model of the page {article}"
+msgstr "Modification du modèle de contenu de l'article {article}"
+
+#: extensions/base/mediawiki.py:1016
+#, python-brace-format
+msgid "Model changed from {old} to {new}: {reason}"
+msgstr "Modèle changé de {old} à {new}: {reason}"
+
+#: extensions/base/mediawiki.py:1028
+#, fuzzy, python-brace-format
+msgid ""
+"[{author}]({author_url}) changed the content model of the page [{article}]"
+"({article_url}) from {old} to {new}{comment}"
+msgstr "Modification de la visibilité d'une révision de la page {article} "
+
+#: extensions/base/mediawiki.py:1043
+#, python-brace-format
+msgid "Created the page {article} using a non-default content model"
+msgstr ""
+
+#: extensions/base/mediawiki.py:1045
+#, fuzzy, python-brace-format
+msgid "Created with model {new}: {reason}"
+msgstr "Modèle changé de {old} à {new}: {reason}"
+
+#: extensions/base/mediawiki.py:1056
+#, fuzzy, python-brace-format
+msgid ""
+"[{author}]({author_url}) created the page [{article}]({article_url}) using a "
+"non-default content model {new}{comment}"
+msgstr "Modification de la visibilité d'une révision de la page {article} "
+
+#: extensions/base/mediawiki.py:1071
+#, fuzzy, python-brace-format
+msgid "Created the tag \"{tag}\""
+msgstr "Création du tag « {tag} »"
+
+#: extensions/base/mediawiki.py:1081
+#, fuzzy, python-brace-format
+msgid ""
+"[{author}]({author_url}) created the [tag]({tag_url}) \"{tag}\"{comment}"
+msgstr "[{author}]({author_url}) a créé le tableau Cargo « {table} »"
+
+#: extensions/base/mediawiki.py:1102
+#, fuzzy, python-brace-format
+msgid "Deleted the tag \"{tag}\""
+msgstr "Suppression du tag « {tag} »"
+
+#: extensions/base/mediawiki.py:1104
+#, fuzzy
+msgid "Removed from"
+msgstr "Retirés"
+
+#: extensions/base/mediawiki.py:1104
+msgid "{} revision or log entry"
+msgid_plural "{} revisions and/or log entries"
+msgstr[0] ""
+msgstr[1] ""
+
+#: extensions/base/mediawiki.py:1117
+#, fuzzy, python-brace-format
+msgid ""
+"[{author}]({author_url}) deleted the [tag]({tag_url}) \"{tag}\"{comment}"
+msgstr "[{author}]({author_url}) a supprimé le tableau Cargo « {table} »"
+
+#: extensions/base/mediawiki.py:1127
+#, fuzzy, python-brace-format
+msgid ""
+"[{author}]({author_url}) deleted the [tag]({tag_url}) \"{tag}\" and removed "
+"it from {count} revision or log entry{comment}"
+msgid_plural ""
+"[{author}]({author_url}) deleted the [tag]({tag_url}) \"{tag}\" and removed "
+"it from {count} revisions and/or log entries{comment}"
+msgstr[0] "Modification des paramètres de blocage pour {blocked_user}"
+msgstr[1] "Modification des paramètres de blocage pour {blocked_user}"
+
+#: extensions/base/mediawiki.py:1144
+#, fuzzy, python-brace-format
+msgid "Activated the tag \"{tag}\""
+msgstr "Activation du tag « {tag} »"
+
+#: extensions/base/mediawiki.py:1153
+#, fuzzy, python-brace-format
+msgid ""
+"[{author}]({author_url}) activated the [tag]({tag_url}) \"{tag}\"{comment}"
+msgstr "[{author}]({author_url}) a créé le tableau Cargo « {table} »"
+
+#: extensions/base/mediawiki.py:1172
+#, fuzzy, python-brace-format
+msgid "Deactivated the tag \"{tag}\""
+msgstr "Désactivation du tag « {tag} »"
+
+#: extensions/base/mediawiki.py:1181
+#, fuzzy, python-brace-format
+msgid ""
+"[{author}]({author_url}) deactivated the [tag]({tag_url}) \"{tag}\"{comment}"
+msgstr "[{author}]({author_url}) a recréé le tableau Cargo « {table} »"
+
+#: extensions/base/sprite.py:37
+#, python-brace-format
+msgid "Edited the sprite for {article}"
+msgstr "Édition du sprite de {article}"
+
+#: extensions/base/sprite.py:45
+#, fuzzy, python-brace-format
+msgid ""
+"[{author}]({author_url}) edited the sprite for [{article}]({article_url})"
+msgstr "Création d'une feuille de sprite pour {article}"
+
+#: extensions/base/sprite.py:60
+#, python-brace-format
+msgid "Created the sprite sheet for {article}"
+msgstr "Création d'une feuille de sprite pour {article}"
+
+#: extensions/base/sprite.py:68
+#, fuzzy, python-brace-format
+msgid ""
+"[{author}]({author_url}) created the sprite sheet for [{article}]"
+"({article_url})"
+msgstr "Création d'une feuille de sprite pour {article}"
+
+#: extensions/base/sprite.py:79
+#, python-brace-format
+msgid "Edited the slice for {article}"
+msgstr "Edited the slice for {article}"
+
+#: extensions/base/sprite.py:86
+#, fuzzy, python-brace-format
+msgid ""
+"[{author}]({author_url}) edited the slice for [{article}]({article_url})"
+msgstr "Création d'une feuille de sprite pour {article}"
+
+#~ msgid "Daily overview"
+#~ msgstr "Résumé de la journée"
+
+#~ msgid "No activity"
+#~ msgstr "Aucune activité"
+
+#~ msgid " ({} action)"
+#~ msgid_plural " ({} actions)"
+#~ msgstr[0] " ({} action)"
+#~ msgstr[1] " ({} actions)"
+
+#~ msgid " ({} edit)"
+#~ msgid_plural " ({} edits)"
+#~ msgstr[0] " ({} modification)"
+#~ msgstr[1] " ({} modifications)"
+
+#~ msgid " UTC ({} action)"
+#~ msgid_plural " UTC ({} actions)"
+#~ msgstr[0] " UTC ({} action)"
+#~ msgstr[1] " UTC ({} actions)"
+
+#~ msgid "But nobody came"
+#~ msgstr "Aucune activité"
+
+#~ msgid "Most active user"
+#~ msgid_plural "Most active users"
+#~ msgstr[0] "Membre le plus actif"
+#~ msgstr[1] "Membres les plus actifs"
+
+#~ msgid "Most edited article"
+#~ msgid_plural "Most edited articles"
+#~ msgstr[0] "Article le plus modifié"
+#~ msgstr[1] "Articles les plus modifiés"
+
+#~ msgid "Edits made"
+#~ msgstr "Modifications effectuées"
+
+#~ msgid "New files"
+#~ msgstr "Nouveaux fichiers"
+
+#~ msgid "Admin actions"
+#~ msgstr "Actions d'administrateur"
+
+#~ msgid "Bytes changed"
+#~ msgstr "Octets modifiés"
+
+#~ msgid "New articles"
+#~ msgstr "Nouveaux articles"
+
+#~ msgid "Unique contributors"
+#~ msgstr "Contributeurs uniques"
+
+#~ msgid "Most active hour"
+#~ msgid_plural "Most active hours"
+#~ msgstr[0] "Heure la plus active"
+#~ msgstr[1] "Heures les plus actives"
+
+#~ msgid "Day score"
+#~ msgstr "Score du jour"
+
+#~ msgid "No description provided"
+#~ msgstr "Aucune description"
+
+#~ msgid "second"
+#~ msgid_plural "seconds"
+#~ msgstr[0] "seconde"
+#~ msgstr[1] "secondes"
+
+#~ msgid "week"
+#~ msgid_plural "weeks"
+#~ msgstr[0] "semaine"
+#~ msgstr[1] "semaines"
+
+#~ msgid "month"
+#~ msgid_plural "months"
+#~ msgstr[0] "mois"
+#~ msgstr[1] "mois"
+
+#~ msgid "millennium"
+#~ msgid_plural "millennia"
+#~ msgstr[0] "millénaire"
+#~ msgstr[1] "millénaires"
+
+#~ msgid "decade"
+#~ msgid_plural "decades"
+#~ msgstr[0] "décennie"
+#~ msgstr[1] "décennies"
+
+#~ msgid "century"
+#~ msgid_plural "centuries"
+#~ msgstr[0] "centenaire"
+#~ msgstr[1] "centenaires"
+
+#~ msgid "none"
+#~ msgstr "aucun"
+
+#, fuzzy, python-brace-format
+#~ msgid ""
+#~ "[{author}]({author_url}) completed deletion of translatable page "
+#~ "[{article}]({article_url}){comment}"
+#~ msgstr "Création d'une feuille de sprite pour {article}"
+
+#, python-brace-format
+#~ msgid "Groups changed from {old_groups} to {new_groups}{reason}"
+#~ msgstr "Groupe modifié de {old_groups} vers {new_groups}{reason}"
+
+#, fuzzy, python-brace-format
+#~ msgid "[{author}]({author_url}) restored a wiki *{wiki_name}*{comment}"
+#~ msgstr "Modification de la visibilité d'évènements des journaux"
+
+#, fuzzy, python-brace-format
+#~ msgid "[{author}]({author_url}) deleted a comment on {target}'s profile"
+#~ msgstr "Retrait d'un commentaire sur le profil de {target}"
+
+#, fuzzy, python-brace-format
+#~ msgid "[{author}]({author_url}) deleted a comment on their own profile"
+#~ msgstr "Retrait d'un commentaire sur le profil de {target}"
+
+#, fuzzy, python-brace-format
+#~ msgid "[{author}]({author_url}) imported interwiki{comment}"
+#~ msgstr "Modification de la visibilité d'évènements des journaux"
+
+#~ msgid "Imported interwiki"
+#~ msgstr "Importation d'interwiki"
+
+#, fuzzy
+#~ msgid "their own profile"
+#~ msgstr "Modification de son propre profil"
+
+#, fuzzy
+#~ msgid "their own"
+#~ msgstr "Modification de son propre profil"
diff --git a/locale/fr/LC_MESSAGES/misc.mo b/locale/fr/LC_MESSAGES/misc.mo
index 808593d..837cb37 100644
Binary files a/locale/fr/LC_MESSAGES/misc.mo and b/locale/fr/LC_MESSAGES/misc.mo differ
diff --git a/locale/fr/LC_MESSAGES/misc.po b/locale/fr/LC_MESSAGES/misc.po
index 907b861..eac0702 100644
--- a/locale/fr/LC_MESSAGES/misc.po
+++ b/locale/fr/LC_MESSAGES/misc.po
@@ -6,7 +6,7 @@ msgid ""
msgstr ""
"Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2020-11-28 23:45+0100\n"
+"POT-Creation-Date: 2021-07-11 14:32+0200\n"
"PO-Revision-Date: 2020-03-17 21:40+0100\n"
"Last-Translator: Frisk <>\n"
"Language-Team: \n"
@@ -72,7 +72,7 @@ msgstr ""
msgid "Battle.net handle"
msgstr ""
-#: src/misc.py:119
+#: src/misc.py:139
msgid ""
"\n"
"__And more__"
@@ -80,11 +80,11 @@ msgstr ""
"\n"
"__Et plus__"
-#: src/misc.py:276
+#: src/misc.py:328
msgid "Unknown"
msgstr "Inconnu"
-#: src/misc.py:278
+#: src/misc.py:330
#, fuzzy
msgid "unknown"
msgstr "Inconnu"
diff --git a/locale/fr/LC_MESSAGES/rc.mo b/locale/fr/LC_MESSAGES/rc.mo
index 33627f1..8781f98 100644
Binary files a/locale/fr/LC_MESSAGES/rc.mo and b/locale/fr/LC_MESSAGES/rc.mo differ
diff --git a/locale/fr/LC_MESSAGES/rc.po b/locale/fr/LC_MESSAGES/rc.po
index 8317435..eb733b4 100644
--- a/locale/fr/LC_MESSAGES/rc.po
+++ b/locale/fr/LC_MESSAGES/rc.po
@@ -7,17 +7,17 @@ msgstr ""
"Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2020-12-23 00:28+0100\n"
-"PO-Revision-Date: 2020-03-17 21:40+0100\n"
-"Last-Translator: Frisk <>\n"
-"Language-Team: \n"
+"PO-Revision-Date: 2021-05-06 14:10+0000\n"
+"Last-Translator: Arnaud0865 \n"
+"Language-Team: French \n"
"Language: fr\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n > 1;\n"
+"X-Generator: Weblate 4.6\n"
"Generated-By: pygettext.py 1.5\n"
-"X-Generator: Poedit 2.3\n"
"X-Poedit-Basepath: ../../..\n"
-"Plural-Forms: nplurals=2; plural=(n > 1);\n"
"X-Poedit-SearchPath-0: rcgcdw.pot\n"
#: src/rc.py:322
@@ -36,8 +36,8 @@ msgstr "La connexion avec {wiki} semble stable maintenant."
#: src/rc.py:404
msgid "~~hidden~~"
-msgstr ""
+msgstr "~~caché~~"
#: src/rc.py:408
msgid "hidden"
-msgstr ""
+msgstr "caché"
diff --git a/locale/fr/LC_MESSAGES/rc_formatters.mo b/locale/fr/LC_MESSAGES/rc_formatters.mo
deleted file mode 100644
index 0934919..0000000
Binary files a/locale/fr/LC_MESSAGES/rc_formatters.mo and /dev/null differ
diff --git a/locale/fr/LC_MESSAGES/rc_formatters.po b/locale/fr/LC_MESSAGES/rc_formatters.po
index 47a33f7..28d1ca1 100644
--- a/locale/fr/LC_MESSAGES/rc_formatters.po
+++ b/locale/fr/LC_MESSAGES/rc_formatters.po
@@ -7,17 +7,18 @@ msgstr ""
"Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2021-04-14 16:24+0200\n"
-"PO-Revision-Date: 2020-03-17 21:40+0100\n"
-"Last-Translator: Frisk <>\n"
-"Language-Team: \n"
+"PO-Revision-Date: 2021-05-06 14:10+0000\n"
+"Last-Translator: magiczocker \n"
+"Language-Team: French \n"
"Language: fr\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n > 1;\n"
+"X-Generator: Weblate 4.6\n"
"Generated-By: pygettext.py 1.5\n"
-"X-Generator: Poedit 2.3\n"
"X-Poedit-Basepath: ../../..\n"
-"Plural-Forms: nplurals=2; plural=(n > 1);\n"
"X-Poedit-SearchPath-0: rcgcdw.pot\n"
#: src/rc_formatters.py:28
@@ -1287,9 +1288,9 @@ msgid ""
msgstr ""
#: src/rc_formatters.py:1195
-#, fuzzy, python-brace-format
+#, python-brace-format
msgid "Completed deletion of translation page \"{article}\""
-msgstr "Modification de la visibilité d'une révision de la page {article} "
+msgstr "Modification de la visibilité d'une révision de la page {article}"
#: src/rc_formatters.py:1198
#, python-brace-format
diff --git a/locale/fr/LC_MESSAGES/rcgcdw.po b/locale/fr/LC_MESSAGES/rcgcdw.po
index 75d19f4..7b9f2cb 100644
--- a/locale/fr/LC_MESSAGES/rcgcdw.po
+++ b/locale/fr/LC_MESSAGES/rcgcdw.po
@@ -6,7 +6,7 @@ msgid ""
msgstr ""
"Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2020-12-23 00:28+0100\n"
+"POT-Creation-Date: 2021-07-11 14:32+0200\n"
"PO-Revision-Date: 2020-12-13 14:30+0000\n"
"Last-Translator: magiczocker \n"
"Language-Team: French \n"
"Language-Team: French 1;\n"
"X-Generator: Weblate 4.4.2\n"
-#: src/discord/redaction.py:62 src/discord/redaction.py:65
-#: src/discord/redaction.py:70
-msgid "Removed"
-msgstr "Retiré"
+#: src/discord/redaction.py:77
+msgid "hidden"
+msgstr ""
+
+#: src/discord/redaction.py:80 src/discord/redaction.py:85
+msgid "~~hidden~~"
+msgstr ""
+
+#~ msgid "Removed"
+#~ msgstr "Retiré"
diff --git a/locale/hi/LC_MESSAGES/discussion_formatters.mo b/locale/hi/LC_MESSAGES/discussion_formatters.mo
deleted file mode 100644
index fb9d901..0000000
Binary files a/locale/hi/LC_MESSAGES/discussion_formatters.mo and /dev/null differ
diff --git a/locale/hi/LC_MESSAGES/discussion_formatters.po b/locale/hi/LC_MESSAGES/discussion_formatters.po
deleted file mode 100644
index 3356f74..0000000
--- a/locale/hi/LC_MESSAGES/discussion_formatters.po
+++ /dev/null
@@ -1,185 +0,0 @@
-# SOME DESCRIPTIVE TITLE.
-# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
-# This file is distributed under the same license as the RcGcDw package.
-# FIRST AUTHOR , YEAR.
-#
-msgid ""
-msgstr ""
-"Project-Id-Version: RcGcDw\n"
-"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2020-12-23 00:28+0100\n"
-"PO-Revision-Date: 2020-12-13 14:30+0000\n"
-"Last-Translator: MarkusRost \n"
-"Language-Team: Hindi \n"
-"Language: hi\n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=UTF-8\n"
-"Content-Transfer-Encoding: 8bit\n"
-"Plural-Forms: nplurals=2; plural=n > 1;\n"
-"X-Generator: Weblate 4.2.1\n"
-
-#: src/discussion_formatters.py:21 src/discussion_formatters.py:56
-#: src/discussion_formatters.py:67 src/discussion_formatters.py:95
-#: src/discussion_formatters.py:163 src/discussion_formatters.py:176
-msgid "unknown"
-msgstr "अनजान"
-
-#: src/discussion_formatters.py:27 src/discussion_formatters.py:102
-msgid "Unregistered user"
-msgstr "अनरेजिसटर्ड सदस्य"
-
-#: src/discussion_formatters.py:39
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) created [{title}](<{url}f/p/{threadId}>) in "
-"{forumName}"
-msgstr ""
-"[{author}]({author_url}) ने {forumName} में [{title}](<{url}f/p/{threadId}>) "
-"बनाया"
-
-#: src/discussion_formatters.py:42
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) created a poll [{title}](<{url}f/p/{threadId}>) in "
-"{forumName}"
-msgstr ""
-"[{author}]({author_url}) ने {forumName} में पॉल [{title}](<{url}f/p/{threadId}"
-">) बनाया"
-
-#: src/discussion_formatters.py:45
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) created a quiz [{title}](<{url}f/p/{threadId}>) in "
-"{forumName}"
-msgstr ""
-"[{author}]({author_url}) ने {forumName} में क्विज़ [{title}](<{url}f/p/{threadId}"
-">) बनाया"
-
-#: src/discussion_formatters.py:54
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) created a [reply](<{url}f/p/{threadId}/r/{postId}>) "
-"to [{title}](<{url}f/p/{threadId}>) in {forumName}"
-msgstr ""
-"[{author}]({author_url}) ने {forumName} में [{title}](<{url}f/p/{threadId}>) पर "
-"[जवाब](<{url}f/p/{threadId}/r/{postId}>) दिया"
-
-#: src/discussion_formatters.py:61
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) created [{title}](<{url}wiki/Message_Wall:"
-"{user_wall}?threadId={threadId}>) on [{user}'s Message Wall](<{url}wiki/"
-"Message_Wall:{user_wall}>)"
-msgstr ""
-"[{author}]({author_url}) ने [{user} के मैसेज वॉल](<{url}wiki/Message_Wall:"
-"{user_wall}>) पर [{title}](<{url}wiki/Message_Wall:{user_wall}?"
-"threadId={threadId}>) बनाया"
-
-#: src/discussion_formatters.py:64
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) created a [reply](<{url}wiki/Message_Wall:"
-"{user_wall}?threadId={threadId}#{replyId}>) to [{title}](<{url}wiki/"
-"Message_Wall:{user_wall}?threadId={threadId}>) on [{user}'s Message Wall]"
-"(<{url}wiki/Message_Wall:{user_wall}>)"
-msgstr ""
-"[{author}]({author_url}) ने [{user} के मैसेज वॉल](<{url}wiki/Message_Wall:"
-"{user_wall}>) के [{title}](<{url}wiki/Message_Wall:{user_wall}?"
-"threadId={threadId}>) पर [जवाब](<{url}wiki/Message_Wall:{user_wall}?"
-"threadId={threadId}#{replyId}>) दिया"
-
-#: src/discussion_formatters.py:72
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) created a [comment](<{url}?commentId={commentId}>) "
-"on [{article}](<{url}>)"
-msgstr ""
-"[{author}]({author_url}) ने [{article}](<{url}>) पर [कमेंट](<{url}?"
-"commentId={commentId}>) किया"
-
-#: src/discussion_formatters.py:78
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) created a [reply](<{url}?commentId={commentId}"
-"&replyId={replyId}>) to a [comment](<{url}?commentId={commentId}>) on "
-"[{article}](<{url}>)"
-msgstr ""
-"[{author}]({author_url}) ने [{article}](<{url}>) के एक [कमेंट](<{url}?"
-"commentId={commentId}>) पर [जवाब](<{url}?commentId={commentId}"
-"&replyId={replyId}>) दिया"
-
-#: src/discussion_formatters.py:86
-#, python-brace-format
-msgid ""
-"Unknown event `{event}` by [{author}]({author_url}), report it on the "
-"[support server](<{support}>)."
-msgstr ""
-"[{author}]({author_url}) द्वारा अनजान घटना `{event}`, [सहायता सर्वर](<{support}"
-">) पर रिपोर्ट करें।"
-
-#: src/discussion_formatters.py:123
-#, python-brace-format
-msgid "Created \"{title}\""
-msgstr "\"{title}\" बनाया"
-
-#: src/discussion_formatters.py:127
-#, python-brace-format
-msgid "Created a poll \"{title}\""
-msgstr "पॉल \"{title}\" बनाया"
-
-#: src/discussion_formatters.py:134
-msgid "Option {}"
-msgstr "विकल्प {}"
-
-#: src/discussion_formatters.py:135
-#, python-brace-format
-msgid "__[View image]({image_url})__"
-msgstr "__[चित्र देखें]({image_url})__"
-
-#: src/discussion_formatters.py:139
-#, python-brace-format
-msgid "Created a quiz \"{title}\""
-msgstr "एक क्विज़ \"{title}\" बनाया"
-
-#: src/discussion_formatters.py:155 src/discussion_formatters.py:157
-msgid "Tags"
-msgstr "टैग"
-
-#: src/discussion_formatters.py:155
-msgid "{} tags"
-msgstr "{} टैग"
-
-#: src/discussion_formatters.py:160
-#, python-brace-format
-msgid "Replied to \"{title}\""
-msgstr "\"{title}\" पर जवाब दिया"
-
-#: src/discussion_formatters.py:169
-#, python-brace-format
-msgid "Created \"{title}\" on {user}'s Message Wall"
-msgstr "{user} के मैसेज वॉल पर \"{title}\" बनाया"
-
-#: src/discussion_formatters.py:173
-#, python-brace-format
-msgid "Replied to \"{title}\" on {user}'s Message Wall"
-msgstr "{user} के मैसेज वॉल के \"{title}\" पर जवाब दिया"
-
-#: src/discussion_formatters.py:180
-#, python-brace-format
-msgid "Commented on {article}"
-msgstr "{article} पर कमेंट किया"
-
-#: src/discussion_formatters.py:184
-#, python-brace-format
-msgid "Replied to a comment on {article}"
-msgstr "{article} के एक कमेंट पर जवाब दिया"
-
-#: src/discussion_formatters.py:188
-#, python-brace-format
-msgid "Unknown event `{event}`"
-msgstr "अनजान घटना `{event}`"
-
-#: src/discussion_formatters.py:194 src/discussion_formatters.py:196
-msgid "Report this on the support server"
-msgstr "इसे सहायता सर्वर पर रिपोर्ट करें"
diff --git a/locale/hi/LC_MESSAGES/formatters.mo b/locale/hi/LC_MESSAGES/formatters.mo
new file mode 100644
index 0000000..91eeab4
Binary files /dev/null and b/locale/hi/LC_MESSAGES/formatters.mo differ
diff --git a/locale/hi/LC_MESSAGES/formatters.po b/locale/hi/LC_MESSAGES/formatters.po
new file mode 100644
index 0000000..e30702c
--- /dev/null
+++ b/locale/hi/LC_MESSAGES/formatters.po
@@ -0,0 +1,2096 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the RcGcDw package.
+# FIRST AUTHOR , YEAR.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: RcGcDw\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2021-07-11 14:32+0200\n"
+"PO-Revision-Date: 2021-07-11 12:33+0000\n"
+"Last-Translator: Creeper \n"
+"Language-Team: Hindi \n"
+"Language: hi\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n > 1;\n"
+"X-Generator: Weblate 4.6.2\n"
+
+#: src/api/util.py:61 src/api/util.py:66
+msgid "__Only whitespace__"
+msgstr "__सिर्फ वाइटस्पेस__"
+
+#: src/api/util.py:71
+msgid "Removed"
+msgstr "हटाया गया"
+
+#: src/api/util.py:73
+msgid "Added"
+msgstr "जोड़ा"
+
+#: src/api/util.py:94 src/api/util.py:126 src/api/util.py:133
+#: src/api/util.py:141 extensions/base/discussions.py:247
+#: extensions/base/discussions.py:264 extensions/base/abusefilter.py:45
+msgid "Unregistered user"
+msgstr "अनरेजिसटर्ड सदस्य"
+
+#: src/api/util.py:160
+msgctxt "recent changes Tags"
+msgid "Tags"
+msgstr "टैग"
+
+#: src/api/util.py:162
+msgid "**Added**: "
+msgstr "**जोड़ा**: "
+
+#: src/api/util.py:163
+msgid " and {} more\n"
+msgstr " और {}\n"
+
+#: src/api/util.py:165
+msgid "**Removed**: "
+msgstr "**हटाया**: "
+
+#: src/api/util.py:166
+msgid " and {} more"
+msgstr " और {}"
+
+#: src/api/util.py:168
+msgid "Changed categories"
+msgstr "श्रेणियों को बदला गया"
+
+#: extensions/base/cargo.py:37
+#, python-brace-format
+msgid "Created the Cargo table \"{table}\""
+msgstr "कार्गो टेबल \"{table}\" बनाया गया"
+
+#: extensions/base/cargo.py:45
+#, python-brace-format
+msgid "[{author}]({author_url}) created the Cargo table \"{table}\""
+msgstr "[{author}]({author_url}) ने कीर्गो टेबल \"{table}\" बनाया"
+
+#: extensions/base/cargo.py:60
+#, python-brace-format
+msgid "Recreated the Cargo table \"{table}\""
+msgstr "कार्गो टेबल \"{table}\" को फिर से बनाया गया"
+
+#: extensions/base/cargo.py:68
+#, python-brace-format
+msgid "[{author}]({author_url}) recreated the Cargo table \"{table}\""
+msgstr "[{author}]({author_url}) ने कार्गो टेबल \"{table}\" को फिर से बनाया"
+
+#: extensions/base/cargo.py:83
+#, python-brace-format
+msgid "Replaced the Cargo table \"{table}\""
+msgstr "कोर्गो टेबल \"{table}\" को बदला गया"
+
+#: extensions/base/cargo.py:91
+#, python-brace-format
+msgid "[{author}]({author_url}) replaced the Cargo table \"{table}\""
+msgstr "[{author}]({author_url}) ने कार्गो टेबल \"{table}\" को बदल दिया"
+
+#: extensions/base/cargo.py:105
+#, python-brace-format
+msgid "Deleted the Cargo table \"{table}\""
+msgstr "कार्गो टेबल \"{table}\" को डिलीट किया गया"
+
+#: extensions/base/cargo.py:112
+#, python-brace-format
+msgid "[{author}]({author_url}) deleted the Cargo table \"{table}\""
+msgstr "[{author}]({author_url}) ने कार्गो टेबल \"{table}\" को डिलीट किया"
+
+#: extensions/base/translate.py:41
+#, python-brace-format
+msgid "Marked \"{article}\" for translation"
+msgstr "\"{article}\" को अनुवाद के लिए मार्क किया गया"
+
+#: extensions/base/translate.py:55
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) marked [{article}]({article_url}) for "
+"translation{comment}"
+msgstr ""
+"[{author}]({author_url}) ने [{article}]({article_url}) को अनुवाद के लिए मार्क "
+"किया{comment}"
+
+#: extensions/base/translate.py:70
+#, python-brace-format
+msgid "Removed \"{article}\" from the translation system"
+msgstr "\"{article}\" को अनुवाद सिस्टम से हटा दिया गया"
+
+#: extensions/base/translate.py:80
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) removed [{article}]({article_url}) from the "
+"translation system{comment}"
+msgstr ""
+"[{author}]({author_url}) ने अनुवाद सिस्टम से [{article}]({article_url}) को "
+"हटाया{comment}"
+
+#: extensions/base/translate.py:95
+#, python-brace-format
+msgid "Completed moving translation pages from \"{article}\" to \"{target}\""
+msgstr "\"{article}\" से \"{target}\" तक अनुवाद पृष्ठों को लाना पूरा हुआ"
+
+#: extensions/base/translate.py:106
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) completed moving translation pages from *{article}* "
+"to [{target}]({target_url}){comment}"
+msgstr ""
+"[{author}]({author_url}) ने *{article}* से [{target}]({target_url}) पर अनुवाद "
+"पृष्ठ को लाना ख़त्म किया{comment}"
+
+#: extensions/base/translate.py:121
+#, python-brace-format
+msgid "Encountered a problem while moving \"{article}\" to \"{target}\""
+msgstr "\"{article}\" को \"{target}\" पर ले जाते वक्त एक त्रुटि आई"
+
+#: extensions/base/translate.py:133
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) encountered a problem while moving [{article}]"
+"({article_url}) to [{target}]({target_url}){comment}"
+msgstr ""
+"[{author}]({author_url}) ने [{article}]({article_url}) को [{target}]"
+"({target_url}) पर लाते वक्त मुश्किलें पाई{comment}"
+
+#: extensions/base/translate.py:149
+#, python-brace-format
+msgid ""
+"Failed to delete \"{article}\" which belongs to translatable page "
+"\"{target}\""
+msgstr ""
+"\"{article}\" को डिलीट न किया जा सका जो अनुवाद-लायक पृष्ठ \"{target}\" का है"
+
+#: extensions/base/translate.py:161
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) failed to delete [{article}]({article_url}) which "
+"belongs to translatable page [{target}]({target_url}){comment}"
+msgstr ""
+"[{author}]({author_url}) [{article}]({article_url}) को डिलीट न कर पाए, जो "
+"अनुवाद-लायक पृष्ठ [{target}]({target_url}) का है{comment}"
+
+#: extensions/base/translate.py:177
+#, python-brace-format
+msgid "Completed deletion of translation page \"{article}\""
+msgstr "अनुवाद पृष्ठ {article} के डिलीशन को पूरा किया"
+
+#: extensions/base/translate.py:188
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) completed deletion of translation page [{article}]"
+"({article_url}){comment}"
+msgstr ""
+"[{author}]({author_url}) ने अनुवाद पृष्ठ [{article}]({article_url}) के डिलीशन को "
+"पूरा किया{comment}"
+
+#: extensions/base/translate.py:203
+#, python-brace-format
+msgid ""
+"Failed to delete \"{article}\" which belongs to translation page \"{target}\""
+msgstr "\"{article}\" को डिलीट न किया जा सका जो अनुवाद पृष्ठ \"{target}\" का है"
+
+#: extensions/base/translate.py:215
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) failed to delete [{article}]({article_url}) which "
+"belongs to translation page [{target}]({target_url}){comment}"
+msgstr ""
+"[{author}]({author_url}) [{article}]({article_url}) को डिलीट न कर पाए, जो "
+"अनुवाद पृष्ठ [{target}]({target_url}) का है{comment}"
+
+#: extensions/base/translate.py:231
+#, python-brace-format
+msgid "Encouraged translation of \"{article}\""
+msgstr "{article} के अनुवाद को बढ़ावा दिया गया"
+
+#: extensions/base/translate.py:240
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) encouraged translation of [{article}]({article_url})"
+"{comment}"
+msgstr ""
+"[{author}]({author_url}) [{article}]({article_url}) को अनुवाद करने का बढ़ावा "
+"दिया{comment}"
+
+#: extensions/base/translate.py:255
+#, python-brace-format
+msgid "Discouraged translation of \"{article}\""
+msgstr "\"{article}\" के अनुवाद के बढ़ावे को कम किया"
+
+#: extensions/base/translate.py:264
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) discouraged translation of [{article}]"
+"({article_url}){comment}"
+msgstr ""
+"[{author}]({author_url}) ने [{article}]({article_url}) के अनुवाद के बढ़ावे को कम "
+"किया{comment}"
+
+#: extensions/base/translate.py:282
+#, python-brace-format
+msgid "Limited languages for \"{article}\" to `{languages}`"
+msgstr "\"{article}\" के भाषाओं को `{languages}` तक सीमित किया गया"
+
+#: extensions/base/translate.py:285
+#, python-brace-format
+msgid "Priority languages for \"{article}\" set to `{languages}`"
+msgstr "\"{article}\" के मुख्य भाषाओं को `{languages}` में सेट किया गया"
+
+#: extensions/base/translate.py:288
+#, python-brace-format
+msgid "Removed priority languages from \"{article}\""
+msgstr "\"{article}\" से मुख्य भाषाओं को हटा दिया गया"
+
+#: extensions/base/translate.py:301
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) limited languages for [{article}]({article_url}) to "
+"`{languages}`{comment}"
+msgstr ""
+"[{author}]({author_url}) ने [{article}]({article_url}) के भाषाओं को `{languages}"
+"` तक सीमित किया{comment}"
+
+#: extensions/base/translate.py:308
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) set the priority languages for [{article}]"
+"({article_url}) to `{languages}`{comment}"
+msgstr ""
+"[{author}]({author_url}) ने [{article}]({article_url}) के मुख्य भाषाओं को "
+"`{languages}` में सेट किया{comment}"
+
+#: extensions/base/translate.py:315
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) removed priority languages from [{article}]"
+"({article_url}){comment}"
+msgstr ""
+"[{author}]({author_url}) ने [{article}]({article_url}) से मुख्य भाषाओं को "
+"हटाया{comment}"
+
+#: extensions/base/translate.py:331
+#, python-brace-format
+msgid "Added translatable page \"{article}\" to aggregate group \"{group}\""
+msgstr "अनुवाद-लायक पृष्ठ \"{article}\" को एग्रीगेट ग्रुप \"{group}\" में डाला गया"
+
+#: extensions/base/translate.py:342
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) added translatable page [{article}]({article_url}) "
+"to aggregate group \"{group}\"{comment}"
+msgstr ""
+"[{author}]({author_url}) ने अनुवाद-लायक पृष्ठ [{article}]({article_url}) को "
+"एग्रीगेट ग्रुप \"{group}\" में डाला{comment}"
+
+#: extensions/base/translate.py:357
+#, python-brace-format
+msgid ""
+"Removed translatable page \"{article}\" from aggregate group \"{group}\""
+msgstr "अनुवाद-लायक पृष्ठ \"{article}\" को एग्रीगेट ग्रुप \"{group}\" से हटा दिया गया"
+
+#: extensions/base/translate.py:368
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) removed translatable page [{article}]"
+"({article_url}) from aggregate group \"{group}\"{comment}"
+msgstr ""
+"[{author}]({author_url}) ने अनुवाद-लायक [{article}]({article_url}) को एग्रीगेट "
+"ग्रुप \"{group}\" से हटाया{comment}"
+
+#: extensions/base/translate.py:387
+#, python-brace-format
+msgid "Reviewed translation \"{article}\""
+msgstr "अनुवाद \"{article}\" को रिव्यु किया गया"
+
+#: extensions/base/translate.py:401
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) reviewed translation [{article}]({article_url})"
+"{comment}"
+msgstr ""
+"[{author}]({author_url}) ने अनुवाद [{article}]({article_url}) को रिव्यु "
+"किया{comment}"
+
+#: extensions/base/translate.py:416
+#, python-brace-format
+msgid "Changed the state of `{language}` translations of \"{article}\""
+msgstr "\"{article}\" `{language}` अनुवादों के स्थिति को बदला गया"
+
+#: extensions/base/translate.py:419
+msgid "Old state"
+msgstr "पुरानी स्थिति"
+
+#: extensions/base/translate.py:420
+msgid "New state"
+msgstr "नई स्थिति"
+
+#: extensions/base/translate.py:431
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) changed the state of `{language}` translations of "
+"[{article}]({article_url}) from `{old_state}` to `{new_state}`{comment}"
+msgstr ""
+"[{author}]({author_url}) ने पृष्ठ [{article}]({article_url}) के `{language}` के "
+"स्थिति को `{old_state}` से `{new_state}` में बदला{comment}"
+
+#: extensions/base/translate.py:439
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) changed the state of `{language}` translations of "
+"[{article}]({article_url}) to `{new_state}`{comment}"
+msgstr ""
+"[{author}]({author_url}) ने पृष्ठ [{article}]({article_url}) के `{language}` "
+"अनुवादों को `{new_state}` में बदला{comment}"
+
+#: extensions/base/translate.py:452 extensions/base/translate.py:455
+msgid "(default)"
+msgstr "(डिफ़ॉल्ट)"
+
+#: extensions/base/translate.py:464
+#, python-brace-format
+msgid "Changed the language of \"{article}\""
+msgstr "\"{article}\" के भाषा को बदला"
+
+#: extensions/base/translate.py:465
+msgid "Old language"
+msgstr "पुरानी भाषा"
+
+#: extensions/base/translate.py:466
+msgid "New language"
+msgstr "नई भाषा"
+
+#: extensions/base/translate.py:477
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) changed the language of [{article}]({article_url}) "
+"from {old_lang} to {new_lang}{comment}"
+msgstr ""
+"[{author}]({author_url}) [{article}]({article_url}) के भाषा को {old_lang} से "
+"{new_lang} में बदला{comment}"
+
+#: extensions/base/discussions.py:148 extensions/base/discussions.py:207
+#: extensions/base/discussions.py:245 extensions/base/discussions.py:261
+#: extensions/base/discussions.py:284 extensions/base/discussions.py:306
+#: extensions/base/discussions.py:334 extensions/base/discussions.py:354
+msgid "unknown"
+msgstr "अनजान"
+
+#: extensions/base/discussions.py:157
+#, python-brace-format
+msgid "Created \"{title}\""
+msgstr "\"{title}\" बनाया"
+
+#: extensions/base/discussions.py:161
+#, python-brace-format
+msgid "Created a poll \"{title}\""
+msgstr "पॉल \"{title}\" बनाया"
+
+#: extensions/base/discussions.py:168
+msgid "Option {}"
+msgstr "विकल्प {}"
+
+#: extensions/base/discussions.py:170
+#, python-brace-format
+msgid "__[View image]({image_url})__"
+msgstr "__[चित्र देखें]({image_url})__"
+
+#: extensions/base/discussions.py:174
+#, python-brace-format
+msgid "Created a quiz \"{title}\""
+msgstr "एक क्विज़ \"{title}\" बनाया"
+
+#: extensions/base/discussions.py:193 extensions/base/discussions.py:195
+msgctxt "Fandom discussions Tags/Forums"
+msgid "Tags"
+msgstr "टैग"
+
+#: extensions/base/discussions.py:193
+msgctxt "Fandom discussions amount of Tags/Forums"
+msgid "{} tags"
+msgstr "{} टैग"
+
+#: extensions/base/discussions.py:198
+#, python-brace-format
+msgid "Replied to \"{title}\""
+msgstr "\"{title}\" पर जवाब दिया"
+
+#: extensions/base/discussions.py:214
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) created [{title}](<{url}f/p/{threadId}>) in "
+"{forumName}"
+msgstr ""
+"[{author}]({author_url}) ने {forumName} में [{title}](<{url}f/p/{threadId}>) "
+"बनाया"
+
+#: extensions/base/discussions.py:217
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) created a poll [{title}](<{url}f/p/{threadId}>) in "
+"{forumName}"
+msgstr ""
+"[{author}]({author_url}) ने {forumName} में पॉल [{title}](<{url}f/p/{threadId}"
+">) बनाया"
+
+#: extensions/base/discussions.py:220
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) created a quiz [{title}](<{url}f/p/{threadId}>) in "
+"{forumName}"
+msgstr ""
+"[{author}]({author_url}) ने {forumName} में क्विज़ [{title}](<{url}f/p/{threadId}"
+">) बनाया"
+
+#: extensions/base/discussions.py:234
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) created a [reply](<{url}f/p/{threadId}/r/{postId}>) "
+"to [{title}](<{url}f/p/{threadId}>) in {forumName}"
+msgstr ""
+"[{author}]({author_url}) ने {forumName} में [{title}](<{url}f/p/{threadId}>) पर "
+"[जवाब](<{url}f/p/{threadId}/r/{postId}>) दिया"
+
+#: extensions/base/discussions.py:292
+#, python-brace-format
+msgid "Created \"{title}\" on {user}'s Message Wall"
+msgstr "{user} के मैसेज वॉल पर \"{title}\" बनाया"
+
+#: extensions/base/discussions.py:298
+#, python-brace-format
+msgid "Replied to \"{title}\" on {user}'s Message Wall"
+msgstr "{user} के मैसेज वॉल के \"{title}\" पर जवाब दिया"
+
+#: extensions/base/discussions.py:312
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) created [{title}](<{url}wiki/Message_Wall:"
+"{user_wall}?threadId={threadId}>) on [{user}'s Message Wall](<{url}wiki/"
+"Message_Wall:{user_wall}>)"
+msgstr ""
+"[{author}]({author_url}) ने [{user} के मैसेज वॉल](<{url}wiki/Message_Wall:"
+"{user_wall}>) पर [{title}](<{url}wiki/Message_Wall:{user_wall}?"
+"threadId={threadId}>) बनाया"
+
+#: extensions/base/discussions.py:318
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) created a [reply](<{url}wiki/Message_Wall:"
+"{user_wall}?threadId={threadId}#{replyId}>) to [{title}](<{url}wiki/"
+"Message_Wall:{user_wall}?threadId={threadId}>) on [{user}'s Message Wall]"
+"(<{url}wiki/Message_Wall:{user_wall}>)"
+msgstr ""
+"[{author}]({author_url}) ने [{user} के मैसेज वॉल](<{url}wiki/Message_Wall:"
+"{user_wall}>) के [{title}](<{url}wiki/Message_Wall:{user_wall}?"
+"threadId={threadId}>) पर [जवाब](<{url}wiki/Message_Wall:{user_wall}?"
+"threadId={threadId}#{replyId}>) दिया"
+
+#: extensions/base/discussions.py:338
+#, python-brace-format
+msgid "Commented on {article}"
+msgstr "{article} पर कमेंट किया"
+
+#: extensions/base/discussions.py:344
+#, python-brace-format
+msgid "Replied to a comment on {article}"
+msgstr "{article} के एक कमेंट पर जवाब दिया"
+
+#: extensions/base/discussions.py:359
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) created a [comment](<{url}?commentId={commentId}>) "
+"on [{article}](<{url}>)"
+msgstr ""
+"[{author}]({author_url}) ने [{article}](<{url}>) पर [कमेंट](<{url}?"
+"commentId={commentId}>) किया"
+
+#: extensions/base/discussions.py:365
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) created a [reply](<{url}?commentId={commentId}"
+"&replyId={replyId}>) to a [comment](<{url}?commentId={commentId}>) on "
+"[{article}](<{url}>)"
+msgstr ""
+"[{author}]({author_url}) ने [{article}](<{url}>) के एक [कमेंट](<{url}?"
+"commentId={commentId}>) पर [जवाब](<{url}?commentId={commentId}"
+"&replyId={replyId}>) दिया"
+
+#: extensions/base/managewiki.py:34
+msgid "Changed wiki settings"
+msgstr "विकी सेटिंग्स को बदला गया"
+
+#: extensions/base/managewiki.py:44
+#, python-brace-format
+msgid "[{author}]({author_url}) changed wiki settings{reason}"
+msgstr "[{author}]({author_url}) ने विकी सेटिंग्स को बदला{reason}"
+
+#: extensions/base/managewiki.py:55
+#, python-brace-format
+msgid "Deleted a \"{wiki}\" wiki"
+msgstr "\"{wiki}\" विकी को डिलीट किया गया"
+
+#: extensions/base/managewiki.py:55 extensions/base/managewiki.py:67
+#: extensions/base/managewiki.py:103 extensions/base/managewiki.py:112
+#: extensions/base/managewiki.py:125 extensions/base/managewiki.py:126
+#: extensions/base/managewiki.py:135 extensions/base/managewiki.py:136
+#: extensions/base/managewiki.py:148 extensions/base/managewiki.py:149
+#: extensions/base/managewiki.py:160 extensions/base/managewiki.py:161
+#: extensions/base/managewiki.py:195 extensions/base/managewiki.py:204
+#: extensions/base/managewiki.py:217 extensions/base/managewiki.py:226
+#: extensions/base/abusefilter.py:55 extensions/base/abusefilter.py:56
+#: extensions/base/abusefilter.py:57 extensions/base/abusefilter.py:68
+#: extensions/base/abusefilter.py:69 extensions/base/abusefilter.py:70
+#: extensions/base/mediawiki.py:743
+msgid "Unknown"
+msgstr "अनजान"
+
+#: extensions/base/managewiki.py:63
+#, python-brace-format
+msgid "[{author}]({author_url}) deleted a wiki *{wiki_name}*{comment}"
+msgstr "[{author}]({author_url}) ने विकी *{wiki_name}* को डिलीट किया{comment}"
+
+#: extensions/base/managewiki.py:80
+#, python-brace-format
+msgid "Deleted a \"{group}\" user group"
+msgstr "\"{group}\" यूज़रग्रुप को हटाया गया"
+
+#: extensions/base/managewiki.py:89
+#, python-brace-format
+msgid "[{author}]({author_url}) deleted a usergroup *{group}*{comment}"
+msgstr "[{author}]({author_url}) ने यूज़र ग्रुप *{group}* को हटाया{comment}"
+
+#: extensions/base/managewiki.py:103
+#, python-brace-format
+msgid "Locked a \"{wiki}\" wiki"
+msgstr "\"{wiki}\" विकी को लॉक किया गया"
+
+#: extensions/base/managewiki.py:111
+#, python-brace-format
+msgid "[{author}]({author_url}) locked a wiki *{wiki_name}*{comment}"
+msgstr "[{author}]({author_url}) ने विकी *{wiki_name}* के लॉक किया{comment}"
+
+#: extensions/base/managewiki.py:124
+#, python-brace-format
+msgid "Modified \"{namespace_name}\" namespace"
+msgstr "\"{namespace_name}\" नेमस्पेस को मॉडिफाई किया गया"
+
+#: extensions/base/managewiki.py:126 extensions/base/managewiki.py:149
+msgid "Wiki"
+msgstr "विकी"
+
+#: extensions/base/managewiki.py:134
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) modified namespace *{namespace_name}* on "
+"*{wiki_name}*{comment}"
+msgstr ""
+"[{author}]({author_url}) ने *{wiki_name}* पर नेमस्पेस *{namespace_name}* को "
+"मॉडिफाई किया{comment}"
+
+#: extensions/base/managewiki.py:147
+#, python-brace-format
+msgid "Deleted a \"{namespace_name}\" namespace"
+msgstr "\"{namespace_name}\" नेमस्पेस को डिलीट किया गया"
+
+#: extensions/base/managewiki.py:158
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) deleted a namespace *{namespace_name}* on "
+"*{wiki_name}*{comment}"
+msgstr ""
+"[{author}]({author_url}) ने *{wiki_name}* पर नेमस्पेस *{namespace_name}* को "
+"डिलीट किया{comment}"
+
+#: extensions/base/managewiki.py:173
+#, python-brace-format
+msgid "Modified \"{usergroup_name}\" usergroup"
+msgstr "\"{usergroup_name}\" यूज़रग्रुप को मॉडिफाइ किया गया"
+
+#: extensions/base/managewiki.py:182
+#, python-brace-format
+msgid "[{author}]({author_url}) modified user group *{group_name}*{comment}"
+msgstr ""
+"[{author}]({author_url}) ने यूज़र ग्रुप *{group_name}* को मॉडिफाइ किया{comment}"
+
+#: extensions/base/managewiki.py:195
+#, python-brace-format
+msgid "Undeleted a \"{wiki}\" wiki"
+msgstr "\"{wiki}\" विकि को अनडिलीट किया गया"
+
+#: extensions/base/managewiki.py:203
+#, python-brace-format
+msgid "[{author}]({author_url}) undeleted a wiki *{wiki_name}*{comment}"
+msgstr "[{author}]({author_url}) ने विकि *{wiki_name}* को अनडिलीट किया{comment}"
+
+#: extensions/base/managewiki.py:217
+#, python-brace-format
+msgid "Unlocked a \"{wiki}\" wiki"
+msgstr "\"{wiki}\" विकी को अनलॉक किया गया"
+
+#: extensions/base/managewiki.py:225
+#, python-brace-format
+msgid "[{author}]({author_url}) unlocked a wiki *{wiki_name}*{comment}"
+msgstr ""
+"[{author}]({author_url}) ने एक विकी *{wiki_name}* को अनलॉक किया{comment}"
+
+#: extensions/base/datadump.py:36
+#, python-brace-format
+msgid "Generated {file} dump"
+msgstr "{file} डंप जनरेट किया"
+
+#: extensions/base/datadump.py:45
+#, python-brace-format
+msgid "[{author}]({author_url}) generated *{file}* dump{comment}"
+msgstr "[{author}]({author_url}) ने *{file}* डंप जनरेट किया{comment}"
+
+#: extensions/base/datadump.py:58
+#, python-brace-format
+msgid "Deleted {file} dump"
+msgstr "{file} डंप को डिलीट किया"
+
+#: extensions/base/datadump.py:67
+#, python-brace-format
+msgid "[{author}]({author_url}) deleted *{file}* dump{comment}"
+msgstr "[{author}]({author_url}) *{file}* डंप को डिलीट किया{comment}"
+
+#: extensions/base/curseprofile.py:40
+#, python-brace-format
+msgid "Edited {target}'s profile"
+msgstr "{target} के प्रॉफाइल को सम्पादित किया"
+
+#: extensions/base/curseprofile.py:42
+msgid "Edited their own profile"
+msgstr "अपने प्रॉफाइल को सम्पादित किया"
+
+#: extensions/base/curseprofile.py:44
+#, python-brace-format
+msgid "Cleared the {field} field"
+msgstr "{field} फील्ड को क्लियर किया"
+
+#: extensions/base/curseprofile.py:46
+#, python-brace-format
+msgid "{field} field changed to: {desc}"
+msgstr "{field} फील्ड को बदला गया: {desc} में"
+
+#: extensions/base/curseprofile.py:58
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) cleared the {field} on [{target}]({target_url})'s "
+"profile."
+msgstr ""
+"[{author}]({author_url}) ने [{target}]({target_url}) के प्रोफाइल पर {field} "
+"को साफ़ किया।"
+
+#: extensions/base/curseprofile.py:60
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) edited the {field} on [{target}]({target_url})'s "
+"profile. *({desc})*"
+msgstr ""
+"[{author}]({author_url}) ने [{target}]({target_url}) के प्रोफाइल पर {field} "
+"को सम्पादित किया। *({desc})*"
+
+#: extensions/base/curseprofile.py:65
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) cleared the {field} on [their own]({target_url}) "
+"profile."
+msgstr ""
+"[{author}]({author_url}) ने [अपने]({target_url}) प्रोफाइल पर {field} को साफ़ "
+"किया।"
+
+#: extensions/base/curseprofile.py:67
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) edited the {field} on [their own]({target_url}) "
+"profile. *({desc})*"
+msgstr ""
+"[{author}]({author_url}) ने [अपने]({target_url}) प्रोफाइल पर {field} को "
+"सम्पादित किया। *({desc})*"
+
+#: extensions/base/curseprofile.py:82
+#, python-brace-format
+msgid "Left a comment on {target}'s profile"
+msgstr "{target} के प्रोफाइल पर एक कमेंट छोड़ा"
+
+#: extensions/base/curseprofile.py:84
+msgid "Left a comment on their own profile"
+msgstr "अपने प्रोफाइल पर एक कमेंट छोड़ा"
+
+#: extensions/base/curseprofile.py:97
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) left a [comment]({comment}) on {target}'s profile."
+msgstr ""
+"[{author}]({author_url}) ने {target} के प्रोफाइल पर एक [कमेंट]({comment}) "
+"छोड़ा।"
+
+#: extensions/base/curseprofile.py:100
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) left a [comment]({comment}) on their own profile."
+msgstr ""
+"[{author}]({author_url}) ने अपने प्रोफाइल पर एक [कमेंट]({comment}) छोड़ा।"
+
+#: extensions/base/curseprofile.py:113
+#, python-brace-format
+msgid "Edited a comment on {target}'s profile"
+msgstr "{target} के प्रॉफाइल के एक कमेंट को सम्पादित किया"
+
+#: extensions/base/curseprofile.py:115
+msgid "Edited a comment on their own profile"
+msgstr "अपने प्रॉफाइल के एक कमेंट को सम्पादित किया"
+
+#: extensions/base/curseprofile.py:128
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) edited a [comment]({comment}) on {target}'s profile."
+msgstr ""
+"[{author}]({author_url}) ने {target} के प्रोफाइल के एक [कमेंट]({comment}) पर "
+"जवाब दिया।"
+
+#: extensions/base/curseprofile.py:131
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) edited a [comment]({comment}) on their own profile."
+msgstr ""
+"[{author}]({author_url}) ने अपने प्रोफाइल के एक [कमेंट]({comment}) को सम्पादि"
+"त किया।"
+
+#: extensions/base/curseprofile.py:144
+#, python-brace-format
+msgid "Replied to a comment on {target}'s profile"
+msgstr "{target} के प्रॉफाइल के एक कमेंट पर जवाब दिया"
+
+#: extensions/base/curseprofile.py:146
+msgid "Replied to a comment on their own profile"
+msgstr "अपने प्रॉफाइल क के एक कमेंट पर जवाब दिया"
+
+#: extensions/base/curseprofile.py:159
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) replied to a [comment]({comment}) on {target}'s "
+"profile."
+msgstr ""
+"[{author}]({author_url}) ने {target} के प्रॉफाइल के एक [कमेंट]({comment}) पर "
+"जवाब दिया।"
+
+#: extensions/base/curseprofile.py:162
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) replied to a [comment]({comment}) on their own "
+"profile."
+msgstr ""
+"[{author}]({author_url}) ने अपने प्रोफाइल पर एक [कमेंट]({comment}) पर जवाब "
+"दिया।"
+
+#: extensions/base/curseprofile.py:175
+#, python-brace-format
+msgid "Deleted a comment on {target}'s profile"
+msgstr "{target} के प्रॉफाइल के एक कमेंट को सम्पादित किया"
+
+#: extensions/base/curseprofile.py:177
+msgid "Deleted a comment on their own profile"
+msgstr "अपने प्रॉफाइल के एक कमेंट को डिलीट किया"
+
+#: extensions/base/curseprofile.py:197
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) deleted a [comment]({comment}) on {target}'s "
+"profile.{reason}"
+msgstr ""
+"[{author}]({author_url}) ने {target} के प्रोफाइल के एक [कमेंट]({comment}) को "
+"डिलीट किया।{reason}"
+
+#: extensions/base/curseprofile.py:200
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) deleted a [comment]({comment}) on their own profile."
+"{reason}"
+msgstr ""
+"[{author}]({author_url}) ने अपने प्रोफाइल के एक [कमेंट]({comment}) को डिलीट "
+"किया।{reason}"
+
+#: extensions/base/curseprofile.py:214
+#, python-brace-format
+msgid "Purged a comment on {target}'s profile"
+msgstr "{target} के प्रॉफाइल के एक कमेंट को पर्ज किया"
+
+#: extensions/base/curseprofile.py:216
+msgid "Purged a comment on their own profile"
+msgstr "अपने प्रॉफाइल के एक कमेंट को पर्ज किया"
+
+#: extensions/base/curseprofile.py:230
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) purged a comment on [{target}]({link})'s profile."
+"{reason}"
+msgstr ""
+"[{author}]({author_url}) ने [{target}]({link}) के प्रोफाइल के एक कमेंट को पर्"
+"ज किया।{reason}"
+
+#: extensions/base/curseprofile.py:233
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) purged a comment on [their own]({link}) profile."
+"{reason}"
+msgstr ""
+"[{author}]({author_url}) ने [अपने]({link}) प्रोफाइल के एक कमेंट को पर्ज "
+"किया।{reason}"
+
+#: extensions/base/renameuser.py:38
+#, python-brace-format
+msgid "Renamed user \"{old_name}\" with {edits} edit to \"{new_name}\""
+msgid_plural "Renamed user \"{old_name}\" with {edits} edits to \"{new_name}\""
+msgstr[0] ""
+"{edits} सम्पादना वाले सदस्य \"{old_name}\" को \"{new_name}\" में रीनेम किया गया"
+msgstr[1] ""
+"{edits} सम्पादनाओं वाले सदस्य \"{old_name}\" को \"{new_name}\" में रीनेम किया गया"
+
+#: extensions/base/renameuser.py:43
+#, python-brace-format
+msgid "Renamed user \"{old_name}\" to \"{new_name}\""
+msgstr "सदस्य \"{old_name}\" को \"{new_name}\" में रीनेम किया गया"
+
+#: extensions/base/renameuser.py:58
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) renamed user *{old_name}* with {edits} edit to "
+"[{new_name}]({link}){comment}"
+msgid_plural ""
+"[{author}]({author_url}) renamed user *{old_name}* with {edits} edits to "
+"[{new_name}]({link}){comment}"
+msgstr[0] ""
+"[{author}]({author_url}) ने {edits} सम्पादना वाले सदस्य *{old_name}* को "
+"[{new_name}]({link}) में रीनेम किया{comment}"
+msgstr[1] ""
+"[{author}]({author_url}) ने {edits} सम्पादनाओं वाले सदस्य *{old_name}* को "
+"[{new_name}]({link}) में रीनेम किया{comment}"
+
+#: extensions/base/renameuser.py:66
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) renamed user *{old_name}* to [{new_name}]({link})"
+"{comment}"
+msgstr ""
+"[{author}]({author_url}) ने सदस्य *{old_name}* को [{new_name}]({link}) में रीनेम "
+"किया{comment}"
+
+#: extensions/base/interwiki.py:37
+msgid "Added an entry to the interwiki table"
+msgstr "इंटरविकी टेबल पर एक एंट्री जोड़ा गया"
+
+#: extensions/base/interwiki.py:38 extensions/base/interwiki.py:65
+#, python-brace-format
+msgid "Prefix: {prefix}, website: {website} | {desc}"
+msgstr "उपसर्ग: {prefix}, वेबसाइट: {website} | {desc}"
+
+#: extensions/base/interwiki.py:50
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) added an entry to the [interwiki table]"
+"({table_url}) pointing to {website} with {prefix} prefix"
+msgstr ""
+"[{author}]({author_url}) ने {prefix} उपसर्ग के साथ {website} की तरफ इशारा करने "
+"वाले [इंटरविकी टेबल]({table_url}) में एक एंट्री जोड़ा"
+
+#: extensions/base/interwiki.py:64
+msgid "Edited an entry in interwiki table"
+msgstr "इंटरविकी टेबल पर एक एंट्री को सम्पादित किया गया"
+
+#: extensions/base/interwiki.py:77
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) edited an entry in [interwiki table]({table_url}) "
+"pointing to {website} with {prefix} prefix"
+msgstr ""
+"[{author}]({author_url}) ने {prefix} उपसर्ग के साथ {website} की तरफ इशारा करने "
+"वाले [इंटरविकी टेबल]({table_url}) में एक एंट्री को सम्पादित किया"
+
+#: extensions/base/interwiki.py:91
+msgid "Deleted an entry in interwiki table"
+msgstr "इंटरविकी टेबल में एक एंट्री को डिलीट किया गया"
+
+#: extensions/base/interwiki.py:92
+#, python-brace-format
+msgid "Prefix: {prefix} | {desc}"
+msgstr "उपसर्ग: {prefix} | {desc}"
+
+#: extensions/base/interwiki.py:102
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) deleted an entry in [interwiki table]({table_url})"
+"{desc}"
+msgstr ""
+"[{author}]({author_url}) ने [इंटरविकि टेबल]({table_url}) पर एक एंट्री को डिली"
+"ट किया{desc}"
+
+#: extensions/base/abusefilter.py:29
+msgid "None"
+msgstr "कुछ नहीं"
+
+#: extensions/base/abusefilter.py:29
+msgid "Warning issued"
+msgstr "सूचना दे दी गई है"
+
+#: extensions/base/abusefilter.py:29
+msgid "**Blocked user**"
+msgstr "**ब्लॉक्ड सदस्य**"
+
+#: extensions/base/abusefilter.py:29
+msgid "Tagged the edit"
+msgstr "सम्पादना को टैग कर दिया है"
+
+#: extensions/base/abusefilter.py:29
+msgid "Disallowed the action"
+msgstr "काम को मना कर दिया"
+
+#: extensions/base/abusefilter.py:29
+msgid "**IP range blocked**"
+msgstr "**IP रेंज ब्लॉक्ड है**"
+
+#: extensions/base/abusefilter.py:29
+msgid "Throttled actions"
+msgstr "थ्रॉटल किए गए काम"
+
+#: extensions/base/abusefilter.py:29
+msgid "Removed autoconfirmed group"
+msgstr "ऑटोकन्फर्म्ड ग्रुप हटा दिया गया है"
+
+#: extensions/base/abusefilter.py:29
+msgid "**Removed from privileged groups**"
+msgstr "**प्रिविलेज वाले ग्रुपों से हटा दिया गया है**"
+
+#: extensions/base/abusefilter.py:30
+msgid "Edit"
+msgstr "सम्पादना"
+
+#: extensions/base/abusefilter.py:30
+msgid "Upload"
+msgstr "अपलोड"
+
+#: extensions/base/abusefilter.py:30
+msgid "Move"
+msgstr "मूव"
+
+#: extensions/base/abusefilter.py:30
+msgid "Stash upload"
+msgstr "स्टैश अपलोड"
+
+#: extensions/base/abusefilter.py:30
+msgid "Deletion"
+msgstr "डिलीशन"
+
+#: extensions/base/abusefilter.py:30
+msgid "Account creation"
+msgstr "अकाउंट सृष्टि"
+
+#: extensions/base/abusefilter.py:30
+msgid "Auto account creation"
+msgstr "ऑटो अकाउंट सृष्टि"
+
+#: extensions/base/abusefilter.py:54
+#, python-brace-format
+msgid "{user} triggered \"{abuse_filter}\""
+msgstr "{user} ने \"{abuse_filter}\" को ट्रिगर किया"
+
+#: extensions/base/abusefilter.py:55
+msgid "Performed"
+msgstr "ऐक्शन"
+
+#: extensions/base/abusefilter.py:56
+msgid "Action taken"
+msgstr "लिया गया ऐक्शन"
+
+#: extensions/base/abusefilter.py:57
+msgid "Title"
+msgstr "शीर्षक"
+
+#: extensions/base/abusefilter.py:66
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) triggered *{abuse_filter}*, performing the action "
+"\"{action}\" on *[{target}]({target_url})* - action taken: {result}."
+msgstr ""
+"[{author}]({author_url}) ने *[{target}]({target_url})* पर ऐक्शन \"{action}\" "
+"लेते हुए *{abuse_filter}* को ट्रिगर किया - लिया गया ऐक्शन: {result}।"
+
+#: extensions/base/abusefilter.py:83
+#, python-brace-format
+msgid "Edited abuse filter number {number}"
+msgstr "अब्यूज़ फिल्टर संख्यी {number} को बदला गया"
+
+#: extensions/base/abusefilter.py:95
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) edited abuse filter [number {number}]({filter_url})"
+msgstr ""
+"[{author}]({author_url}) ने अब्यूज़ फिल्टर [संख्या {number}]({filter_url}) को "
+"सम्पादित किया"
+
+#: extensions/base/abusefilter.py:111
+#, python-brace-format
+msgid "Created abuse filter number {number}"
+msgstr "अब्यूज़ फिल्टर संख्या {number} को बनाया गया"
+
+#: extensions/base/abusefilter.py:119
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) created abuse filter [number {number}]({filter_url})"
+msgstr ""
+"[{author}]({author_url}) ने अब्यूज़ फिल्टर [संख्या {number}]({filter_url}) बनाया"
+
+#: extensions/base/mediawiki.py:37
+msgid "director"
+msgstr "निर्देशक"
+
+#: extensions/base/mediawiki.py:37
+msgid "bot"
+msgstr "बॉट"
+
+#: extensions/base/mediawiki.py:37
+msgid "editor"
+msgstr "सम्पादक"
+
+#: extensions/base/mediawiki.py:37
+msgid "directors"
+msgstr "निर्देशक"
+
+#: extensions/base/mediawiki.py:37
+msgid "sysop"
+msgstr "साइसॉप"
+
+#: extensions/base/mediawiki.py:37
+msgid "bureaucrat"
+msgstr "ब्यूरोक्रैट"
+
+#: extensions/base/mediawiki.py:37
+msgid "reviewer"
+msgstr "रिव्युअर"
+
+#: extensions/base/mediawiki.py:38
+msgid "autoreview"
+msgstr "ऑटोरिव्यु"
+
+#: extensions/base/mediawiki.py:38
+msgid "autopatrol"
+msgstr "ऑटोपैट्रॉल"
+
+#: extensions/base/mediawiki.py:38
+msgid "wiki_guardian"
+msgstr "विकी_संरक्षक"
+
+#: extensions/base/mediawiki.py:70
+msgid "(N!) "
+msgstr "(न!) "
+
+#: extensions/base/mediawiki.py:71
+msgid "m"
+msgstr "छो"
+
+#: extensions/base/mediawiki.py:72
+msgid "b"
+msgstr "बॉ"
+
+#: extensions/base/mediawiki.py:112
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) edited [{article}]({edit_link}){comment} {bold}"
+"({sign}{edit_size}){bold}"
+msgstr ""
+"[{author}]({author_url}) ने [{article}]({edit_link}){comment} ({bold}({sign}"
+"{edit_size}){bold} को सम्पादित किया"
+
+#: extensions/base/mediawiki.py:117
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) created [{article}]({edit_link}){comment} {bold}"
+"({sign}{edit_size}){bold}"
+msgstr ""
+"[{author}]({author_url}) ने [{article}]({edit_link}){comment} {bold}({sign}"
+"{edit_size}){bold} बनाया"
+
+#: extensions/base/mediawiki.py:190 extensions/base/mediawiki.py:223
+msgid "Options"
+msgstr "विकल्प"
+
+#: extensions/base/mediawiki.py:190
+#, python-brace-format
+msgid "([preview]({link}) | [undo]({undolink}))"
+msgstr "([पूर्वावलोकन]({link}) | [पूर्ववत करें]({undolink}))"
+
+#: extensions/base/mediawiki.py:195
+#, python-brace-format
+msgid "Uploaded a new version of {name}"
+msgstr "{name} के एक नए संसकरण को अपलोड किया"
+
+#: extensions/base/mediawiki.py:197
+#, python-brace-format
+msgid "Reverted a version of {name}"
+msgstr "{name} के एक संसकरण को पूर्ववत किया"
+
+#: extensions/base/mediawiki.py:199
+#, python-brace-format
+msgid "Uploaded {name}"
+msgstr "{name} को अपलोड किया"
+
+#: extensions/base/mediawiki.py:208
+msgid "**No license!**"
+msgstr "**कोई लाइसेंस नहीं है!**"
+
+#: extensions/base/mediawiki.py:223
+#, python-brace-format
+msgid "([preview]({link}))"
+msgstr "([पूर्वावलोकन]({link}))"
+
+#: extensions/base/mediawiki.py:228
+msgid ""
+"\n"
+"License: {}"
+msgstr ""
+"\n"
+"लाइसेंस: {}"
+
+#: extensions/base/mediawiki.py:237
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) reverted a version of [{file}]({file_link}){comment}"
+msgstr ""
+"[{author}]({author_url}) ने [{file}]({file_link}){comment} के एक संसकरण को "
+"रिवर्ट किया"
+
+#: extensions/base/mediawiki.py:248
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) uploaded a new version of [{file}]({file_link})"
+"{comment}"
+msgstr ""
+"[{author}]({author_url}) ने [{file}]({file_link}){comment} के एक नए संसकरण को "
+"अपलोड किया"
+
+#: extensions/base/mediawiki.py:259
+#, python-brace-format
+msgid "[{author}]({author_url}) uploaded [{file}]({file_link}){comment}"
+msgstr ""
+"[{author}]({author_url}) ने [{file}]({file_link}){comment} को अपलोड किया"
+
+#: extensions/base/mediawiki.py:274
+#, python-brace-format
+msgid "Deleted page {article}"
+msgstr "पृष्ठ {article} को डिलीट किया"
+
+#: extensions/base/mediawiki.py:283
+#, python-brace-format
+msgid "[{author}]({author_url}) deleted [{page}]({page_link}){comment}"
+msgstr ""
+"[{author}]({author_url}) ने [{page}]({page_link}){comment} को डिलीट किया"
+
+#: extensions/base/mediawiki.py:298
+#, python-brace-format
+msgid "Deleted redirect {article} by overwriting"
+msgstr "ओवर्राइट करके रेडिरेक्ट {article} को डिलीट किया"
+
+#: extensions/base/mediawiki.py:308
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) deleted redirect by overwriting [{page}]"
+"({page_link}){comment}"
+msgstr ""
+"[{author}]({author_url}) ने [{page}]({page_link}) को ओवर्राइट करके अनुप्रेषण "
+"को डिलीट किया{comment}"
+
+#: extensions/base/mediawiki.py:322
+#, python-brace-format
+msgid "Restored {article}"
+msgstr "{article} को रिस्टोर किया गया"
+
+#: extensions/base/mediawiki.py:331
+#, python-brace-format
+msgid "[{author}]({author_url}) restored [{article}]({article_url}){comment}"
+msgstr ""
+"[{author}]({author_url}) ने [{article}]({article_url}) को रिस्टोर किया{comment}"
+
+#: extensions/base/mediawiki.py:348
+msgid "Changed visibility of log events"
+msgstr "लॉग घटनाओं के दृश्यता को बदला गया"
+
+#: extensions/base/mediawiki.py:356
+#, python-brace-format
+msgid "[{author}]({author_url}) changed visibility of log events{comment}"
+msgstr "[{author}]({author_url}) ने लॉग घटनाओं के दृश्यता को बदल दिया{comment}"
+
+#: extensions/base/mediawiki.py:370
+#, python-brace-format
+msgid "Changed visibility of revision on page {article} "
+msgid_plural "Changed visibility of {amount} revisions on page {article} "
+msgstr[0] "पृष्ठ {article} पर रिवीशन के दृश्यता को बदला "
+msgstr[1] "पृष्ठ {article} पर {amount} रिवीशनों के दृश्यता को बदला "
+
+#: extensions/base/mediawiki.py:383
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) changed visibility of revision on page [{article}]"
+"({article_url}){comment}"
+msgid_plural ""
+"[{author}]({author_url}) changed visibility of {amount} revisions on page "
+"[{article}]({article_url}){comment}"
+msgstr[0] ""
+"[{author}]({author_url}) ने [{article}]({article_url}) पर रिवीशन के दृश्यता "
+"को बदल दिया{comment}"
+msgstr[1] ""
+"[{author}]({author_url}) ने [{article}]({article_url}) पर {amount} रिवीशनों "
+"के दृश्यता को बदल दिया{comment}"
+
+#: extensions/base/mediawiki.py:399 extensions/base/mediawiki.py:432
+msgid "No redirect has been made"
+msgstr "कोई रेडिरेक्ट नहीं बनाया गया"
+
+#: extensions/base/mediawiki.py:400 extensions/base/mediawiki.py:433
+msgid "A redirect has been made"
+msgstr "एक रेडिरेक्ट बनाया गया है"
+
+#: extensions/base/mediawiki.py:401
+#, python-brace-format
+msgid "Moved {redirect}{article} to {target}"
+msgstr "{redirect}{article} को {target} पर ले जाया गया है"
+
+#: extensions/base/mediawiki.py:412 extensions/base/mediawiki.py:444
+msgid "without making a redirect"
+msgstr "बिना रेडिरेक्ट छोड़े"
+
+#: extensions/base/mediawiki.py:413 extensions/base/mediawiki.py:445
+msgid "with a redirect"
+msgstr "रेडिरेक्ट छोड़कर"
+
+#: extensions/base/mediawiki.py:416
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) moved {redirect}*{article}* to [{target}]"
+"({target_url}) {made_a_redirect}{comment}"
+msgstr ""
+"[{author}]({author_url}) ने {redirect}*{article}* को [{target}]({target_url}) "
+"पर {made_a_redirect} मूव किया{comment}"
+
+#: extensions/base/mediawiki.py:434
+#, python-brace-format
+msgid "Moved {redirect}{article} to {title} over redirect"
+msgstr "{redirect}{article} को रेडिरेक्ट के साथ {title} पर ले जाया गया है"
+
+#: extensions/base/mediawiki.py:448
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) moved {redirect}*{article}* over redirect to "
+"[{target}]({target_url}) {made_a_redirect}{comment}"
+msgstr ""
+"[{author}]({author_url}) ने {redirect}*{article}* को अनुप्रेषण के साथ "
+"[{target}]({target_url}) पर मूव किया {made_a_redirect}{comment}"
+
+#: extensions/base/mediawiki.py:464
+#, python-brace-format
+msgid "Moved protection settings from {redirect}{article} to {title}"
+msgstr "प्रॉटेक्शन सेटिंग्स को {redirect}{article} से {title} पर ले जाया गया"
+
+#: extensions/base/mediawiki.py:477
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) moved protection settings from {redirect}*{article}"
+"* to [{target}]({target_url}){comment}"
+msgstr ""
+"[{author}]({author_url}) ने प्रॉटेक्शन सेटिंगस को {redirect}*{article}* से "
+"[{target}]({target_url}){comment} पर मूव किया"
+
+#: extensions/base/mediawiki.py:492
+#, python-brace-format
+msgid "Protected {target}"
+msgstr "{target} को प्रॉटेक्ट किया गया"
+
+#: extensions/base/mediawiki.py:495 extensions/base/mediawiki.py:510
+#: extensions/base/mediawiki.py:526 extensions/base/mediawiki.py:541
+msgid " [cascading]"
+msgstr " [कैस्केडिंग]"
+
+#: extensions/base/mediawiki.py:506
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) protected [{article}]({article_url}) with the "
+"following settings: {settings}{comment}"
+msgstr ""
+"[{author}]({author_url}) ने [{article}]({article_url}) को इन सेटिंग्स के साथ "
+"प्रॉटेक्ट किया: {settings}{comment}"
+
+#: extensions/base/mediawiki.py:523
+#, python-brace-format
+msgid "Changed protection level for {article}"
+msgstr "{article} के प्रॉटेक्शन लेवल को बदला"
+
+#: extensions/base/mediawiki.py:537
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) modified protection settings of [{article}]"
+"({article_url}) to: {settings}{comment}"
+msgstr ""
+"[{author}]({author_url}) ने [{article}]({article_url}) के प्रॉटेक्शन सेटिंग्स को इसमें "
+"मॉडिफाइ किया: {settings}{comment}"
+
+#: extensions/base/mediawiki.py:554
+#, python-brace-format
+msgid "Removed protection from {article}"
+msgstr "{article} से प्रॉटेक्शन हटा दिया गया"
+
+#: extensions/base/mediawiki.py:563
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) removed protection from [{article}]({article_url})"
+"{comment}"
+msgstr ""
+"[{author}]({author_url}) ने [{article}]({article_url}) से प्रॉटेक्शन हटा "
+"दिया{comment}"
+
+#: extensions/base/mediawiki.py:572
+msgid "for infinity and beyond"
+msgstr "अनंत और इसके परे तक"
+
+#: extensions/base/mediawiki.py:581
+msgid "for less than a minute"
+msgstr "एक मिनट से कम के लिए"
+
+#: extensions/base/mediawiki.py:583
+msgid "year"
+msgid_plural "years"
+msgstr[0] "साल"
+msgstr[1] "साल"
+
+#: extensions/base/mediawiki.py:583
+msgid "day"
+msgid_plural "days"
+msgstr[0] "दिन"
+msgstr[1] "दिन"
+
+#: extensions/base/mediawiki.py:583
+msgid "hour"
+msgid_plural "hours"
+msgstr[0] "घंटा"
+msgstr[1] "घंटे"
+
+#: extensions/base/mediawiki.py:584
+msgid "minute"
+msgid_plural "minutes"
+msgstr[0] "मिनट"
+msgstr[1] "मिनट"
+
+#: extensions/base/mediawiki.py:589
+#, python-brace-format
+msgid "for {time_number} {time_unit}"
+msgstr "{time_number} {time_unit} के लिए"
+
+#: extensions/base/mediawiki.py:608
+msgid "Blocked from editing the following pages: "
+msgstr "इन पृष्ठों को सम्पादित करने से ब्लॉक्ड: "
+
+#: extensions/base/mediawiki.py:615 extensions/base/mediawiki.py:661
+msgid " and namespaces: "
+msgstr " और इन नेमस्पेसों पर: "
+
+#: extensions/base/mediawiki.py:617
+msgid "Blocked from editing pages on following namespaces: "
+msgstr "इन नेमस्पेसों में पृष्ठों को सम्पादित करने से ब्लॉक्ड: "
+
+#: extensions/base/mediawiki.py:628
+msgid "Partial block details"
+msgstr "आधा ब्लॉक विवरण"
+
+#: extensions/base/mediawiki.py:631
+msgid "Block flags"
+msgstr "ब्लॉक के फ्लैग"
+
+#: extensions/base/mediawiki.py:633
+#, python-brace-format
+msgid "Blocked {blocked_user} {time}"
+msgstr "{blocked_user} को ब्लॉक किया {time}"
+
+#: extensions/base/mediawiki.py:653
+msgid " on pages: "
+msgstr " इन पृष्ठों पर: "
+
+#: extensions/base/mediawiki.py:663
+msgid " on namespaces: "
+msgstr " इन नेमस्पेसों पर: "
+
+#: extensions/base/mediawiki.py:675
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) blocked [{user}]({user_url}) {time}"
+"{restriction_desc}{comment}"
+msgstr ""
+"[{author}]({author_url}) ने [{user}]({user_url}) {time}{restriction_desc} को "
+"ब्लॉक किया{comment}"
+
+#: extensions/base/mediawiki.py:693
+#, python-brace-format
+msgid "Changed block settings for {blocked_user}"
+msgstr "{blocked_user} के ब्लॉक सेटिंग्स को बदला"
+
+#: extensions/base/mediawiki.py:703
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) changed block settings for [{blocked_user}]"
+"({user_url}){comment}"
+msgstr ""
+"[{author}]({author_url}) ने [{blocked_user}]({user_url}) के ब्लॉक सेटिंगस को "
+"बदला{comment}"
+
+#: extensions/base/mediawiki.py:716
+#, python-brace-format
+msgid "Unblocked {blocked_user}"
+msgstr "{blocked_user} को अनब्लॉक किया"
+
+#: extensions/base/mediawiki.py:726
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) unblocked [{blocked_user}]({user_url}){comment}"
+msgstr ""
+"[{author}]({author_url}) ने [{blocked_user}]({user_url}) को अनब्लॉक "
+"किया{comment}"
+
+#: extensions/base/mediawiki.py:742
+msgid "Action has been hidden by administration"
+msgstr "ऐक्शन ऐडमिनिस्ट्रेशन द्वारा छिपाया गया है"
+
+#: extensions/base/mediawiki.py:749
+msgid "An action has been hidden by administration."
+msgstr "एक ऐक्शन ऐडमिनिस्ट्रेशन द्वारा छिपाया गया है।"
+
+#: extensions/base/mediawiki.py:760
+#, python-brace-format
+msgid "Imported {article} with {count} revision"
+msgid_plural "Imported {article} with {count} revisions"
+msgstr[0] "{count} रिवीशन के साथ {article} को इम्पोर्ट किया गया"
+msgstr[1] "{count} रिवीशनों के साथ {article} को इम्पोर्ट किया गया"
+
+#: extensions/base/mediawiki.py:771
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) imported [{article}]({article_url}) with {count} "
+"revision{comment}"
+msgid_plural ""
+"[{author}]({author_url}) imported [{article}]({article_url}) with {count} "
+"revisions{comment}"
+msgstr[0] ""
+"[{author}]({author_url}) ने [{article}]({article_url}) को {count} रिवीशन के "
+"साथ ({article_url}) इम्पोर्ट किया{comment}"
+msgstr[1] ""
+"[{author}]({author_url}) ने [{article}]({article_url}) को {count} रिवीशनों के "
+"साथ ({article_url}) इम्पोर्ट किया{comment}"
+
+#: extensions/base/mediawiki.py:787
+#, python-brace-format
+msgid "Imported {article} with {count} revision from \"{source}\""
+msgid_plural "Imported {article} with {count} revisions from \"{source}\""
+msgstr[0] "\"{source}\" से {count} रिवीशन के साथ {article} को इम्पोर्ट किया गया"
+msgstr[1] "\"{source}\" से {count} रिवीशनों के साथ {article} को इम्पोर्ट किया गया"
+
+#: extensions/base/mediawiki.py:802
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) imported [{article}]({article_url}) with {count} "
+"revision from [{source}]({source_url}){comment}"
+msgid_plural ""
+"[{author}]({author_url}) imported [{article}]({article_url}) with {count} "
+"revisions from [{source}]({source_url}){comment}"
+msgstr[0] ""
+"[{author}]({author_url}) ने [{source}]({source_url}) से [{article}]"
+"({article_url}) को {count} रिवीशन के साथ ({article_url}) इम्पोर्ट किया{comment}"
+msgstr[1] ""
+"[{author}]({author_url}) ने [{source}]({source_url}) से [{article}]"
+"({article_url}) को {count} रिवीशनों के साथ ({article_url}) इम्पोर्ट किया{comment}"
+
+#: extensions/base/mediawiki.py:817
+#, python-brace-format
+msgid " (until {date_and_time})"
+msgstr " ({date_and_time} तक)"
+
+#: extensions/base/mediawiki.py:834
+#, python-brace-format
+msgid "Changed group membership for {target}"
+msgstr "{target} के ग्रुपों को बदला"
+
+#: extensions/base/mediawiki.py:836
+msgid "System"
+msgstr "सिस्टम"
+
+#: extensions/base/mediawiki.py:837
+#, python-brace-format
+msgid "{target} got autopromoted to a new usergroup"
+msgstr "{target} को एक नए यूज़रग्रुप में ऑटोप्रमोट किया गया"
+
+#: extensions/base/mediawiki.py:843
+msgid "Added group"
+msgid_plural "Added groups"
+msgstr[0] "जोड़ा गया समूह"
+msgstr[1] "जोड़े गए समूह"
+
+#: extensions/base/mediawiki.py:845
+msgid "Removed group"
+msgid_plural "Removed groups"
+msgstr[0] "हटाया गया समूह"
+msgstr[1] "हटाए गए समूह"
+
+#: extensions/base/mediawiki.py:859
+#, python-brace-format
+msgid "Added to {added} and removed from {removed}."
+msgstr "{added} में जोड़ा गया और {removed} से हटाया गया।"
+
+#: extensions/base/mediawiki.py:860 extensions/base/mediawiki.py:862
+#: extensions/base/mediawiki.py:864 extensions/base/mediawiki.py:871
+msgid ", "
+msgstr ", "
+
+#: extensions/base/mediawiki.py:862
+#, python-brace-format
+msgid "Added to {added}."
+msgstr "{added} में जोड़ा गया।"
+
+#: extensions/base/mediawiki.py:864
+#, python-brace-format
+msgid "Removed from {removed}."
+msgstr "{removed} से हटाया गया।"
+
+#: extensions/base/mediawiki.py:865
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) changed group membership for [{target}]"
+"({target_url}): {group_changes}{comment}"
+msgstr ""
+"[{author}]({author_url}) ने [{target}]({target_url}) के समूह सदस्यता को बदला:"
+" {group_changes}{comment}"
+
+#: extensions/base/mediawiki.py:869
+#, python-brace-format
+msgid "The system autopromoted [{target}]({target_url}) to {added}.{comment}"
+msgstr ""
+"सिस्टम ने [{target}]({target_url}) को {added} में ऑटोप्रमोट किया।{comment}"
+
+#: extensions/base/mediawiki.py:882
+#, python-brace-format
+msgid "Merged revision histories of {article} into {dest}"
+msgstr "{article} के रिवीशन इतिहास को {dest} में मर्ज किया गया"
+
+#: extensions/base/mediawiki.py:896
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) merged revision histories of [{article}]"
+"({article_url}) into [{dest}]({dest_url}){comment}"
+msgstr ""
+"[{author}]({author_url}) ने [{article}]({article_url}) के रिवीशन इतिहास को "
+"[{dest}]({dest_url}) में मर्ज किया{comment}"
+
+#: extensions/base/mediawiki.py:910
+msgid "Created account automatically"
+msgstr "अपने आप अकाउंट बनाया गया"
+
+#: extensions/base/mediawiki.py:917
+#, python-brace-format
+msgid "Account [{author}]({author_url}) was created automatically"
+msgstr "अकाउंट [{author}]({author_url}) अपने आप बना है"
+
+#: extensions/base/mediawiki.py:930 extensions/base/mediawiki.py:995
+msgid "Created account"
+msgstr "अकाउंट बनाया गया"
+
+#: extensions/base/mediawiki.py:937 extensions/base/mediawiki.py:1002
+#, python-brace-format
+msgid "Account [{author}]({author_url}) was created"
+msgstr "अकाउंट [{author}]({author_url}) को बनाया गया है"
+
+#: extensions/base/mediawiki.py:949
+#, python-brace-format
+msgid "Created account {article}"
+msgstr "अकाउंट {article} बनाया गया"
+
+#: extensions/base/mediawiki.py:958
+#, python-brace-format
+msgid ""
+"Account [{article}]({article_url}) was created by [{author}]({author_url})"
+"{comment}"
+msgstr ""
+"अकाउंट [{article}]({article_url}) [{author}]({author_url}) द्वारा बनाया गया "
+"है{comment}"
+
+#: extensions/base/mediawiki.py:971
+#, python-brace-format
+msgid "Created account {article} and password was sent by email"
+msgstr "अकाउंट {article} बनाया गया और पासवर्ड ईमेल के ज़रिये भेजा गया"
+
+#: extensions/base/mediawiki.py:982
+#, python-brace-format
+msgid ""
+"Account [{article}]({article_url}) was created by [{author}]({author_url}) "
+"and password was sent by email{comment}"
+msgstr ""
+"अकाउंट [{article}]({article_url}) [{author}]({author_url}) द्वारा बनाया गया है "
+"और पासवर्ड ईमेल के ज़रिये भेजा गया है{comment}"
+
+#: extensions/base/mediawiki.py:1014
+#, python-brace-format
+msgid "Changed the content model of the page {article}"
+msgstr "पृष्ठ {article} के कंटेंट मॉडल को बदला गया"
+
+#: extensions/base/mediawiki.py:1016
+#, python-brace-format
+msgid "Model changed from {old} to {new}: {reason}"
+msgstr "मॉडल को {old} से {new} में बदला गया: {reason}"
+
+#: extensions/base/mediawiki.py:1028
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) changed the content model of the page [{article}]"
+"({article_url}) from {old} to {new}{comment}"
+msgstr ""
+"[{author}]({author_url}) ने पृष्ठ [{article}]({article_url}) के कंटेंट मॉडल को "
+"{old} से {new} में बदला{comment}"
+
+#: extensions/base/mediawiki.py:1043
+#, python-brace-format
+msgid "Created the page {article} using a non-default content model"
+msgstr "पृष्ठ {article} को गैर-डिफ़ॉल्ट कंटेंट मॉडल की मदद से बनाया"
+
+#: extensions/base/mediawiki.py:1045
+#, python-brace-format
+msgid "Created with model {new}: {reason}"
+msgstr "मॉडल {new} से बनाया: {reason}"
+
+#: extensions/base/mediawiki.py:1056
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) created the page [{article}]({article_url}) using a "
+"non-default content model {new}{comment}"
+msgstr ""
+"[{author}]({author_url}) ने पृष्ठ [{article}]({article_url}) को गैर-डिफ़ॉल्ट कंटेंट "
+"मॉडल की मदद से बनाया {new}{comment}"
+
+#: extensions/base/mediawiki.py:1071
+#, python-brace-format
+msgid "Created the tag \"{tag}\""
+msgstr "टैग \"{tag}\" बनाया गया"
+
+#: extensions/base/mediawiki.py:1081
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) created the [tag]({tag_url}) \"{tag}\"{comment}"
+msgstr ""
+"[{author}]({author_url}) ने एक [टैग]({tag_url}) \"{tag}\" बनाया{comment}"
+
+#: extensions/base/mediawiki.py:1102
+#, python-brace-format
+msgid "Deleted the tag \"{tag}\""
+msgstr "टैग \"{tag}\" को डिलीट किया गया"
+
+#: extensions/base/mediawiki.py:1104
+msgid "Removed from"
+msgstr "इससे हटाया गया"
+
+#: extensions/base/mediawiki.py:1104
+msgid "{} revision or log entry"
+msgid_plural "{} revisions and/or log entries"
+msgstr[0] "{} रिवीशन या लॉग एंट्री"
+msgstr[1] "{} रिवीशन और/या लॉग एंट्री"
+
+#: extensions/base/mediawiki.py:1117
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) deleted the [tag]({tag_url}) \"{tag}\"{comment}"
+msgstr ""
+"[{author}]({author_url}) ने एक [टैग]({tag_url}) \"{tag}\" को डिलीट "
+"किया{comment}"
+
+#: extensions/base/mediawiki.py:1127
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) deleted the [tag]({tag_url}) \"{tag}\" and removed "
+"it from {count} revision or log entry{comment}"
+msgid_plural ""
+"[{author}]({author_url}) deleted the [tag]({tag_url}) \"{tag}\" and removed "
+"it from {count} revisions and/or log entries{comment}"
+msgstr[0] ""
+"[{author}]({author_url}) ने [टैग]({tag_url}) \"{tag}\" को डिलीट किया और इसे "
+"{count} रिवीशन या लॉग एंट्री से हटाया।{comment}"
+msgstr[1] ""
+"[{author}]({author_url}) ने [टैग]({tag_url}) \"{tag}\" को डिलीट किया और इसे "
+"{count} रिवीशनों और/या लॉग एंट्रियों से हटाया।{comment}"
+
+#: extensions/base/mediawiki.py:1144
+#, python-brace-format
+msgid "Activated the tag \"{tag}\""
+msgstr "टैग \"{tag}\" को सक्रीय किया गया"
+
+#: extensions/base/mediawiki.py:1153
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) activated the [tag]({tag_url}) \"{tag}\"{comment}"
+msgstr ""
+"[{author}]({author_url}) ने एक [टैग]({tag_url}) \"{tag}\" को सक्रीय "
+"किया{comment}"
+
+#: extensions/base/mediawiki.py:1172
+#, python-brace-format
+msgid "Deactivated the tag \"{tag}\""
+msgstr "टैग \"{tag}\" को अक्रीय किया गया"
+
+#: extensions/base/mediawiki.py:1181
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) deactivated the [tag]({tag_url}) \"{tag}\"{comment}"
+msgstr ""
+"[{author}]({author_url}) ने एक [टैग]({tag_url}) \"{tag}\" को अक्रीय "
+"किया{comment}"
+
+#: extensions/base/sprite.py:37
+#, python-brace-format
+msgid "Edited the sprite for {article}"
+msgstr "{article} के स्प्राइट को सम्पादित किया गया"
+
+#: extensions/base/sprite.py:45
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) edited the sprite for [{article}]({article_url})"
+msgstr ""
+"[{author}]({author_url}) [{article}]({article_url}) के स्प्राइट को सम्पादित किया"
+
+#: extensions/base/sprite.py:60
+#, python-brace-format
+msgid "Created the sprite sheet for {article}"
+msgstr "{article} के लिए स्प्राइट शीट बनाया गया"
+
+#: extensions/base/sprite.py:68
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) created the sprite sheet for [{article}]"
+"({article_url})"
+msgstr ""
+"[{author}]({author_url}) ने [{article}]({article_url}) के लिए स्प्राइट शीट बनाया"
+
+#: extensions/base/sprite.py:79
+#, python-brace-format
+msgid "Edited the slice for {article}"
+msgstr "{article} के स्लाइस को सम्पादित किया गया"
+
+#: extensions/base/sprite.py:86
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) edited the slice for [{article}]({article_url})"
+msgstr ""
+"[{author}]({author_url}) ने [{article}]({article_url}) के स्लाइस को सम्पादित किया"
+
+#, fuzzy, python-brace-format
+#~ msgid ""
+#~ "[{author}]({author_url}) changed group membership for [{target}]"
+#~ "({target_url}) {added}{comma} {removed}{comment}"
+#~ msgstr ""
+#~ "[{author}]({author_url}) ने [{target}]({target_url}) के लिए ग्रुप "
+#~ "{old_groups} से {new_groups} में बदला{comment}"
+
+#, python-brace-format
+#~ msgid "{value} (avg. {avg})"
+#~ msgstr "{value} (औसत {avg})"
+
+#~ msgid "Daily overview"
+#~ msgstr "दैनिक अवलोकन"
+
+#~ msgid "No activity"
+#~ msgstr "कोई ऐक्टिविटी नहीं थी"
+
+#~ msgid " ({} action)"
+#~ msgid_plural " ({} actions)"
+#~ msgstr[0] " ({} एक्शन)"
+#~ msgstr[1] " ({} एक्शन)"
+
+#~ msgid " ({} edit)"
+#~ msgid_plural " ({} edits)"
+#~ msgstr[0] " ({} सम्पादना)"
+#~ msgstr[1] " ({} सम्पादनाएँ)"
+
+#~ msgid " UTC ({} action)"
+#~ msgid_plural " UTC ({} actions)"
+#~ msgstr[0] " UTC ({} एक्शन)"
+#~ msgstr[1] " UTC ({} एक्शन)"
+
+#~ msgid "But nobody came"
+#~ msgstr "पर कोई नहीं आया"
+
+#~ msgid "Most active user"
+#~ msgid_plural "Most active users"
+#~ msgstr[0] "सबसे सक्रीय सदस्य"
+#~ msgstr[1] "सबसे सक्रीय सदस्य"
+
+#~ msgid "Most edited article"
+#~ msgid_plural "Most edited articles"
+#~ msgstr[0] "सबसे ज़्यादा सम्पादित किया गया आर्टिकल"
+#~ msgstr[1] "सबसे ज़्यादा सम्पादित किए गए आर्टिकल"
+
+#~ msgid "Edits made"
+#~ msgstr "दिए गए सम्पादनाएँ"
+
+#~ msgid "New files"
+#~ msgstr "नए चित्र"
+
+#~ msgid "Admin actions"
+#~ msgstr "एडमिन एक्शन"
+
+#~ msgid "Bytes changed"
+#~ msgstr "बदले गए बाइट"
+
+#~ msgid "New articles"
+#~ msgstr "नए आर्टिकल"
+
+#~ msgid "Unique contributors"
+#~ msgstr "विशेष सदस्य"
+
+#~ msgid "Most active hour"
+#~ msgid_plural "Most active hours"
+#~ msgstr[0] "सबसे सक्रीय घंटा"
+#~ msgstr[1] "सबसे सक्रीय घंटे"
+
+#~ msgid "Day score"
+#~ msgstr "दिन का स्कोर"
+
+#~ msgid "No description provided"
+#~ msgstr "कोई विवरण नहीं दिया गया"
+
+#~ msgid "second"
+#~ msgid_plural "seconds"
+#~ msgstr[0] "सेकंड"
+#~ msgstr[1] "सेकंड"
+
+#~ msgid "week"
+#~ msgid_plural "weeks"
+#~ msgstr[0] "हफ्ता"
+#~ msgstr[1] "हफ्तें"
+
+#~ msgid "month"
+#~ msgid_plural "months"
+#~ msgstr[0] "महीना"
+#~ msgstr[1] "महीनें"
+
+#~ msgid "millennium"
+#~ msgid_plural "millennia"
+#~ msgstr[0] "सहस्त्राब्द"
+#~ msgstr[1] "सहस्त्राब्द"
+
+#~ msgid "decade"
+#~ msgid_plural "decades"
+#~ msgstr[0] "दशक"
+#~ msgstr[1] "दशक"
+
+#~ msgid "century"
+#~ msgid_plural "centuries"
+#~ msgstr[0] "शताब्दी"
+#~ msgstr[1] "शताब्दियाँ"
+
+#, python-brace-format
+#~ msgid ""
+#~ "[{author}]({author_url}) edited [{article}]({edit_link}){comment} ({bold}"
+#~ "{sign}{edit_size}{bold})"
+#~ msgstr ""
+#~ "[{author}]({author_url}) ने [{article}]({edit_link}){comment} ({bold}{sign}"
+#~ "{edit_size}{bold}) को सम्पादित किया"
+
+#, python-brace-format
+#~ msgid ""
+#~ "[{author}]({author_url}) created [{article}]({edit_link}){comment} ({bold}"
+#~ "{sign}{edit_size}{bold})"
+#~ msgstr ""
+#~ "[{author}]({author_url}) ने [{article}]({edit_link}){comment} ({bold}{sign}"
+#~ "{edit_size}{bold}) बनाया"
+
+#, python-brace-format
+#~ msgid "for {num} {translated_length}"
+#~ msgstr "{num} {translated_length} के लिए"
+
+#~ msgid "until {}"
+#~ msgstr "{} के लिए"
+
+#, python-brace-format
+#~ msgid "[{author}]({author_url}) deleted a comment on {target}'s profile"
+#~ msgstr ""
+#~ "[{author}]({author_url}) ने {target} के प्रॉफाइल के एक कमेंट को डिलीट किया"
+
+#, python-brace-format
+#~ msgid "[{author}]({author_url}) deleted a comment on their own profile"
+#~ msgstr "[{author}]({author_url}) ने अपने प्रॉफाइल पर एक कमेंट को डिलीट किया"
+
+#, python-brace-format
+#~ msgid ""
+#~ "[{author}]({author_url}) edited the {field} on {target}'s profile. "
+#~ "*({desc})*"
+#~ msgstr ""
+#~ "[{author}]({author_url}) ने {target} के प्रॉफाइल पर {field} को सम्पादित किया। "
+#~ "*({desc})*"
+
+#, python-brace-format
+#~ msgid ""
+#~ "[{author}]({author_url}) edited the {field} on their own profile. "
+#~ "*({desc})*"
+#~ msgstr ""
+#~ "[{author}]({author_url}) ने अपने प्रॉफाइल पर {field} को सम्पादित किया। "
+#~ "*({desc})*"
+
+#~ msgid "none"
+#~ msgstr "कुछ नहीं"
+
+#, python-brace-format
+#~ msgid ""
+#~ "{author} autopromoted [{target}]({target_url}) from {old_groups} to "
+#~ "{new_groups}{comment}"
+#~ msgstr ""
+#~ "{author} ने [{target}]({target_url}) को {old_groups} से {new_groups} में "
+#~ "ऑटोप्रमोट किया{comment}"
+
+#, python-brace-format
+#~ msgid "[{author}]({author_url}) imported interwiki{comment}"
+#~ msgstr "[{author}]({author_url}) ने इंटरविकी इम्पोर्ट किया{comment}"
+
+#, python-brace-format
+#~ msgid ""
+#~ "[{author}]({author_url}) deleted an entry in [interwiki table]"
+#~ "({table_url})"
+#~ msgstr ""
+#~ "[{author}]({author_url}) ने [इंटरविकी टेबल]({table_url}) पर एक एंट्री को डिलीट "
+#~ "किया"
+
+#, python-brace-format
+#~ msgid "[{author}]({author_url}) created a [tag]({tag_url}) \"{tag}\""
+#~ msgstr "[{author}]({author_url}) ने एक [टैग]({tag_url}) \"{tag}\" बनाया"
+
+#, python-brace-format
+#~ msgid "[{author}]({author_url}) deleted a [tag]({tag_url}) \"{tag}\""
+#~ msgstr ""
+#~ "[{author}]({author_url}) ने एक [टैग]({tag_url}) \"{tag}\" को डिलीट किया"
+
+#, python-brace-format
+#~ msgid "[{author}]({author_url}) activated a [tag]({tag_url}) \"{tag}\""
+#~ msgstr ""
+#~ "[{author}]({author_url}) ने एक [टैग]({tag_url}) \"{tag}\" को ऐक्टिवेट किया"
+
+#, python-brace-format
+#~ msgid "[{author}]({author_url}) deactivated a [tag]({tag_url}) \"{tag}\""
+#~ msgstr ""
+#~ "[{author}]({author_url}) ने एक [टैग]({tag_url}) \"{tag}\" को डिऐक्टिवेट किया"
+
+#, python-brace-format
+#~ msgid "[{author}]({author_url}) changed wiki settings ({reason})"
+#~ msgstr "[{author}]({author_url}) ने विकी सेटिंग्स को बदला ({reason})"
+
+#, python-brace-format
+#~ msgid "[{author}]({author_url}) deleted a wiki *{wiki_name}* ({comment})"
+#~ msgstr ""
+#~ "[{author}]({author_url}) ने विकी *{wiki_name}* को डिलीट किया ({comment})"
+
+#, python-brace-format
+#~ msgid "[{author}]({author_url}) locked a wiki *{wiki_name}* ({comment})"
+#~ msgstr ""
+#~ "[{author}]({author_url}) ने विकी *{wiki_name}* ({comment}) के लॉक किया"
+
+#, python-brace-format
+#~ msgid ""
+#~ "[{author}]({author_url}) modified a namespace *{namespace_name}* on "
+#~ "*{wiki_name}* ({comment})"
+#~ msgstr ""
+#~ "[{author}]({author_url}) ने *{wiki_name}* पर एक नेमस्पेस *{namespace_name}* "
+#~ "को मॉडिफाइ किया ({comment})"
+
+#, python-brace-format
+#~ msgid ""
+#~ "[{author}]({author_url}) deleted a namespace *{namespace_name}* on "
+#~ "*{wiki_name}* ({comment})"
+#~ msgstr ""
+#~ "[{author}]({author_url}) ने *{wiki_name}* पर नेमस्पेस *{namespace_name}* को "
+#~ "डिलीट किया ({comment})"
+
+#, python-brace-format
+#~ msgid ""
+#~ "[{author}]({author_url}) modified user group *{group_name}* ({comment})"
+#~ msgstr ""
+#~ "[{author}]({author_url}) ने यूज़र ग्रुप *{group_name}* को मॉडिफाइ किया "
+#~ "({comment})"
+
+#, python-brace-format
+#~ msgid "[{author}]({author_url}) restored a wiki *{wiki_name}* ({comment})"
+#~ msgstr ""
+#~ "[{author}]({author_url}) ने एक विकी *{wiki_name}* को रिस्टोर किया "
+#~ "({comment})"
+
+#, python-brace-format
+#~ msgid "[{author}]({author_url}) unlocked a wiki *{wiki_name}* ({comment})"
+#~ msgstr ""
+#~ "[{author}]({author_url}) ने एक विकी *{wiki_name}* को अनलॉक किया ({comment})"
+
+#, python-brace-format
+#~ msgid ""
+#~ "Unknown event `{event}` by [{author}]({author_url}), report it on the "
+#~ "[support server](<{support}>)."
+#~ msgstr ""
+#~ "[{author}]({author_url}) द्वारा अनजान घटना `{event}`, इसे [सहायता सर्वर]"
+#~ "(<{support}>) पर रिपोर्ट करें।"
+
+#~ msgid "unknown expiry time"
+#~ msgstr "अनजान समय सीमा"
+
+#, python-brace-format
+#~ msgid "Groups changed from {old_groups} to {new_groups}{reason}"
+#~ msgstr "ग्रुपों को {old_groups} से {new_groups} में बदला गया{reason}"
+
+#~ msgid "Imported interwiki"
+#~ msgstr "इंटरविकी इम्पोर्ट किया गया"
+
+#, python-brace-format
+#~ msgid "Created a tag \"{tag}\""
+#~ msgstr "टैग \"{tag}\" बनाया गया"
+
+#, python-brace-format
+#~ msgid "Deleted a tag \"{tag}\""
+#~ msgstr "टैग \"{tag}\" को डिलीट किया गया"
+
+#, python-brace-format
+#~ msgid "Activated a tag \"{tag}\""
+#~ msgstr "टैग \"{tag}\" को ऐक्टिवेट किया गया"
+
+#, python-brace-format
+#~ msgid "Deactivated a tag \"{tag}\""
+#~ msgstr "टैग \"{tag}\" को डिऐक्टिवेट किया गया"
+
+#, python-brace-format
+#~ msgid "Modified a \"{namespace_name}\" namespace"
+#~ msgstr "\"{namespace_name}\" नेमस्पेस को मॉडिफाइ किया गया"
+
+#, python-brace-format
+#~ msgid "Restored a \"{wiki}\" wiki"
+#~ msgstr "\"{wiki}\" विकी को रिस्टोर किया गया"
+
+#, python-brace-format
+#~ msgid "Unknown event `{event}`"
+#~ msgstr "अनजान घटना `{event}`"
+
+#~ msgid "Report this on the support server"
+#~ msgstr "इसे सहायता सर्वर पर रिपोर्ट करें"
+
+#, python-brace-format
+#~ msgid ""
+#~ "[{author}]({author_url}) completed deletion of translatable page "
+#~ "[{article}]({article_url}){comment}"
+#~ msgstr ""
+#~ "[{author}]({author_url}) ने अनुवाद लायक पृष्ठ [{article}]({article_url}) के "
+#~ "डिलीशन को पूरा किया{comment}"
+
+#, python-brace-format
+#~ msgid "Completed deletion of translatable page \"{article}\""
+#~ msgstr "अनुवाद-लायक पृष्ठ \"{article}\" के डिलीशन पृष्ठ को पूरा किया"
+
+#, python-brace-format
+#~ msgid "[{author}]({author_url}) restored a wiki *{wiki_name}*{comment}"
+#~ msgstr ""
+#~ "[{author}]({author_url}) ने एक विकी *{wiki_name}* को रिस्टोर किया{comment}"
diff --git a/locale/hi/LC_MESSAGES/misc.po b/locale/hi/LC_MESSAGES/misc.po
index 687a64a..30e2c9a 100644
--- a/locale/hi/LC_MESSAGES/misc.po
+++ b/locale/hi/LC_MESSAGES/misc.po
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: RcGcDw\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2020-11-29 00:05+0100\n"
+"POT-Creation-Date: 2021-07-11 14:32+0200\n"
"PO-Revision-Date: 2020-11-25 10:16+0000\n"
"Last-Translator: Creeper \n"
"Language-Team: Hindi \n"
@@ -70,7 +70,7 @@ msgstr "डिस्कॉर्ड अकाउंट"
msgid "Battle.net handle"
msgstr "Battle.net अकाउंट"
-#: src/misc.py:119
+#: src/misc.py:139
msgid ""
"\n"
"__And more__"
@@ -78,10 +78,10 @@ msgstr ""
"\n"
"__और काफी कुछ__"
-#: src/misc.py:276
+#: src/misc.py:328
msgid "Unknown"
msgstr "अनजान"
-#: src/misc.py:278
+#: src/misc.py:330
msgid "unknown"
msgstr "अनजान"
diff --git a/locale/hi/LC_MESSAGES/rc_formatters.mo b/locale/hi/LC_MESSAGES/rc_formatters.mo
deleted file mode 100644
index 1d792b3..0000000
Binary files a/locale/hi/LC_MESSAGES/rc_formatters.mo and /dev/null differ
diff --git a/locale/hi/LC_MESSAGES/rc_formatters.po b/locale/hi/LC_MESSAGES/rc_formatters.po
index aa6862d..ab25f60 100644
--- a/locale/hi/LC_MESSAGES/rc_formatters.po
+++ b/locale/hi/LC_MESSAGES/rc_formatters.po
@@ -8,7 +8,7 @@ msgstr ""
"Project-Id-Version: RcGcDw\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2021-04-14 16:24+0200\n"
-"PO-Revision-Date: 2020-12-30 13:26+0000\n"
+"PO-Revision-Date: 2021-05-06 14:10+0000\n"
"Last-Translator: Creeper \n"
"Language-Team: Hindi \n"
@@ -17,7 +17,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n > 1;\n"
-"X-Generator: Weblate 4.2.1\n"
+"X-Generator: Weblate 4.6\n"
#: src/rc_formatters.py:28
msgid "None"
@@ -593,19 +593,22 @@ msgid "[{author}]({author_url}) replaced the Cargo table \"{table}\""
msgstr "[{author}]({author_url}) ने कार्गो टेबल \"{table}\" को बदल दिया"
#: src/rc_formatters.py:436
-#, fuzzy, python-brace-format
+#, python-brace-format
msgid ""
"[{author}]({author_url}) created the [tag]({tag_url}) \"{tag}\"{comment}"
-msgstr "[{author}]({author_url}) ने एक [टैग]({tag_url}) \"{tag}\" बनाया"
+msgstr ""
+"[{author}]({author_url}) ने एक [टैग]({tag_url}) \"{tag}\" बनाया{comment}"
#: src/rc_formatters.py:441
-#, fuzzy, python-brace-format
+#, python-brace-format
msgid ""
"[{author}]({author_url}) deleted the [tag]({tag_url}) \"{tag}\"{comment}"
-msgstr "[{author}]({author_url}) ने एक [टैग]({tag_url}) \"{tag}\" को डिलीट किया"
+msgstr ""
+"[{author}]({author_url}) ने एक [टैग]({tag_url}) \"{tag}\" को डिलीट "
+"किया{comment}"
#: src/rc_formatters.py:443
-#, fuzzy, python-brace-format
+#, python-brace-format
msgid ""
"[{author}]({author_url}) deleted the [tag]({tag_url}) \"{tag}\" and removed "
"it from {count} revision or log entry{comment}"
@@ -613,24 +616,27 @@ msgid_plural ""
"[{author}]({author_url}) deleted the [tag]({tag_url}) \"{tag}\" and removed "
"it from {count} revisions and/or log entries{comment}"
msgstr[0] ""
-"[{author}]({author_url}) ने [{article}]({article_url}) को {count} रिवीशन के "
-"साथ ({article_url}) इम्पोर्ट किया{comment}"
+"[{author}]({author_url}) ने [टैग]({tag_url}) \"{tag}\" को डिलीट किया और इसे "
+"{count} रिवीशन या लॉग एंट्री से हटाया{comment}"
msgstr[1] ""
-"[{author}]({author_url}) ने [{article}]({article_url}) को {count} रिवीशनों के "
-"साथ ({article_url}) इम्पोर्ट किया{comment}"
+"[{author}]({author_url}) ने [टैग]({tag_url}) \"{tag}\" को डिलीट किया और इसे "
+"{count} रिवीशनों या लॉग एंट्रियों से हटाया{comment}"
#: src/rc_formatters.py:449
-#, fuzzy, python-brace-format
+#, python-brace-format
msgid ""
"[{author}]({author_url}) activated the [tag]({tag_url}) \"{tag}\"{comment}"
-msgstr "[{author}]({author_url}) ने एक [टैग]({tag_url}) \"{tag}\" को ऐक्टिवेट किया"
+msgstr ""
+"[{author}]({author_url}) ने एक [टैग]({tag_url}) \"{tag}\" को सक्रीय "
+"किया{comment}"
#: src/rc_formatters.py:452
-#, fuzzy, python-brace-format
+#, python-brace-format
msgid ""
"[{author}]({author_url}) deactivated the [tag]({tag_url}) \"{tag}\"{comment}"
msgstr ""
-"[{author}]({author_url}) ने एक [टैग]({tag_url}) \"{tag}\" को डिऐक्टिवेट किया"
+"[{author}]({author_url}) ने एक [टैग]({tag_url}) \"{tag}\" को अक्रीय "
+"किया{comment}"
#: src/rc_formatters.py:454
#, python-brace-format
@@ -648,12 +654,12 @@ msgid "[{author}]({author_url}) locked a wiki *{wiki_name}*{comment}"
msgstr "[{author}]({author_url}) ने विकी *{wiki_name}* के लॉक किया{comment}"
#: src/rc_formatters.py:462
-#, fuzzy, python-brace-format
+#, python-brace-format
msgid ""
"[{author}]({author_url}) modified namespace *{namespace_name}* on "
"*{wiki_name}*{comment}"
msgstr ""
-"[{author}]({author_url}) ने *{wiki_name}* पर एक नेमस्पेस *{namespace_name}* को "
+"[{author}]({author_url}) ने *{wiki_name}* पर नेमस्पेस *{namespace_name}* को "
"मॉडिफाइ किया{comment}"
#: src/rc_formatters.py:467
@@ -672,9 +678,9 @@ msgstr ""
"[{author}]({author_url}) ने यूज़र ग्रुप *{group_name}* को मॉडिफाइ किया{comment}"
#: src/rc_formatters.py:477
-#, fuzzy, python-brace-format
+#, python-brace-format
msgid "[{author}]({author_url}) undeleted a wiki *{wiki_name}*{comment}"
-msgstr "[{author}]({author_url}) ने विकी *{wiki_name}* को डिलीट किया{comment}"
+msgstr "[{author}]({author_url}) ने विकि *{wiki_name}* को अनडिलीट किया{comment}"
#: src/rc_formatters.py:481
#, python-brace-format
@@ -1290,35 +1296,34 @@ msgid "Replaced the Cargo table \"{table}\""
msgstr "कोर्गो टेबल \"{table}\" को बदला गया"
#: src/rc_formatters.py:1121
-#, fuzzy, python-brace-format
+#, python-brace-format
msgid "Created the tag \"{tag}\""
msgstr "टैग \"{tag}\" बनाया गया"
#: src/rc_formatters.py:1125
-#, fuzzy, python-brace-format
+#, python-brace-format
msgid "Deleted the tag \"{tag}\""
msgstr "टैग \"{tag}\" को डिलीट किया गया"
#: src/rc_formatters.py:1127
-#, fuzzy
msgid "Removed from"
-msgstr "हटाया गया"
+msgstr "इससे हटाया गया"
#: src/rc_formatters.py:1127
msgid "{} revision or log entry"
msgid_plural "{} revisions and/or log entries"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "{} रिवीशन और/या लॉग एंट्री"
+msgstr[1] "{} रिवीशन और/या लॉग एंट्रियाँ"
#: src/rc_formatters.py:1131
-#, fuzzy, python-brace-format
+#, python-brace-format
msgid "Activated the tag \"{tag}\""
-msgstr "टैग \"{tag}\" को ऐक्टिवेट किया गया"
+msgstr "टैग \"{tag}\" को सक्रीय किया गया"
#: src/rc_formatters.py:1134
-#, fuzzy, python-brace-format
+#, python-brace-format
msgid "Deactivated the tag \"{tag}\""
-msgstr "टैग \"{tag}\" को डिऐक्टिवेट किया गया"
+msgstr "टैग \"{tag}\" को अक्रीय किया गया"
#: src/rc_formatters.py:1137
msgid "Changed wiki settings"
@@ -1335,7 +1340,7 @@ msgid "Locked a \"{wiki}\" wiki"
msgstr "\"{wiki}\" विकी को लॉक किया गया"
#: src/rc_formatters.py:1147
-#, fuzzy, python-brace-format
+#, python-brace-format
msgid "Modified \"{namespace_name}\" namespace"
msgstr "\"{namespace_name}\" नेमस्पेस को मॉडिफाइ किया गया"
@@ -1354,9 +1359,9 @@ msgid "Modified \"{usergroup_name}\" usergroup"
msgstr "\"{usergroup_name}\" यूज़रग्रुप को मॉडिफाइ किया गया"
#: src/rc_formatters.py:1160
-#, fuzzy, python-brace-format
+#, python-brace-format
msgid "Undeleted a \"{wiki}\" wiki"
-msgstr "\"{wiki}\" विकी को डिलीट किया गया"
+msgstr "\"{wiki}\" विकि को अनडिलीट किया गया"
#: src/rc_formatters.py:1163
#, python-brace-format
diff --git a/locale/hi/LC_MESSAGES/rcgcdw.mo b/locale/hi/LC_MESSAGES/rcgcdw.mo
index c485519..ec8b03b 100644
Binary files a/locale/hi/LC_MESSAGES/rcgcdw.mo and b/locale/hi/LC_MESSAGES/rcgcdw.mo differ
diff --git a/locale/hi/LC_MESSAGES/rcgcdw.po b/locale/hi/LC_MESSAGES/rcgcdw.po
index 170dfa7..f509508 100644
--- a/locale/hi/LC_MESSAGES/rcgcdw.po
+++ b/locale/hi/LC_MESSAGES/rcgcdw.po
@@ -7,199 +7,190 @@ msgid ""
msgstr ""
"Project-Id-Version: RcGcDw\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2020-12-23 00:28+0100\n"
-"PO-Revision-Date: 2020-12-06 14:17+0000\n"
+"POT-Creation-Date: 2021-07-11 14:32+0200\n"
+"PO-Revision-Date: 2021-07-11 12:33+0000\n"
"Last-Translator: Creeper \n"
-"Language-Team: Hindi \n"
+"Language-Team: Hindi "
+"\n"
"Language: hi\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n > 1;\n"
-"X-Generator: Weblate 4.2.1\n"
+"X-Generator: Weblate 4.6.2\n"
-#: src/rcgcdw.py:115 src/rcgcdw.py:117 src/rcgcdw.py:119 src/rcgcdw.py:121
-#: src/rcgcdw.py:123 src/rcgcdw.py:125 src/rcgcdw.py:127
+#: src/rcgcdw.py:117
#, python-brace-format
msgid "{value} (avg. {avg})"
msgstr "{value} (औसत {avg})"
-#: src/rcgcdw.py:147
+#: src/rcgcdw.py:136
msgid "Daily overview"
msgstr "दैनिक अवलोकन"
-#: src/rcgcdw.py:154
+#: src/rcgcdw.py:143
msgid "No activity"
msgstr "कोई ऐक्टिविटी नहीं थी"
-#: src/rcgcdw.py:178
+#: src/rcgcdw.py:167
msgid " ({} action)"
msgid_plural " ({} actions)"
msgstr[0] " ({} एक्शन)"
msgstr[1] " ({} एक्शन)"
-#: src/rcgcdw.py:180
+#: src/rcgcdw.py:169
msgid " ({} edit)"
msgid_plural " ({} edits)"
msgstr[0] " ({} सम्पादना)"
msgstr[1] " ({} सम्पादनाएँ)"
-#: src/rcgcdw.py:185
+#: src/rcgcdw.py:174
msgid " UTC ({} action)"
msgid_plural " UTC ({} actions)"
msgstr[0] " UTC ({} एक्शन)"
msgstr[1] " UTC ({} एक्शन)"
-#: src/rcgcdw.py:187 src/rcgcdw.py:188 src/rcgcdw.py:192
+#: src/rcgcdw.py:176 src/rcgcdw.py:179
msgid "But nobody came"
msgstr "पर कोई नहीं आया"
-#: src/rcgcdw.py:195
+#: src/rcgcdw.py:183
msgid "Most active user"
msgid_plural "Most active users"
msgstr[0] "सबसे सक्रीय सदस्य"
msgstr[1] "सबसे सक्रीय सदस्य"
-#: src/rcgcdw.py:196
+#: src/rcgcdw.py:184
msgid "Most edited article"
msgid_plural "Most edited articles"
msgstr[0] "सबसे ज़्यादा सम्पादित किया गया आर्टिकल"
msgstr[1] "सबसे ज़्यादा सम्पादित किए गए आर्टिकल"
-#: src/rcgcdw.py:197
+#: src/rcgcdw.py:185
msgid "Edits made"
msgstr "दिए गए सम्पादनाएँ"
-#: src/rcgcdw.py:197
+#: src/rcgcdw.py:185
msgid "New files"
msgstr "नए चित्र"
-#: src/rcgcdw.py:197
+#: src/rcgcdw.py:186
msgid "Admin actions"
msgstr "एडमिन एक्शन"
-#: src/rcgcdw.py:198
+#: src/rcgcdw.py:186
msgid "Bytes changed"
msgstr "बदले गए बाइट"
-#: src/rcgcdw.py:198
+#: src/rcgcdw.py:187
msgid "New articles"
msgstr "नए आर्टिकल"
-#: src/rcgcdw.py:199
+#: src/rcgcdw.py:187
msgid "Unique contributors"
msgstr "विशेष सदस्य"
-#: src/rcgcdw.py:200
+#: src/rcgcdw.py:188
msgid "Most active hour"
msgid_plural "Most active hours"
msgstr[0] "सबसे सक्रीय घंटा"
msgstr[1] "सबसे सक्रीय घंटे"
-#: src/rcgcdw.py:201
+#: src/rcgcdw.py:189
msgid "Day score"
msgstr "दिन का स्कोर"
-#: src/rcgcdw.py:243
-msgid "director"
-msgstr "निर्देशक"
+#: src/rcgcdw.py:223
+msgid "~~hidden~~"
+msgstr "~~छिपाया गया~~"
-#: src/rcgcdw.py:243
-msgid "bot"
-msgstr "बॉट"
+#: src/rcgcdw.py:225
+msgid "No description provided"
+msgstr "कोई विवरण नहीं दिया गया"
-#: src/rcgcdw.py:243
-msgid "editor"
-msgstr "सम्पादक"
+#: src/rcgcdw.py:228
+msgid "hidden"
+msgstr "छिपाया गया"
-#: src/rcgcdw.py:243
-msgid "directors"
-msgstr "निर्देशक"
+#~ msgid "director"
+#~ msgstr "निर्देशक"
-#: src/rcgcdw.py:243
-msgid "sysop"
-msgstr "साइसॉप"
+#~ msgid "bot"
+#~ msgstr "बॉट"
-#: src/rcgcdw.py:243
-msgid "bureaucrat"
-msgstr "ब्यूरोक्रैट"
+#~ msgid "editor"
+#~ msgstr "सम्पादक"
-#: src/rcgcdw.py:243
-msgid "reviewer"
-msgstr "रिव्युअर"
+#~ msgid "directors"
+#~ msgstr "निर्देशक"
-#: src/rcgcdw.py:244
-msgid "autoreview"
-msgstr "ऑटोरिव्यु"
+#~ msgid "sysop"
+#~ msgstr "साइसॉप"
-#: src/rcgcdw.py:244
-msgid "autopatrol"
-msgstr "ऑटोपैट्रॉल"
+#~ msgid "bureaucrat"
+#~ msgstr "ब्यूरोक्रैट"
-#: src/rcgcdw.py:244
-msgid "wiki_guardian"
-msgstr "विकी_संरक्षक"
+#~ msgid "reviewer"
+#~ msgstr "रिव्युअर"
-#: src/rcgcdw.py:244
-msgid "second"
-msgid_plural "seconds"
-msgstr[0] "सेकंड"
-msgstr[1] "सेकंड"
+#~ msgid "autoreview"
+#~ msgstr "ऑटोरिव्यु"
-#: src/rcgcdw.py:244
-msgid "minute"
-msgid_plural "minutes"
-msgstr[0] "मिनट"
-msgstr[1] "मिनट"
+#~ msgid "autopatrol"
+#~ msgstr "ऑटोपैट्रॉल"
-#: src/rcgcdw.py:244
-msgid "hour"
-msgid_plural "hours"
-msgstr[0] "घंटा"
-msgstr[1] "घंटे"
+#~ msgid "wiki_guardian"
+#~ msgstr "विकी_संरक्षक"
-#: src/rcgcdw.py:244
-msgid "day"
-msgid_plural "days"
-msgstr[0] "दिन"
-msgstr[1] "दिन"
+#~ msgid "second"
+#~ msgid_plural "seconds"
+#~ msgstr[0] "सेकंड"
+#~ msgstr[1] "सेकंड"
-#: src/rcgcdw.py:244
-msgid "week"
-msgid_plural "weeks"
-msgstr[0] "हफ्ता"
-msgstr[1] "हफ्तें"
+#~ msgid "minute"
+#~ msgid_plural "minutes"
+#~ msgstr[0] "मिनट"
+#~ msgstr[1] "मिनट"
-#: src/rcgcdw.py:244
-msgid "month"
-msgid_plural "months"
-msgstr[0] "महीना"
-msgstr[1] "महीनें"
+#~ msgid "hour"
+#~ msgid_plural "hours"
+#~ msgstr[0] "घंटा"
+#~ msgstr[1] "घंटे"
-#: src/rcgcdw.py:244
-msgid "year"
-msgid_plural "years"
-msgstr[0] "साल"
-msgstr[1] "साल"
+#~ msgid "day"
+#~ msgid_plural "days"
+#~ msgstr[0] "दिन"
+#~ msgstr[1] "दिन"
-#: src/rcgcdw.py:244
-msgid "millennium"
-msgid_plural "millennia"
-msgstr[0] "सहस्त्राब्द"
-msgstr[1] "सहस्त्राब्द"
+#~ msgid "week"
+#~ msgid_plural "weeks"
+#~ msgstr[0] "हफ्ता"
+#~ msgstr[1] "हफ्तें"
-#: src/rcgcdw.py:244
-msgid "decade"
-msgid_plural "decades"
-msgstr[0] "दशक"
-msgstr[1] "दशक"
+#~ msgid "month"
+#~ msgid_plural "months"
+#~ msgstr[0] "महीना"
+#~ msgstr[1] "महीनें"
-#: src/rcgcdw.py:244
-msgid "century"
-msgid_plural "centuries"
-msgstr[0] "शताब्दी"
-msgstr[1] "शताब्दियाँ"
+#~ msgid "year"
+#~ msgid_plural "years"
+#~ msgstr[0] "साल"
+#~ msgstr[1] "साल"
+
+#~ msgid "millennium"
+#~ msgid_plural "millennia"
+#~ msgstr[0] "सहस्त्राब्द"
+#~ msgstr[1] "सहस्त्राब्द"
+
+#~ msgid "decade"
+#~ msgid_plural "decades"
+#~ msgstr[0] "दशक"
+#~ msgstr[1] "दशक"
+
+#~ msgid "century"
+#~ msgid_plural "centuries"
+#~ msgstr[0] "शताब्दी"
+#~ msgstr[1] "शताब्दियाँ"
#~ msgid "None"
#~ msgstr "कुछ नहीं"
@@ -759,9 +750,6 @@ msgstr[1] "शताब्दियाँ"
#~ msgid "Title"
#~ msgstr "शीर्षक"
-#~ msgid "No description provided"
-#~ msgstr "कोई विवरण नहीं दिया गया"
-
#~ msgid "(N!) "
#~ msgstr "(न!) "
diff --git a/locale/hi/LC_MESSAGES/redaction.po b/locale/hi/LC_MESSAGES/redaction.po
index 2de303a..a3dd3bf 100644
--- a/locale/hi/LC_MESSAGES/redaction.po
+++ b/locale/hi/LC_MESSAGES/redaction.po
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: RcGcDw\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2020-12-23 00:28+0100\n"
+"POT-Creation-Date: 2021-07-11 14:32+0200\n"
"PO-Revision-Date: 2020-11-27 13:07+0000\n"
"Last-Translator: Creeper \n"
"Language-Team: Hindi 1;\n"
"X-Generator: Weblate 4.2.1\n"
-#: src/discord/redaction.py:62 src/discord/redaction.py:65
-#: src/discord/redaction.py:70
-msgid "Removed"
-msgstr "हटाया गया"
+#: src/discord/redaction.py:77
+msgid "hidden"
+msgstr ""
+
+#: src/discord/redaction.py:80 src/discord/redaction.py:85
+msgid "~~hidden~~"
+msgstr ""
+
+#~ msgid "Removed"
+#~ msgstr "हटाया गया"
diff --git a/locale/it/LC_MESSAGES/discussion_formatters.mo b/locale/it/LC_MESSAGES/discussion_formatters.mo
deleted file mode 100644
index 48acdd9..0000000
Binary files a/locale/it/LC_MESSAGES/discussion_formatters.mo and /dev/null differ
diff --git a/locale/it/LC_MESSAGES/discussion_formatters.po b/locale/it/LC_MESSAGES/discussion_formatters.po
deleted file mode 100644
index 609d1c0..0000000
--- a/locale/it/LC_MESSAGES/discussion_formatters.po
+++ /dev/null
@@ -1,159 +0,0 @@
-# SOME DESCRIPTIVE TITLE.
-# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
-# This file is distributed under the same license as the RcGcDw package.
-# FIRST AUTHOR , YEAR.
-#
-msgid ""
-msgstr ""
-"Project-Id-Version: RcGcDw\n"
-"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2020-11-30 11:58+0100\n"
-"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
-"Last-Translator: Automatically generated\n"
-"Language-Team: none\n"
-"Language: it\n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=UTF-8\n"
-"Content-Transfer-Encoding: 8bit\n"
-
-#: src/discussion_formatters.py:25 src/discussion_formatters.py:81
-msgid "Unregistered user"
-msgstr ""
-
-#: src/discussion_formatters.py:34
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) created [{title}](<{url}f/p/{threadId}>) in "
-"{forumName}"
-msgstr ""
-
-#: src/discussion_formatters.py:36
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) created a poll [{title}](<{url}f/p/{threadId}>) in "
-"{forumName}"
-msgstr ""
-
-#: src/discussion_formatters.py:38
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) created a quiz [{title}](<{url}f/p/{threadId}>) in "
-"{forumName}"
-msgstr ""
-
-#: src/discussion_formatters.py:43
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) created a [reply](<{url}f/p/{threadId}/r/{postId}>) "
-"to [{title}](<{url}f/p/{threadId}>) in {forumName}"
-msgstr ""
-
-#: src/discussion_formatters.py:45 src/discussion_formatters.py:54
-#: src/discussion_formatters.py:137 src/discussion_formatters.py:150
-msgid "unknown"
-msgstr ""
-
-#: src/discussion_formatters.py:49
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) created [{title}](<{url}wiki/Message_Wall:"
-"{user_wall}?threadId={threadId}>) on [{user}'s Message Wall](<{url}wiki/"
-"Message_Wall:{user_wall}>)"
-msgstr ""
-
-#: src/discussion_formatters.py:51
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) created a [reply](<{url}wiki/Message_Wall:"
-"{user_wall}?threadId={threadId}#{replyId}>) to [{title}](<{url}wiki/"
-"Message_Wall:{user_wall}?threadId={threadId}>) on [{user}'s Message Wall]"
-"(<{url}wiki/Message_Wall:{user_wall}>)"
-msgstr ""
-
-#: src/discussion_formatters.py:57
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) created a [comment](<{url}?commentId={commentId}>) "
-"on [{article}](<{url}>)"
-msgstr ""
-
-#: src/discussion_formatters.py:62
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) created a [reply](<{url}?commentId={commentId}"
-"&replyId={replyId}>) to a [comment](<{url}?commentId={commentId}>) on "
-"[{article}](<{url}>)"
-msgstr ""
-
-#: src/discussion_formatters.py:70
-#, python-brace-format
-msgid ""
-"Unknown event `{event}` by [{author}]({author_url}), report it on the "
-"[support server](<{support}>)."
-msgstr ""
-
-#: src/discussion_formatters.py:98
-#, python-brace-format
-msgid "Created \"{title}\""
-msgstr ""
-
-#: src/discussion_formatters.py:102
-#, python-brace-format
-msgid "Created a poll \"{title}\""
-msgstr ""
-
-#: src/discussion_formatters.py:109
-msgid "Option {}"
-msgstr ""
-
-#: src/discussion_formatters.py:110
-#, python-brace-format
-msgid "__[View image]({image_url})__"
-msgstr ""
-
-#: src/discussion_formatters.py:114
-#, python-brace-format
-msgid "Created a quiz \"{title}\""
-msgstr ""
-
-#: src/discussion_formatters.py:129 src/discussion_formatters.py:131
-msgid "Tags"
-msgstr ""
-
-#: src/discussion_formatters.py:129
-msgid "{} tags"
-msgstr ""
-
-#: src/discussion_formatters.py:134
-#, python-brace-format
-msgid "Replied to \"{title}\""
-msgstr ""
-
-#: src/discussion_formatters.py:143
-#, python-brace-format
-msgid "Created \"{title}\" on {user}'s Message Wall"
-msgstr ""
-
-#: src/discussion_formatters.py:147
-#, python-brace-format
-msgid "Replied to \"{title}\" on {user}'s Message Wall"
-msgstr ""
-
-#: src/discussion_formatters.py:154
-#, python-brace-format
-msgid "Commented on {article}"
-msgstr ""
-
-#: src/discussion_formatters.py:158
-#, python-brace-format
-msgid "Replied to a comment on {article}"
-msgstr ""
-
-#: src/discussion_formatters.py:162
-#, python-brace-format
-msgid "Unknown event `{event}`"
-msgstr ""
-
-#: src/discussion_formatters.py:168 src/discussion_formatters.py:170
-msgid "Report this on the support server"
-msgstr ""
diff --git a/locale/it/LC_MESSAGES/rc_formatters.mo b/locale/it/LC_MESSAGES/formatters.mo
similarity index 68%
rename from locale/it/LC_MESSAGES/rc_formatters.mo
rename to locale/it/LC_MESSAGES/formatters.mo
index dfd1513..e439862 100644
Binary files a/locale/it/LC_MESSAGES/rc_formatters.mo and b/locale/it/LC_MESSAGES/formatters.mo differ
diff --git a/locale/lol/LC_MESSAGES/rc_formatters.po b/locale/it/LC_MESSAGES/formatters.po
similarity index 58%
rename from locale/lol/LC_MESSAGES/rc_formatters.po
rename to locale/it/LC_MESSAGES/formatters.po
index 5425531..c75a9ed 100644
--- a/locale/lol/LC_MESSAGES/rc_formatters.po
+++ b/locale/it/LC_MESSAGES/formatters.po
@@ -7,732 +7,763 @@ msgid ""
msgstr ""
"Project-Id-Version: RcGcDw\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2021-04-14 16:24+0200\n"
+"POT-Creation-Date: 2021-05-22 18:48+0200\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: Automatically generated\n"
"Language-Team: none\n"
-"Language: lol\n"
+"Language: it\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
-#: src/rc_formatters.py:28
-msgid "None"
+#: src/api/util.py:61 src/api/util.py:66
+msgid "__Only whitespace__"
msgstr ""
-#: src/rc_formatters.py:28
-msgid "Warning issued"
+#: src/api/util.py:71
+msgid "Removed"
msgstr ""
-#: src/rc_formatters.py:28
-msgid "**Blocked user**"
+#: src/api/util.py:73
+msgid "Added"
msgstr ""
-#: src/rc_formatters.py:28
-msgid "Tagged the edit"
-msgstr ""
-
-#: src/rc_formatters.py:28
-msgid "Disallowed the action"
-msgstr ""
-
-#: src/rc_formatters.py:28
-msgid "**IP range blocked**"
-msgstr ""
-
-#: src/rc_formatters.py:28
-msgid "Throttled actions"
-msgstr ""
-
-#: src/rc_formatters.py:28
-msgid "Removed autoconfirmed group"
-msgstr ""
-
-#: src/rc_formatters.py:28
-msgid "**Removed from privileged groups**"
-msgstr ""
-
-#: src/rc_formatters.py:29
-msgid "Edit"
-msgstr ""
-
-#: src/rc_formatters.py:29
-msgid "Upload"
-msgstr ""
-
-#: src/rc_formatters.py:29
-msgid "Move"
-msgstr ""
-
-#: src/rc_formatters.py:29
-msgid "Stash upload"
-msgstr ""
-
-#: src/rc_formatters.py:29
-msgid "Deletion"
-msgstr ""
-
-#: src/rc_formatters.py:29
-msgid "Account creation"
-msgstr ""
-
-#: src/rc_formatters.py:29
-msgid "Auto account creation"
-msgstr ""
-
-#: src/rc_formatters.py:46 src/rc_formatters.py:53 src/rc_formatters.py:60
-#: src/rc_formatters.py:75 src/rc_formatters.py:96
+#: src/api/util.py:94 src/api/util.py:126 src/api/util.py:133
+#: src/api/util.py:141 extensions/base/discussions.py:247
+#: extensions/base/discussions.py:264 extensions/base/abusefilter.py:45
msgid "Unregistered user"
msgstr ""
-#: src/rc_formatters.py:83
+#: src/api/util.py:160
+msgctxt "recent changes Tags"
+msgid "Tags"
+msgstr ""
+
+#: src/api/util.py:162
+msgid "**Added**: "
+msgstr ""
+
+#: src/api/util.py:163
+msgid " and {} more\n"
+msgstr ""
+
+#: src/api/util.py:165
+msgid "**Removed**: "
+msgstr ""
+
+#: src/api/util.py:166
+msgid " and {} more"
+msgstr ""
+
+#: src/api/util.py:168
+msgid "Changed categories"
+msgstr ""
+
+#: extensions/base/cargo.py:37
#, python-brace-format
-msgid ""
-"[{author}]({author_url}) triggered *{abuse_filter}*, performing the action "
-"\"{action}\" on *[{target}]({target_url})* - action taken: {result}."
+msgid "Created the Cargo table \"{table}\""
msgstr ""
-#: src/rc_formatters.py:85 src/rc_formatters.py:86 src/rc_formatters.py:87
-#: src/rc_formatters.py:457 src/rc_formatters.py:460 src/rc_formatters.py:463
-#: src/rc_formatters.py:464 src/rc_formatters.py:469 src/rc_formatters.py:470
-#: src/rc_formatters.py:478 src/rc_formatters.py:482 src/rc_formatters.py:682
-#: src/rc_formatters.py:683 src/rc_formatters.py:684 src/rc_formatters.py:1141
-#: src/rc_formatters.py:1144 src/rc_formatters.py:1147
-#: src/rc_formatters.py:1149 src/rc_formatters.py:1152
-#: src/rc_formatters.py:1154 src/rc_formatters.py:1160
-#: src/rc_formatters.py:1163 src/rc_formatters.py:1255
-msgid "Unknown"
-msgstr ""
-
-#: src/rc_formatters.py:116
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) edited [{article}]({edit_link}){comment} {bold}"
-"({sign}{edit_size}){bold}"
-msgstr ""
-
-#: src/rc_formatters.py:118
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) created [{article}]({edit_link}){comment} {bold}"
-"({sign}{edit_size}){bold}"
-msgstr ""
-
-#: src/rc_formatters.py:121
-#, python-brace-format
-msgid "[{author}]({author_url}) uploaded [{file}]({file_link}){comment}"
-msgstr ""
-
-#: src/rc_formatters.py:128
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) reverted a version of [{file}]({file_link}){comment}"
-msgstr ""
-
-#: src/rc_formatters.py:132
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) uploaded a new version of [{file}]({file_link})"
-"{comment}"
-msgstr ""
-
-#: src/rc_formatters.py:135
-#, python-brace-format
-msgid "[{author}]({author_url}) deleted [{page}]({page_link}){comment}"
-msgstr ""
-
-#: src/rc_formatters.py:141
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) deleted redirect by overwriting [{page}]"
-"({page_link}){comment}"
-msgstr ""
-
-#: src/rc_formatters.py:147 src/rc_formatters.py:152
-msgid "without making a redirect"
-msgstr ""
-
-#: src/rc_formatters.py:147 src/rc_formatters.py:153
-msgid "with a redirect"
-msgstr ""
-
-#: src/rc_formatters.py:148
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) moved {redirect}*{article}* to [{target}]"
-"({target_url}) {made_a_redirect}{comment}"
-msgstr ""
-
-#: src/rc_formatters.py:154
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) moved {redirect}*{article}* over redirect to "
-"[{target}]({target_url}) {made_a_redirect}{comment}"
-msgstr ""
-
-#: src/rc_formatters.py:159
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) moved protection settings from {redirect}*{article}"
-"* to [{target}]({target_url}){comment}"
-msgstr ""
-
-#: src/rc_formatters.py:170 src/rc_formatters.py:855
-msgid "for infinity and beyond"
-msgstr ""
-
-#: src/rc_formatters.py:179 src/rc_formatters.py:863
-#, python-brace-format
-msgid "for {num} {translated_length}"
-msgstr ""
-
-#: src/rc_formatters.py:185 src/rc_formatters.py:867
-msgid "until {}"
-msgstr ""
-
-#: src/rc_formatters.py:189
-msgid " on pages: "
-msgstr ""
-
-#: src/rc_formatters.py:196 src/rc_formatters.py:881
-msgid " and namespaces: "
-msgstr ""
-
-#: src/rc_formatters.py:198
-msgid " on namespaces: "
-msgstr ""
-
-#: src/rc_formatters.py:210
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) blocked [{user}]({user_url}) {time}"
-"{restriction_desc}{comment}"
-msgstr ""
-
-#: src/rc_formatters.py:214
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) changed block settings for [{blocked_user}]"
-"({user_url}){comment}"
-msgstr ""
-
-#: src/rc_formatters.py:218
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) unblocked [{blocked_user}]({user_url}){comment}"
-msgstr ""
-
-#: src/rc_formatters.py:223
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) left a [comment]({comment}) on {target}'s profile"
-msgstr ""
-
-#: src/rc_formatters.py:225
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) left a [comment]({comment}) on their own profile"
-msgstr ""
-
-#: src/rc_formatters.py:231
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) replied to a [comment]({comment}) on {target}'s "
-"profile"
-msgstr ""
-
-#: src/rc_formatters.py:237
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) replied to a [comment]({comment}) on their own "
-"profile"
-msgstr ""
-
-#: src/rc_formatters.py:245
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) edited a [comment]({comment}) on {target}'s profile"
-msgstr ""
-
-#: src/rc_formatters.py:251
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) edited a [comment]({comment}) on their own profile"
-msgstr ""
-
-#: src/rc_formatters.py:257
-#, python-brace-format
-msgid "[{author}]({author_url}) purged a comment on {target}'s profile"
-msgstr ""
-
-#: src/rc_formatters.py:259
-#, python-brace-format
-msgid "[{author}]({author_url}) purged a comment on their own profile"
-msgstr ""
-
-#: src/rc_formatters.py:267
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) deleted a [comment]({comment}) on {target}'s profile"
-msgstr ""
-
-#: src/rc_formatters.py:269
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) deleted a [comment]({comment}) on their own profile"
-msgstr ""
-
-#: src/rc_formatters.py:274
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) edited the {field} on [{target}]({target_url})'s "
-"profile. *({desc})*"
-msgstr ""
-
-#: src/rc_formatters.py:281
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) edited the {field} on [their own]({target_url}) "
-"profile. *({desc})*"
-msgstr ""
-
-#: src/rc_formatters.py:296 src/rc_formatters.py:298 src/rc_formatters.py:977
-#: src/rc_formatters.py:979
-msgid "none"
-msgstr ""
-
-#: src/rc_formatters.py:301
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) changed group membership for [{target}]"
-"({target_url}) from {old_groups} to {new_groups}{comment}"
-msgstr ""
-
-#: src/rc_formatters.py:303
-#, python-brace-format
-msgid ""
-"{author} autopromoted [{target}]({target_url}) from {old_groups} to "
-"{new_groups}{comment}"
-msgstr ""
-
-#: src/rc_formatters.py:304 src/rc_formatters.py:965
-msgid "System"
-msgstr ""
-
-#: src/rc_formatters.py:309
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) protected [{article}]({article_url}) with the "
-"following settings: {settings}{comment}"
-msgstr ""
-
-#: src/rc_formatters.py:311 src/rc_formatters.py:319 src/rc_formatters.py:987
-#: src/rc_formatters.py:993
-msgid " [cascading]"
-msgstr ""
-
-#: src/rc_formatters.py:316
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) modified protection settings of [{article}]"
-"({article_url}) to: {settings}{comment}"
-msgstr ""
-
-#: src/rc_formatters.py:323
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) removed protection from [{article}]({article_url})"
-"{comment}"
-msgstr ""
-
-#: src/rc_formatters.py:327
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) changed visibility of revision on page [{article}]"
-"({article_url}){comment}"
-msgid_plural ""
-"[{author}]({author_url}) changed visibility of {amount} revisions on page "
-"[{article}]({article_url}){comment}"
-msgstr[0] ""
-msgstr[1] ""
-
-#: src/rc_formatters.py:340
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) imported [{article}]({article_url}) with {count} "
-"revision{comment}"
-msgid_plural ""
-"[{author}]({author_url}) imported [{article}]({article_url}) with {count} "
-"revisions{comment}"
-msgstr[0] ""
-msgstr[1] ""
-
-#: src/rc_formatters.py:345
-#, python-brace-format
-msgid "[{author}]({author_url}) restored [{article}]({article_url}){comment}"
-msgstr ""
-
-#: src/rc_formatters.py:347
-#, python-brace-format
-msgid "[{author}]({author_url}) changed visibility of log events{comment}"
-msgstr ""
-
-#: src/rc_formatters.py:359
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) imported [{article}]({article_url}) with {count} "
-"revision from [{source}]({source_url}){comment}"
-msgid_plural ""
-"[{author}]({author_url}) imported [{article}]({article_url}) with {count} "
-"revisions from [{source}]({source_url}){comment}"
-msgstr[0] ""
-msgstr[1] ""
-
-#: src/rc_formatters.py:364
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) edited abuse filter [number {number}]({filter_url})"
-msgstr ""
-
-#: src/rc_formatters.py:368
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) created abuse filter [number {number}]({filter_url})"
-msgstr ""
-
-#: src/rc_formatters.py:372
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) merged revision histories of [{article}]"
-"({article_url}) into [{dest}]({dest_url}){comment}"
-msgstr ""
-
-#: src/rc_formatters.py:375
-#, python-brace-format
-msgid "Account [{author}]({author_url}) was created automatically"
-msgstr ""
-
-#: src/rc_formatters.py:377 src/rc_formatters.py:385
-#, python-brace-format
-msgid "Account [{author}]({author_url}) was created"
-msgstr ""
-
-#: src/rc_formatters.py:380
-#, python-brace-format
-msgid ""
-"Account [{article}]({article_url}) was created by [{author}]({author_url})"
-"{comment}"
-msgstr ""
-
-#: src/rc_formatters.py:383
-#, python-brace-format
-msgid ""
-"Account [{article}]({article_url}) was created by [{author}]({author_url}) "
-"and password was sent by email{comment}"
-msgstr ""
-
-#: src/rc_formatters.py:388
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) added an entry to the [interwiki table]"
-"({table_url}) pointing to {website} with {prefix} prefix"
-msgstr ""
-
-#: src/rc_formatters.py:394
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) edited an entry in [interwiki table]({table_url}) "
-"pointing to {website} with {prefix} prefix"
-msgstr ""
-
-#: src/rc_formatters.py:400
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) deleted an entry in [interwiki table]({table_url})"
-msgstr ""
-
-#: src/rc_formatters.py:403
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) changed the content model of the page [{article}]"
-"({article_url}) from {old} to {new}{comment}"
-msgstr ""
-
-#: src/rc_formatters.py:407
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) created the page [{article}]({article_url}) using a "
-"non-default content model {new}{comment}"
-msgstr ""
-
-#: src/rc_formatters.py:410
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) edited the sprite for [{article}]({article_url})"
-msgstr ""
-
-#: src/rc_formatters.py:413
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) created the sprite sheet for [{article}]"
-"({article_url})"
-msgstr ""
-
-#: src/rc_formatters.py:416
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) edited the slice for [{article}]({article_url})"
-msgstr ""
-
-#: src/rc_formatters.py:421
+#: extensions/base/cargo.py:45
#, python-brace-format
msgid "[{author}]({author_url}) created the Cargo table \"{table}\""
msgstr ""
-#: src/rc_formatters.py:423
+#: extensions/base/cargo.py:60
#, python-brace-format
-msgid "[{author}]({author_url}) deleted the Cargo table \"{table}\""
+msgid "Recreated the Cargo table \"{table}\""
msgstr ""
-#: src/rc_formatters.py:428
+#: extensions/base/cargo.py:68
#, python-brace-format
msgid "[{author}]({author_url}) recreated the Cargo table \"{table}\""
msgstr ""
-#: src/rc_formatters.py:433
+#: extensions/base/cargo.py:83
+#, python-brace-format
+msgid "Replaced the Cargo table \"{table}\""
+msgstr ""
+
+#: extensions/base/cargo.py:91
#, python-brace-format
msgid "[{author}]({author_url}) replaced the Cargo table \"{table}\""
msgstr ""
-#: src/rc_formatters.py:436
+#: extensions/base/cargo.py:105
#, python-brace-format
-msgid ""
-"[{author}]({author_url}) created the [tag]({tag_url}) \"{tag}\"{comment}"
+msgid "Deleted the Cargo table \"{table}\""
msgstr ""
-#: src/rc_formatters.py:441
+#: extensions/base/cargo.py:112
#, python-brace-format
-msgid ""
-"[{author}]({author_url}) deleted the [tag]({tag_url}) \"{tag}\"{comment}"
+msgid "[{author}]({author_url}) deleted the Cargo table \"{table}\""
msgstr ""
-#: src/rc_formatters.py:443
+#: extensions/base/translate.py:41
#, python-brace-format
-msgid ""
-"[{author}]({author_url}) deleted the [tag]({tag_url}) \"{tag}\" and removed "
-"it from {count} revision or log entry{comment}"
-msgid_plural ""
-"[{author}]({author_url}) deleted the [tag]({tag_url}) \"{tag}\" and removed "
-"it from {count} revisions and/or log entries{comment}"
-msgstr[0] ""
-msgstr[1] ""
-
-#: src/rc_formatters.py:449
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) activated the [tag]({tag_url}) \"{tag}\"{comment}"
+msgid "Marked \"{article}\" for translation"
msgstr ""
-#: src/rc_formatters.py:452
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) deactivated the [tag]({tag_url}) \"{tag}\"{comment}"
-msgstr ""
-
-#: src/rc_formatters.py:454
-#, python-brace-format
-msgid "[{author}]({author_url}) changed wiki settings{reason}"
-msgstr ""
-
-#: src/rc_formatters.py:456
-#, python-brace-format
-msgid "[{author}]({author_url}) deleted a wiki *{wiki_name}*{comment}"
-msgstr ""
-
-#: src/rc_formatters.py:459
-#, python-brace-format
-msgid "[{author}]({author_url}) locked a wiki *{wiki_name}*{comment}"
-msgstr ""
-
-#: src/rc_formatters.py:462
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) modified namespace *{namespace_name}* on "
-"*{wiki_name}*{comment}"
-msgstr ""
-
-#: src/rc_formatters.py:467
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) deleted a namespace *{namespace_name}* on "
-"*{wiki_name}*{comment}"
-msgstr ""
-
-#: src/rc_formatters.py:473
-#, python-brace-format
-msgid "[{author}]({author_url}) modified user group *{group_name}*{comment}"
-msgstr ""
-
-#: src/rc_formatters.py:477
-#, python-brace-format
-msgid "[{author}]({author_url}) undeleted a wiki *{wiki_name}*{comment}"
-msgstr ""
-
-#: src/rc_formatters.py:481
-#, python-brace-format
-msgid "[{author}]({author_url}) unlocked a wiki *{wiki_name}*{comment}"
-msgstr ""
-
-#: src/rc_formatters.py:486
-#, python-brace-format
-msgid "[{author}]({author_url}) generated *{file}* dump{comment}"
-msgstr ""
-
-#: src/rc_formatters.py:491
-#, python-brace-format
-msgid "[{author}]({author_url}) deleted *{file}* dump{comment}"
-msgstr ""
-
-#: src/rc_formatters.py:502
+#: extensions/base/translate.py:55
#, python-brace-format
msgid ""
"[{author}]({author_url}) marked [{article}]({article_url}) for "
"translation{comment}"
msgstr ""
-#: src/rc_formatters.py:509
+#: extensions/base/translate.py:70
+#, python-brace-format
+msgid "Removed \"{article}\" from the translation system"
+msgstr ""
+
+#: extensions/base/translate.py:80
#, python-brace-format
msgid ""
"[{author}]({author_url}) removed [{article}]({article_url}) from the "
"translation system{comment}"
msgstr ""
-#: src/rc_formatters.py:516
+#: extensions/base/translate.py:95
+#, python-brace-format
+msgid "Completed moving translation pages from \"{article}\" to \"{target}\""
+msgstr ""
+
+#: extensions/base/translate.py:106
#, python-brace-format
msgid ""
"[{author}]({author_url}) completed moving translation pages from *{article}* "
"to [{target}]({target_url}){comment}"
msgstr ""
-#: src/rc_formatters.py:524
+#: extensions/base/translate.py:121
+#, python-brace-format
+msgid "Encountered a problem while moving \"{article}\" to \"{target}\""
+msgstr ""
+
+#: extensions/base/translate.py:133
#, python-brace-format
msgid ""
"[{author}]({author_url}) encountered a problem while moving [{article}]"
"({article_url}) to [{target}]({target_url}){comment}"
msgstr ""
-#: src/rc_formatters.py:532
+#: extensions/base/translate.py:149
#, python-brace-format
msgid ""
-"[{author}]({author_url}) completed deletion of translatable page [{article}]"
-"({article_url}){comment}"
+"Failed to delete \"{article}\" which belongs to translatable page "
+"\"{target}\""
msgstr ""
-#: src/rc_formatters.py:540
+#: extensions/base/translate.py:161
#, python-brace-format
msgid ""
"[{author}]({author_url}) failed to delete [{article}]({article_url}) which "
"belongs to translatable page [{target}]({target_url}){comment}"
msgstr ""
-#: src/rc_formatters.py:548
+#: extensions/base/translate.py:177
+#, python-brace-format
+msgid "Completed deletion of translation page \"{article}\""
+msgstr ""
+
+#: extensions/base/translate.py:188
#, python-brace-format
msgid ""
"[{author}]({author_url}) completed deletion of translation page [{article}]"
"({article_url}){comment}"
msgstr ""
-#: src/rc_formatters.py:556
+#: extensions/base/translate.py:203
+#, python-brace-format
+msgid ""
+"Failed to delete \"{article}\" which belongs to translation page \"{target}\""
+msgstr ""
+
+#: extensions/base/translate.py:215
#, python-brace-format
msgid ""
"[{author}]({author_url}) failed to delete [{article}]({article_url}) which "
"belongs to translation page [{target}]({target_url}){comment}"
msgstr ""
-#: src/rc_formatters.py:564
+#: extensions/base/translate.py:231
+#, python-brace-format
+msgid "Encouraged translation of \"{article}\""
+msgstr ""
+
+#: extensions/base/translate.py:240
#, python-brace-format
msgid ""
"[{author}]({author_url}) encouraged translation of [{article}]({article_url})"
"{comment}"
msgstr ""
-#: src/rc_formatters.py:571
+#: extensions/base/translate.py:255
+#, python-brace-format
+msgid "Discouraged translation of \"{article}\""
+msgstr ""
+
+#: extensions/base/translate.py:264
#, python-brace-format
msgid ""
"[{author}]({author_url}) discouraged translation of [{article}]"
"({article_url}){comment}"
msgstr ""
-#: src/rc_formatters.py:581
+#: extensions/base/translate.py:282
+#, python-brace-format
+msgid "Limited languages for \"{article}\" to `{languages}`"
+msgstr ""
+
+#: extensions/base/translate.py:285
+#, python-brace-format
+msgid "Priority languages for \"{article}\" set to `{languages}`"
+msgstr ""
+
+#: extensions/base/translate.py:288
+#, python-brace-format
+msgid "Removed priority languages from \"{article}\""
+msgstr ""
+
+#: extensions/base/translate.py:301
#, python-brace-format
msgid ""
"[{author}]({author_url}) limited languages for [{article}]({article_url}) to "
"`{languages}`{comment}"
msgstr ""
-#: src/rc_formatters.py:587
+#: extensions/base/translate.py:308
#, python-brace-format
msgid ""
"[{author}]({author_url}) set the priority languages for [{article}]"
"({article_url}) to `{languages}`{comment}"
msgstr ""
-#: src/rc_formatters.py:593
+#: extensions/base/translate.py:315
#, python-brace-format
msgid ""
"[{author}]({author_url}) removed priority languages from [{article}]"
"({article_url}){comment}"
msgstr ""
-#: src/rc_formatters.py:600
+#: extensions/base/translate.py:331
+#, python-brace-format
+msgid "Added translatable page \"{article}\" to aggregate group \"{group}\""
+msgstr ""
+
+#: extensions/base/translate.py:342
#, python-brace-format
msgid ""
"[{author}]({author_url}) added translatable page [{article}]({article_url}) "
"to aggregate group \"{group}\"{comment}"
msgstr ""
-#: src/rc_formatters.py:607
+#: extensions/base/translate.py:357
+#, python-brace-format
+msgid ""
+"Removed translatable page \"{article}\" from aggregate group \"{group}\""
+msgstr ""
+
+#: extensions/base/translate.py:368
#, python-brace-format
msgid ""
"[{author}]({author_url}) removed translatable page [{article}]"
"({article_url}) from aggregate group \"{group}\"{comment}"
msgstr ""
-#: src/rc_formatters.py:619
+#: extensions/base/translate.py:387
+#, python-brace-format
+msgid "Reviewed translation \"{article}\""
+msgstr ""
+
+#: extensions/base/translate.py:401
#, python-brace-format
msgid ""
"[{author}]({author_url}) reviewed translation [{article}]({article_url})"
"{comment}"
msgstr ""
-#: src/rc_formatters.py:627
+#: extensions/base/translate.py:416
+#, python-brace-format
+msgid "Changed the state of `{language}` translations of \"{article}\""
+msgstr ""
+
+#: extensions/base/translate.py:419
+msgid "Old state"
+msgstr ""
+
+#: extensions/base/translate.py:420
+msgid "New state"
+msgstr ""
+
+#: extensions/base/translate.py:431
#, python-brace-format
msgid ""
"[{author}]({author_url}) changed the state of `{language}` translations of "
"[{article}]({article_url}) from `{old_state}` to `{new_state}`{comment}"
msgstr ""
-#: src/rc_formatters.py:634
+#: extensions/base/translate.py:439
#, python-brace-format
msgid ""
"[{author}]({author_url}) changed the state of `{language}` translations of "
"[{article}]({article_url}) to `{new_state}`{comment}"
msgstr ""
-#: src/rc_formatters.py:643 src/rc_formatters.py:646 src/rc_formatters.py:1238
-#: src/rc_formatters.py:1241
+#: extensions/base/translate.py:452 extensions/base/translate.py:455
msgid "(default)"
msgstr ""
-#: src/rc_formatters.py:647
+#: extensions/base/translate.py:464
+#, python-brace-format
+msgid "Changed the language of \"{article}\""
+msgstr ""
+
+#: extensions/base/translate.py:465
+msgid "Old language"
+msgstr ""
+
+#: extensions/base/translate.py:466
+msgid "New language"
+msgstr ""
+
+#: extensions/base/translate.py:477
#, python-brace-format
msgid ""
"[{author}]({author_url}) changed the language of [{article}]({article_url}) "
"from {old_lang} to {new_lang}{comment}"
msgstr ""
-#: src/rc_formatters.py:656
+#: extensions/base/discussions.py:148 extensions/base/discussions.py:207
+#: extensions/base/discussions.py:245 extensions/base/discussions.py:261
+#: extensions/base/discussions.py:284 extensions/base/discussions.py:306
+#: extensions/base/discussions.py:334 extensions/base/discussions.py:354
+msgid "unknown"
+msgstr ""
+
+#: extensions/base/discussions.py:157
+#, python-brace-format
+msgid "Created \"{title}\""
+msgstr ""
+
+#: extensions/base/discussions.py:161
+#, python-brace-format
+msgid "Created a poll \"{title}\""
+msgstr ""
+
+#: extensions/base/discussions.py:168
+msgid "Option {}"
+msgstr ""
+
+#: extensions/base/discussions.py:170
+#, python-brace-format
+msgid "__[View image]({image_url})__"
+msgstr ""
+
+#: extensions/base/discussions.py:174
+#, python-brace-format
+msgid "Created a quiz \"{title}\""
+msgstr ""
+
+#: extensions/base/discussions.py:193 extensions/base/discussions.py:195
+msgctxt "Fandom discussions Tags/Forums"
+msgid "Tags"
+msgstr ""
+
+#: extensions/base/discussions.py:193
+msgctxt "Fandom discussions amount of Tags/Forums"
+msgid "{} tags"
+msgstr ""
+
+#: extensions/base/discussions.py:198
+#, python-brace-format
+msgid "Replied to \"{title}\""
+msgstr ""
+
+#: extensions/base/discussions.py:214
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) created [{title}](<{url}f/p/{threadId}>) in "
+"{forumName}"
+msgstr ""
+
+#: extensions/base/discussions.py:217
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) created a poll [{title}](<{url}f/p/{threadId}>) in "
+"{forumName}"
+msgstr ""
+
+#: extensions/base/discussions.py:220
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) created a quiz [{title}](<{url}f/p/{threadId}>) in "
+"{forumName}"
+msgstr ""
+
+#: extensions/base/discussions.py:234
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) created a [reply](<{url}f/p/{threadId}/r/{postId}>) "
+"to [{title}](<{url}f/p/{threadId}>) in {forumName}"
+msgstr ""
+
+#: extensions/base/discussions.py:292
+#, python-brace-format
+msgid "Created \"{title}\" on {user}'s Message Wall"
+msgstr ""
+
+#: extensions/base/discussions.py:298
+#, python-brace-format
+msgid "Replied to \"{title}\" on {user}'s Message Wall"
+msgstr ""
+
+#: extensions/base/discussions.py:312
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) created [{title}](<{url}wiki/Message_Wall:"
+"{user_wall}?threadId={threadId}>) on [{user}'s Message Wall](<{url}wiki/"
+"Message_Wall:{user_wall}>)"
+msgstr ""
+
+#: extensions/base/discussions.py:318
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) created a [reply](<{url}wiki/Message_Wall:"
+"{user_wall}?threadId={threadId}#{replyId}>) to [{title}](<{url}wiki/"
+"Message_Wall:{user_wall}?threadId={threadId}>) on [{user}'s Message Wall]"
+"(<{url}wiki/Message_Wall:{user_wall}>)"
+msgstr ""
+
+#: extensions/base/discussions.py:338
+#, python-brace-format
+msgid "Commented on {article}"
+msgstr ""
+
+#: extensions/base/discussions.py:344
+#, python-brace-format
+msgid "Replied to a comment on {article}"
+msgstr ""
+
+#: extensions/base/discussions.py:359
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) created a [comment](<{url}?commentId={commentId}>) "
+"on [{article}](<{url}>)"
+msgstr ""
+
+#: extensions/base/discussions.py:365
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) created a [reply](<{url}?commentId={commentId}"
+"&replyId={replyId}>) to a [comment](<{url}?commentId={commentId}>) on "
+"[{article}](<{url}>)"
+msgstr ""
+
+#: extensions/base/managewiki.py:34
+msgid "Changed wiki settings"
+msgstr ""
+
+#: extensions/base/managewiki.py:44
+#, python-brace-format
+msgid "[{author}]({author_url}) changed wiki settings{reason}"
+msgstr ""
+
+#: extensions/base/managewiki.py:55
+#, python-brace-format
+msgid "Deleted a \"{wiki}\" wiki"
+msgstr ""
+
+#: extensions/base/managewiki.py:55 extensions/base/managewiki.py:67
+#: extensions/base/managewiki.py:103 extensions/base/managewiki.py:112
+#: extensions/base/managewiki.py:125 extensions/base/managewiki.py:126
+#: extensions/base/managewiki.py:135 extensions/base/managewiki.py:136
+#: extensions/base/managewiki.py:148 extensions/base/managewiki.py:149
+#: extensions/base/managewiki.py:160 extensions/base/managewiki.py:161
+#: extensions/base/managewiki.py:195 extensions/base/managewiki.py:204
+#: extensions/base/managewiki.py:217 extensions/base/managewiki.py:226
+#: extensions/base/abusefilter.py:55 extensions/base/abusefilter.py:56
+#: extensions/base/abusefilter.py:57 extensions/base/abusefilter.py:68
+#: extensions/base/abusefilter.py:69 extensions/base/abusefilter.py:70
+#: extensions/base/mediawiki.py:744
+msgid "Unknown"
+msgstr ""
+
+#: extensions/base/managewiki.py:63
+#, python-brace-format
+msgid "[{author}]({author_url}) deleted a wiki *{wiki_name}*{comment}"
+msgstr ""
+
+#: extensions/base/managewiki.py:80
+#, python-brace-format
+msgid "Deleted a \"{group}\" user group"
+msgstr ""
+
+#: extensions/base/managewiki.py:89
+#, python-brace-format
+msgid "[{author}]({author_url}) deleted a usergroup *{group}*{comment}"
+msgstr ""
+
+#: extensions/base/managewiki.py:103
+#, python-brace-format
+msgid "Locked a \"{wiki}\" wiki"
+msgstr ""
+
+#: extensions/base/managewiki.py:111
+#, python-brace-format
+msgid "[{author}]({author_url}) locked a wiki *{wiki_name}*{comment}"
+msgstr ""
+
+#: extensions/base/managewiki.py:124
+#, python-brace-format
+msgid "Modified \"{namespace_name}\" namespace"
+msgstr ""
+
+#: extensions/base/managewiki.py:126 extensions/base/managewiki.py:149
+msgid "Wiki"
+msgstr ""
+
+#: extensions/base/managewiki.py:134
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) modified namespace *{namespace_name}* on "
+"*{wiki_name}*{comment}"
+msgstr ""
+
+#: extensions/base/managewiki.py:147
+#, python-brace-format
+msgid "Deleted a \"{namespace_name}\" namespace"
+msgstr ""
+
+#: extensions/base/managewiki.py:158
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) deleted a namespace *{namespace_name}* on "
+"*{wiki_name}*{comment}"
+msgstr ""
+
+#: extensions/base/managewiki.py:173
+#, python-brace-format
+msgid "Modified \"{usergroup_name}\" usergroup"
+msgstr ""
+
+#: extensions/base/managewiki.py:182
+#, python-brace-format
+msgid "[{author}]({author_url}) modified user group *{group_name}*{comment}"
+msgstr ""
+
+#: extensions/base/managewiki.py:195
+#, python-brace-format
+msgid "Undeleted a \"{wiki}\" wiki"
+msgstr ""
+
+#: extensions/base/managewiki.py:203
+#, python-brace-format
+msgid "[{author}]({author_url}) undeleted a wiki *{wiki_name}*{comment}"
+msgstr ""
+
+#: extensions/base/managewiki.py:217
+#, python-brace-format
+msgid "Unlocked a \"{wiki}\" wiki"
+msgstr ""
+
+#: extensions/base/managewiki.py:225
+#, python-brace-format
+msgid "[{author}]({author_url}) unlocked a wiki *{wiki_name}*{comment}"
+msgstr ""
+
+#: extensions/base/datadump.py:36
+#, python-brace-format
+msgid "Generated {file} dump"
+msgstr ""
+
+#: extensions/base/datadump.py:45
+#, python-brace-format
+msgid "[{author}]({author_url}) generated *{file}* dump{comment}"
+msgstr ""
+
+#: extensions/base/datadump.py:58
+#, python-brace-format
+msgid "Deleted {file} dump"
+msgstr ""
+
+#: extensions/base/datadump.py:67
+#, python-brace-format
+msgid "[{author}]({author_url}) deleted *{file}* dump{comment}"
+msgstr ""
+
+#: extensions/base/curseprofile.py:40
+#, python-brace-format
+msgid "Edited {target}'s profile"
+msgstr ""
+
+#: extensions/base/curseprofile.py:42
+msgid "Edited their own profile"
+msgstr ""
+
+#: extensions/base/curseprofile.py:44
+#, python-brace-format
+msgid "Cleared the {field} field"
+msgstr ""
+
+#: extensions/base/curseprofile.py:46
+#, python-brace-format
+msgid "{field} field changed to: {desc}"
+msgstr ""
+
+#: extensions/base/curseprofile.py:58
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) cleared the {field} on [{target}]({target_url})'s "
+"profile."
+msgstr ""
+
+#: extensions/base/curseprofile.py:60
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) edited the {field} on [{target}]({target_url})'s "
+"profile. *({desc})*"
+msgstr ""
+
+#: extensions/base/curseprofile.py:65
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) cleared the {field} on [their own]({target_url}) "
+"profile."
+msgstr ""
+
+#: extensions/base/curseprofile.py:67
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) edited the {field} on [their own]({target_url}) "
+"profile. *({desc})*"
+msgstr ""
+
+#: extensions/base/curseprofile.py:82
+#, python-brace-format
+msgid "Left a comment on {target}'s profile"
+msgstr ""
+
+#: extensions/base/curseprofile.py:84
+msgid "Left a comment on their own profile"
+msgstr ""
+
+#: extensions/base/curseprofile.py:97
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) left a [comment]({comment}) on {target}'s profile."
+msgstr ""
+
+#: extensions/base/curseprofile.py:100
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) left a [comment]({comment}) on their own profile."
+msgstr ""
+
+#: extensions/base/curseprofile.py:113
+#, python-brace-format
+msgid "Edited a comment on {target}'s profile"
+msgstr ""
+
+#: extensions/base/curseprofile.py:115
+msgid "Edited a comment on their own profile"
+msgstr ""
+
+#: extensions/base/curseprofile.py:128
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) edited a [comment]({comment}) on {target}'s profile."
+msgstr ""
+
+#: extensions/base/curseprofile.py:131
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) edited a [comment]({comment}) on their own profile."
+msgstr ""
+
+#: extensions/base/curseprofile.py:144
+#, python-brace-format
+msgid "Replied to a comment on {target}'s profile"
+msgstr ""
+
+#: extensions/base/curseprofile.py:146
+msgid "Replied to a comment on their own profile"
+msgstr ""
+
+#: extensions/base/curseprofile.py:159
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) replied to a [comment]({comment}) on {target}'s "
+"profile."
+msgstr ""
+
+#: extensions/base/curseprofile.py:162
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) replied to a [comment]({comment}) on their own "
+"profile."
+msgstr ""
+
+#: extensions/base/curseprofile.py:175
+#, python-brace-format
+msgid "Deleted a comment on {target}'s profile"
+msgstr ""
+
+#: extensions/base/curseprofile.py:177
+msgid "Deleted a comment on their own profile"
+msgstr ""
+
+#: extensions/base/curseprofile.py:197
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) deleted a [comment]({comment}) on {target}'s "
+"profile.{reason}"
+msgstr ""
+
+#: extensions/base/curseprofile.py:200
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) deleted a [comment]({comment}) on their own profile."
+"{reason}"
+msgstr ""
+
+#: extensions/base/curseprofile.py:214
+#, python-brace-format
+msgid "Purged a comment on {target}'s profile"
+msgstr ""
+
+#: extensions/base/curseprofile.py:216
+msgid "Purged a comment on their own profile"
+msgstr ""
+
+#: extensions/base/curseprofile.py:230
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) purged a comment on [{target}]({link})'s profile."
+"{reason}"
+msgstr ""
+
+#: extensions/base/curseprofile.py:233
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) purged a comment on [their own]({link}) profile."
+"{reason}"
+msgstr ""
+
+#: extensions/base/renameuser.py:38
+#, python-brace-format
+msgid "Renamed user \"{old_name}\" with {edits} edit to \"{new_name}\""
+msgid_plural "Renamed user \"{old_name}\" with {edits} edits to \"{new_name}\""
+msgstr[0] ""
+msgstr[1] ""
+
+#: extensions/base/renameuser.py:43
+#, python-brace-format
+msgid "Renamed user \"{old_name}\" to \"{new_name}\""
+msgstr ""
+
+#: extensions/base/renameuser.py:58
#, python-brace-format
msgid ""
"[{author}]({author_url}) renamed user *{old_name}* with {edits} edit to "
@@ -743,644 +774,831 @@ msgid_plural ""
msgstr[0] ""
msgstr[1] ""
-#: src/rc_formatters.py:661
+#: extensions/base/renameuser.py:66
#, python-brace-format
msgid ""
"[{author}]({author_url}) renamed user *{old_name}* to [{new_name}]({link})"
"{comment}"
msgstr ""
-#: src/rc_formatters.py:665
-msgid "An action has been hidden by administration."
+#: extensions/base/interwiki.py:37
+msgid "Added an entry to the interwiki table"
msgstr ""
-#: src/rc_formatters.py:672
+#: extensions/base/interwiki.py:38 extensions/base/interwiki.py:65
+#, python-brace-format
+msgid "Prefix: {prefix}, website: {website} | {desc}"
+msgstr ""
+
+#: extensions/base/interwiki.py:50
#, python-brace-format
msgid ""
-"Unknown event `{event}` by [{author}]({author_url}), report it on the "
-"[support server](<{support}>)."
+"[{author}]({author_url}) added an entry to the [interwiki table]"
+"({table_url}) pointing to {website} with {prefix} prefix"
msgstr ""
-#: src/rc_formatters.py:681
+#: extensions/base/interwiki.py:64
+msgid "Edited an entry in interwiki table"
+msgstr ""
+
+#: extensions/base/interwiki.py:77
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) edited an entry in [interwiki table]({table_url}) "
+"pointing to {website} with {prefix} prefix"
+msgstr ""
+
+#: extensions/base/interwiki.py:91
+msgid "Deleted an entry in interwiki table"
+msgstr ""
+
+#: extensions/base/interwiki.py:92
+#, python-brace-format
+msgid "Prefix: {prefix} | {desc}"
+msgstr ""
+
+#: extensions/base/interwiki.py:102
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) deleted an entry in [interwiki table]({table_url})"
+"{desc}"
+msgstr ""
+
+#: extensions/base/abusefilter.py:29
+msgid "None"
+msgstr ""
+
+#: extensions/base/abusefilter.py:29
+msgid "Warning issued"
+msgstr ""
+
+#: extensions/base/abusefilter.py:29
+msgid "**Blocked user**"
+msgstr ""
+
+#: extensions/base/abusefilter.py:29
+msgid "Tagged the edit"
+msgstr ""
+
+#: extensions/base/abusefilter.py:29
+msgid "Disallowed the action"
+msgstr ""
+
+#: extensions/base/abusefilter.py:29
+msgid "**IP range blocked**"
+msgstr ""
+
+#: extensions/base/abusefilter.py:29
+msgid "Throttled actions"
+msgstr ""
+
+#: extensions/base/abusefilter.py:29
+msgid "Removed autoconfirmed group"
+msgstr ""
+
+#: extensions/base/abusefilter.py:29
+msgid "**Removed from privileged groups**"
+msgstr ""
+
+#: extensions/base/abusefilter.py:30
+msgid "Edit"
+msgstr ""
+
+#: extensions/base/abusefilter.py:30
+msgid "Upload"
+msgstr ""
+
+#: extensions/base/abusefilter.py:30
+msgid "Move"
+msgstr ""
+
+#: extensions/base/abusefilter.py:30
+msgid "Stash upload"
+msgstr ""
+
+#: extensions/base/abusefilter.py:30
+msgid "Deletion"
+msgstr ""
+
+#: extensions/base/abusefilter.py:30
+msgid "Account creation"
+msgstr ""
+
+#: extensions/base/abusefilter.py:30
+msgid "Auto account creation"
+msgstr ""
+
+#: extensions/base/abusefilter.py:54
#, python-brace-format
msgid "{user} triggered \"{abuse_filter}\""
msgstr ""
-#: src/rc_formatters.py:682
+#: extensions/base/abusefilter.py:55
msgid "Performed"
msgstr ""
-#: src/rc_formatters.py:683
+#: extensions/base/abusefilter.py:56
msgid "Action taken"
msgstr ""
-#: src/rc_formatters.py:684
+#: extensions/base/abusefilter.py:57
msgid "Title"
msgstr ""
-#: src/rc_formatters.py:693 src/rc_formatters.py:980
-msgid "No description provided"
+#: extensions/base/abusefilter.py:66
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) triggered *{abuse_filter}*, performing the action "
+"\"{action}\" on *[{target}]({target_url})* - action taken: {result}."
msgstr ""
-#: src/rc_formatters.py:717
+#: extensions/base/abusefilter.py:83
+#, python-brace-format
+msgid "Edited abuse filter number {number}"
+msgstr ""
+
+#: extensions/base/abusefilter.py:95
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) edited abuse filter [number {number}]({filter_url})"
+msgstr ""
+
+#: extensions/base/abusefilter.py:111
+#, python-brace-format
+msgid "Created abuse filter number {number}"
+msgstr ""
+
+#: extensions/base/abusefilter.py:119
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) created abuse filter [number {number}]({filter_url})"
+msgstr ""
+
+#: extensions/base/mediawiki.py:37
+msgid "director"
+msgstr ""
+
+#: extensions/base/mediawiki.py:37
+msgid "bot"
+msgstr ""
+
+#: extensions/base/mediawiki.py:37
+msgid "editor"
+msgstr ""
+
+#: extensions/base/mediawiki.py:37
+msgid "directors"
+msgstr ""
+
+#: extensions/base/mediawiki.py:37
+msgid "sysop"
+msgstr ""
+
+#: extensions/base/mediawiki.py:37
+msgid "bureaucrat"
+msgstr ""
+
+#: extensions/base/mediawiki.py:37
+msgid "reviewer"
+msgstr ""
+
+#: extensions/base/mediawiki.py:38
+msgid "autoreview"
+msgstr ""
+
+#: extensions/base/mediawiki.py:38
+msgid "autopatrol"
+msgstr ""
+
+#: extensions/base/mediawiki.py:38
+msgid "wiki_guardian"
+msgstr ""
+
+#: extensions/base/mediawiki.py:71
msgid "(N!) "
msgstr ""
-#: src/rc_formatters.py:718
+#: extensions/base/mediawiki.py:72
msgid "m"
msgstr ""
-#: src/rc_formatters.py:718
+#: extensions/base/mediawiki.py:73
msgid "b"
msgstr ""
-#: src/rc_formatters.py:735 src/rc_formatters.py:740
-msgid "__Only whitespace__"
+#: extensions/base/mediawiki.py:112
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) edited [{article}]({edit_link}){comment} {bold}"
+"({sign}{edit_size}){bold}"
msgstr ""
-#: src/rc_formatters.py:745
-msgid "Removed"
+#: extensions/base/mediawiki.py:117
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) created [{article}]({edit_link}){comment} {bold}"
+"({sign}{edit_size}){bold}"
msgstr ""
-#: src/rc_formatters.py:747
-msgid "Added"
-msgstr ""
-
-#: src/rc_formatters.py:781 src/rc_formatters.py:820
+#: extensions/base/mediawiki.py:190 extensions/base/mediawiki.py:223
msgid "Options"
msgstr ""
-#: src/rc_formatters.py:781
+#: extensions/base/mediawiki.py:190
#, python-brace-format
msgid "([preview]({link}) | [undo]({undolink}))"
msgstr ""
-#: src/rc_formatters.py:786
+#: extensions/base/mediawiki.py:195
#, python-brace-format
msgid "Uploaded a new version of {name}"
msgstr ""
-#: src/rc_formatters.py:788
+#: extensions/base/mediawiki.py:197
#, python-brace-format
msgid "Reverted a version of {name}"
msgstr ""
-#: src/rc_formatters.py:790
+#: extensions/base/mediawiki.py:199
#, python-brace-format
msgid "Uploaded {name}"
msgstr ""
-#: src/rc_formatters.py:806
+#: extensions/base/mediawiki.py:208
msgid "**No license!**"
msgstr ""
-#: src/rc_formatters.py:818
+#: extensions/base/mediawiki.py:223
+#, python-brace-format
+msgid "([preview]({link}))"
+msgstr ""
+
+#: extensions/base/mediawiki.py:228
msgid ""
"\n"
"License: {}"
msgstr ""
-#: src/rc_formatters.py:820
+#: extensions/base/mediawiki.py:237
#, python-brace-format
-msgid "([preview]({link}))"
+msgid ""
+"[{author}]({author_url}) reverted a version of [{file}]({file_link}){comment}"
msgstr ""
-#: src/rc_formatters.py:825
+#: extensions/base/mediawiki.py:248
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) uploaded a new version of [{file}]({file_link})"
+"{comment}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:259
+#, python-brace-format
+msgid "[{author}]({author_url}) uploaded [{file}]({file_link}){comment}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:274
#, python-brace-format
msgid "Deleted page {article}"
msgstr ""
-#: src/rc_formatters.py:830
+#: extensions/base/mediawiki.py:283
+#, python-brace-format
+msgid "[{author}]({author_url}) deleted [{page}]({page_link}){comment}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:298
#, python-brace-format
msgid "Deleted redirect {article} by overwriting"
msgstr ""
-#: src/rc_formatters.py:836
-msgid "No redirect has been made"
-msgstr ""
-
-#: src/rc_formatters.py:837
-msgid "A redirect has been made"
-msgstr ""
-
-#: src/rc_formatters.py:838
+#: extensions/base/mediawiki.py:308
#, python-brace-format
-msgid "Moved {redirect}{article} to {target}"
+msgid ""
+"[{author}]({author_url}) deleted redirect by overwriting [{page}]"
+"({page_link}){comment}"
msgstr ""
-#: src/rc_formatters.py:841
+#: extensions/base/mediawiki.py:322
#, python-brace-format
-msgid "Moved {redirect}{article} to {title} over redirect"
+msgid "Restored {article}"
msgstr ""
-#: src/rc_formatters.py:845
+#: extensions/base/mediawiki.py:331
#, python-brace-format
-msgid "Moved protection settings from {redirect}{article} to {title}"
+msgid "[{author}]({author_url}) restored [{article}]({article_url}){comment}"
msgstr ""
-#: src/rc_formatters.py:869
-msgid "unknown expiry time"
+#: extensions/base/mediawiki.py:348
+msgid "Changed visibility of log events"
msgstr ""
-#: src/rc_formatters.py:874
-msgid "Blocked from editing the following pages: "
-msgstr ""
-
-#: src/rc_formatters.py:883
-msgid "Blocked from editing pages on following namespaces: "
-msgstr ""
-
-#: src/rc_formatters.py:894
-msgid "Partial block details"
-msgstr ""
-
-#: src/rc_formatters.py:895
+#: extensions/base/mediawiki.py:356
#, python-brace-format
-msgid "Blocked {blocked_user} {time}"
+msgid "[{author}]({author_url}) changed visibility of log events{comment}"
msgstr ""
-#: src/rc_formatters.py:899
-#, python-brace-format
-msgid "Changed block settings for {blocked_user}"
-msgstr ""
-
-#: src/rc_formatters.py:903
-#, python-brace-format
-msgid "Unblocked {blocked_user}"
-msgstr ""
-
-#: src/rc_formatters.py:910
-#, python-brace-format
-msgid "Left a comment on {target}'s profile"
-msgstr ""
-
-#: src/rc_formatters.py:912
-msgid "Left a comment on their own profile"
-msgstr ""
-
-#: src/rc_formatters.py:919
-#, python-brace-format
-msgid "Replied to a comment on {target}'s profile"
-msgstr ""
-
-#: src/rc_formatters.py:921
-msgid "Replied to a comment on their own profile"
-msgstr ""
-
-#: src/rc_formatters.py:928
-#, python-brace-format
-msgid "Edited a comment on {target}'s profile"
-msgstr ""
-
-#: src/rc_formatters.py:930
-msgid "Edited a comment on their own profile"
-msgstr ""
-
-#: src/rc_formatters.py:935
-#, python-brace-format
-msgid "Edited {target}'s profile"
-msgstr ""
-
-#: src/rc_formatters.py:937
-msgid "Edited their own profile"
-msgstr ""
-
-#: src/rc_formatters.py:939
-#, python-brace-format
-msgid "Cleared the {field} field"
-msgstr ""
-
-#: src/rc_formatters.py:941
-#, python-brace-format
-msgid "{field} field changed to: {desc}"
-msgstr ""
-
-#: src/rc_formatters.py:946
-#, python-brace-format
-msgid "Purged a comment on {target}'s profile"
-msgstr ""
-
-#: src/rc_formatters.py:948
-msgid "Purged a comment on their own profile"
-msgstr ""
-
-#: src/rc_formatters.py:956
-#, python-brace-format
-msgid "Deleted a comment on {target}'s profile"
-msgstr ""
-
-#: src/rc_formatters.py:958
-msgid "Deleted a comment on their own profile"
-msgstr ""
-
-#: src/rc_formatters.py:962
-#, python-brace-format
-msgid "Changed group membership for {target}"
-msgstr ""
-
-#: src/rc_formatters.py:966
-#, python-brace-format
-msgid "{target} got autopromoted to a new usergroup"
-msgstr ""
-
-#: src/rc_formatters.py:981
-#, python-brace-format
-msgid "Groups changed from {old_groups} to {new_groups}{reason}"
-msgstr ""
-
-#: src/rc_formatters.py:985
-#, python-brace-format
-msgid "Protected {target}"
-msgstr ""
-
-#: src/rc_formatters.py:991
-#, python-brace-format
-msgid "Changed protection level for {article}"
-msgstr ""
-
-#: src/rc_formatters.py:997
-#, python-brace-format
-msgid "Removed protection from {article}"
-msgstr ""
-
-#: src/rc_formatters.py:1001
+#: extensions/base/mediawiki.py:370
#, python-brace-format
msgid "Changed visibility of revision on page {article} "
msgid_plural "Changed visibility of {amount} revisions on page {article} "
msgstr[0] ""
msgstr[1] ""
-#: src/rc_formatters.py:1013
+#: extensions/base/mediawiki.py:383
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) changed visibility of revision on page [{article}]"
+"({article_url}){comment}"
+msgid_plural ""
+"[{author}]({author_url}) changed visibility of {amount} revisions on page "
+"[{article}]({article_url}){comment}"
+msgstr[0] ""
+msgstr[1] ""
+
+#: extensions/base/mediawiki.py:399 extensions/base/mediawiki.py:432
+msgid "No redirect has been made"
+msgstr ""
+
+#: extensions/base/mediawiki.py:400 extensions/base/mediawiki.py:433
+msgid "A redirect has been made"
+msgstr ""
+
+#: extensions/base/mediawiki.py:401
+#, python-brace-format
+msgid "Moved {redirect}{article} to {target}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:412 extensions/base/mediawiki.py:444
+msgid "without making a redirect"
+msgstr ""
+
+#: extensions/base/mediawiki.py:413 extensions/base/mediawiki.py:445
+msgid "with a redirect"
+msgstr ""
+
+#: extensions/base/mediawiki.py:416
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) moved {redirect}*{article}* to [{target}]"
+"({target_url}) {made_a_redirect}{comment}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:434
+#, python-brace-format
+msgid "Moved {redirect}{article} to {title} over redirect"
+msgstr ""
+
+#: extensions/base/mediawiki.py:448
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) moved {redirect}*{article}* over redirect to "
+"[{target}]({target_url}) {made_a_redirect}{comment}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:464
+#, python-brace-format
+msgid "Moved protection settings from {redirect}{article} to {title}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:477
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) moved protection settings from {redirect}*{article}"
+"* to [{target}]({target_url}){comment}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:492
+#, python-brace-format
+msgid "Protected {target}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:495 extensions/base/mediawiki.py:510
+#: extensions/base/mediawiki.py:526 extensions/base/mediawiki.py:541
+msgid " [cascading]"
+msgstr ""
+
+#: extensions/base/mediawiki.py:506
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) protected [{article}]({article_url}) with the "
+"following settings: {settings}{comment}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:523
+#, python-brace-format
+msgid "Changed protection level for {article}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:537
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) modified protection settings of [{article}]"
+"({article_url}) to: {settings}{comment}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:554
+#, python-brace-format
+msgid "Removed protection from {article}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:563
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) removed protection from [{article}]({article_url})"
+"{comment}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:572
+msgid "for infinity and beyond"
+msgstr ""
+
+#: extensions/base/mediawiki.py:582
+msgid "for less than a minute"
+msgstr ""
+
+#: extensions/base/mediawiki.py:584
+msgid "year"
+msgid_plural "years"
+msgstr[0] ""
+msgstr[1] ""
+
+#: extensions/base/mediawiki.py:584
+msgid "day"
+msgid_plural "days"
+msgstr[0] ""
+msgstr[1] ""
+
+#: extensions/base/mediawiki.py:584
+msgid "hour"
+msgid_plural "hours"
+msgstr[0] ""
+msgstr[1] ""
+
+#: extensions/base/mediawiki.py:585
+msgid "minute"
+msgid_plural "minutes"
+msgstr[0] ""
+msgstr[1] ""
+
+#: extensions/base/mediawiki.py:590
+#, python-brace-format
+msgid "for {time_number} {time_unit}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:609
+msgid "Blocked from editing the following pages: "
+msgstr ""
+
+#: extensions/base/mediawiki.py:616 extensions/base/mediawiki.py:662
+msgid " and namespaces: "
+msgstr ""
+
+#: extensions/base/mediawiki.py:618
+msgid "Blocked from editing pages on following namespaces: "
+msgstr ""
+
+#: extensions/base/mediawiki.py:629
+msgid "Partial block details"
+msgstr ""
+
+#: extensions/base/mediawiki.py:632
+msgid "Block flags"
+msgstr ""
+
+#: extensions/base/mediawiki.py:634
+#, python-brace-format
+msgid "Blocked {blocked_user} {time}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:654
+msgid " on pages: "
+msgstr ""
+
+#: extensions/base/mediawiki.py:664
+msgid " on namespaces: "
+msgstr ""
+
+#: extensions/base/mediawiki.py:676
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) blocked [{user}]({user_url}) {time}"
+"{restriction_desc}{comment}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:694
+#, python-brace-format
+msgid "Changed block settings for {blocked_user}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:704
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) changed block settings for [{blocked_user}]"
+"({user_url}){comment}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:717
+#, python-brace-format
+msgid "Unblocked {blocked_user}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:727
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) unblocked [{blocked_user}]({user_url}){comment}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:743
+msgid "Action has been hidden by administration"
+msgstr ""
+
+#: extensions/base/mediawiki.py:750
+msgid "An action has been hidden by administration."
+msgstr ""
+
+#: extensions/base/mediawiki.py:761
#, python-brace-format
msgid "Imported {article} with {count} revision"
msgid_plural "Imported {article} with {count} revisions"
msgstr[0] ""
msgstr[1] ""
-#: src/rc_formatters.py:1018
+#: extensions/base/mediawiki.py:772
#, python-brace-format
-msgid "Restored {article}"
-msgstr ""
+msgid ""
+"[{author}]({author_url}) imported [{article}]({article_url}) with {count} "
+"revision{comment}"
+msgid_plural ""
+"[{author}]({author_url}) imported [{article}]({article_url}) with {count} "
+"revisions{comment}"
+msgstr[0] ""
+msgstr[1] ""
-#: src/rc_formatters.py:1021
-msgid "Changed visibility of log events"
-msgstr ""
-
-#: src/rc_formatters.py:1031
+#: extensions/base/mediawiki.py:788
#, python-brace-format
msgid "Imported {article} with {count} revision from \"{source}\""
msgid_plural "Imported {article} with {count} revisions from \"{source}\""
msgstr[0] ""
msgstr[1] ""
-#: src/rc_formatters.py:1036
+#: extensions/base/mediawiki.py:803
#, python-brace-format
-msgid "Edited abuse filter number {number}"
+msgid ""
+"[{author}]({author_url}) imported [{article}]({article_url}) with {count} "
+"revision from [{source}]({source_url}){comment}"
+msgid_plural ""
+"[{author}]({author_url}) imported [{article}]({article_url}) with {count} "
+"revisions from [{source}]({source_url}){comment}"
+msgstr[0] ""
+msgstr[1] ""
+
+#: extensions/base/mediawiki.py:818
+#, python-brace-format
+msgid " (until {date_and_time})"
msgstr ""
-#: src/rc_formatters.py:1039
+#: extensions/base/mediawiki.py:835
#, python-brace-format
-msgid "Created abuse filter number {number}"
+msgid "Changed group membership for {target}"
msgstr ""
-#: src/rc_formatters.py:1042
+#: extensions/base/mediawiki.py:837
+msgid "System"
+msgstr ""
+
+#: extensions/base/mediawiki.py:838
+#, python-brace-format
+msgid "{target} got autopromoted to a new usergroup"
+msgstr ""
+
+#: extensions/base/mediawiki.py:844
+msgid "Added group"
+msgid_plural "Added groups"
+msgstr[0] ""
+msgstr[1] ""
+
+#: extensions/base/mediawiki.py:846
+msgid "Removed group"
+msgid_plural "Removed groups"
+msgstr[0] ""
+msgstr[1] ""
+
+#: extensions/base/mediawiki.py:860
+#, python-brace-format
+msgid "Added to {added} and removed from {removed}."
+msgstr ""
+
+#: extensions/base/mediawiki.py:861 extensions/base/mediawiki.py:863
+#: extensions/base/mediawiki.py:865 extensions/base/mediawiki.py:872
+msgid ", "
+msgstr ""
+
+#: extensions/base/mediawiki.py:863
+#, python-brace-format
+msgid "Added to {added}."
+msgstr ""
+
+#: extensions/base/mediawiki.py:865
+#, python-brace-format
+msgid "Removed from {removed}."
+msgstr ""
+
+#: extensions/base/mediawiki.py:866
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) changed group membership for [{target}]"
+"({target_url}): {group_changes}{comment}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:870
+#, python-brace-format
+msgid "The system autopromoted [{target}]({target_url}) to {added}.{comment}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:883
#, python-brace-format
msgid "Merged revision histories of {article} into {dest}"
msgstr ""
-#: src/rc_formatters.py:1046
+#: extensions/base/mediawiki.py:897
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) merged revision histories of [{article}]"
+"({article_url}) into [{dest}]({dest_url}){comment}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:911
msgid "Created account automatically"
msgstr ""
-#: src/rc_formatters.py:1049 src/rc_formatters.py:1058
+#: extensions/base/mediawiki.py:918
+#, python-brace-format
+msgid "Account [{author}]({author_url}) was created automatically"
+msgstr ""
+
+#: extensions/base/mediawiki.py:931 extensions/base/mediawiki.py:996
msgid "Created account"
msgstr ""
-#: src/rc_formatters.py:1052
+#: extensions/base/mediawiki.py:938 extensions/base/mediawiki.py:1003
+#, python-brace-format
+msgid "Account [{author}]({author_url}) was created"
+msgstr ""
+
+#: extensions/base/mediawiki.py:950
#, python-brace-format
msgid "Created account {article}"
msgstr ""
-#: src/rc_formatters.py:1055
+#: extensions/base/mediawiki.py:959
+#, python-brace-format
+msgid ""
+"Account [{article}]({article_url}) was created by [{author}]({author_url})"
+"{comment}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:972
#, python-brace-format
msgid "Created account {article} and password was sent by email"
msgstr ""
-#: src/rc_formatters.py:1061
-msgid "Added an entry to the interwiki table"
-msgstr ""
-
-#: src/rc_formatters.py:1062 src/rc_formatters.py:1068
+#: extensions/base/mediawiki.py:983
#, python-brace-format
-msgid "Prefix: {prefix}, website: {website} | {desc}"
+msgid ""
+"Account [{article}]({article_url}) was created by [{author}]({author_url}) "
+"and password was sent by email{comment}"
msgstr ""
-#: src/rc_formatters.py:1067
-msgid "Edited an entry in interwiki table"
-msgstr ""
-
-#: src/rc_formatters.py:1073
-msgid "Deleted an entry in interwiki table"
-msgstr ""
-
-#: src/rc_formatters.py:1074
-#, python-brace-format
-msgid "Prefix: {prefix} | {desc}"
-msgstr ""
-
-#: src/rc_formatters.py:1077
+#: extensions/base/mediawiki.py:1015
#, python-brace-format
msgid "Changed the content model of the page {article}"
msgstr ""
-#: src/rc_formatters.py:1078
+#: extensions/base/mediawiki.py:1017
#, python-brace-format
msgid "Model changed from {old} to {new}: {reason}"
msgstr ""
-#: src/rc_formatters.py:1083
+#: extensions/base/mediawiki.py:1029
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) changed the content model of the page [{article}]"
+"({article_url}) from {old} to {new}{comment}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:1044
#, python-brace-format
msgid "Created the page {article} using a non-default content model"
msgstr ""
-#: src/rc_formatters.py:1084
+#: extensions/base/mediawiki.py:1046
#, python-brace-format
msgid "Created with model {new}: {reason}"
msgstr ""
-#: src/rc_formatters.py:1087
+#: extensions/base/mediawiki.py:1057
#, python-brace-format
-msgid "Edited the sprite for {article}"
+msgid ""
+"[{author}]({author_url}) created the page [{article}]({article_url}) using a "
+"non-default content model {new}{comment}"
msgstr ""
-#: src/rc_formatters.py:1090
-#, python-brace-format
-msgid "Created the sprite sheet for {article}"
-msgstr ""
-
-#: src/rc_formatters.py:1093
-#, python-brace-format
-msgid "Edited the slice for {article}"
-msgstr ""
-
-#: src/rc_formatters.py:1099
-#, python-brace-format
-msgid "Created the Cargo table \"{table}\""
-msgstr ""
-
-#: src/rc_formatters.py:1103
-#, python-brace-format
-msgid "Deleted the Cargo table \"{table}\""
-msgstr ""
-
-#: src/rc_formatters.py:1110
-#, python-brace-format
-msgid "Recreated the Cargo table \"{table}\""
-msgstr ""
-
-#: src/rc_formatters.py:1117
-#, python-brace-format
-msgid "Replaced the Cargo table \"{table}\""
-msgstr ""
-
-#: src/rc_formatters.py:1121
+#: extensions/base/mediawiki.py:1072
#, python-brace-format
msgid "Created the tag \"{tag}\""
msgstr ""
-#: src/rc_formatters.py:1125
+#: extensions/base/mediawiki.py:1082
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) created the [tag]({tag_url}) \"{tag}\"{comment}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:1103
#, python-brace-format
msgid "Deleted the tag \"{tag}\""
msgstr ""
-#: src/rc_formatters.py:1127
+#: extensions/base/mediawiki.py:1105
msgid "Removed from"
msgstr ""
-#: src/rc_formatters.py:1127
+#: extensions/base/mediawiki.py:1105
msgid "{} revision or log entry"
msgid_plural "{} revisions and/or log entries"
msgstr[0] ""
msgstr[1] ""
-#: src/rc_formatters.py:1131
+#: extensions/base/mediawiki.py:1118
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) deleted the [tag]({tag_url}) \"{tag}\"{comment}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:1128
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) deleted the [tag]({tag_url}) \"{tag}\" and removed "
+"it from {count} revision or log entry{comment}"
+msgid_plural ""
+"[{author}]({author_url}) deleted the [tag]({tag_url}) \"{tag}\" and removed "
+"it from {count} revisions and/or log entries{comment}"
+msgstr[0] ""
+msgstr[1] ""
+
+#: extensions/base/mediawiki.py:1145
#, python-brace-format
msgid "Activated the tag \"{tag}\""
msgstr ""
-#: src/rc_formatters.py:1134
+#: extensions/base/mediawiki.py:1154
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) activated the [tag]({tag_url}) \"{tag}\"{comment}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:1173
#, python-brace-format
msgid "Deactivated the tag \"{tag}\""
msgstr ""
-#: src/rc_formatters.py:1137
-msgid "Changed wiki settings"
-msgstr ""
-
-#: src/rc_formatters.py:1141
-#, python-brace-format
-msgid "Deleted a \"{wiki}\" wiki"
-msgstr ""
-
-#: src/rc_formatters.py:1144
-#, python-brace-format
-msgid "Locked a \"{wiki}\" wiki"
-msgstr ""
-
-#: src/rc_formatters.py:1147
-#, python-brace-format
-msgid "Modified \"{namespace_name}\" namespace"
-msgstr ""
-
-#: src/rc_formatters.py:1149 src/rc_formatters.py:1154
-msgid "Wiki"
-msgstr ""
-
-#: src/rc_formatters.py:1151
-#, python-brace-format
-msgid "Deleted a \"{namespace_name}\" namespace"
-msgstr ""
-
-#: src/rc_formatters.py:1157
-#, python-brace-format
-msgid "Modified \"{usergroup_name}\" usergroup"
-msgstr ""
-
-#: src/rc_formatters.py:1160
-#, python-brace-format
-msgid "Undeleted a \"{wiki}\" wiki"
-msgstr ""
-
-#: src/rc_formatters.py:1163
-#, python-brace-format
-msgid "Unlocked a \"{wiki}\" wiki"
-msgstr ""
-
-#: src/rc_formatters.py:1166
-#, python-brace-format
-msgid "Generated {file} dump"
-msgstr ""
-
-#: src/rc_formatters.py:1169
-#, python-brace-format
-msgid "Deleted {file} dump"
-msgstr ""
-
-#: src/rc_formatters.py:1177
-#, python-brace-format
-msgid "Marked \"{article}\" for translation"
-msgstr ""
-
-#: src/rc_formatters.py:1180
-#, python-brace-format
-msgid "Removed \"{article}\" from the translation system"
-msgstr ""
-
-#: src/rc_formatters.py:1183
-#, python-brace-format
-msgid "Completed moving translation pages from \"{article}\" to \"{target}\""
-msgstr ""
-
-#: src/rc_formatters.py:1186
-#, python-brace-format
-msgid "Encountered a problem while moving \"{article}\" to \"{target}\""
-msgstr ""
-
-#: src/rc_formatters.py:1189
-#, python-brace-format
-msgid "Completed deletion of translatable page \"{article}\""
-msgstr ""
-
-#: src/rc_formatters.py:1192
+#: extensions/base/mediawiki.py:1182
#, python-brace-format
msgid ""
-"Failed to delete \"{article}\" which belongs to translatable page "
-"\"{target}\""
+"[{author}]({author_url}) deactivated the [tag]({tag_url}) \"{tag}\"{comment}"
msgstr ""
-#: src/rc_formatters.py:1195
+#: extensions/base/sprite.py:37
#, python-brace-format
-msgid "Completed deletion of translation page \"{article}\""
+msgid "Edited the sprite for {article}"
msgstr ""
-#: src/rc_formatters.py:1198
+#: extensions/base/sprite.py:45
#, python-brace-format
msgid ""
-"Failed to delete \"{article}\" which belongs to translation page \"{target}\""
+"[{author}]({author_url}) edited the sprite for [{article}]({article_url})"
msgstr ""
-#: src/rc_formatters.py:1201
+#: extensions/base/sprite.py:60
#, python-brace-format
-msgid "Encouraged translation of \"{article}\""
+msgid "Created the sprite sheet for {article}"
msgstr ""
-#: src/rc_formatters.py:1204
-#, python-brace-format
-msgid "Discouraged translation of \"{article}\""
-msgstr ""
-
-#: src/rc_formatters.py:1210
-#, python-brace-format
-msgid "Limited languages for \"{article}\" to `{languages}`"
-msgstr ""
-
-#: src/rc_formatters.py:1212
-#, python-brace-format
-msgid "Priority languages for \"{article}\" set to `{languages}`"
-msgstr ""
-
-#: src/rc_formatters.py:1214
-#, python-brace-format
-msgid "Removed priority languages from \"{article}\""
-msgstr ""
-
-#: src/rc_formatters.py:1217
-#, python-brace-format
-msgid "Added translatable page \"{article}\" to aggregate group \"{group}\""
-msgstr ""
-
-#: src/rc_formatters.py:1220
+#: extensions/base/sprite.py:68
#, python-brace-format
msgid ""
-"Removed translatable page \"{article}\" from aggregate group \"{group}\""
+"[{author}]({author_url}) created the sprite sheet for [{article}]"
+"({article_url})"
msgstr ""
-#: src/rc_formatters.py:1227
+#: extensions/base/sprite.py:79
#, python-brace-format
-msgid "Reviewed translation \"{article}\""
+msgid "Edited the slice for {article}"
msgstr ""
-#: src/rc_formatters.py:1230
+#: extensions/base/sprite.py:86
#, python-brace-format
-msgid "Changed the state of `{language}` translations of \"{article}\""
-msgstr ""
-
-#: src/rc_formatters.py:1232
-msgid "Old state"
-msgstr ""
-
-#: src/rc_formatters.py:1233
-msgid "New state"
-msgstr ""
-
-#: src/rc_formatters.py:1242
-#, python-brace-format
-msgid "Changed the language of \"{article}\""
-msgstr ""
-
-#: src/rc_formatters.py:1243
-msgid "Old language"
-msgstr ""
-
-#: src/rc_formatters.py:1244
-msgid "New language"
-msgstr ""
-
-#: src/rc_formatters.py:1248
-#, python-brace-format
-msgid "Renamed user \"{old_name}\" with {edits} edit to \"{new_name}\""
-msgid_plural "Renamed user \"{old_name}\" with {edits} edits to \"{new_name}\""
-msgstr[0] ""
-msgstr[1] ""
-
-#: src/rc_formatters.py:1250
-#, python-brace-format
-msgid "Renamed user \"{old_name}\" to \"{new_name}\""
-msgstr ""
-
-#: src/rc_formatters.py:1254
-msgid "Action has been hidden by administration"
-msgstr ""
-
-#: src/rc_formatters.py:1259
-#, python-brace-format
-msgid "Unknown event `{event}`"
-msgstr ""
-
-#: src/rc_formatters.py:1265 src/rc_formatters.py:1267
-msgid "Report this on the support server"
-msgstr ""
-
-#: src/rc_formatters.py:1283
-msgid "Tags"
-msgstr ""
-
-#: src/rc_formatters.py:1288
-msgid "**Added**: "
-msgstr ""
-
-#: src/rc_formatters.py:1288
-msgid " and {} more\n"
-msgstr ""
-
-#: src/rc_formatters.py:1289
-msgid "**Removed**: "
-msgstr ""
-
-#: src/rc_formatters.py:1289
-msgid " and {} more"
-msgstr ""
-
-#: src/rc_formatters.py:1290
-msgid "Changed categories"
+msgid ""
+"[{author}]({author_url}) edited the slice for [{article}]({article_url})"
msgstr ""
diff --git a/locale/ja/LC_MESSAGES/discussion_formatters.mo b/locale/ja/LC_MESSAGES/discussion_formatters.mo
deleted file mode 100644
index 67cc803..0000000
Binary files a/locale/ja/LC_MESSAGES/discussion_formatters.mo and /dev/null differ
diff --git a/locale/ja/LC_MESSAGES/discussion_formatters.po b/locale/ja/LC_MESSAGES/discussion_formatters.po
deleted file mode 100644
index c251054..0000000
--- a/locale/ja/LC_MESSAGES/discussion_formatters.po
+++ /dev/null
@@ -1,159 +0,0 @@
-# SOME DESCRIPTIVE TITLE.
-# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
-# This file is distributed under the same license as the RcGcDw package.
-# FIRST AUTHOR , YEAR.
-#
-msgid ""
-msgstr ""
-"Project-Id-Version: RcGcDw\n"
-"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2020-11-30 11:58+0100\n"
-"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
-"Last-Translator: Automatically generated\n"
-"Language-Team: none\n"
-"Language: ja\n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=UTF-8\n"
-"Content-Transfer-Encoding: 8bit\n"
-
-#: src/discussion_formatters.py:25 src/discussion_formatters.py:81
-msgid "Unregistered user"
-msgstr ""
-
-#: src/discussion_formatters.py:34
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) created [{title}](<{url}f/p/{threadId}>) in "
-"{forumName}"
-msgstr ""
-
-#: src/discussion_formatters.py:36
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) created a poll [{title}](<{url}f/p/{threadId}>) in "
-"{forumName}"
-msgstr ""
-
-#: src/discussion_formatters.py:38
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) created a quiz [{title}](<{url}f/p/{threadId}>) in "
-"{forumName}"
-msgstr ""
-
-#: src/discussion_formatters.py:43
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) created a [reply](<{url}f/p/{threadId}/r/{postId}>) "
-"to [{title}](<{url}f/p/{threadId}>) in {forumName}"
-msgstr ""
-
-#: src/discussion_formatters.py:45 src/discussion_formatters.py:54
-#: src/discussion_formatters.py:137 src/discussion_formatters.py:150
-msgid "unknown"
-msgstr ""
-
-#: src/discussion_formatters.py:49
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) created [{title}](<{url}wiki/Message_Wall:"
-"{user_wall}?threadId={threadId}>) on [{user}'s Message Wall](<{url}wiki/"
-"Message_Wall:{user_wall}>)"
-msgstr ""
-
-#: src/discussion_formatters.py:51
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) created a [reply](<{url}wiki/Message_Wall:"
-"{user_wall}?threadId={threadId}#{replyId}>) to [{title}](<{url}wiki/"
-"Message_Wall:{user_wall}?threadId={threadId}>) on [{user}'s Message Wall]"
-"(<{url}wiki/Message_Wall:{user_wall}>)"
-msgstr ""
-
-#: src/discussion_formatters.py:57
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) created a [comment](<{url}?commentId={commentId}>) "
-"on [{article}](<{url}>)"
-msgstr ""
-
-#: src/discussion_formatters.py:62
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) created a [reply](<{url}?commentId={commentId}"
-"&replyId={replyId}>) to a [comment](<{url}?commentId={commentId}>) on "
-"[{article}](<{url}>)"
-msgstr ""
-
-#: src/discussion_formatters.py:70
-#, python-brace-format
-msgid ""
-"Unknown event `{event}` by [{author}]({author_url}), report it on the "
-"[support server](<{support}>)."
-msgstr ""
-
-#: src/discussion_formatters.py:98
-#, python-brace-format
-msgid "Created \"{title}\""
-msgstr ""
-
-#: src/discussion_formatters.py:102
-#, python-brace-format
-msgid "Created a poll \"{title}\""
-msgstr ""
-
-#: src/discussion_formatters.py:109
-msgid "Option {}"
-msgstr ""
-
-#: src/discussion_formatters.py:110
-#, python-brace-format
-msgid "__[View image]({image_url})__"
-msgstr ""
-
-#: src/discussion_formatters.py:114
-#, python-brace-format
-msgid "Created a quiz \"{title}\""
-msgstr ""
-
-#: src/discussion_formatters.py:129 src/discussion_formatters.py:131
-msgid "Tags"
-msgstr ""
-
-#: src/discussion_formatters.py:129
-msgid "{} tags"
-msgstr ""
-
-#: src/discussion_formatters.py:134
-#, python-brace-format
-msgid "Replied to \"{title}\""
-msgstr ""
-
-#: src/discussion_formatters.py:143
-#, python-brace-format
-msgid "Created \"{title}\" on {user}'s Message Wall"
-msgstr ""
-
-#: src/discussion_formatters.py:147
-#, python-brace-format
-msgid "Replied to \"{title}\" on {user}'s Message Wall"
-msgstr ""
-
-#: src/discussion_formatters.py:154
-#, python-brace-format
-msgid "Commented on {article}"
-msgstr ""
-
-#: src/discussion_formatters.py:158
-#, python-brace-format
-msgid "Replied to a comment on {article}"
-msgstr ""
-
-#: src/discussion_formatters.py:162
-#, python-brace-format
-msgid "Unknown event `{event}`"
-msgstr ""
-
-#: src/discussion_formatters.py:168 src/discussion_formatters.py:170
-msgid "Report this on the support server"
-msgstr ""
diff --git a/locale/ja/LC_MESSAGES/formatters.mo b/locale/ja/LC_MESSAGES/formatters.mo
new file mode 100644
index 0000000..5603fe6
Binary files /dev/null and b/locale/ja/LC_MESSAGES/formatters.mo differ
diff --git a/locale/ja/LC_MESSAGES/formatters.po b/locale/ja/LC_MESSAGES/formatters.po
new file mode 100644
index 0000000..84d6014
--- /dev/null
+++ b/locale/ja/LC_MESSAGES/formatters.po
@@ -0,0 +1,1612 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the RcGcDw package.
+# FIRST AUTHOR , YEAR.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: RcGcDw\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2021-05-22 18:48+0200\n"
+"PO-Revision-Date: 2021-07-11 12:33+0000\n"
+"Last-Translator: しぃ \n"
+"Language-Team: Japanese \n"
+"Language: ja\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+"X-Generator: Weblate 4.6.2\n"
+
+#: src/api/util.py:61 src/api/util.py:66
+msgid "__Only whitespace__"
+msgstr "__空白のみ__"
+
+#: src/api/util.py:71
+msgid "Removed"
+msgstr "削除済"
+
+#: src/api/util.py:73
+msgid "Added"
+msgstr "追加済"
+
+#: src/api/util.py:94 src/api/util.py:126 src/api/util.py:133
+#: src/api/util.py:141 extensions/base/discussions.py:247
+#: extensions/base/discussions.py:264 extensions/base/abusefilter.py:45
+msgid "Unregistered user"
+msgstr "未登録利用者"
+
+#: src/api/util.py:160
+msgctxt "recent changes Tags"
+msgid "Tags"
+msgstr "タグ"
+
+#: src/api/util.py:162
+msgid "**Added**: "
+msgstr "**追加済**: "
+
+#: src/api/util.py:163
+msgid " and {} more\n"
+msgstr " そして {} その他にも\n"
+
+#: src/api/util.py:165
+msgid "**Removed**: "
+msgstr "**削除済**: "
+
+#: src/api/util.py:166
+msgid " and {} more"
+msgstr " そして {} その他にも"
+
+#: src/api/util.py:168
+msgid "Changed categories"
+msgstr "変更後の分類"
+
+#: extensions/base/cargo.py:37
+#, python-brace-format
+msgid "Created the Cargo table \"{table}\""
+msgstr "Cargo テーブル\"{table}\"を作成しました"
+
+#: extensions/base/cargo.py:45
+#, python-brace-format
+msgid "[{author}]({author_url}) created the Cargo table \"{table}\""
+msgstr "[{author}]({author_url}) がCargo テーブル\"{table}\"を作成しました"
+
+#: extensions/base/cargo.py:60
+#, python-brace-format
+msgid "Recreated the Cargo table \"{table}\""
+msgstr "Cargo テーブル \"{table}\" の再作成"
+
+#: extensions/base/cargo.py:68
+#, python-brace-format
+msgid "[{author}]({author_url}) recreated the Cargo table \"{table}\""
+msgstr "[{author}]({author_url}) がCargo テーブル\"{table}\"を再作成しました"
+
+#: extensions/base/cargo.py:83
+#, python-brace-format
+msgid "Replaced the Cargo table \"{table}\""
+msgstr "Cargo テーブル \"{table}\" の置き換え"
+
+#: extensions/base/cargo.py:91
+#, python-brace-format
+msgid "[{author}]({author_url}) replaced the Cargo table \"{table}\""
+msgstr "[{author}]({author_url}) がCargo テーブル\"{table}\"を置き換えました"
+
+#: extensions/base/cargo.py:105
+#, python-brace-format
+msgid "Deleted the Cargo table \"{table}\""
+msgstr "Cargo テーブル \"{table}\" の削除"
+
+#: extensions/base/cargo.py:112
+#, python-brace-format
+msgid "[{author}]({author_url}) deleted the Cargo table \"{table}\""
+msgstr "[{author}]({author_url}) がCargo テーブル\"{table}\"を削除しました"
+
+#: extensions/base/translate.py:41
+#, python-brace-format
+msgid "Marked \"{article}\" for translation"
+msgstr "ページ \"{article}\" を翻訳可能にしました"
+
+#: extensions/base/translate.py:55
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) marked [{article}]({article_url}) for "
+"translation{comment}"
+msgstr ""
+"[{author}]({author_url}) は [{article}]({article_url}) というページを翻訳可能にしました "
+"{comment}"
+
+#: extensions/base/translate.py:70
+#, python-brace-format
+msgid "Removed \"{article}\" from the translation system"
+msgstr "翻訳システムから \"{article}\" を削除しました"
+
+#: extensions/base/translate.py:80
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) removed [{article}]({article_url}) from the "
+"translation system{comment}"
+msgstr ""
+"[{author}]({author_url}) は [{article}]({article_url}) を翻訳から削除しました {comment}"
+
+#: extensions/base/translate.py:95
+#, python-brace-format
+msgid "Completed moving translation pages from \"{article}\" to \"{target}\""
+msgstr "翻訳ページを \"{article}\" から \"{target}\" への移動を完了"
+
+#: extensions/base/translate.py:106
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) completed moving translation pages from *{article}* "
+"to [{target}]({target_url}){comment}"
+msgstr ""
+"[{author}]({author_url}) が *{article}* から [{target}]({target_url}) "
+"への翻訳ページの移動が完了しました {comment}"
+
+#: extensions/base/translate.py:121
+#, python-brace-format
+msgid "Encountered a problem while moving \"{article}\" to \"{target}\""
+msgstr "\"{article}\" から \"{target}\" に移動する際に問題が発生しました"
+
+#: extensions/base/translate.py:133
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) encountered a problem while moving [{article}]"
+"({article_url}) to [{target}]({target_url}){comment}"
+msgstr ""
+"[{author}]({author_url}) が [{article}]({article_url}) から "
+"[{target}]({target_url}) に移動する際に問題が発生しました {comment}"
+
+#: extensions/base/translate.py:149
+#, python-brace-format
+msgid ""
+"Failed to delete \"{article}\" which belongs to translatable page "
+"\"{target}\""
+msgstr "翻訳可能なページ\"{target}\"に関する\"{article}\"の削除に失敗しました"
+
+#: extensions/base/translate.py:161
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) failed to delete [{article}]({article_url}) which "
+"belongs to translatable page [{target}]({target_url}){comment}"
+msgstr ""
+"[{author}]({author_url})は、翻訳可能なページに属する[{article}]({article_url})の削除に失敗しました "
+"[{target}]({target_url}){comment}"
+
+#: extensions/base/translate.py:177
+#, python-brace-format
+msgid "Completed deletion of translation page \"{article}\""
+msgstr "翻訳ページ\"{article}\"の削除を完了"
+
+#: extensions/base/translate.py:188
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) completed deletion of translation page [{article}]"
+"({article_url}){comment}"
+msgstr ""
+"[{author}]({author_url}) が翻訳ページ [{article}]({article_url}) の削除を完了 {comment}"
+
+#: extensions/base/translate.py:203
+#, python-brace-format
+msgid ""
+"Failed to delete \"{article}\" which belongs to translation page \"{target}\""
+msgstr "翻訳ページ\"{target}\"に属する\"{article}\"の削除に失敗しました"
+
+#: extensions/base/translate.py:215
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) failed to delete [{article}]({article_url}) which "
+"belongs to translation page [{target}]({target_url}){comment}"
+msgstr ""
+"[{author}]({author_url})が翻訳ページ[{target}]({target_url})に属する[{article}]({articl"
+"e_url})の削除に失敗しました {comment}"
+
+#: extensions/base/translate.py:231
+#, python-brace-format
+msgid "Encouraged translation of \"{article}\""
+msgstr "推奨される\"{article}\"の翻訳"
+
+#: extensions/base/translate.py:240
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) encouraged translation of [{article}]({article_url})"
+"{comment}"
+msgstr "[{author}]({author_url})が推奨する翻訳:[{article}]({article_url}){comment}"
+
+#: extensions/base/translate.py:255
+#, python-brace-format
+msgid "Discouraged translation of \"{article}\""
+msgstr "\"{article}\"の翻訳に挫折"
+
+#: extensions/base/translate.py:264
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) discouraged translation of [{article}]"
+"({article_url}){comment}"
+msgstr "[{author}]({author_url}) が挫折した翻訳: [{article}]({article_url}){comment}"
+
+#: extensions/base/translate.py:282
+#, python-brace-format
+msgid "Limited languages for \"{article}\" to `{languages}`"
+msgstr "\"{article}\"の言語を`{languages}`に限定"
+
+#: extensions/base/translate.py:285
+#, python-brace-format
+msgid "Priority languages for \"{article}\" set to `{languages}`"
+msgstr "\"{article}\"の優先言語は`{languages}`に設定されています"
+
+#: extensions/base/translate.py:288
+#, python-brace-format
+msgid "Removed priority languages from \"{article}\""
+msgstr "\"{article}\"から優先順位の高い言語を削除しました"
+
+#: extensions/base/translate.py:301
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) limited languages for [{article}]({article_url}) to "
+"`{languages}`{comment}"
+msgstr ""
+"[{author}]({author_url}) は [{article}]({article_url}) の言語を `{languages}` "
+"に限定しました {comment}"
+
+#: extensions/base/translate.py:308
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) set the priority languages for [{article}]"
+"({article_url}) to `{languages}`{comment}"
+msgstr ""
+"[{author}]({author_url})は、[{article}]({article_url}) "
+"ページの優先言語リストを以下のように設定しています: `{languages}`{comment}"
+
+#: extensions/base/translate.py:315
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) removed priority languages from [{article}]"
+"({article_url}){comment}"
+msgstr ""
+"[{author}]({author_url}) の優先言語を [{article}]({article_url}) から削除しました {comment}"
+
+#: extensions/base/translate.py:331
+#, python-brace-format
+msgid "Added translatable page \"{article}\" to aggregate group \"{group}\""
+msgstr "翻訳可能なページ \"{article}\" を集計グループ \"{group}\" に追加しました"
+
+#: extensions/base/translate.py:342
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) added translatable page [{article}]({article_url}) "
+"to aggregate group \"{group}\"{comment}"
+msgstr ""
+"[{author}]({author_url}) は、翻訳可能なページ [{article}]({article_url}) を集計グループ \""
+"{group}\"に追加しました{comment}"
+
+#: extensions/base/translate.py:357
+#, python-brace-format
+msgid ""
+"Removed translatable page \"{article}\" from aggregate group \"{group}\""
+msgstr "翻訳可能なページ \"{article}\" を集約グループ \"{group}\" から削除しました"
+
+#: extensions/base/translate.py:368
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) removed translatable page [{article}]"
+"({article_url}) from aggregate group \"{group}\"{comment}"
+msgstr ""
+"[{author}]({author_url}) は、翻訳可能なページ [{article}]({article_url}) を集計グループ \""
+"{group}\"から削除しました{comment}"
+
+#: extensions/base/translate.py:387
+#, python-brace-format
+msgid "Reviewed translation \"{article}\""
+msgstr "\"{article}\" ページの翻訳を確認しました"
+
+#: extensions/base/translate.py:401
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) reviewed translation [{article}]({article_url})"
+"{comment}"
+msgstr ""
+"[{author}]({author_url}) の翻訳をチェックしました [{article}]({article_url}){comment}"
+
+#: extensions/base/translate.py:416
+#, python-brace-format
+msgid "Changed the state of `{language}` translations of \"{article}\""
+msgstr "\"{article}\"ページの翻訳状況を`{language}`に変更しました"
+
+#: extensions/base/translate.py:419
+msgid "Old state"
+msgstr "古い状態"
+
+#: extensions/base/translate.py:420
+msgid "New state"
+msgstr "新しい状態"
+
+#: extensions/base/translate.py:431
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) changed the state of `{language}` translations of "
+"[{article}]({article_url}) from `{old_state}` to `{new_state}`{comment}"
+msgstr ""
+
+#: extensions/base/translate.py:439
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) changed the state of `{language}` translations of "
+"[{article}]({article_url}) to `{new_state}`{comment}"
+msgstr ""
+
+#: extensions/base/translate.py:452 extensions/base/translate.py:455
+msgid "(default)"
+msgstr ""
+
+#: extensions/base/translate.py:464
+#, python-brace-format
+msgid "Changed the language of \"{article}\""
+msgstr ""
+
+#: extensions/base/translate.py:465
+msgid "Old language"
+msgstr ""
+
+#: extensions/base/translate.py:466
+msgid "New language"
+msgstr ""
+
+#: extensions/base/translate.py:477
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) changed the language of [{article}]({article_url}) "
+"from {old_lang} to {new_lang}{comment}"
+msgstr ""
+
+#: extensions/base/discussions.py:148 extensions/base/discussions.py:207
+#: extensions/base/discussions.py:245 extensions/base/discussions.py:261
+#: extensions/base/discussions.py:284 extensions/base/discussions.py:306
+#: extensions/base/discussions.py:334 extensions/base/discussions.py:354
+msgid "unknown"
+msgstr ""
+
+#: extensions/base/discussions.py:157
+#, python-brace-format
+msgid "Created \"{title}\""
+msgstr ""
+
+#: extensions/base/discussions.py:161
+#, python-brace-format
+msgid "Created a poll \"{title}\""
+msgstr ""
+
+#: extensions/base/discussions.py:168
+msgid "Option {}"
+msgstr ""
+
+#: extensions/base/discussions.py:170
+#, python-brace-format
+msgid "__[View image]({image_url})__"
+msgstr ""
+
+#: extensions/base/discussions.py:174
+#, python-brace-format
+msgid "Created a quiz \"{title}\""
+msgstr ""
+
+#: extensions/base/discussions.py:193 extensions/base/discussions.py:195
+msgctxt "Fandom discussions Tags/Forums"
+msgid "Tags"
+msgstr ""
+
+#: extensions/base/discussions.py:193
+msgctxt "Fandom discussions amount of Tags/Forums"
+msgid "{} tags"
+msgstr ""
+
+#: extensions/base/discussions.py:198
+#, python-brace-format
+msgid "Replied to \"{title}\""
+msgstr ""
+
+#: extensions/base/discussions.py:214
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) created [{title}](<{url}f/p/{threadId}>) in "
+"{forumName}"
+msgstr ""
+
+#: extensions/base/discussions.py:217
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) created a poll [{title}](<{url}f/p/{threadId}>) in "
+"{forumName}"
+msgstr ""
+
+#: extensions/base/discussions.py:220
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) created a quiz [{title}](<{url}f/p/{threadId}>) in "
+"{forumName}"
+msgstr ""
+
+#: extensions/base/discussions.py:234
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) created a [reply](<{url}f/p/{threadId}/r/{postId}>) "
+"to [{title}](<{url}f/p/{threadId}>) in {forumName}"
+msgstr ""
+
+#: extensions/base/discussions.py:292
+#, python-brace-format
+msgid "Created \"{title}\" on {user}'s Message Wall"
+msgstr ""
+
+#: extensions/base/discussions.py:298
+#, python-brace-format
+msgid "Replied to \"{title}\" on {user}'s Message Wall"
+msgstr ""
+
+#: extensions/base/discussions.py:312
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) created [{title}](<{url}wiki/Message_Wall:"
+"{user_wall}?threadId={threadId}>) on [{user}'s Message Wall](<{url}wiki/"
+"Message_Wall:{user_wall}>)"
+msgstr ""
+
+#: extensions/base/discussions.py:318
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) created a [reply](<{url}wiki/Message_Wall:"
+"{user_wall}?threadId={threadId}#{replyId}>) to [{title}](<{url}wiki/"
+"Message_Wall:{user_wall}?threadId={threadId}>) on [{user}'s Message Wall]"
+"(<{url}wiki/Message_Wall:{user_wall}>)"
+msgstr ""
+
+#: extensions/base/discussions.py:338
+#, python-brace-format
+msgid "Commented on {article}"
+msgstr ""
+
+#: extensions/base/discussions.py:344
+#, python-brace-format
+msgid "Replied to a comment on {article}"
+msgstr ""
+
+#: extensions/base/discussions.py:359
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) created a [comment](<{url}?commentId={commentId}>) "
+"on [{article}](<{url}>)"
+msgstr ""
+
+#: extensions/base/discussions.py:365
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) created a [reply](<{url}?commentId={commentId}"
+"&replyId={replyId}>) to a [comment](<{url}?commentId={commentId}>) on "
+"[{article}](<{url}>)"
+msgstr ""
+
+#: extensions/base/managewiki.py:34
+msgid "Changed wiki settings"
+msgstr ""
+
+#: extensions/base/managewiki.py:44
+#, python-brace-format
+msgid "[{author}]({author_url}) changed wiki settings{reason}"
+msgstr ""
+
+#: extensions/base/managewiki.py:55
+#, python-brace-format
+msgid "Deleted a \"{wiki}\" wiki"
+msgstr ""
+
+#: extensions/base/managewiki.py:55 extensions/base/managewiki.py:67
+#: extensions/base/managewiki.py:103 extensions/base/managewiki.py:112
+#: extensions/base/managewiki.py:125 extensions/base/managewiki.py:126
+#: extensions/base/managewiki.py:135 extensions/base/managewiki.py:136
+#: extensions/base/managewiki.py:148 extensions/base/managewiki.py:149
+#: extensions/base/managewiki.py:160 extensions/base/managewiki.py:161
+#: extensions/base/managewiki.py:195 extensions/base/managewiki.py:204
+#: extensions/base/managewiki.py:217 extensions/base/managewiki.py:226
+#: extensions/base/abusefilter.py:55 extensions/base/abusefilter.py:56
+#: extensions/base/abusefilter.py:57 extensions/base/abusefilter.py:68
+#: extensions/base/abusefilter.py:69 extensions/base/abusefilter.py:70
+#: extensions/base/mediawiki.py:744
+msgid "Unknown"
+msgstr ""
+
+#: extensions/base/managewiki.py:63
+#, python-brace-format
+msgid "[{author}]({author_url}) deleted a wiki *{wiki_name}*{comment}"
+msgstr ""
+
+#: extensions/base/managewiki.py:80
+#, python-brace-format
+msgid "Deleted a \"{group}\" user group"
+msgstr ""
+
+#: extensions/base/managewiki.py:89
+#, python-brace-format
+msgid "[{author}]({author_url}) deleted a usergroup *{group}*{comment}"
+msgstr ""
+
+#: extensions/base/managewiki.py:103
+#, python-brace-format
+msgid "Locked a \"{wiki}\" wiki"
+msgstr ""
+
+#: extensions/base/managewiki.py:111
+#, python-brace-format
+msgid "[{author}]({author_url}) locked a wiki *{wiki_name}*{comment}"
+msgstr ""
+
+#: extensions/base/managewiki.py:124
+#, python-brace-format
+msgid "Modified \"{namespace_name}\" namespace"
+msgstr ""
+
+#: extensions/base/managewiki.py:126 extensions/base/managewiki.py:149
+msgid "Wiki"
+msgstr ""
+
+#: extensions/base/managewiki.py:134
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) modified namespace *{namespace_name}* on "
+"*{wiki_name}*{comment}"
+msgstr ""
+
+#: extensions/base/managewiki.py:147
+#, python-brace-format
+msgid "Deleted a \"{namespace_name}\" namespace"
+msgstr ""
+
+#: extensions/base/managewiki.py:158
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) deleted a namespace *{namespace_name}* on "
+"*{wiki_name}*{comment}"
+msgstr ""
+
+#: extensions/base/managewiki.py:173
+#, python-brace-format
+msgid "Modified \"{usergroup_name}\" usergroup"
+msgstr ""
+
+#: extensions/base/managewiki.py:182
+#, python-brace-format
+msgid "[{author}]({author_url}) modified user group *{group_name}*{comment}"
+msgstr ""
+
+#: extensions/base/managewiki.py:195
+#, python-brace-format
+msgid "Undeleted a \"{wiki}\" wiki"
+msgstr ""
+
+#: extensions/base/managewiki.py:203
+#, python-brace-format
+msgid "[{author}]({author_url}) undeleted a wiki *{wiki_name}*{comment}"
+msgstr ""
+
+#: extensions/base/managewiki.py:217
+#, python-brace-format
+msgid "Unlocked a \"{wiki}\" wiki"
+msgstr ""
+
+#: extensions/base/managewiki.py:225
+#, python-brace-format
+msgid "[{author}]({author_url}) unlocked a wiki *{wiki_name}*{comment}"
+msgstr ""
+
+#: extensions/base/datadump.py:36
+#, python-brace-format
+msgid "Generated {file} dump"
+msgstr ""
+
+#: extensions/base/datadump.py:45
+#, python-brace-format
+msgid "[{author}]({author_url}) generated *{file}* dump{comment}"
+msgstr ""
+
+#: extensions/base/datadump.py:58
+#, python-brace-format
+msgid "Deleted {file} dump"
+msgstr ""
+
+#: extensions/base/datadump.py:67
+#, python-brace-format
+msgid "[{author}]({author_url}) deleted *{file}* dump{comment}"
+msgstr ""
+
+#: extensions/base/curseprofile.py:40
+#, python-brace-format
+msgid "Edited {target}'s profile"
+msgstr ""
+
+#: extensions/base/curseprofile.py:42
+msgid "Edited their own profile"
+msgstr ""
+
+#: extensions/base/curseprofile.py:44
+#, python-brace-format
+msgid "Cleared the {field} field"
+msgstr ""
+
+#: extensions/base/curseprofile.py:46
+#, python-brace-format
+msgid "{field} field changed to: {desc}"
+msgstr ""
+
+#: extensions/base/curseprofile.py:58
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) cleared the {field} on [{target}]({target_url})'s "
+"profile."
+msgstr ""
+
+#: extensions/base/curseprofile.py:60
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) edited the {field} on [{target}]({target_url})'s "
+"profile. *({desc})*"
+msgstr ""
+
+#: extensions/base/curseprofile.py:65
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) cleared the {field} on [their own]({target_url}) "
+"profile."
+msgstr ""
+
+#: extensions/base/curseprofile.py:67
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) edited the {field} on [their own]({target_url}) "
+"profile. *({desc})*"
+msgstr ""
+
+#: extensions/base/curseprofile.py:82
+#, python-brace-format
+msgid "Left a comment on {target}'s profile"
+msgstr ""
+
+#: extensions/base/curseprofile.py:84
+msgid "Left a comment on their own profile"
+msgstr ""
+
+#: extensions/base/curseprofile.py:97
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) left a [comment]({comment}) on {target}'s profile."
+msgstr ""
+
+#: extensions/base/curseprofile.py:100
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) left a [comment]({comment}) on their own profile."
+msgstr ""
+
+#: extensions/base/curseprofile.py:113
+#, python-brace-format
+msgid "Edited a comment on {target}'s profile"
+msgstr ""
+
+#: extensions/base/curseprofile.py:115
+msgid "Edited a comment on their own profile"
+msgstr ""
+
+#: extensions/base/curseprofile.py:128
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) edited a [comment]({comment}) on {target}'s profile."
+msgstr ""
+
+#: extensions/base/curseprofile.py:131
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) edited a [comment]({comment}) on their own profile."
+msgstr ""
+
+#: extensions/base/curseprofile.py:144
+#, python-brace-format
+msgid "Replied to a comment on {target}'s profile"
+msgstr ""
+
+#: extensions/base/curseprofile.py:146
+msgid "Replied to a comment on their own profile"
+msgstr ""
+
+#: extensions/base/curseprofile.py:159
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) replied to a [comment]({comment}) on {target}'s "
+"profile."
+msgstr ""
+
+#: extensions/base/curseprofile.py:162
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) replied to a [comment]({comment}) on their own "
+"profile."
+msgstr ""
+
+#: extensions/base/curseprofile.py:175
+#, python-brace-format
+msgid "Deleted a comment on {target}'s profile"
+msgstr ""
+
+#: extensions/base/curseprofile.py:177
+msgid "Deleted a comment on their own profile"
+msgstr ""
+
+#: extensions/base/curseprofile.py:197
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) deleted a [comment]({comment}) on {target}'s "
+"profile.{reason}"
+msgstr ""
+
+#: extensions/base/curseprofile.py:200
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) deleted a [comment]({comment}) on their own profile."
+"{reason}"
+msgstr ""
+
+#: extensions/base/curseprofile.py:214
+#, python-brace-format
+msgid "Purged a comment on {target}'s profile"
+msgstr ""
+
+#: extensions/base/curseprofile.py:216
+msgid "Purged a comment on their own profile"
+msgstr ""
+
+#: extensions/base/curseprofile.py:230
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) purged a comment on [{target}]({link})'s profile."
+"{reason}"
+msgstr ""
+
+#: extensions/base/curseprofile.py:233
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) purged a comment on [their own]({link}) profile."
+"{reason}"
+msgstr ""
+
+#: extensions/base/renameuser.py:38
+#, python-brace-format
+msgid "Renamed user \"{old_name}\" with {edits} edit to \"{new_name}\""
+msgid_plural "Renamed user \"{old_name}\" with {edits} edits to \"{new_name}\""
+msgstr[0] ""
+
+#: extensions/base/renameuser.py:43
+#, python-brace-format
+msgid "Renamed user \"{old_name}\" to \"{new_name}\""
+msgstr ""
+
+#: extensions/base/renameuser.py:58
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) renamed user *{old_name}* with {edits} edit to "
+"[{new_name}]({link}){comment}"
+msgid_plural ""
+"[{author}]({author_url}) renamed user *{old_name}* with {edits} edits to "
+"[{new_name}]({link}){comment}"
+msgstr[0] ""
+
+#: extensions/base/renameuser.py:66
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) renamed user *{old_name}* to [{new_name}]({link})"
+"{comment}"
+msgstr ""
+
+#: extensions/base/interwiki.py:37
+msgid "Added an entry to the interwiki table"
+msgstr ""
+
+#: extensions/base/interwiki.py:38 extensions/base/interwiki.py:65
+#, python-brace-format
+msgid "Prefix: {prefix}, website: {website} | {desc}"
+msgstr ""
+
+#: extensions/base/interwiki.py:50
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) added an entry to the [interwiki table]"
+"({table_url}) pointing to {website} with {prefix} prefix"
+msgstr ""
+
+#: extensions/base/interwiki.py:64
+msgid "Edited an entry in interwiki table"
+msgstr ""
+
+#: extensions/base/interwiki.py:77
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) edited an entry in [interwiki table]({table_url}) "
+"pointing to {website} with {prefix} prefix"
+msgstr ""
+
+#: extensions/base/interwiki.py:91
+msgid "Deleted an entry in interwiki table"
+msgstr ""
+
+#: extensions/base/interwiki.py:92
+#, python-brace-format
+msgid "Prefix: {prefix} | {desc}"
+msgstr ""
+
+#: extensions/base/interwiki.py:102
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) deleted an entry in [interwiki table]({table_url})"
+"{desc}"
+msgstr ""
+
+#: extensions/base/abusefilter.py:29
+msgid "None"
+msgstr ""
+
+#: extensions/base/abusefilter.py:29
+msgid "Warning issued"
+msgstr ""
+
+#: extensions/base/abusefilter.py:29
+msgid "**Blocked user**"
+msgstr ""
+
+#: extensions/base/abusefilter.py:29
+msgid "Tagged the edit"
+msgstr ""
+
+#: extensions/base/abusefilter.py:29
+msgid "Disallowed the action"
+msgstr ""
+
+#: extensions/base/abusefilter.py:29
+msgid "**IP range blocked**"
+msgstr ""
+
+#: extensions/base/abusefilter.py:29
+msgid "Throttled actions"
+msgstr ""
+
+#: extensions/base/abusefilter.py:29
+msgid "Removed autoconfirmed group"
+msgstr ""
+
+#: extensions/base/abusefilter.py:29
+msgid "**Removed from privileged groups**"
+msgstr ""
+
+#: extensions/base/abusefilter.py:30
+msgid "Edit"
+msgstr ""
+
+#: extensions/base/abusefilter.py:30
+msgid "Upload"
+msgstr ""
+
+#: extensions/base/abusefilter.py:30
+msgid "Move"
+msgstr ""
+
+#: extensions/base/abusefilter.py:30
+msgid "Stash upload"
+msgstr ""
+
+#: extensions/base/abusefilter.py:30
+msgid "Deletion"
+msgstr ""
+
+#: extensions/base/abusefilter.py:30
+msgid "Account creation"
+msgstr ""
+
+#: extensions/base/abusefilter.py:30
+msgid "Auto account creation"
+msgstr ""
+
+#: extensions/base/abusefilter.py:54
+#, python-brace-format
+msgid "{user} triggered \"{abuse_filter}\""
+msgstr ""
+
+#: extensions/base/abusefilter.py:55
+msgid "Performed"
+msgstr ""
+
+#: extensions/base/abusefilter.py:56
+msgid "Action taken"
+msgstr ""
+
+#: extensions/base/abusefilter.py:57
+msgid "Title"
+msgstr ""
+
+#: extensions/base/abusefilter.py:66
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) triggered *{abuse_filter}*, performing the action "
+"\"{action}\" on *[{target}]({target_url})* - action taken: {result}."
+msgstr ""
+
+#: extensions/base/abusefilter.py:83
+#, python-brace-format
+msgid "Edited abuse filter number {number}"
+msgstr ""
+
+#: extensions/base/abusefilter.py:95
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) edited abuse filter [number {number}]({filter_url})"
+msgstr ""
+
+#: extensions/base/abusefilter.py:111
+#, python-brace-format
+msgid "Created abuse filter number {number}"
+msgstr ""
+
+#: extensions/base/abusefilter.py:119
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) created abuse filter [number {number}]({filter_url})"
+msgstr ""
+
+#: extensions/base/mediawiki.py:37
+msgid "director"
+msgstr ""
+
+#: extensions/base/mediawiki.py:37
+msgid "bot"
+msgstr ""
+
+#: extensions/base/mediawiki.py:37
+msgid "editor"
+msgstr ""
+
+#: extensions/base/mediawiki.py:37
+msgid "directors"
+msgstr ""
+
+#: extensions/base/mediawiki.py:37
+msgid "sysop"
+msgstr ""
+
+#: extensions/base/mediawiki.py:37
+msgid "bureaucrat"
+msgstr ""
+
+#: extensions/base/mediawiki.py:37
+msgid "reviewer"
+msgstr ""
+
+#: extensions/base/mediawiki.py:38
+msgid "autoreview"
+msgstr ""
+
+#: extensions/base/mediawiki.py:38
+msgid "autopatrol"
+msgstr ""
+
+#: extensions/base/mediawiki.py:38
+msgid "wiki_guardian"
+msgstr ""
+
+#: extensions/base/mediawiki.py:71
+msgid "(N!) "
+msgstr ""
+
+#: extensions/base/mediawiki.py:72
+msgid "m"
+msgstr ""
+
+#: extensions/base/mediawiki.py:73
+msgid "b"
+msgstr ""
+
+#: extensions/base/mediawiki.py:112
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) edited [{article}]({edit_link}){comment} {bold}"
+"({sign}{edit_size}){bold}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:117
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) created [{article}]({edit_link}){comment} {bold}"
+"({sign}{edit_size}){bold}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:190 extensions/base/mediawiki.py:223
+msgid "Options"
+msgstr ""
+
+#: extensions/base/mediawiki.py:190
+#, python-brace-format
+msgid "([preview]({link}) | [undo]({undolink}))"
+msgstr ""
+
+#: extensions/base/mediawiki.py:195
+#, python-brace-format
+msgid "Uploaded a new version of {name}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:197
+#, python-brace-format
+msgid "Reverted a version of {name}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:199
+#, python-brace-format
+msgid "Uploaded {name}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:208
+msgid "**No license!**"
+msgstr ""
+
+#: extensions/base/mediawiki.py:223
+#, python-brace-format
+msgid "([preview]({link}))"
+msgstr ""
+
+#: extensions/base/mediawiki.py:228
+msgid ""
+"\n"
+"License: {}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:237
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) reverted a version of [{file}]({file_link}){comment}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:248
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) uploaded a new version of [{file}]({file_link})"
+"{comment}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:259
+#, python-brace-format
+msgid "[{author}]({author_url}) uploaded [{file}]({file_link}){comment}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:274
+#, python-brace-format
+msgid "Deleted page {article}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:283
+#, python-brace-format
+msgid "[{author}]({author_url}) deleted [{page}]({page_link}){comment}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:298
+#, python-brace-format
+msgid "Deleted redirect {article} by overwriting"
+msgstr ""
+
+#: extensions/base/mediawiki.py:308
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) deleted redirect by overwriting [{page}]"
+"({page_link}){comment}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:322
+#, python-brace-format
+msgid "Restored {article}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:331
+#, python-brace-format
+msgid "[{author}]({author_url}) restored [{article}]({article_url}){comment}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:348
+msgid "Changed visibility of log events"
+msgstr ""
+
+#: extensions/base/mediawiki.py:356
+#, python-brace-format
+msgid "[{author}]({author_url}) changed visibility of log events{comment}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:370
+#, python-brace-format
+msgid "Changed visibility of revision on page {article} "
+msgid_plural "Changed visibility of {amount} revisions on page {article} "
+msgstr[0] ""
+
+#: extensions/base/mediawiki.py:383
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) changed visibility of revision on page [{article}]"
+"({article_url}){comment}"
+msgid_plural ""
+"[{author}]({author_url}) changed visibility of {amount} revisions on page "
+"[{article}]({article_url}){comment}"
+msgstr[0] ""
+
+#: extensions/base/mediawiki.py:399 extensions/base/mediawiki.py:432
+msgid "No redirect has been made"
+msgstr ""
+
+#: extensions/base/mediawiki.py:400 extensions/base/mediawiki.py:433
+msgid "A redirect has been made"
+msgstr ""
+
+#: extensions/base/mediawiki.py:401
+#, python-brace-format
+msgid "Moved {redirect}{article} to {target}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:412 extensions/base/mediawiki.py:444
+msgid "without making a redirect"
+msgstr ""
+
+#: extensions/base/mediawiki.py:413 extensions/base/mediawiki.py:445
+msgid "with a redirect"
+msgstr ""
+
+#: extensions/base/mediawiki.py:416
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) moved {redirect}*{article}* to [{target}]"
+"({target_url}) {made_a_redirect}{comment}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:434
+#, python-brace-format
+msgid "Moved {redirect}{article} to {title} over redirect"
+msgstr ""
+
+#: extensions/base/mediawiki.py:448
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) moved {redirect}*{article}* over redirect to "
+"[{target}]({target_url}) {made_a_redirect}{comment}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:464
+#, python-brace-format
+msgid "Moved protection settings from {redirect}{article} to {title}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:477
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) moved protection settings from {redirect}*{article}"
+"* to [{target}]({target_url}){comment}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:492
+#, python-brace-format
+msgid "Protected {target}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:495 extensions/base/mediawiki.py:510
+#: extensions/base/mediawiki.py:526 extensions/base/mediawiki.py:541
+msgid " [cascading]"
+msgstr ""
+
+#: extensions/base/mediawiki.py:506
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) protected [{article}]({article_url}) with the "
+"following settings: {settings}{comment}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:523
+#, python-brace-format
+msgid "Changed protection level for {article}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:537
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) modified protection settings of [{article}]"
+"({article_url}) to: {settings}{comment}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:554
+#, python-brace-format
+msgid "Removed protection from {article}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:563
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) removed protection from [{article}]({article_url})"
+"{comment}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:572
+msgid "for infinity and beyond"
+msgstr ""
+
+#: extensions/base/mediawiki.py:582
+msgid "for less than a minute"
+msgstr ""
+
+#: extensions/base/mediawiki.py:584
+msgid "year"
+msgid_plural "years"
+msgstr[0] ""
+
+#: extensions/base/mediawiki.py:584
+msgid "day"
+msgid_plural "days"
+msgstr[0] ""
+
+#: extensions/base/mediawiki.py:584
+msgid "hour"
+msgid_plural "hours"
+msgstr[0] ""
+
+#: extensions/base/mediawiki.py:585
+msgid "minute"
+msgid_plural "minutes"
+msgstr[0] ""
+
+#: extensions/base/mediawiki.py:590
+#, python-brace-format
+msgid "for {time_number} {time_unit}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:609
+msgid "Blocked from editing the following pages: "
+msgstr ""
+
+#: extensions/base/mediawiki.py:616 extensions/base/mediawiki.py:662
+msgid " and namespaces: "
+msgstr ""
+
+#: extensions/base/mediawiki.py:618
+msgid "Blocked from editing pages on following namespaces: "
+msgstr ""
+
+#: extensions/base/mediawiki.py:629
+msgid "Partial block details"
+msgstr ""
+
+#: extensions/base/mediawiki.py:632
+msgid "Block flags"
+msgstr ""
+
+#: extensions/base/mediawiki.py:634
+#, python-brace-format
+msgid "Blocked {blocked_user} {time}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:654
+msgid " on pages: "
+msgstr ""
+
+#: extensions/base/mediawiki.py:664
+msgid " on namespaces: "
+msgstr ""
+
+#: extensions/base/mediawiki.py:676
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) blocked [{user}]({user_url}) {time}"
+"{restriction_desc}{comment}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:694
+#, python-brace-format
+msgid "Changed block settings for {blocked_user}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:704
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) changed block settings for [{blocked_user}]"
+"({user_url}){comment}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:717
+#, python-brace-format
+msgid "Unblocked {blocked_user}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:727
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) unblocked [{blocked_user}]({user_url}){comment}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:743
+msgid "Action has been hidden by administration"
+msgstr ""
+
+#: extensions/base/mediawiki.py:750
+msgid "An action has been hidden by administration."
+msgstr ""
+
+#: extensions/base/mediawiki.py:761
+#, python-brace-format
+msgid "Imported {article} with {count} revision"
+msgid_plural "Imported {article} with {count} revisions"
+msgstr[0] ""
+
+#: extensions/base/mediawiki.py:772
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) imported [{article}]({article_url}) with {count} "
+"revision{comment}"
+msgid_plural ""
+"[{author}]({author_url}) imported [{article}]({article_url}) with {count} "
+"revisions{comment}"
+msgstr[0] ""
+
+#: extensions/base/mediawiki.py:788
+#, python-brace-format
+msgid "Imported {article} with {count} revision from \"{source}\""
+msgid_plural "Imported {article} with {count} revisions from \"{source}\""
+msgstr[0] ""
+
+#: extensions/base/mediawiki.py:803
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) imported [{article}]({article_url}) with {count} "
+"revision from [{source}]({source_url}){comment}"
+msgid_plural ""
+"[{author}]({author_url}) imported [{article}]({article_url}) with {count} "
+"revisions from [{source}]({source_url}){comment}"
+msgstr[0] ""
+
+#: extensions/base/mediawiki.py:818
+#, python-brace-format
+msgid " (until {date_and_time})"
+msgstr ""
+
+#: extensions/base/mediawiki.py:835
+#, python-brace-format
+msgid "Changed group membership for {target}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:837
+msgid "System"
+msgstr ""
+
+#: extensions/base/mediawiki.py:838
+#, python-brace-format
+msgid "{target} got autopromoted to a new usergroup"
+msgstr ""
+
+#: extensions/base/mediawiki.py:844
+msgid "Added group"
+msgid_plural "Added groups"
+msgstr[0] ""
+
+#: extensions/base/mediawiki.py:846
+msgid "Removed group"
+msgid_plural "Removed groups"
+msgstr[0] ""
+
+#: extensions/base/mediawiki.py:860
+#, python-brace-format
+msgid "Added to {added} and removed from {removed}."
+msgstr ""
+
+#: extensions/base/mediawiki.py:861 extensions/base/mediawiki.py:863
+#: extensions/base/mediawiki.py:865 extensions/base/mediawiki.py:872
+msgid ", "
+msgstr ""
+
+#: extensions/base/mediawiki.py:863
+#, python-brace-format
+msgid "Added to {added}."
+msgstr ""
+
+#: extensions/base/mediawiki.py:865
+#, python-brace-format
+msgid "Removed from {removed}."
+msgstr ""
+
+#: extensions/base/mediawiki.py:866
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) changed group membership for [{target}]"
+"({target_url}): {group_changes}{comment}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:870
+#, python-brace-format
+msgid "The system autopromoted [{target}]({target_url}) to {added}.{comment}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:883
+#, python-brace-format
+msgid "Merged revision histories of {article} into {dest}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:897
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) merged revision histories of [{article}]"
+"({article_url}) into [{dest}]({dest_url}){comment}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:911
+msgid "Created account automatically"
+msgstr ""
+
+#: extensions/base/mediawiki.py:918
+#, python-brace-format
+msgid "Account [{author}]({author_url}) was created automatically"
+msgstr ""
+
+#: extensions/base/mediawiki.py:931 extensions/base/mediawiki.py:996
+msgid "Created account"
+msgstr ""
+
+#: extensions/base/mediawiki.py:938 extensions/base/mediawiki.py:1003
+#, python-brace-format
+msgid "Account [{author}]({author_url}) was created"
+msgstr ""
+
+#: extensions/base/mediawiki.py:950
+#, python-brace-format
+msgid "Created account {article}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:959
+#, python-brace-format
+msgid ""
+"Account [{article}]({article_url}) was created by [{author}]({author_url})"
+"{comment}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:972
+#, python-brace-format
+msgid "Created account {article} and password was sent by email"
+msgstr ""
+
+#: extensions/base/mediawiki.py:983
+#, python-brace-format
+msgid ""
+"Account [{article}]({article_url}) was created by [{author}]({author_url}) "
+"and password was sent by email{comment}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:1015
+#, python-brace-format
+msgid "Changed the content model of the page {article}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:1017
+#, python-brace-format
+msgid "Model changed from {old} to {new}: {reason}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:1029
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) changed the content model of the page [{article}]"
+"({article_url}) from {old} to {new}{comment}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:1044
+#, python-brace-format
+msgid "Created the page {article} using a non-default content model"
+msgstr ""
+
+#: extensions/base/mediawiki.py:1046
+#, python-brace-format
+msgid "Created with model {new}: {reason}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:1057
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) created the page [{article}]({article_url}) using a "
+"non-default content model {new}{comment}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:1072
+#, python-brace-format
+msgid "Created the tag \"{tag}\""
+msgstr ""
+
+#: extensions/base/mediawiki.py:1082
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) created the [tag]({tag_url}) \"{tag}\"{comment}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:1103
+#, python-brace-format
+msgid "Deleted the tag \"{tag}\""
+msgstr ""
+
+#: extensions/base/mediawiki.py:1105
+msgid "Removed from"
+msgstr ""
+
+#: extensions/base/mediawiki.py:1105
+msgid "{} revision or log entry"
+msgid_plural "{} revisions and/or log entries"
+msgstr[0] ""
+
+#: extensions/base/mediawiki.py:1118
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) deleted the [tag]({tag_url}) \"{tag}\"{comment}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:1128
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) deleted the [tag]({tag_url}) \"{tag}\" and removed "
+"it from {count} revision or log entry{comment}"
+msgid_plural ""
+"[{author}]({author_url}) deleted the [tag]({tag_url}) \"{tag}\" and removed "
+"it from {count} revisions and/or log entries{comment}"
+msgstr[0] ""
+
+#: extensions/base/mediawiki.py:1145
+#, python-brace-format
+msgid "Activated the tag \"{tag}\""
+msgstr ""
+
+#: extensions/base/mediawiki.py:1154
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) activated the [tag]({tag_url}) \"{tag}\"{comment}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:1173
+#, python-brace-format
+msgid "Deactivated the tag \"{tag}\""
+msgstr ""
+
+#: extensions/base/mediawiki.py:1182
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) deactivated the [tag]({tag_url}) \"{tag}\"{comment}"
+msgstr ""
+
+#: extensions/base/sprite.py:37
+#, python-brace-format
+msgid "Edited the sprite for {article}"
+msgstr ""
+
+#: extensions/base/sprite.py:45
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) edited the sprite for [{article}]({article_url})"
+msgstr ""
+
+#: extensions/base/sprite.py:60
+#, python-brace-format
+msgid "Created the sprite sheet for {article}"
+msgstr ""
+
+#: extensions/base/sprite.py:68
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) created the sprite sheet for [{article}]"
+"({article_url})"
+msgstr ""
+
+#: extensions/base/sprite.py:79
+#, python-brace-format
+msgid "Edited the slice for {article}"
+msgstr ""
+
+#: extensions/base/sprite.py:86
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) edited the slice for [{article}]({article_url})"
+msgstr ""
diff --git a/locale/ja/LC_MESSAGES/misc.mo b/locale/ja/LC_MESSAGES/misc.mo
new file mode 100644
index 0000000..2ed8107
Binary files /dev/null and b/locale/ja/LC_MESSAGES/misc.mo differ
diff --git a/locale/ja/LC_MESSAGES/misc.po b/locale/ja/LC_MESSAGES/misc.po
index 2865824..4428443 100644
--- a/locale/ja/LC_MESSAGES/misc.po
+++ b/locale/ja/LC_MESSAGES/misc.po
@@ -8,76 +8,81 @@ msgstr ""
"Project-Id-Version: RcGcDw\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2020-11-30 11:58+0100\n"
-"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
-"Last-Translator: Automatically generated\n"
-"Language-Team: none\n"
+"PO-Revision-Date: 2021-07-11 12:33+0000\n"
+"Last-Translator: しぃ \n"
+"Language-Team: Japanese \n"
"Language: ja\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+"X-Generator: Weblate 4.6.2\n"
#: src/misc.py:45
msgid "Location"
-msgstr ""
+msgstr "ロケーション"
#: src/misc.py:45
msgid "About me"
-msgstr ""
+msgstr "私について"
#: src/misc.py:45
msgid "Google link"
-msgstr ""
+msgstr "Googleのリンク"
#: src/misc.py:45
msgid "Facebook link"
-msgstr ""
+msgstr "Facebookのリンク"
#: src/misc.py:45
msgid "Twitter link"
-msgstr ""
+msgstr "Twitterのリンク"
#: src/misc.py:45
msgid "Reddit link"
-msgstr ""
+msgstr "Redditのリンク"
#: src/misc.py:45
msgid "Twitch link"
-msgstr ""
+msgstr "Twitchのリンク"
#: src/misc.py:45
msgid "PSN link"
-msgstr ""
+msgstr "PSNのリンク"
#: src/misc.py:45
msgid "VK link"
-msgstr ""
+msgstr "VKのリンク"
#: src/misc.py:45
msgid "XBL link"
-msgstr ""
+msgstr "XBLのリンク"
#: src/misc.py:45
msgid "Steam link"
-msgstr ""
+msgstr "Steamのリンク"
#: src/misc.py:45
msgid "Discord handle"
-msgstr ""
+msgstr "Discordアカウントへのリンク"
#: src/misc.py:45
msgid "Battle.net handle"
-msgstr ""
+msgstr "Battle.net アカウントへのリンク"
#: src/misc.py:119
msgid ""
"\n"
"__And more__"
msgstr ""
+"\n"
+"__その他色々__"
#: src/misc.py:276
msgid "Unknown"
-msgstr ""
+msgstr "不明"
#: src/misc.py:278
msgid "unknown"
-msgstr ""
+msgstr "不明"
diff --git a/locale/ja/LC_MESSAGES/rc_formatters.mo b/locale/ja/LC_MESSAGES/rc_formatters.mo
deleted file mode 100644
index d18faee..0000000
Binary files a/locale/ja/LC_MESSAGES/rc_formatters.mo and /dev/null differ
diff --git a/locale/ja/LC_MESSAGES/rcgcdw.mo b/locale/ja/LC_MESSAGES/rcgcdw.mo
index 1cd0c1a..b441828 100644
Binary files a/locale/ja/LC_MESSAGES/rcgcdw.mo and b/locale/ja/LC_MESSAGES/rcgcdw.mo differ
diff --git a/locale/ja/LC_MESSAGES/rcgcdw.po b/locale/ja/LC_MESSAGES/rcgcdw.po
index 85ae6f3..7fea434 100644
--- a/locale/ja/LC_MESSAGES/rcgcdw.po
+++ b/locale/ja/LC_MESSAGES/rcgcdw.po
@@ -8,14 +8,16 @@ msgstr ""
"Project-Id-Version: RcGcDw\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2020-11-30 11:58+0100\n"
-"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
-"Last-Translator: Automatically generated\n"
-"Language-Team: none\n"
+"PO-Revision-Date: 2021-07-11 12:33+0000\n"
+"Last-Translator: しぃ \n"
+"Language-Team: Japanese \n"
"Language: ja\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=1; plural=0;\n"
+"X-Generator: Weblate 4.6.2\n"
#: src/rc_formatters.py:28
msgid "None"
@@ -732,7 +734,7 @@ msgstr ""
#: src/rc_formatters.py:661 src/rc_formatters.py:948
msgid "No description provided"
-msgstr ""
+msgstr "説明はありません"
#: src/rc_formatters.py:685
msgid "(N!) "
diff --git a/locale/ja/LC_MESSAGES/redaction.mo b/locale/ja/LC_MESSAGES/redaction.mo
index b6be5e7..14af06e 100644
Binary files a/locale/ja/LC_MESSAGES/redaction.mo and b/locale/ja/LC_MESSAGES/redaction.mo differ
diff --git a/locale/ja/LC_MESSAGES/redaction.po b/locale/ja/LC_MESSAGES/redaction.po
index 86e2a11..1349576 100644
--- a/locale/ja/LC_MESSAGES/redaction.po
+++ b/locale/ja/LC_MESSAGES/redaction.po
@@ -8,15 +8,18 @@ msgstr ""
"Project-Id-Version: RcGcDw\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2020-11-30 11:58+0100\n"
-"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
-"Last-Translator: Automatically generated\n"
-"Language-Team: none\n"
+"PO-Revision-Date: 2021-07-11 12:33+0000\n"
+"Last-Translator: しぃ \n"
+"Language-Team: Japanese \n"
"Language: ja\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+"X-Generator: Weblate 4.6.2\n"
#: src/discord/redaction.py:59 src/discord/redaction.py:62
#: src/discord/redaction.py:67
msgid "Removed"
-msgstr ""
+msgstr "削除"
diff --git a/locale/ko/LC_MESSAGES/discussion_formatters.mo b/locale/ko/LC_MESSAGES/discussion_formatters.mo
deleted file mode 100644
index b044847..0000000
Binary files a/locale/ko/LC_MESSAGES/discussion_formatters.mo and /dev/null differ
diff --git a/locale/ko/LC_MESSAGES/discussion_formatters.po b/locale/ko/LC_MESSAGES/discussion_formatters.po
deleted file mode 100644
index c3099cb..0000000
--- a/locale/ko/LC_MESSAGES/discussion_formatters.po
+++ /dev/null
@@ -1,162 +0,0 @@
-# SOME DESCRIPTIVE TITLE.
-# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
-# This file is distributed under the same license as the RcGcDw package.
-# FIRST AUTHOR , YEAR.
-#
-msgid ""
-msgstr ""
-"Project-Id-Version: RcGcDw\n"
-"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2020-11-18 14:13+0100\n"
-"PO-Revision-Date: 2020-11-27 13:07+0000\n"
-"Last-Translator: Yongmin Hong \n"
-"Language-Team: Korean \n"
-"Language: ko\n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=UTF-8\n"
-"Content-Transfer-Encoding: 8bit\n"
-"Plural-Forms: nplurals=1; plural=0;\n"
-"X-Generator: Weblate 4.2.1\n"
-
-#: src/discussion_formatters.py:25 src/discussion_formatters.py:81
-msgid "Unregistered user"
-msgstr "비등록 사용자"
-
-#: src/discussion_formatters.py:34
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) created [{title}](<{url}f/p/{threadId}>) in "
-"{forumName}"
-msgstr ""
-
-#: src/discussion_formatters.py:36
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) created a poll [{title}](<{url}f/p/{threadId}>) in "
-"{forumName}"
-msgstr ""
-
-#: src/discussion_formatters.py:38
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) created a quiz [{title}](<{url}f/p/{threadId}>) in "
-"{forumName}"
-msgstr ""
-
-#: src/discussion_formatters.py:43
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) created a [reply](<{url}f/p/{threadId}/r/{postId}>) "
-"to [{title}](<{url}f/p/{threadId}>) in {forumName}"
-msgstr ""
-
-#: src/discussion_formatters.py:45 src/discussion_formatters.py:54
-#: src/discussion_formatters.py:137 src/discussion_formatters.py:150
-msgid "unknown"
-msgstr "알 수 없음"
-
-#: src/discussion_formatters.py:49
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) created [{title}](<{url}wiki/Message_Wall:"
-"{user_wall}?threadId={threadId}>) on [{user}'s Message Wall](<{url}wiki/"
-"Message_Wall:{user_wall}>)"
-msgstr ""
-
-#: src/discussion_formatters.py:51
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) created a [reply](<{url}wiki/Message_Wall:"
-"{user_wall}?threadId={threadId}#{replyId}>) to [{title}](<{url}wiki/"
-"Message_Wall:{user_wall}?threadId={threadId}>) on [{user}'s Message Wall]"
-"(<{url}wiki/Message_Wall:{user_wall}>)"
-msgstr ""
-
-#: src/discussion_formatters.py:57
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) created a [comment](<{url}?commentId={commentId}>) "
-"on [{article}](<{url}>)"
-msgstr ""
-
-#: src/discussion_formatters.py:62
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) created a [reply](<{url}?commentId={commentId}"
-"&replyId={replyId}>) to a [comment](<{url}?commentId={commentId}>) on "
-"[{article}](<{url}>)"
-msgstr ""
-
-#: src/discussion_formatters.py:70
-#, python-brace-format
-msgid ""
-"Unknown event `{event}` by [{author}]({author_url}), report it on the "
-"[support server](<{support}>)."
-msgstr ""
-
-#: src/discussion_formatters.py:98
-#, python-brace-format
-msgid "Created \"{title}\""
-msgstr ""
-
-#: src/discussion_formatters.py:102
-#, python-brace-format
-msgid "Created a poll \"{title}\""
-msgstr ""
-
-#: src/discussion_formatters.py:109
-msgid "Option {}"
-msgstr ""
-
-#: src/discussion_formatters.py:110
-#, python-brace-format
-msgid "__[View image]({image_url})__"
-msgstr ""
-
-#: src/discussion_formatters.py:114
-#, python-brace-format
-msgid "Created a quiz \"{title}\""
-msgstr ""
-
-#: src/discussion_formatters.py:129 src/discussion_formatters.py:131
-msgid "Tags"
-msgstr "태그"
-
-#: src/discussion_formatters.py:129
-msgid "{} tags"
-msgstr ""
-
-#: src/discussion_formatters.py:134
-#, python-brace-format
-msgid "Replied to \"{title}\""
-msgstr ""
-
-#: src/discussion_formatters.py:143
-#, python-brace-format
-msgid "Created \"{title}\" on {user}'s Message Wall"
-msgstr ""
-
-#: src/discussion_formatters.py:147
-#, python-brace-format
-msgid "Replied to \"{title}\" on {user}'s Message Wall"
-msgstr ""
-
-#: src/discussion_formatters.py:154
-#, python-brace-format
-msgid "Commented on {article}"
-msgstr ""
-
-#: src/discussion_formatters.py:158
-#, python-brace-format
-msgid "Replied to a comment on {article}"
-msgstr ""
-
-#: src/discussion_formatters.py:162
-#, python-brace-format
-msgid "Unknown event `{event}`"
-msgstr ""
-
-#: src/discussion_formatters.py:168 src/discussion_formatters.py:170
-msgid "Report this on the support server"
-msgstr ""
diff --git a/locale/ko/LC_MESSAGES/formatters.mo b/locale/ko/LC_MESSAGES/formatters.mo
new file mode 100644
index 0000000..13c1866
Binary files /dev/null and b/locale/ko/LC_MESSAGES/formatters.mo differ
diff --git a/locale/ja/LC_MESSAGES/rc_formatters.po b/locale/ko/LC_MESSAGES/formatters.po
similarity index 53%
rename from locale/ja/LC_MESSAGES/rc_formatters.po
rename to locale/ko/LC_MESSAGES/formatters.po
index 85ae6f3..7d396bd 100644
--- a/locale/ja/LC_MESSAGES/rc_formatters.po
+++ b/locale/ko/LC_MESSAGES/formatters.po
@@ -7,685 +7,762 @@ msgid ""
msgstr ""
"Project-Id-Version: RcGcDw\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2020-11-30 11:58+0100\n"
+"POT-Creation-Date: 2021-05-22 18:48+0200\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: Automatically generated\n"
"Language-Team: none\n"
-"Language: ja\n"
+"Language: ko\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=1; plural=0;\n"
-#: src/rc_formatters.py:28
-msgid "None"
+#: src/api/util.py:61 src/api/util.py:66
+msgid "__Only whitespace__"
msgstr ""
-#: src/rc_formatters.py:28
-msgid "Warning issued"
+#: src/api/util.py:71
+msgid "Removed"
msgstr ""
-#: src/rc_formatters.py:28
-msgid "**Blocked user**"
+#: src/api/util.py:73
+msgid "Added"
msgstr ""
-#: src/rc_formatters.py:28
-msgid "Tagged the edit"
-msgstr ""
-
-#: src/rc_formatters.py:28
-msgid "Disallowed the action"
-msgstr ""
-
-#: src/rc_formatters.py:28
-msgid "**IP range blocked**"
-msgstr ""
-
-#: src/rc_formatters.py:28
-msgid "Throttled actions"
-msgstr ""
-
-#: src/rc_formatters.py:28
-msgid "Removed autoconfirmed group"
-msgstr ""
-
-#: src/rc_formatters.py:28
-msgid "**Removed from privileged groups**"
-msgstr ""
-
-#: src/rc_formatters.py:29
-msgid "Edit"
-msgstr ""
-
-#: src/rc_formatters.py:29
-msgid "Upload"
-msgstr ""
-
-#: src/rc_formatters.py:29
-msgid "Move"
-msgstr ""
-
-#: src/rc_formatters.py:29
-msgid "Stash upload"
-msgstr ""
-
-#: src/rc_formatters.py:29
-msgid "Deletion"
-msgstr ""
-
-#: src/rc_formatters.py:29
-msgid "Account creation"
-msgstr ""
-
-#: src/rc_formatters.py:29
-msgid "Auto account creation"
-msgstr ""
-
-#: src/rc_formatters.py:46 src/rc_formatters.py:53 src/rc_formatters.py:60
-#: src/rc_formatters.py:75 src/rc_formatters.py:96
+#: src/api/util.py:94 src/api/util.py:126 src/api/util.py:133
+#: src/api/util.py:141 extensions/base/discussions.py:247
+#: extensions/base/discussions.py:264 extensions/base/abusefilter.py:45
msgid "Unregistered user"
msgstr ""
-#: src/rc_formatters.py:83
+#: src/api/util.py:160
+msgctxt "recent changes Tags"
+msgid "Tags"
+msgstr ""
+
+#: src/api/util.py:162
+msgid "**Added**: "
+msgstr ""
+
+#: src/api/util.py:163
+msgid " and {} more\n"
+msgstr ""
+
+#: src/api/util.py:165
+msgid "**Removed**: "
+msgstr ""
+
+#: src/api/util.py:166
+msgid " and {} more"
+msgstr ""
+
+#: src/api/util.py:168
+msgid "Changed categories"
+msgstr ""
+
+#: extensions/base/cargo.py:37
#, python-brace-format
-msgid ""
-"[{author}]({author_url}) triggered *{abuse_filter}*, performing the action "
-"\"{action}\" on *[{target}]({target_url})* - action taken: {result}."
+msgid "Created the Cargo table \"{table}\""
msgstr ""
-#: src/rc_formatters.py:85 src/rc_formatters.py:86 src/rc_formatters.py:87
-#: src/rc_formatters.py:449 src/rc_formatters.py:452 src/rc_formatters.py:455
-#: src/rc_formatters.py:456 src/rc_formatters.py:461 src/rc_formatters.py:462
-#: src/rc_formatters.py:470 src/rc_formatters.py:474 src/rc_formatters.py:650
-#: src/rc_formatters.py:651 src/rc_formatters.py:652 src/rc_formatters.py:1103
-#: src/rc_formatters.py:1106 src/rc_formatters.py:1109
-#: src/rc_formatters.py:1111 src/rc_formatters.py:1114
-#: src/rc_formatters.py:1116 src/rc_formatters.py:1122
-#: src/rc_formatters.py:1125 src/rc_formatters.py:1200
-msgid "Unknown"
-msgstr ""
-
-#: src/rc_formatters.py:116
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) edited [{article}]({edit_link}){comment} {bold}"
-"({sign}{edit_size}){bold}"
-msgstr ""
-
-#: src/rc_formatters.py:118
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) created [{article}]({edit_link}){comment} {bold}"
-"({sign}{edit_size}){bold}"
-msgstr ""
-
-#: src/rc_formatters.py:121
-#, python-brace-format
-msgid "[{author}]({author_url}) uploaded [{file}]({file_link}){comment}"
-msgstr ""
-
-#: src/rc_formatters.py:128
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) reverted a version of [{file}]({file_link}){comment}"
-msgstr ""
-
-#: src/rc_formatters.py:132
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) uploaded a new version of [{file}]({file_link})"
-"{comment}"
-msgstr ""
-
-#: src/rc_formatters.py:135
-#, python-brace-format
-msgid "[{author}]({author_url}) deleted [{page}]({page_link}){comment}"
-msgstr ""
-
-#: src/rc_formatters.py:141
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) deleted redirect by overwriting [{page}]"
-"({page_link}){comment}"
-msgstr ""
-
-#: src/rc_formatters.py:147 src/rc_formatters.py:152
-msgid "without making a redirect"
-msgstr ""
-
-#: src/rc_formatters.py:147 src/rc_formatters.py:153
-msgid "with a redirect"
-msgstr ""
-
-#: src/rc_formatters.py:148
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) moved {redirect}*{article}* to [{target}]"
-"({target_url}) {made_a_redirect}{comment}"
-msgstr ""
-
-#: src/rc_formatters.py:154
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) moved {redirect}*{article}* over redirect to "
-"[{target}]({target_url}) {made_a_redirect}{comment}"
-msgstr ""
-
-#: src/rc_formatters.py:159
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) moved protection settings from {redirect}*{article}"
-"* to [{target}]({target_url}){comment}"
-msgstr ""
-
-#: src/rc_formatters.py:170 src/rc_formatters.py:823
-msgid "for infinity and beyond"
-msgstr ""
-
-#: src/rc_formatters.py:179 src/rc_formatters.py:831
-#, python-brace-format
-msgid "for {num} {translated_length}"
-msgstr ""
-
-#: src/rc_formatters.py:185 src/rc_formatters.py:835
-msgid "until {}"
-msgstr ""
-
-#: src/rc_formatters.py:189
-msgid " on pages: "
-msgstr ""
-
-#: src/rc_formatters.py:196 src/rc_formatters.py:849
-msgid " and namespaces: "
-msgstr ""
-
-#: src/rc_formatters.py:198
-msgid " on namespaces: "
-msgstr ""
-
-#: src/rc_formatters.py:210
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) blocked [{user}]({user_url}) {time}"
-"{restriction_desc}{comment}"
-msgstr ""
-
-#: src/rc_formatters.py:214
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) changed block settings for [{blocked_user}]"
-"({user_url}){comment}"
-msgstr ""
-
-#: src/rc_formatters.py:218
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) unblocked [{blocked_user}]({user_url}){comment}"
-msgstr ""
-
-#: src/rc_formatters.py:223
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) left a [comment]({comment}) on {target}'s profile"
-msgstr ""
-
-#: src/rc_formatters.py:225
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) left a [comment]({comment}) on their own profile"
-msgstr ""
-
-#: src/rc_formatters.py:231
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) replied to a [comment]({comment}) on {target}'s "
-"profile"
-msgstr ""
-
-#: src/rc_formatters.py:237
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) replied to a [comment]({comment}) on their own "
-"profile"
-msgstr ""
-
-#: src/rc_formatters.py:245
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) edited a [comment]({comment}) on {target}'s profile"
-msgstr ""
-
-#: src/rc_formatters.py:251
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) edited a [comment]({comment}) on their own profile"
-msgstr ""
-
-#: src/rc_formatters.py:257
-#, python-brace-format
-msgid "[{author}]({author_url}) purged a comment on {target}'s profile"
-msgstr ""
-
-#: src/rc_formatters.py:259
-#, python-brace-format
-msgid "[{author}]({author_url}) purged a comment on their own profile"
-msgstr ""
-
-#: src/rc_formatters.py:267
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) deleted a [comment]({comment}) on {target}'s profile"
-msgstr ""
-
-#: src/rc_formatters.py:269
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) deleted a [comment]({comment}) on their own profile"
-msgstr ""
-
-#: src/rc_formatters.py:274
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) edited the {field} on [{target}]({target_url})'s "
-"profile. *({desc})*"
-msgstr ""
-
-#: src/rc_formatters.py:281
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) edited the {field} on [their own]({target_url}) "
-"profile. *({desc})*"
-msgstr ""
-
-#: src/rc_formatters.py:296 src/rc_formatters.py:298 src/rc_formatters.py:945
-#: src/rc_formatters.py:947
-msgid "none"
-msgstr ""
-
-#: src/rc_formatters.py:301
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) changed group membership for [{target}]"
-"({target_url}) from {old_groups} to {new_groups}{comment}"
-msgstr ""
-
-#: src/rc_formatters.py:303
-#, python-brace-format
-msgid ""
-"{author} autopromoted [{target}]({target_url}) from {old_groups} to "
-"{new_groups}{comment}"
-msgstr ""
-
-#: src/rc_formatters.py:304 src/rc_formatters.py:933
-msgid "System"
-msgstr ""
-
-#: src/rc_formatters.py:309
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) protected [{article}]({article_url}) with the "
-"following settings: {settings}{comment}"
-msgstr ""
-
-#: src/rc_formatters.py:311 src/rc_formatters.py:319 src/rc_formatters.py:955
-#: src/rc_formatters.py:961
-msgid " [cascading]"
-msgstr ""
-
-#: src/rc_formatters.py:316
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) modified protection settings of [{article}]"
-"({article_url}) to: {settings}{comment}"
-msgstr ""
-
-#: src/rc_formatters.py:323
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) removed protection from [{article}]({article_url})"
-"{comment}"
-msgstr ""
-
-#: src/rc_formatters.py:327
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) changed visibility of revision on page [{article}]"
-"({article_url}){comment}"
-msgid_plural ""
-"[{author}]({author_url}) changed visibility of {amount} revisions on page "
-"[{article}]({article_url}){comment}"
-msgstr[0] ""
-
-#: src/rc_formatters.py:340
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) imported [{article}]({article_url}) with {count} "
-"revision{comment}"
-msgid_plural ""
-"[{author}]({author_url}) imported [{article}]({article_url}) with {count} "
-"revisions{comment}"
-msgstr[0] ""
-
-#: src/rc_formatters.py:345
-#, python-brace-format
-msgid "[{author}]({author_url}) restored [{article}]({article_url}){comment}"
-msgstr ""
-
-#: src/rc_formatters.py:347
-#, python-brace-format
-msgid "[{author}]({author_url}) changed visibility of log events{comment}"
-msgstr ""
-
-#: src/rc_formatters.py:359
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) imported [{article}]({article_url}) with {count} "
-"revision from [{source}]({source_url}){comment}"
-msgid_plural ""
-"[{author}]({author_url}) imported [{article}]({article_url}) with {count} "
-"revisions from [{source}]({source_url}){comment}"
-msgstr[0] ""
-
-#: src/rc_formatters.py:364
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) edited abuse filter [number {number}]({filter_url})"
-msgstr ""
-
-#: src/rc_formatters.py:368
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) created abuse filter [number {number}]({filter_url})"
-msgstr ""
-
-#: src/rc_formatters.py:372
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) merged revision histories of [{article}]"
-"({article_url}) into [{dest}]({dest_url}){comment}"
-msgstr ""
-
-#: src/rc_formatters.py:375
-#, python-brace-format
-msgid "Account [{author}]({author_url}) was created automatically"
-msgstr ""
-
-#: src/rc_formatters.py:377 src/rc_formatters.py:385
-#, python-brace-format
-msgid "Account [{author}]({author_url}) was created"
-msgstr ""
-
-#: src/rc_formatters.py:380
-#, python-brace-format
-msgid ""
-"Account [{article}]({article_url}) was created by [{author}]({author_url})"
-"{comment}"
-msgstr ""
-
-#: src/rc_formatters.py:383
-#, python-brace-format
-msgid ""
-"Account [{article}]({article_url}) was created by [{author}]({author_url}) "
-"and password was sent by email{comment}"
-msgstr ""
-
-#: src/rc_formatters.py:388
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) added an entry to the [interwiki table]"
-"({table_url}) pointing to {website} with {prefix} prefix"
-msgstr ""
-
-#: src/rc_formatters.py:394
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) edited an entry in [interwiki table]({table_url}) "
-"pointing to {website} with {prefix} prefix"
-msgstr ""
-
-#: src/rc_formatters.py:400
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) deleted an entry in [interwiki table]({table_url})"
-msgstr ""
-
-#: src/rc_formatters.py:403
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) changed the content model of the page [{article}]"
-"({article_url}) from {old} to {new}{comment}"
-msgstr ""
-
-#: src/rc_formatters.py:407
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) edited the sprite for [{article}]({article_url})"
-msgstr ""
-
-#: src/rc_formatters.py:410
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) created the sprite sheet for [{article}]"
-"({article_url})"
-msgstr ""
-
-#: src/rc_formatters.py:413
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) edited the slice for [{article}]({article_url})"
-msgstr ""
-
-#: src/rc_formatters.py:418
+#: extensions/base/cargo.py:45
#, python-brace-format
msgid "[{author}]({author_url}) created the Cargo table \"{table}\""
msgstr ""
-#: src/rc_formatters.py:420
+#: extensions/base/cargo.py:60
#, python-brace-format
-msgid "[{author}]({author_url}) deleted the Cargo table \"{table}\""
+msgid "Recreated the Cargo table \"{table}\""
msgstr ""
-#: src/rc_formatters.py:425
+#: extensions/base/cargo.py:68
#, python-brace-format
msgid "[{author}]({author_url}) recreated the Cargo table \"{table}\""
msgstr ""
-#: src/rc_formatters.py:430
+#: extensions/base/cargo.py:83
+#, python-brace-format
+msgid "Replaced the Cargo table \"{table}\""
+msgstr ""
+
+#: extensions/base/cargo.py:91
#, python-brace-format
msgid "[{author}]({author_url}) replaced the Cargo table \"{table}\""
msgstr ""
-#: src/rc_formatters.py:433
+#: extensions/base/cargo.py:105
#, python-brace-format
-msgid "[{author}]({author_url}) created a [tag]({tag_url}) \"{tag}\""
+msgid "Deleted the Cargo table \"{table}\""
msgstr ""
-#: src/rc_formatters.py:437
+#: extensions/base/cargo.py:112
#, python-brace-format
-msgid "[{author}]({author_url}) deleted a [tag]({tag_url}) \"{tag}\""
+msgid "[{author}]({author_url}) deleted the Cargo table \"{table}\""
msgstr ""
-#: src/rc_formatters.py:441
+#: extensions/base/translate.py:41
#, python-brace-format
-msgid "[{author}]({author_url}) activated a [tag]({tag_url}) \"{tag}\""
+msgid "Marked \"{article}\" for translation"
msgstr ""
-#: src/rc_formatters.py:444
-#, python-brace-format
-msgid "[{author}]({author_url}) deactivated a [tag]({tag_url}) \"{tag}\""
-msgstr ""
-
-#: src/rc_formatters.py:446
-#, python-brace-format
-msgid "[{author}]({author_url}) changed wiki settings{reason}"
-msgstr ""
-
-#: src/rc_formatters.py:448
-#, python-brace-format
-msgid "[{author}]({author_url}) deleted a wiki *{wiki_name}*{comment}"
-msgstr ""
-
-#: src/rc_formatters.py:451
-#, python-brace-format
-msgid "[{author}]({author_url}) locked a wiki *{wiki_name}*{comment}"
-msgstr ""
-
-#: src/rc_formatters.py:454
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) modified a namespace *{namespace_name}* on "
-"*{wiki_name}*{comment}"
-msgstr ""
-
-#: src/rc_formatters.py:459
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) deleted a namespace *{namespace_name}* on "
-"*{wiki_name}*{comment}"
-msgstr ""
-
-#: src/rc_formatters.py:465
-#, python-brace-format
-msgid "[{author}]({author_url}) modified user group *{group_name}*{comment}"
-msgstr ""
-
-#: src/rc_formatters.py:469
-#, python-brace-format
-msgid "[{author}]({author_url}) restored a wiki *{wiki_name}*{comment}"
-msgstr ""
-
-#: src/rc_formatters.py:473
-#, python-brace-format
-msgid "[{author}]({author_url}) unlocked a wiki *{wiki_name}*{comment}"
-msgstr ""
-
-#: src/rc_formatters.py:484
+#: extensions/base/translate.py:55
#, python-brace-format
msgid ""
"[{author}]({author_url}) marked [{article}]({article_url}) for "
"translation{comment}"
msgstr ""
-#: src/rc_formatters.py:491
+#: extensions/base/translate.py:70
+#, python-brace-format
+msgid "Removed \"{article}\" from the translation system"
+msgstr ""
+
+#: extensions/base/translate.py:80
#, python-brace-format
msgid ""
"[{author}]({author_url}) removed [{article}]({article_url}) from the "
"translation system{comment}"
msgstr ""
-#: src/rc_formatters.py:498
+#: extensions/base/translate.py:95
+#, python-brace-format
+msgid "Completed moving translation pages from \"{article}\" to \"{target}\""
+msgstr ""
+
+#: extensions/base/translate.py:106
#, python-brace-format
msgid ""
"[{author}]({author_url}) completed moving translation pages from *{article}* "
"to [{target}]({target_url}){comment}"
msgstr ""
-#: src/rc_formatters.py:506
+#: extensions/base/translate.py:121
+#, python-brace-format
+msgid "Encountered a problem while moving \"{article}\" to \"{target}\""
+msgstr ""
+
+#: extensions/base/translate.py:133
#, python-brace-format
msgid ""
"[{author}]({author_url}) encountered a problem while moving [{article}]"
"({article_url}) to [{target}]({target_url}){comment}"
msgstr ""
-#: src/rc_formatters.py:514
+#: extensions/base/translate.py:149
#, python-brace-format
msgid ""
-"[{author}]({author_url}) completed deletion of translatable page [{article}]"
-"({article_url}){comment}"
+"Failed to delete \"{article}\" which belongs to translatable page "
+"\"{target}\""
msgstr ""
-#: src/rc_formatters.py:522
+#: extensions/base/translate.py:161
#, python-brace-format
msgid ""
"[{author}]({author_url}) failed to delete [{article}]({article_url}) which "
"belongs to translatable page [{target}]({target_url}){comment}"
msgstr ""
-#: src/rc_formatters.py:530
+#: extensions/base/translate.py:177
+#, python-brace-format
+msgid "Completed deletion of translation page \"{article}\""
+msgstr ""
+
+#: extensions/base/translate.py:188
#, python-brace-format
msgid ""
"[{author}]({author_url}) completed deletion of translation page [{article}]"
"({article_url}){comment}"
msgstr ""
-#: src/rc_formatters.py:538
+#: extensions/base/translate.py:203
+#, python-brace-format
+msgid ""
+"Failed to delete \"{article}\" which belongs to translation page \"{target}\""
+msgstr ""
+
+#: extensions/base/translate.py:215
#, python-brace-format
msgid ""
"[{author}]({author_url}) failed to delete [{article}]({article_url}) which "
"belongs to translation page [{target}]({target_url}){comment}"
msgstr ""
-#: src/rc_formatters.py:546
+#: extensions/base/translate.py:231
+#, python-brace-format
+msgid "Encouraged translation of \"{article}\""
+msgstr ""
+
+#: extensions/base/translate.py:240
#, python-brace-format
msgid ""
"[{author}]({author_url}) encouraged translation of [{article}]({article_url})"
"{comment}"
msgstr ""
-#: src/rc_formatters.py:553
+#: extensions/base/translate.py:255
+#, python-brace-format
+msgid "Discouraged translation of \"{article}\""
+msgstr ""
+
+#: extensions/base/translate.py:264
#, python-brace-format
msgid ""
"[{author}]({author_url}) discouraged translation of [{article}]"
"({article_url}){comment}"
msgstr ""
-#: src/rc_formatters.py:563
+#: extensions/base/translate.py:282
+#, python-brace-format
+msgid "Limited languages for \"{article}\" to `{languages}`"
+msgstr ""
+
+#: extensions/base/translate.py:285
+#, python-brace-format
+msgid "Priority languages for \"{article}\" set to `{languages}`"
+msgstr ""
+
+#: extensions/base/translate.py:288
+#, python-brace-format
+msgid "Removed priority languages from \"{article}\""
+msgstr ""
+
+#: extensions/base/translate.py:301
#, python-brace-format
msgid ""
"[{author}]({author_url}) limited languages for [{article}]({article_url}) to "
"`{languages}`{comment}"
msgstr ""
-#: src/rc_formatters.py:569
+#: extensions/base/translate.py:308
#, python-brace-format
msgid ""
"[{author}]({author_url}) set the priority languages for [{article}]"
"({article_url}) to `{languages}`{comment}"
msgstr ""
-#: src/rc_formatters.py:575
+#: extensions/base/translate.py:315
#, python-brace-format
msgid ""
"[{author}]({author_url}) removed priority languages from [{article}]"
"({article_url}){comment}"
msgstr ""
-#: src/rc_formatters.py:582
+#: extensions/base/translate.py:331
+#, python-brace-format
+msgid "Added translatable page \"{article}\" to aggregate group \"{group}\""
+msgstr ""
+
+#: extensions/base/translate.py:342
#, python-brace-format
msgid ""
"[{author}]({author_url}) added translatable page [{article}]({article_url}) "
"to aggregate group \"{group}\"{comment}"
msgstr ""
-#: src/rc_formatters.py:589
+#: extensions/base/translate.py:357
+#, python-brace-format
+msgid ""
+"Removed translatable page \"{article}\" from aggregate group \"{group}\""
+msgstr ""
+
+#: extensions/base/translate.py:368
#, python-brace-format
msgid ""
"[{author}]({author_url}) removed translatable page [{article}]"
"({article_url}) from aggregate group \"{group}\"{comment}"
msgstr ""
-#: src/rc_formatters.py:601
+#: extensions/base/translate.py:387
+#, python-brace-format
+msgid "Reviewed translation \"{article}\""
+msgstr ""
+
+#: extensions/base/translate.py:401
#, python-brace-format
msgid ""
"[{author}]({author_url}) reviewed translation [{article}]({article_url})"
"{comment}"
msgstr ""
-#: src/rc_formatters.py:609
+#: extensions/base/translate.py:416
+#, python-brace-format
+msgid "Changed the state of `{language}` translations of \"{article}\""
+msgstr ""
+
+#: extensions/base/translate.py:419
+msgid "Old state"
+msgstr ""
+
+#: extensions/base/translate.py:420
+msgid "New state"
+msgstr ""
+
+#: extensions/base/translate.py:431
#, python-brace-format
msgid ""
"[{author}]({author_url}) changed the state of `{language}` translations of "
"[{article}]({article_url}) from `{old_state}` to `{new_state}`{comment}"
msgstr ""
-#: src/rc_formatters.py:616
+#: extensions/base/translate.py:439
#, python-brace-format
msgid ""
"[{author}]({author_url}) changed the state of `{language}` translations of "
"[{article}]({article_url}) to `{new_state}`{comment}"
msgstr ""
-#: src/rc_formatters.py:625
+#: extensions/base/translate.py:452 extensions/base/translate.py:455
+msgid "(default)"
+msgstr ""
+
+#: extensions/base/translate.py:464
+#, python-brace-format
+msgid "Changed the language of \"{article}\""
+msgstr ""
+
+#: extensions/base/translate.py:465
+msgid "Old language"
+msgstr ""
+
+#: extensions/base/translate.py:466
+msgid "New language"
+msgstr ""
+
+#: extensions/base/translate.py:477
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) changed the language of [{article}]({article_url}) "
+"from {old_lang} to {new_lang}{comment}"
+msgstr ""
+
+#: extensions/base/discussions.py:148 extensions/base/discussions.py:207
+#: extensions/base/discussions.py:245 extensions/base/discussions.py:261
+#: extensions/base/discussions.py:284 extensions/base/discussions.py:306
+#: extensions/base/discussions.py:334 extensions/base/discussions.py:354
+msgid "unknown"
+msgstr ""
+
+#: extensions/base/discussions.py:157
+#, python-brace-format
+msgid "Created \"{title}\""
+msgstr ""
+
+#: extensions/base/discussions.py:161
+#, python-brace-format
+msgid "Created a poll \"{title}\""
+msgstr ""
+
+#: extensions/base/discussions.py:168
+msgid "Option {}"
+msgstr ""
+
+#: extensions/base/discussions.py:170
+#, python-brace-format
+msgid "__[View image]({image_url})__"
+msgstr ""
+
+#: extensions/base/discussions.py:174
+#, python-brace-format
+msgid "Created a quiz \"{title}\""
+msgstr ""
+
+#: extensions/base/discussions.py:193 extensions/base/discussions.py:195
+msgctxt "Fandom discussions Tags/Forums"
+msgid "Tags"
+msgstr ""
+
+#: extensions/base/discussions.py:193
+msgctxt "Fandom discussions amount of Tags/Forums"
+msgid "{} tags"
+msgstr ""
+
+#: extensions/base/discussions.py:198
+#, python-brace-format
+msgid "Replied to \"{title}\""
+msgstr ""
+
+#: extensions/base/discussions.py:214
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) created [{title}](<{url}f/p/{threadId}>) in "
+"{forumName}"
+msgstr ""
+
+#: extensions/base/discussions.py:217
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) created a poll [{title}](<{url}f/p/{threadId}>) in "
+"{forumName}"
+msgstr ""
+
+#: extensions/base/discussions.py:220
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) created a quiz [{title}](<{url}f/p/{threadId}>) in "
+"{forumName}"
+msgstr ""
+
+#: extensions/base/discussions.py:234
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) created a [reply](<{url}f/p/{threadId}/r/{postId}>) "
+"to [{title}](<{url}f/p/{threadId}>) in {forumName}"
+msgstr ""
+
+#: extensions/base/discussions.py:292
+#, python-brace-format
+msgid "Created \"{title}\" on {user}'s Message Wall"
+msgstr ""
+
+#: extensions/base/discussions.py:298
+#, python-brace-format
+msgid "Replied to \"{title}\" on {user}'s Message Wall"
+msgstr ""
+
+#: extensions/base/discussions.py:312
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) created [{title}](<{url}wiki/Message_Wall:"
+"{user_wall}?threadId={threadId}>) on [{user}'s Message Wall](<{url}wiki/"
+"Message_Wall:{user_wall}>)"
+msgstr ""
+
+#: extensions/base/discussions.py:318
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) created a [reply](<{url}wiki/Message_Wall:"
+"{user_wall}?threadId={threadId}#{replyId}>) to [{title}](<{url}wiki/"
+"Message_Wall:{user_wall}?threadId={threadId}>) on [{user}'s Message Wall]"
+"(<{url}wiki/Message_Wall:{user_wall}>)"
+msgstr ""
+
+#: extensions/base/discussions.py:338
+#, python-brace-format
+msgid "Commented on {article}"
+msgstr ""
+
+#: extensions/base/discussions.py:344
+#, python-brace-format
+msgid "Replied to a comment on {article}"
+msgstr ""
+
+#: extensions/base/discussions.py:359
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) created a [comment](<{url}?commentId={commentId}>) "
+"on [{article}](<{url}>)"
+msgstr ""
+
+#: extensions/base/discussions.py:365
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) created a [reply](<{url}?commentId={commentId}"
+"&replyId={replyId}>) to a [comment](<{url}?commentId={commentId}>) on "
+"[{article}](<{url}>)"
+msgstr ""
+
+#: extensions/base/managewiki.py:34
+msgid "Changed wiki settings"
+msgstr ""
+
+#: extensions/base/managewiki.py:44
+#, python-brace-format
+msgid "[{author}]({author_url}) changed wiki settings{reason}"
+msgstr ""
+
+#: extensions/base/managewiki.py:55
+#, python-brace-format
+msgid "Deleted a \"{wiki}\" wiki"
+msgstr ""
+
+#: extensions/base/managewiki.py:55 extensions/base/managewiki.py:67
+#: extensions/base/managewiki.py:103 extensions/base/managewiki.py:112
+#: extensions/base/managewiki.py:125 extensions/base/managewiki.py:126
+#: extensions/base/managewiki.py:135 extensions/base/managewiki.py:136
+#: extensions/base/managewiki.py:148 extensions/base/managewiki.py:149
+#: extensions/base/managewiki.py:160 extensions/base/managewiki.py:161
+#: extensions/base/managewiki.py:195 extensions/base/managewiki.py:204
+#: extensions/base/managewiki.py:217 extensions/base/managewiki.py:226
+#: extensions/base/abusefilter.py:55 extensions/base/abusefilter.py:56
+#: extensions/base/abusefilter.py:57 extensions/base/abusefilter.py:68
+#: extensions/base/abusefilter.py:69 extensions/base/abusefilter.py:70
+#: extensions/base/mediawiki.py:744
+msgid "Unknown"
+msgstr ""
+
+#: extensions/base/managewiki.py:63
+#, python-brace-format
+msgid "[{author}]({author_url}) deleted a wiki *{wiki_name}*{comment}"
+msgstr ""
+
+#: extensions/base/managewiki.py:80
+#, python-brace-format
+msgid "Deleted a \"{group}\" user group"
+msgstr ""
+
+#: extensions/base/managewiki.py:89
+#, python-brace-format
+msgid "[{author}]({author_url}) deleted a usergroup *{group}*{comment}"
+msgstr ""
+
+#: extensions/base/managewiki.py:103
+#, python-brace-format
+msgid "Locked a \"{wiki}\" wiki"
+msgstr ""
+
+#: extensions/base/managewiki.py:111
+#, python-brace-format
+msgid "[{author}]({author_url}) locked a wiki *{wiki_name}*{comment}"
+msgstr ""
+
+#: extensions/base/managewiki.py:124
+#, python-brace-format
+msgid "Modified \"{namespace_name}\" namespace"
+msgstr ""
+
+#: extensions/base/managewiki.py:126 extensions/base/managewiki.py:149
+msgid "Wiki"
+msgstr ""
+
+#: extensions/base/managewiki.py:134
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) modified namespace *{namespace_name}* on "
+"*{wiki_name}*{comment}"
+msgstr ""
+
+#: extensions/base/managewiki.py:147
+#, python-brace-format
+msgid "Deleted a \"{namespace_name}\" namespace"
+msgstr ""
+
+#: extensions/base/managewiki.py:158
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) deleted a namespace *{namespace_name}* on "
+"*{wiki_name}*{comment}"
+msgstr ""
+
+#: extensions/base/managewiki.py:173
+#, python-brace-format
+msgid "Modified \"{usergroup_name}\" usergroup"
+msgstr ""
+
+#: extensions/base/managewiki.py:182
+#, python-brace-format
+msgid "[{author}]({author_url}) modified user group *{group_name}*{comment}"
+msgstr ""
+
+#: extensions/base/managewiki.py:195
+#, python-brace-format
+msgid "Undeleted a \"{wiki}\" wiki"
+msgstr ""
+
+#: extensions/base/managewiki.py:203
+#, python-brace-format
+msgid "[{author}]({author_url}) undeleted a wiki *{wiki_name}*{comment}"
+msgstr ""
+
+#: extensions/base/managewiki.py:217
+#, python-brace-format
+msgid "Unlocked a \"{wiki}\" wiki"
+msgstr ""
+
+#: extensions/base/managewiki.py:225
+#, python-brace-format
+msgid "[{author}]({author_url}) unlocked a wiki *{wiki_name}*{comment}"
+msgstr ""
+
+#: extensions/base/datadump.py:36
+#, python-brace-format
+msgid "Generated {file} dump"
+msgstr ""
+
+#: extensions/base/datadump.py:45
+#, python-brace-format
+msgid "[{author}]({author_url}) generated *{file}* dump{comment}"
+msgstr ""
+
+#: extensions/base/datadump.py:58
+#, python-brace-format
+msgid "Deleted {file} dump"
+msgstr ""
+
+#: extensions/base/datadump.py:67
+#, python-brace-format
+msgid "[{author}]({author_url}) deleted *{file}* dump{comment}"
+msgstr ""
+
+#: extensions/base/curseprofile.py:40
+#, python-brace-format
+msgid "Edited {target}'s profile"
+msgstr ""
+
+#: extensions/base/curseprofile.py:42
+msgid "Edited their own profile"
+msgstr ""
+
+#: extensions/base/curseprofile.py:44
+#, python-brace-format
+msgid "Cleared the {field} field"
+msgstr ""
+
+#: extensions/base/curseprofile.py:46
+#, python-brace-format
+msgid "{field} field changed to: {desc}"
+msgstr ""
+
+#: extensions/base/curseprofile.py:58
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) cleared the {field} on [{target}]({target_url})'s "
+"profile."
+msgstr ""
+
+#: extensions/base/curseprofile.py:60
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) edited the {field} on [{target}]({target_url})'s "
+"profile. *({desc})*"
+msgstr ""
+
+#: extensions/base/curseprofile.py:65
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) cleared the {field} on [their own]({target_url}) "
+"profile."
+msgstr ""
+
+#: extensions/base/curseprofile.py:67
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) edited the {field} on [their own]({target_url}) "
+"profile. *({desc})*"
+msgstr ""
+
+#: extensions/base/curseprofile.py:82
+#, python-brace-format
+msgid "Left a comment on {target}'s profile"
+msgstr ""
+
+#: extensions/base/curseprofile.py:84
+msgid "Left a comment on their own profile"
+msgstr ""
+
+#: extensions/base/curseprofile.py:97
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) left a [comment]({comment}) on {target}'s profile."
+msgstr ""
+
+#: extensions/base/curseprofile.py:100
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) left a [comment]({comment}) on their own profile."
+msgstr ""
+
+#: extensions/base/curseprofile.py:113
+#, python-brace-format
+msgid "Edited a comment on {target}'s profile"
+msgstr ""
+
+#: extensions/base/curseprofile.py:115
+msgid "Edited a comment on their own profile"
+msgstr ""
+
+#: extensions/base/curseprofile.py:128
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) edited a [comment]({comment}) on {target}'s profile."
+msgstr ""
+
+#: extensions/base/curseprofile.py:131
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) edited a [comment]({comment}) on their own profile."
+msgstr ""
+
+#: extensions/base/curseprofile.py:144
+#, python-brace-format
+msgid "Replied to a comment on {target}'s profile"
+msgstr ""
+
+#: extensions/base/curseprofile.py:146
+msgid "Replied to a comment on their own profile"
+msgstr ""
+
+#: extensions/base/curseprofile.py:159
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) replied to a [comment]({comment}) on {target}'s "
+"profile."
+msgstr ""
+
+#: extensions/base/curseprofile.py:162
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) replied to a [comment]({comment}) on their own "
+"profile."
+msgstr ""
+
+#: extensions/base/curseprofile.py:175
+#, python-brace-format
+msgid "Deleted a comment on {target}'s profile"
+msgstr ""
+
+#: extensions/base/curseprofile.py:177
+msgid "Deleted a comment on their own profile"
+msgstr ""
+
+#: extensions/base/curseprofile.py:197
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) deleted a [comment]({comment}) on {target}'s "
+"profile.{reason}"
+msgstr ""
+
+#: extensions/base/curseprofile.py:200
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) deleted a [comment]({comment}) on their own profile."
+"{reason}"
+msgstr ""
+
+#: extensions/base/curseprofile.py:214
+#, python-brace-format
+msgid "Purged a comment on {target}'s profile"
+msgstr ""
+
+#: extensions/base/curseprofile.py:216
+msgid "Purged a comment on their own profile"
+msgstr ""
+
+#: extensions/base/curseprofile.py:230
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) purged a comment on [{target}]({link})'s profile."
+"{reason}"
+msgstr ""
+
+#: extensions/base/curseprofile.py:233
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) purged a comment on [their own]({link}) profile."
+"{reason}"
+msgstr ""
+
+#: extensions/base/renameuser.py:38
+#, python-brace-format
+msgid "Renamed user \"{old_name}\" with {edits} edit to \"{new_name}\""
+msgid_plural "Renamed user \"{old_name}\" with {edits} edits to \"{new_name}\""
+msgstr[0] ""
+
+#: extensions/base/renameuser.py:43
+#, python-brace-format
+msgid "Renamed user \"{old_name}\" to \"{new_name}\""
+msgstr ""
+
+#: extensions/base/renameuser.py:58
#, python-brace-format
msgid ""
"[{author}]({author_url}) renamed user *{old_name}* with {edits} edit to "
@@ -695,597 +772,817 @@ msgid_plural ""
"[{new_name}]({link}){comment}"
msgstr[0] ""
-#: src/rc_formatters.py:630
+#: extensions/base/renameuser.py:66
#, python-brace-format
msgid ""
"[{author}]({author_url}) renamed user *{old_name}* to [{new_name}]({link})"
"{comment}"
msgstr ""
-#: src/rc_formatters.py:634
-msgid "An action has been hidden by administration."
+#: extensions/base/interwiki.py:37
+msgid "Added an entry to the interwiki table"
msgstr ""
-#: src/rc_formatters.py:641
+#: extensions/base/interwiki.py:38 extensions/base/interwiki.py:65
+#, python-brace-format
+msgid "Prefix: {prefix}, website: {website} | {desc}"
+msgstr ""
+
+#: extensions/base/interwiki.py:50
#, python-brace-format
msgid ""
-"Unknown event `{event}` by [{author}]({author_url}), report it on the "
-"[support server](<{support}>)."
+"[{author}]({author_url}) added an entry to the [interwiki table]"
+"({table_url}) pointing to {website} with {prefix} prefix"
msgstr ""
-#: src/rc_formatters.py:649
+#: extensions/base/interwiki.py:64
+msgid "Edited an entry in interwiki table"
+msgstr ""
+
+#: extensions/base/interwiki.py:77
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) edited an entry in [interwiki table]({table_url}) "
+"pointing to {website} with {prefix} prefix"
+msgstr ""
+
+#: extensions/base/interwiki.py:91
+msgid "Deleted an entry in interwiki table"
+msgstr ""
+
+#: extensions/base/interwiki.py:92
+#, python-brace-format
+msgid "Prefix: {prefix} | {desc}"
+msgstr ""
+
+#: extensions/base/interwiki.py:102
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) deleted an entry in [interwiki table]({table_url})"
+"{desc}"
+msgstr ""
+
+#: extensions/base/abusefilter.py:29
+msgid "None"
+msgstr ""
+
+#: extensions/base/abusefilter.py:29
+msgid "Warning issued"
+msgstr ""
+
+#: extensions/base/abusefilter.py:29
+msgid "**Blocked user**"
+msgstr ""
+
+#: extensions/base/abusefilter.py:29
+msgid "Tagged the edit"
+msgstr ""
+
+#: extensions/base/abusefilter.py:29
+msgid "Disallowed the action"
+msgstr ""
+
+#: extensions/base/abusefilter.py:29
+msgid "**IP range blocked**"
+msgstr ""
+
+#: extensions/base/abusefilter.py:29
+msgid "Throttled actions"
+msgstr ""
+
+#: extensions/base/abusefilter.py:29
+msgid "Removed autoconfirmed group"
+msgstr ""
+
+#: extensions/base/abusefilter.py:29
+msgid "**Removed from privileged groups**"
+msgstr ""
+
+#: extensions/base/abusefilter.py:30
+msgid "Edit"
+msgstr ""
+
+#: extensions/base/abusefilter.py:30
+msgid "Upload"
+msgstr ""
+
+#: extensions/base/abusefilter.py:30
+msgid "Move"
+msgstr ""
+
+#: extensions/base/abusefilter.py:30
+msgid "Stash upload"
+msgstr ""
+
+#: extensions/base/abusefilter.py:30
+msgid "Deletion"
+msgstr ""
+
+#: extensions/base/abusefilter.py:30
+msgid "Account creation"
+msgstr ""
+
+#: extensions/base/abusefilter.py:30
+msgid "Auto account creation"
+msgstr ""
+
+#: extensions/base/abusefilter.py:54
#, python-brace-format
msgid "{user} triggered \"{abuse_filter}\""
msgstr ""
-#: src/rc_formatters.py:650
+#: extensions/base/abusefilter.py:55
msgid "Performed"
msgstr ""
-#: src/rc_formatters.py:651
+#: extensions/base/abusefilter.py:56
msgid "Action taken"
msgstr ""
-#: src/rc_formatters.py:652
+#: extensions/base/abusefilter.py:57
msgid "Title"
msgstr ""
-#: src/rc_formatters.py:661 src/rc_formatters.py:948
-msgid "No description provided"
+#: extensions/base/abusefilter.py:66
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) triggered *{abuse_filter}*, performing the action "
+"\"{action}\" on *[{target}]({target_url})* - action taken: {result}."
msgstr ""
-#: src/rc_formatters.py:685
+#: extensions/base/abusefilter.py:83
+#, python-brace-format
+msgid "Edited abuse filter number {number}"
+msgstr ""
+
+#: extensions/base/abusefilter.py:95
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) edited abuse filter [number {number}]({filter_url})"
+msgstr ""
+
+#: extensions/base/abusefilter.py:111
+#, python-brace-format
+msgid "Created abuse filter number {number}"
+msgstr ""
+
+#: extensions/base/abusefilter.py:119
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) created abuse filter [number {number}]({filter_url})"
+msgstr ""
+
+#: extensions/base/mediawiki.py:37
+msgid "director"
+msgstr ""
+
+#: extensions/base/mediawiki.py:37
+msgid "bot"
+msgstr ""
+
+#: extensions/base/mediawiki.py:37
+msgid "editor"
+msgstr ""
+
+#: extensions/base/mediawiki.py:37
+msgid "directors"
+msgstr ""
+
+#: extensions/base/mediawiki.py:37
+msgid "sysop"
+msgstr ""
+
+#: extensions/base/mediawiki.py:37
+msgid "bureaucrat"
+msgstr ""
+
+#: extensions/base/mediawiki.py:37
+msgid "reviewer"
+msgstr ""
+
+#: extensions/base/mediawiki.py:38
+msgid "autoreview"
+msgstr ""
+
+#: extensions/base/mediawiki.py:38
+msgid "autopatrol"
+msgstr ""
+
+#: extensions/base/mediawiki.py:38
+msgid "wiki_guardian"
+msgstr ""
+
+#: extensions/base/mediawiki.py:71
msgid "(N!) "
msgstr ""
-#: src/rc_formatters.py:686
+#: extensions/base/mediawiki.py:72
msgid "m"
msgstr ""
-#: src/rc_formatters.py:686
+#: extensions/base/mediawiki.py:73
msgid "b"
msgstr ""
-#: src/rc_formatters.py:703 src/rc_formatters.py:708
-msgid "__Only whitespace__"
+#: extensions/base/mediawiki.py:112
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) edited [{article}]({edit_link}){comment} {bold}"
+"({sign}{edit_size}){bold}"
msgstr ""
-#: src/rc_formatters.py:713
-msgid "Removed"
+#: extensions/base/mediawiki.py:117
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) created [{article}]({edit_link}){comment} {bold}"
+"({sign}{edit_size}){bold}"
msgstr ""
-#: src/rc_formatters.py:715
-msgid "Added"
-msgstr ""
-
-#: src/rc_formatters.py:749 src/rc_formatters.py:788
+#: extensions/base/mediawiki.py:190 extensions/base/mediawiki.py:223
msgid "Options"
msgstr ""
-#: src/rc_formatters.py:749
+#: extensions/base/mediawiki.py:190
#, python-brace-format
msgid "([preview]({link}) | [undo]({undolink}))"
msgstr ""
-#: src/rc_formatters.py:754
+#: extensions/base/mediawiki.py:195
#, python-brace-format
msgid "Uploaded a new version of {name}"
msgstr ""
-#: src/rc_formatters.py:756
+#: extensions/base/mediawiki.py:197
#, python-brace-format
msgid "Reverted a version of {name}"
msgstr ""
-#: src/rc_formatters.py:758
+#: extensions/base/mediawiki.py:199
#, python-brace-format
msgid "Uploaded {name}"
msgstr ""
-#: src/rc_formatters.py:774
+#: extensions/base/mediawiki.py:208
msgid "**No license!**"
msgstr ""
-#: src/rc_formatters.py:786
+#: extensions/base/mediawiki.py:223
+#, python-brace-format
+msgid "([preview]({link}))"
+msgstr ""
+
+#: extensions/base/mediawiki.py:228
msgid ""
"\n"
"License: {}"
msgstr ""
-#: src/rc_formatters.py:788
+#: extensions/base/mediawiki.py:237
#, python-brace-format
-msgid "([preview]({link}))"
+msgid ""
+"[{author}]({author_url}) reverted a version of [{file}]({file_link}){comment}"
msgstr ""
-#: src/rc_formatters.py:793
+#: extensions/base/mediawiki.py:248
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) uploaded a new version of [{file}]({file_link})"
+"{comment}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:259
+#, python-brace-format
+msgid "[{author}]({author_url}) uploaded [{file}]({file_link}){comment}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:274
#, python-brace-format
msgid "Deleted page {article}"
msgstr ""
-#: src/rc_formatters.py:798
+#: extensions/base/mediawiki.py:283
+#, python-brace-format
+msgid "[{author}]({author_url}) deleted [{page}]({page_link}){comment}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:298
#, python-brace-format
msgid "Deleted redirect {article} by overwriting"
msgstr ""
-#: src/rc_formatters.py:804
-msgid "No redirect has been made"
-msgstr ""
-
-#: src/rc_formatters.py:805
-msgid "A redirect has been made"
-msgstr ""
-
-#: src/rc_formatters.py:806
+#: extensions/base/mediawiki.py:308
#, python-brace-format
-msgid "Moved {redirect}{article} to {target}"
+msgid ""
+"[{author}]({author_url}) deleted redirect by overwriting [{page}]"
+"({page_link}){comment}"
msgstr ""
-#: src/rc_formatters.py:809
+#: extensions/base/mediawiki.py:322
#, python-brace-format
-msgid "Moved {redirect}{article} to {title} over redirect"
+msgid "Restored {article}"
msgstr ""
-#: src/rc_formatters.py:813
+#: extensions/base/mediawiki.py:331
#, python-brace-format
-msgid "Moved protection settings from {redirect}{article} to {title}"
+msgid "[{author}]({author_url}) restored [{article}]({article_url}){comment}"
msgstr ""
-#: src/rc_formatters.py:837
-msgid "unknown expiry time"
+#: extensions/base/mediawiki.py:348
+msgid "Changed visibility of log events"
msgstr ""
-#: src/rc_formatters.py:842
-msgid "Blocked from editing the following pages: "
-msgstr ""
-
-#: src/rc_formatters.py:851
-msgid "Blocked from editing pages on following namespaces: "
-msgstr ""
-
-#: src/rc_formatters.py:862
-msgid "Partial block details"
-msgstr ""
-
-#: src/rc_formatters.py:863
+#: extensions/base/mediawiki.py:356
#, python-brace-format
-msgid "Blocked {blocked_user} {time}"
+msgid "[{author}]({author_url}) changed visibility of log events{comment}"
msgstr ""
-#: src/rc_formatters.py:867
-#, python-brace-format
-msgid "Changed block settings for {blocked_user}"
-msgstr ""
-
-#: src/rc_formatters.py:871
-#, python-brace-format
-msgid "Unblocked {blocked_user}"
-msgstr ""
-
-#: src/rc_formatters.py:878
-#, python-brace-format
-msgid "Left a comment on {target}'s profile"
-msgstr ""
-
-#: src/rc_formatters.py:880
-msgid "Left a comment on their own profile"
-msgstr ""
-
-#: src/rc_formatters.py:887
-#, python-brace-format
-msgid "Replied to a comment on {target}'s profile"
-msgstr ""
-
-#: src/rc_formatters.py:889
-msgid "Replied to a comment on their own profile"
-msgstr ""
-
-#: src/rc_formatters.py:896
-#, python-brace-format
-msgid "Edited a comment on {target}'s profile"
-msgstr ""
-
-#: src/rc_formatters.py:898
-msgid "Edited a comment on their own profile"
-msgstr ""
-
-#: src/rc_formatters.py:903
-#, python-brace-format
-msgid "Edited {target}'s profile"
-msgstr ""
-
-#: src/rc_formatters.py:905
-msgid "Edited their own profile"
-msgstr ""
-
-#: src/rc_formatters.py:907
-#, python-brace-format
-msgid "Cleared the {field} field"
-msgstr ""
-
-#: src/rc_formatters.py:909
-#, python-brace-format
-msgid "{field} field changed to: {desc}"
-msgstr ""
-
-#: src/rc_formatters.py:914
-#, python-brace-format
-msgid "Purged a comment on {target}'s profile"
-msgstr ""
-
-#: src/rc_formatters.py:916
-msgid "Purged a comment on their own profile"
-msgstr ""
-
-#: src/rc_formatters.py:924
-#, python-brace-format
-msgid "Deleted a comment on {target}'s profile"
-msgstr ""
-
-#: src/rc_formatters.py:926
-msgid "Deleted a comment on their own profile"
-msgstr ""
-
-#: src/rc_formatters.py:930
-#, python-brace-format
-msgid "Changed group membership for {target}"
-msgstr ""
-
-#: src/rc_formatters.py:934
-#, python-brace-format
-msgid "{target} got autopromoted to a new usergroup"
-msgstr ""
-
-#: src/rc_formatters.py:949
-#, python-brace-format
-msgid "Groups changed from {old_groups} to {new_groups}{reason}"
-msgstr ""
-
-#: src/rc_formatters.py:953
-#, python-brace-format
-msgid "Protected {target}"
-msgstr ""
-
-#: src/rc_formatters.py:959
-#, python-brace-format
-msgid "Changed protection level for {article}"
-msgstr ""
-
-#: src/rc_formatters.py:965
-#, python-brace-format
-msgid "Removed protection from {article}"
-msgstr ""
-
-#: src/rc_formatters.py:969
+#: extensions/base/mediawiki.py:370
#, python-brace-format
msgid "Changed visibility of revision on page {article} "
msgid_plural "Changed visibility of {amount} revisions on page {article} "
msgstr[0] ""
-#: src/rc_formatters.py:981
+#: extensions/base/mediawiki.py:383
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) changed visibility of revision on page [{article}]"
+"({article_url}){comment}"
+msgid_plural ""
+"[{author}]({author_url}) changed visibility of {amount} revisions on page "
+"[{article}]({article_url}){comment}"
+msgstr[0] ""
+
+#: extensions/base/mediawiki.py:399 extensions/base/mediawiki.py:432
+msgid "No redirect has been made"
+msgstr ""
+
+#: extensions/base/mediawiki.py:400 extensions/base/mediawiki.py:433
+msgid "A redirect has been made"
+msgstr ""
+
+#: extensions/base/mediawiki.py:401
+#, python-brace-format
+msgid "Moved {redirect}{article} to {target}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:412 extensions/base/mediawiki.py:444
+msgid "without making a redirect"
+msgstr ""
+
+#: extensions/base/mediawiki.py:413 extensions/base/mediawiki.py:445
+msgid "with a redirect"
+msgstr ""
+
+#: extensions/base/mediawiki.py:416
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) moved {redirect}*{article}* to [{target}]"
+"({target_url}) {made_a_redirect}{comment}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:434
+#, python-brace-format
+msgid "Moved {redirect}{article} to {title} over redirect"
+msgstr ""
+
+#: extensions/base/mediawiki.py:448
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) moved {redirect}*{article}* over redirect to "
+"[{target}]({target_url}) {made_a_redirect}{comment}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:464
+#, python-brace-format
+msgid "Moved protection settings from {redirect}{article} to {title}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:477
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) moved protection settings from {redirect}*{article}"
+"* to [{target}]({target_url}){comment}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:492
+#, python-brace-format
+msgid "Protected {target}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:495 extensions/base/mediawiki.py:510
+#: extensions/base/mediawiki.py:526 extensions/base/mediawiki.py:541
+msgid " [cascading]"
+msgstr ""
+
+#: extensions/base/mediawiki.py:506
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) protected [{article}]({article_url}) with the "
+"following settings: {settings}{comment}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:523
+#, python-brace-format
+msgid "Changed protection level for {article}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:537
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) modified protection settings of [{article}]"
+"({article_url}) to: {settings}{comment}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:554
+#, python-brace-format
+msgid "Removed protection from {article}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:563
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) removed protection from [{article}]({article_url})"
+"{comment}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:572
+msgid "for infinity and beyond"
+msgstr ""
+
+#: extensions/base/mediawiki.py:582
+msgid "for less than a minute"
+msgstr ""
+
+#: extensions/base/mediawiki.py:584
+msgid "year"
+msgid_plural "years"
+msgstr[0] ""
+
+#: extensions/base/mediawiki.py:584
+msgid "day"
+msgid_plural "days"
+msgstr[0] ""
+
+#: extensions/base/mediawiki.py:584
+msgid "hour"
+msgid_plural "hours"
+msgstr[0] ""
+
+#: extensions/base/mediawiki.py:585
+msgid "minute"
+msgid_plural "minutes"
+msgstr[0] ""
+
+#: extensions/base/mediawiki.py:590
+#, python-brace-format
+msgid "for {time_number} {time_unit}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:609
+msgid "Blocked from editing the following pages: "
+msgstr ""
+
+#: extensions/base/mediawiki.py:616 extensions/base/mediawiki.py:662
+msgid " and namespaces: "
+msgstr ""
+
+#: extensions/base/mediawiki.py:618
+msgid "Blocked from editing pages on following namespaces: "
+msgstr ""
+
+#: extensions/base/mediawiki.py:629
+msgid "Partial block details"
+msgstr ""
+
+#: extensions/base/mediawiki.py:632
+msgid "Block flags"
+msgstr ""
+
+#: extensions/base/mediawiki.py:634
+#, python-brace-format
+msgid "Blocked {blocked_user} {time}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:654
+msgid " on pages: "
+msgstr ""
+
+#: extensions/base/mediawiki.py:664
+msgid " on namespaces: "
+msgstr ""
+
+#: extensions/base/mediawiki.py:676
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) blocked [{user}]({user_url}) {time}"
+"{restriction_desc}{comment}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:694
+#, python-brace-format
+msgid "Changed block settings for {blocked_user}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:704
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) changed block settings for [{blocked_user}]"
+"({user_url}){comment}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:717
+#, python-brace-format
+msgid "Unblocked {blocked_user}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:727
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) unblocked [{blocked_user}]({user_url}){comment}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:743
+msgid "Action has been hidden by administration"
+msgstr ""
+
+#: extensions/base/mediawiki.py:750
+msgid "An action has been hidden by administration."
+msgstr ""
+
+#: extensions/base/mediawiki.py:761
#, python-brace-format
msgid "Imported {article} with {count} revision"
msgid_plural "Imported {article} with {count} revisions"
msgstr[0] ""
-#: src/rc_formatters.py:986
+#: extensions/base/mediawiki.py:772
#, python-brace-format
-msgid "Restored {article}"
-msgstr ""
+msgid ""
+"[{author}]({author_url}) imported [{article}]({article_url}) with {count} "
+"revision{comment}"
+msgid_plural ""
+"[{author}]({author_url}) imported [{article}]({article_url}) with {count} "
+"revisions{comment}"
+msgstr[0] ""
-#: src/rc_formatters.py:989
-msgid "Changed visibility of log events"
-msgstr ""
-
-#: src/rc_formatters.py:999
+#: extensions/base/mediawiki.py:788
#, python-brace-format
msgid "Imported {article} with {count} revision from \"{source}\""
msgid_plural "Imported {article} with {count} revisions from \"{source}\""
msgstr[0] ""
-#: src/rc_formatters.py:1004
+#: extensions/base/mediawiki.py:803
#, python-brace-format
-msgid "Edited abuse filter number {number}"
+msgid ""
+"[{author}]({author_url}) imported [{article}]({article_url}) with {count} "
+"revision from [{source}]({source_url}){comment}"
+msgid_plural ""
+"[{author}]({author_url}) imported [{article}]({article_url}) with {count} "
+"revisions from [{source}]({source_url}){comment}"
+msgstr[0] ""
+
+#: extensions/base/mediawiki.py:818
+#, python-brace-format
+msgid " (until {date_and_time})"
msgstr ""
-#: src/rc_formatters.py:1007
+#: extensions/base/mediawiki.py:835
#, python-brace-format
-msgid "Created abuse filter number {number}"
+msgid "Changed group membership for {target}"
msgstr ""
-#: src/rc_formatters.py:1010
+#: extensions/base/mediawiki.py:837
+msgid "System"
+msgstr ""
+
+#: extensions/base/mediawiki.py:838
+#, python-brace-format
+msgid "{target} got autopromoted to a new usergroup"
+msgstr ""
+
+#: extensions/base/mediawiki.py:844
+msgid "Added group"
+msgid_plural "Added groups"
+msgstr[0] ""
+
+#: extensions/base/mediawiki.py:846
+msgid "Removed group"
+msgid_plural "Removed groups"
+msgstr[0] ""
+
+#: extensions/base/mediawiki.py:860
+#, python-brace-format
+msgid "Added to {added} and removed from {removed}."
+msgstr ""
+
+#: extensions/base/mediawiki.py:861 extensions/base/mediawiki.py:863
+#: extensions/base/mediawiki.py:865 extensions/base/mediawiki.py:872
+msgid ", "
+msgstr ""
+
+#: extensions/base/mediawiki.py:863
+#, python-brace-format
+msgid "Added to {added}."
+msgstr ""
+
+#: extensions/base/mediawiki.py:865
+#, python-brace-format
+msgid "Removed from {removed}."
+msgstr ""
+
+#: extensions/base/mediawiki.py:866
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) changed group membership for [{target}]"
+"({target_url}): {group_changes}{comment}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:870
+#, python-brace-format
+msgid "The system autopromoted [{target}]({target_url}) to {added}.{comment}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:883
#, python-brace-format
msgid "Merged revision histories of {article} into {dest}"
msgstr ""
-#: src/rc_formatters.py:1014
+#: extensions/base/mediawiki.py:897
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) merged revision histories of [{article}]"
+"({article_url}) into [{dest}]({dest_url}){comment}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:911
msgid "Created account automatically"
msgstr ""
-#: src/rc_formatters.py:1017 src/rc_formatters.py:1026
+#: extensions/base/mediawiki.py:918
+#, python-brace-format
+msgid "Account [{author}]({author_url}) was created automatically"
+msgstr ""
+
+#: extensions/base/mediawiki.py:931 extensions/base/mediawiki.py:996
msgid "Created account"
msgstr ""
-#: src/rc_formatters.py:1020
+#: extensions/base/mediawiki.py:938 extensions/base/mediawiki.py:1003
+#, python-brace-format
+msgid "Account [{author}]({author_url}) was created"
+msgstr ""
+
+#: extensions/base/mediawiki.py:950
#, python-brace-format
msgid "Created account {article}"
msgstr ""
-#: src/rc_formatters.py:1023
+#: extensions/base/mediawiki.py:959
+#, python-brace-format
+msgid ""
+"Account [{article}]({article_url}) was created by [{author}]({author_url})"
+"{comment}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:972
#, python-brace-format
msgid "Created account {article} and password was sent by email"
msgstr ""
-#: src/rc_formatters.py:1029
-msgid "Added an entry to the interwiki table"
-msgstr ""
-
-#: src/rc_formatters.py:1030 src/rc_formatters.py:1036
+#: extensions/base/mediawiki.py:983
#, python-brace-format
-msgid "Prefix: {prefix}, website: {website} | {desc}"
+msgid ""
+"Account [{article}]({article_url}) was created by [{author}]({author_url}) "
+"and password was sent by email{comment}"
msgstr ""
-#: src/rc_formatters.py:1035
-msgid "Edited an entry in interwiki table"
-msgstr ""
-
-#: src/rc_formatters.py:1041
-msgid "Deleted an entry in interwiki table"
-msgstr ""
-
-#: src/rc_formatters.py:1042
-#, python-brace-format
-msgid "Prefix: {prefix} | {desc}"
-msgstr ""
-
-#: src/rc_formatters.py:1045
+#: extensions/base/mediawiki.py:1015
#, python-brace-format
msgid "Changed the content model of the page {article}"
msgstr ""
-#: src/rc_formatters.py:1046
+#: extensions/base/mediawiki.py:1017
#, python-brace-format
msgid "Model changed from {old} to {new}: {reason}"
msgstr ""
-#: src/rc_formatters.py:1051
+#: extensions/base/mediawiki.py:1029
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) changed the content model of the page [{article}]"
+"({article_url}) from {old} to {new}{comment}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:1044
+#, python-brace-format
+msgid "Created the page {article} using a non-default content model"
+msgstr ""
+
+#: extensions/base/mediawiki.py:1046
+#, python-brace-format
+msgid "Created with model {new}: {reason}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:1057
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) created the page [{article}]({article_url}) using a "
+"non-default content model {new}{comment}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:1072
+#, python-brace-format
+msgid "Created the tag \"{tag}\""
+msgstr ""
+
+#: extensions/base/mediawiki.py:1082
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) created the [tag]({tag_url}) \"{tag}\"{comment}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:1103
+#, python-brace-format
+msgid "Deleted the tag \"{tag}\""
+msgstr ""
+
+#: extensions/base/mediawiki.py:1105
+msgid "Removed from"
+msgstr ""
+
+#: extensions/base/mediawiki.py:1105
+msgid "{} revision or log entry"
+msgid_plural "{} revisions and/or log entries"
+msgstr[0] ""
+
+#: extensions/base/mediawiki.py:1118
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) deleted the [tag]({tag_url}) \"{tag}\"{comment}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:1128
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) deleted the [tag]({tag_url}) \"{tag}\" and removed "
+"it from {count} revision or log entry{comment}"
+msgid_plural ""
+"[{author}]({author_url}) deleted the [tag]({tag_url}) \"{tag}\" and removed "
+"it from {count} revisions and/or log entries{comment}"
+msgstr[0] ""
+
+#: extensions/base/mediawiki.py:1145
+#, python-brace-format
+msgid "Activated the tag \"{tag}\""
+msgstr ""
+
+#: extensions/base/mediawiki.py:1154
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) activated the [tag]({tag_url}) \"{tag}\"{comment}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:1173
+#, python-brace-format
+msgid "Deactivated the tag \"{tag}\""
+msgstr ""
+
+#: extensions/base/mediawiki.py:1182
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) deactivated the [tag]({tag_url}) \"{tag}\"{comment}"
+msgstr ""
+
+#: extensions/base/sprite.py:37
#, python-brace-format
msgid "Edited the sprite for {article}"
msgstr ""
-#: src/rc_formatters.py:1054
+#: extensions/base/sprite.py:45
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) edited the sprite for [{article}]({article_url})"
+msgstr ""
+
+#: extensions/base/sprite.py:60
#, python-brace-format
msgid "Created the sprite sheet for {article}"
msgstr ""
-#: src/rc_formatters.py:1057
+#: extensions/base/sprite.py:68
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) created the sprite sheet for [{article}]"
+"({article_url})"
+msgstr ""
+
+#: extensions/base/sprite.py:79
#, python-brace-format
msgid "Edited the slice for {article}"
msgstr ""
-#: src/rc_formatters.py:1063
-#, python-brace-format
-msgid "Created the Cargo table \"{table}\""
-msgstr ""
-
-#: src/rc_formatters.py:1067
-#, python-brace-format
-msgid "Deleted the Cargo table \"{table}\""
-msgstr ""
-
-#: src/rc_formatters.py:1074
-#, python-brace-format
-msgid "Recreated the Cargo table \"{table}\""
-msgstr ""
-
-#: src/rc_formatters.py:1081
-#, python-brace-format
-msgid "Replaced the Cargo table \"{table}\""
-msgstr ""
-
-#: src/rc_formatters.py:1085
-#, python-brace-format
-msgid "Created a tag \"{tag}\""
-msgstr ""
-
-#: src/rc_formatters.py:1089
-#, python-brace-format
-msgid "Deleted a tag \"{tag}\""
-msgstr ""
-
-#: src/rc_formatters.py:1093
-#, python-brace-format
-msgid "Activated a tag \"{tag}\""
-msgstr ""
-
-#: src/rc_formatters.py:1096
-#, python-brace-format
-msgid "Deactivated a tag \"{tag}\""
-msgstr ""
-
-#: src/rc_formatters.py:1099
-msgid "Changed wiki settings"
-msgstr ""
-
-#: src/rc_formatters.py:1103
-#, python-brace-format
-msgid "Deleted a \"{wiki}\" wiki"
-msgstr ""
-
-#: src/rc_formatters.py:1106
-#, python-brace-format
-msgid "Locked a \"{wiki}\" wiki"
-msgstr ""
-
-#: src/rc_formatters.py:1109
-#, python-brace-format
-msgid "Modified a \"{namespace_name}\" namespace"
-msgstr ""
-
-#: src/rc_formatters.py:1111 src/rc_formatters.py:1116
-msgid "Wiki"
-msgstr ""
-
-#: src/rc_formatters.py:1113
-#, python-brace-format
-msgid "Deleted a \"{namespace_name}\" namespace"
-msgstr ""
-
-#: src/rc_formatters.py:1119
-#, python-brace-format
-msgid "Modified \"{usergroup_name}\" usergroup"
-msgstr ""
-
-#: src/rc_formatters.py:1122
-#, python-brace-format
-msgid "Restored a \"{wiki}\" wiki"
-msgstr ""
-
-#: src/rc_formatters.py:1125
-#, python-brace-format
-msgid "Unlocked a \"{wiki}\" wiki"
-msgstr ""
-
-#: src/rc_formatters.py:1133
-#, python-brace-format
-msgid "Marked \"{article}\" for translation"
-msgstr ""
-
-#: src/rc_formatters.py:1136
-#, python-brace-format
-msgid "Removed \"{article}\" from the translation system"
-msgstr ""
-
-#: src/rc_formatters.py:1139
-#, python-brace-format
-msgid "Completed moving translation pages from \"{article}\" to \"{target}\""
-msgstr ""
-
-#: src/rc_formatters.py:1142
-#, python-brace-format
-msgid "Encountered a problem while moving \"{article}\" to \"{target}\""
-msgstr ""
-
-#: src/rc_formatters.py:1145
-#, python-brace-format
-msgid "Completed deletion of translatable page \"{article}\""
-msgstr ""
-
-#: src/rc_formatters.py:1148
+#: extensions/base/sprite.py:86
#, python-brace-format
msgid ""
-"Failed to delete \"{article}\" which belongs to translatable page "
-"\"{target}\""
-msgstr ""
-
-#: src/rc_formatters.py:1151
-#, python-brace-format
-msgid "Completed deletion of translation page \"{article}\""
-msgstr ""
-
-#: src/rc_formatters.py:1154
-#, python-brace-format
-msgid ""
-"Failed to delete \"{article}\" which belongs to translation page \"{target}\""
-msgstr ""
-
-#: src/rc_formatters.py:1157
-#, python-brace-format
-msgid "Encouraged translation of \"{article}\""
-msgstr ""
-
-#: src/rc_formatters.py:1160
-#, python-brace-format
-msgid "Discouraged translation of \"{article}\""
-msgstr ""
-
-#: src/rc_formatters.py:1166
-#, python-brace-format
-msgid "Limited languages for \"{article}\" to `{languages}`"
-msgstr ""
-
-#: src/rc_formatters.py:1168
-#, python-brace-format
-msgid "Priority languages for \"{article}\" set to `{languages}`"
-msgstr ""
-
-#: src/rc_formatters.py:1170
-#, python-brace-format
-msgid "Removed priority languages from \"{article}\""
-msgstr ""
-
-#: src/rc_formatters.py:1173
-#, python-brace-format
-msgid "Added translatable page \"{article}\" to aggregate group \"{group}\""
-msgstr ""
-
-#: src/rc_formatters.py:1176
-#, python-brace-format
-msgid ""
-"Removed translatable page \"{article}\" from aggregate group \"{group}\""
-msgstr ""
-
-#: src/rc_formatters.py:1183
-#, python-brace-format
-msgid "Reviewed translation \"{article}\""
-msgstr ""
-
-#: src/rc_formatters.py:1186
-#, python-brace-format
-msgid "Changed the state of `{language}` translations of \"{article}\""
-msgstr ""
-
-#: src/rc_formatters.py:1188
-msgid "Old state"
-msgstr ""
-
-#: src/rc_formatters.py:1189
-msgid "New state"
-msgstr ""
-
-#: src/rc_formatters.py:1193
-#, python-brace-format
-msgid "Renamed user \"{old_name}\" with {edits} edit to \"{new_name}\""
-msgid_plural "Renamed user \"{old_name}\" with {edits} edits to \"{new_name}\""
-msgstr[0] ""
-
-#: src/rc_formatters.py:1195
-#, python-brace-format
-msgid "Renamed user \"{old_name}\" to \"{new_name}\""
-msgstr ""
-
-#: src/rc_formatters.py:1199
-msgid "Action has been hidden by administration"
-msgstr ""
-
-#: src/rc_formatters.py:1204
-#, python-brace-format
-msgid "Unknown event `{event}`"
-msgstr ""
-
-#: src/rc_formatters.py:1210 src/rc_formatters.py:1212
-msgid "Report this on the support server"
-msgstr ""
-
-#: src/rc_formatters.py:1229
-msgid "Tags"
-msgstr ""
-
-#: src/rc_formatters.py:1234
-msgid "**Added**: "
-msgstr ""
-
-#: src/rc_formatters.py:1234
-msgid " and {} more\n"
-msgstr ""
-
-#: src/rc_formatters.py:1235
-msgid "**Removed**: "
-msgstr ""
-
-#: src/rc_formatters.py:1235
-msgid " and {} more"
-msgstr ""
-
-#: src/rc_formatters.py:1236
-msgid "Changed categories"
+"[{author}]({author_url}) edited the slice for [{article}]({article_url})"
msgstr ""
diff --git a/locale/ko/LC_MESSAGES/rc_formatters.mo b/locale/ko/LC_MESSAGES/rc_formatters.mo
deleted file mode 100644
index ed98639..0000000
Binary files a/locale/ko/LC_MESSAGES/rc_formatters.mo and /dev/null differ
diff --git a/locale/ko/LC_MESSAGES/rc_formatters.po b/locale/ko/LC_MESSAGES/rc_formatters.po
deleted file mode 100644
index 8e75cf4..0000000
--- a/locale/ko/LC_MESSAGES/rc_formatters.po
+++ /dev/null
@@ -1,1022 +0,0 @@
-# SOME DESCRIPTIVE TITLE.
-# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
-# This file is distributed under the same license as the RcGcDw package.
-# FIRST AUTHOR , YEAR.
-#
-msgid ""
-msgstr ""
-"Project-Id-Version: RcGcDw\n"
-"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2020-11-18 14:13+0100\n"
-"PO-Revision-Date: 2021-01-22 13:58+0000\n"
-"Last-Translator: Yongmin Hong \n"
-"Language-Team: Korean \n"
-"Language: ko\n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=UTF-8\n"
-"Content-Transfer-Encoding: 8bit\n"
-"Plural-Forms: nplurals=1; plural=0;\n"
-"X-Generator: Weblate 4.2.1\n"
-
-#: src/rc_formatters.py:28
-msgid "None"
-msgstr "없음"
-
-#: src/rc_formatters.py:28
-msgid "Warning issued"
-msgstr ""
-
-#: src/rc_formatters.py:28
-msgid "**Blocked user**"
-msgstr ""
-
-#: src/rc_formatters.py:28
-msgid "Tagged the edit"
-msgstr ""
-
-#: src/rc_formatters.py:28
-msgid "Disallowed the action"
-msgstr ""
-
-#: src/rc_formatters.py:28
-msgid "**IP range blocked**"
-msgstr ""
-
-#: src/rc_formatters.py:28
-msgid "Throttled actions"
-msgstr ""
-
-#: src/rc_formatters.py:28
-msgid "Removed autoconfirmed group"
-msgstr ""
-
-#: src/rc_formatters.py:28
-msgid "**Removed from privileged groups**"
-msgstr ""
-
-#: src/rc_formatters.py:29
-msgid "Edit"
-msgstr "편집"
-
-#: src/rc_formatters.py:29
-msgid "Upload"
-msgstr "업로드"
-
-#: src/rc_formatters.py:29
-msgid "Move"
-msgstr "이동"
-
-#: src/rc_formatters.py:29
-msgid "Stash upload"
-msgstr ""
-
-#: src/rc_formatters.py:29
-msgid "Deletion"
-msgstr "삭제"
-
-#: src/rc_formatters.py:29
-msgid "Account creation"
-msgstr "계정 생성"
-
-#: src/rc_formatters.py:29
-msgid "Auto account creation"
-msgstr ""
-
-#: src/rc_formatters.py:46 src/rc_formatters.py:53 src/rc_formatters.py:60
-#: src/rc_formatters.py:75 src/rc_formatters.py:96
-msgid "Unregistered user"
-msgstr ""
-
-#: src/rc_formatters.py:83
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) triggered *{abuse_filter}*, performing the action "
-"\"{action}\" on *[{target}]({target_url})* - action taken: {result}."
-msgstr ""
-
-#: src/rc_formatters.py:85 src/rc_formatters.py:86 src/rc_formatters.py:87
-#: src/rc_formatters.py:445 src/rc_formatters.py:448 src/rc_formatters.py:451
-#: src/rc_formatters.py:452 src/rc_formatters.py:457 src/rc_formatters.py:458
-#: src/rc_formatters.py:465 src/rc_formatters.py:469 src/rc_formatters.py:489
-#: src/rc_formatters.py:490 src/rc_formatters.py:491 src/rc_formatters.py:921
-#: src/rc_formatters.py:924 src/rc_formatters.py:927 src/rc_formatters.py:929
-#: src/rc_formatters.py:932 src/rc_formatters.py:934 src/rc_formatters.py:939
-#: src/rc_formatters.py:942 src/rc_formatters.py:947
-msgid "Unknown"
-msgstr ""
-
-#: src/rc_formatters.py:117
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) edited [{article}]({edit_link}){comment} ({bold}"
-"{sign}{edit_size}{bold})"
-msgstr ""
-
-#: src/rc_formatters.py:119
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) created [{article}]({edit_link}){comment} ({bold}"
-"{sign}{edit_size}{bold})"
-msgstr ""
-
-#: src/rc_formatters.py:122
-#, python-brace-format
-msgid "[{author}]({author_url}) uploaded [{file}]({file_link}){comment}"
-msgstr ""
-
-#: src/rc_formatters.py:129
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) reverted a version of [{file}]({file_link}){comment}"
-msgstr ""
-
-#: src/rc_formatters.py:133
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) uploaded a new version of [{file}]({file_link})"
-"{comment}"
-msgstr ""
-
-#: src/rc_formatters.py:136
-#, python-brace-format
-msgid "[{author}]({author_url}) deleted [{page}]({page_link}){comment}"
-msgstr ""
-
-#: src/rc_formatters.py:142
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) deleted redirect by overwriting [{page}]"
-"({page_link}){comment}"
-msgstr ""
-
-#: src/rc_formatters.py:148 src/rc_formatters.py:153
-msgid "without making a redirect"
-msgstr ""
-
-#: src/rc_formatters.py:148 src/rc_formatters.py:154
-msgid "with a redirect"
-msgstr ""
-
-#: src/rc_formatters.py:149
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) moved {redirect}*{article}* to [{target}]"
-"({target_url}) {made_a_redirect}{comment}"
-msgstr ""
-
-#: src/rc_formatters.py:155
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) moved {redirect}*{article}* over redirect to "
-"[{target}]({target_url}) {made_a_redirect}{comment}"
-msgstr ""
-
-#: src/rc_formatters.py:160
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) moved protection settings from {redirect}*{article}"
-"* to [{target}]({target_url}){comment}"
-msgstr ""
-
-#: src/rc_formatters.py:171 src/rc_formatters.py:662
-msgid "for infinity and beyond"
-msgstr ""
-
-#: src/rc_formatters.py:180 src/rc_formatters.py:670
-#, python-brace-format
-msgid "for {num} {translated_length}"
-msgstr ""
-
-#: src/rc_formatters.py:186 src/rc_formatters.py:674
-msgid "until {}"
-msgstr ""
-
-#: src/rc_formatters.py:190
-msgid " on pages: "
-msgstr ""
-
-#: src/rc_formatters.py:197 src/rc_formatters.py:687
-msgid " and namespaces: "
-msgstr ""
-
-#: src/rc_formatters.py:199
-msgid " on namespaces: "
-msgstr ""
-
-#: src/rc_formatters.py:211
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) blocked [{user}]({user_url}) {time}"
-"{restriction_desc}{comment}"
-msgstr ""
-
-#: src/rc_formatters.py:215
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) changed block settings for [{blocked_user}]"
-"({user_url}){comment}"
-msgstr ""
-
-#: src/rc_formatters.py:219
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) unblocked [{blocked_user}]({user_url}){comment}"
-msgstr ""
-
-#: src/rc_formatters.py:224
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) left a [comment]({comment}) on {target}'s profile"
-msgstr ""
-
-#: src/rc_formatters.py:226
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) left a [comment]({comment}) on their own profile"
-msgstr ""
-
-#: src/rc_formatters.py:232
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) replied to a [comment]({comment}) on {target}'s "
-"profile"
-msgstr ""
-
-#: src/rc_formatters.py:238
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) replied to a [comment]({comment}) on their own "
-"profile"
-msgstr ""
-
-#: src/rc_formatters.py:246
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) edited a [comment]({comment}) on {target}'s profile"
-msgstr ""
-
-#: src/rc_formatters.py:252
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) edited a [comment]({comment}) on their own profile"
-msgstr ""
-
-#: src/rc_formatters.py:259
-#, python-brace-format
-msgid "[{author}]({author_url}) purged a comment on {target}'s profile"
-msgstr ""
-
-#: src/rc_formatters.py:261
-#, python-brace-format
-msgid "[{author}]({author_url}) purged a comment on their own profile"
-msgstr ""
-
-#: src/rc_formatters.py:265
-#, python-brace-format
-msgid "[{author}]({author_url}) deleted a comment on {target}'s profile"
-msgstr ""
-
-#: src/rc_formatters.py:267
-#, python-brace-format
-msgid "[{author}]({author_url}) deleted a comment on their own profile"
-msgstr ""
-
-#: src/rc_formatters.py:273
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) edited the {field} on {target}'s profile. *({desc})*"
-msgstr ""
-
-#: src/rc_formatters.py:279
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) edited the {field} on their own profile. *({desc})*"
-msgstr ""
-
-#: src/rc_formatters.py:293 src/rc_formatters.py:295 src/rc_formatters.py:765
-#: src/rc_formatters.py:767
-msgid "none"
-msgstr ""
-
-#: src/rc_formatters.py:298
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) changed group membership for [{target}]"
-"({target_url}) from {old_groups} to {new_groups}{comment}"
-msgstr ""
-
-#: src/rc_formatters.py:300
-#, python-brace-format
-msgid ""
-"{author} autopromoted [{target}]({target_url}) from {old_groups} to "
-"{new_groups}{comment}"
-msgstr ""
-
-#: src/rc_formatters.py:301 src/rc_formatters.py:752
-msgid "System"
-msgstr ""
-
-#: src/rc_formatters.py:306
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) protected [{article}]({article_url}) with the "
-"following settings: {settings}{comment}"
-msgstr ""
-
-#: src/rc_formatters.py:308 src/rc_formatters.py:316 src/rc_formatters.py:775
-#: src/rc_formatters.py:781
-msgid " [cascading]"
-msgstr ""
-
-#: src/rc_formatters.py:313
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) modified protection settings of [{article}]"
-"({article_url}) to: {settings}{comment}"
-msgstr ""
-
-#: src/rc_formatters.py:320
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) removed protection from [{article}]({article_url})"
-"{comment}"
-msgstr ""
-
-#: src/rc_formatters.py:324
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) changed visibility of revision on page [{article}]"
-"({article_url}){comment}"
-msgid_plural ""
-"[{author}]({author_url}) changed visibility of {amount} revisions on page "
-"[{article}]({article_url}){comment}"
-msgstr[0] ""
-
-#: src/rc_formatters.py:337
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) imported [{article}]({article_url}) with {count} "
-"revision{comment}"
-msgid_plural ""
-"[{author}]({author_url}) imported [{article}]({article_url}) with {count} "
-"revisions{comment}"
-msgstr[0] ""
-
-#: src/rc_formatters.py:342
-#, python-brace-format
-msgid "[{author}]({author_url}) restored [{article}]({article_url}){comment}"
-msgstr ""
-
-#: src/rc_formatters.py:344
-#, python-brace-format
-msgid "[{author}]({author_url}) changed visibility of log events{comment}"
-msgstr ""
-
-#: src/rc_formatters.py:354
-#, python-brace-format
-msgid "[{author}]({author_url}) imported interwiki{comment}"
-msgstr ""
-
-#: src/rc_formatters.py:357
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) edited abuse filter [number {number}]({filter_url})"
-msgstr ""
-
-#: src/rc_formatters.py:361
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) created abuse filter [number {number}]({filter_url})"
-msgstr ""
-
-#: src/rc_formatters.py:365
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) merged revision histories of [{article}]"
-"({article_url}) into [{dest}]({dest_url}){comment}"
-msgstr ""
-
-#: src/rc_formatters.py:369
-#, python-brace-format
-msgid "Account [{author}]({author_url}) was created automatically"
-msgstr ""
-
-#: src/rc_formatters.py:372 src/rc_formatters.py:381
-#, python-brace-format
-msgid "Account [{author}]({author_url}) was created"
-msgstr ""
-
-#: src/rc_formatters.py:375
-#, python-brace-format
-msgid ""
-"Account [{article}]({article_url}) was created by [{author}]({author_url})"
-"{comment}"
-msgstr ""
-
-#: src/rc_formatters.py:378
-#, python-brace-format
-msgid ""
-"Account [{article}]({article_url}) was created by [{author}]({author_url}) "
-"and password was sent by email{comment}"
-msgstr ""
-
-#: src/rc_formatters.py:384
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) added an entry to the [interwiki table]"
-"({table_url}) pointing to {website} with {prefix} prefix"
-msgstr ""
-
-#: src/rc_formatters.py:390
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) edited an entry in [interwiki table]({table_url}) "
-"pointing to {website} with {prefix} prefix"
-msgstr ""
-
-#: src/rc_formatters.py:396
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) deleted an entry in [interwiki table]({table_url})"
-msgstr ""
-
-#: src/rc_formatters.py:399
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) changed the content model of the page [{article}]"
-"({article_url}) from {old} to {new}{comment}"
-msgstr ""
-
-#: src/rc_formatters.py:403
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) edited the sprite for [{article}]({article_url})"
-msgstr ""
-
-#: src/rc_formatters.py:406
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) created the sprite sheet for [{article}]"
-"({article_url})"
-msgstr ""
-
-#: src/rc_formatters.py:409
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) edited the slice for [{article}]({article_url})"
-msgstr ""
-
-#: src/rc_formatters.py:414
-#, python-brace-format
-msgid "[{author}]({author_url}) created the Cargo table \"{table}\""
-msgstr ""
-
-#: src/rc_formatters.py:416
-#, python-brace-format
-msgid "[{author}]({author_url}) deleted the Cargo table \"{table}\""
-msgstr ""
-
-#: src/rc_formatters.py:421
-#, python-brace-format
-msgid "[{author}]({author_url}) recreated the Cargo table \"{table}\""
-msgstr ""
-
-#: src/rc_formatters.py:426
-#, python-brace-format
-msgid "[{author}]({author_url}) replaced the Cargo table \"{table}\""
-msgstr ""
-
-#: src/rc_formatters.py:429
-#, python-brace-format
-msgid "[{author}]({author_url}) created a [tag]({tag_url}) \"{tag}\""
-msgstr ""
-
-#: src/rc_formatters.py:433
-#, python-brace-format
-msgid "[{author}]({author_url}) deleted a [tag]({tag_url}) \"{tag}\""
-msgstr ""
-
-#: src/rc_formatters.py:437
-#, python-brace-format
-msgid "[{author}]({author_url}) activated a [tag]({tag_url}) \"{tag}\""
-msgstr ""
-
-#: src/rc_formatters.py:440
-#, python-brace-format
-msgid "[{author}]({author_url}) deactivated a [tag]({tag_url}) \"{tag}\""
-msgstr ""
-
-#: src/rc_formatters.py:442
-#, python-brace-format
-msgid "[{author}]({author_url}) changed wiki settings ({reason})"
-msgstr ""
-
-#: src/rc_formatters.py:444
-#, python-brace-format
-msgid "[{author}]({author_url}) deleted a wiki *{wiki_name}* ({comment})"
-msgstr ""
-
-#: src/rc_formatters.py:447
-#, python-brace-format
-msgid "[{author}]({author_url}) locked a wiki *{wiki_name}* ({comment})"
-msgstr ""
-
-#: src/rc_formatters.py:450
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) modified a namespace *{namespace_name}* on "
-"*{wiki_name}* ({comment})"
-msgstr ""
-
-#: src/rc_formatters.py:455
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) deleted a namespace *{namespace_name}* on "
-"*{wiki_name}* ({comment})"
-msgstr ""
-
-#: src/rc_formatters.py:460
-#, python-brace-format
-msgid "[{author}]({author_url}) modified user group *{group_name}* ({comment})"
-msgstr ""
-
-#: src/rc_formatters.py:464
-#, python-brace-format
-msgid "[{author}]({author_url}) restored a wiki *{wiki_name}* ({comment})"
-msgstr ""
-
-#: src/rc_formatters.py:468
-#, python-brace-format
-msgid "[{author}]({author_url}) unlocked a wiki *{wiki_name}* ({comment})"
-msgstr ""
-
-#: src/rc_formatters.py:473
-msgid "An action has been hidden by administration."
-msgstr ""
-
-#: src/rc_formatters.py:480
-#, python-brace-format
-msgid ""
-"Unknown event `{event}` by [{author}]({author_url}), report it on the "
-"[support server](<{support}>)."
-msgstr ""
-
-#: src/rc_formatters.py:488
-#, python-brace-format
-msgid "{user} triggered \"{abuse_filter}\""
-msgstr ""
-
-#: src/rc_formatters.py:489
-msgid "Performed"
-msgstr ""
-
-#: src/rc_formatters.py:490
-msgid "Action taken"
-msgstr ""
-
-#: src/rc_formatters.py:491
-msgid "Title"
-msgstr ""
-
-#: src/rc_formatters.py:500 src/rc_formatters.py:768
-msgid "No description provided"
-msgstr ""
-
-#: src/rc_formatters.py:524
-msgid "(N!) "
-msgstr ""
-
-#: src/rc_formatters.py:525
-msgid "m"
-msgstr ""
-
-#: src/rc_formatters.py:525
-msgid "b"
-msgstr ""
-
-#: src/rc_formatters.py:542 src/rc_formatters.py:547
-msgid "__Only whitespace__"
-msgstr ""
-
-#: src/rc_formatters.py:552
-msgid "Removed"
-msgstr ""
-
-#: src/rc_formatters.py:554
-msgid "Added"
-msgstr ""
-
-#: src/rc_formatters.py:588 src/rc_formatters.py:627
-msgid "Options"
-msgstr ""
-
-#: src/rc_formatters.py:588
-#, python-brace-format
-msgid "([preview]({link}) | [undo]({undolink}))"
-msgstr ""
-
-#: src/rc_formatters.py:593
-#, python-brace-format
-msgid "Uploaded a new version of {name}"
-msgstr ""
-
-#: src/rc_formatters.py:595
-#, python-brace-format
-msgid "Reverted a version of {name}"
-msgstr ""
-
-#: src/rc_formatters.py:597
-#, python-brace-format
-msgid "Uploaded {name}"
-msgstr ""
-
-#: src/rc_formatters.py:613
-msgid "**No license!**"
-msgstr ""
-
-#: src/rc_formatters.py:625
-msgid ""
-"\n"
-"License: {}"
-msgstr ""
-
-#: src/rc_formatters.py:627
-#, python-brace-format
-msgid "([preview]({link}))"
-msgstr ""
-
-#: src/rc_formatters.py:632
-#, python-brace-format
-msgid "Deleted page {article}"
-msgstr ""
-
-#: src/rc_formatters.py:637
-#, python-brace-format
-msgid "Deleted redirect {article} by overwriting"
-msgstr ""
-
-#: src/rc_formatters.py:643
-msgid "No redirect has been made"
-msgstr ""
-
-#: src/rc_formatters.py:644
-msgid "A redirect has been made"
-msgstr ""
-
-#: src/rc_formatters.py:645
-#, python-brace-format
-msgid "Moved {redirect}{article} to {target}"
-msgstr ""
-
-#: src/rc_formatters.py:648
-#, python-brace-format
-msgid "Moved {redirect}{article} to {title} over redirect"
-msgstr ""
-
-#: src/rc_formatters.py:652
-#, python-brace-format
-msgid "Moved protection settings from {redirect}{article} to {title}"
-msgstr ""
-
-#: src/rc_formatters.py:676
-msgid "unknown expiry time"
-msgstr ""
-
-#: src/rc_formatters.py:680
-msgid "Blocked from editing the following pages: "
-msgstr ""
-
-#: src/rc_formatters.py:689
-msgid "Blocked from editing pages on following namespaces: "
-msgstr ""
-
-#: src/rc_formatters.py:700
-msgid "Partial block details"
-msgstr ""
-
-#: src/rc_formatters.py:701
-#, python-brace-format
-msgid "Blocked {blocked_user} {time}"
-msgstr ""
-
-#: src/rc_formatters.py:705
-#, python-brace-format
-msgid "Changed block settings for {blocked_user}"
-msgstr ""
-
-#: src/rc_formatters.py:709
-#, python-brace-format
-msgid "Unblocked {blocked_user}"
-msgstr ""
-
-#: src/rc_formatters.py:714
-#, python-brace-format
-msgid "Left a comment on {target}'s profile"
-msgstr ""
-
-#: src/rc_formatters.py:716
-msgid "Left a comment on their own profile"
-msgstr ""
-
-#: src/rc_formatters.py:721
-#, python-brace-format
-msgid "Replied to a comment on {target}'s profile"
-msgstr ""
-
-#: src/rc_formatters.py:723
-msgid "Replied to a comment on their own profile"
-msgstr ""
-
-#: src/rc_formatters.py:728
-#, python-brace-format
-msgid "Edited a comment on {target}'s profile"
-msgstr ""
-
-#: src/rc_formatters.py:730
-msgid "Edited a comment on their own profile"
-msgstr ""
-
-#: src/rc_formatters.py:733
-#, python-brace-format
-msgid "Edited {target}'s profile"
-msgstr ""
-
-#: src/rc_formatters.py:733
-msgid "Edited their own profile"
-msgstr ""
-
-#: src/rc_formatters.py:735
-#, python-brace-format
-msgid "Cleared the {field} field"
-msgstr ""
-
-#: src/rc_formatters.py:737
-#, python-brace-format
-msgid "{field} field changed to: {desc}"
-msgstr ""
-
-#: src/rc_formatters.py:740
-#, python-brace-format
-msgid "Purged a comment on {target}'s profile"
-msgstr ""
-
-#: src/rc_formatters.py:746
-#, python-brace-format
-msgid "Deleted a comment on {target}'s profile"
-msgstr ""
-
-#: src/rc_formatters.py:750
-#, python-brace-format
-msgid "Changed group membership for {target}"
-msgstr ""
-
-#: src/rc_formatters.py:754
-#, python-brace-format
-msgid "{target} got autopromoted to a new usergroup"
-msgstr ""
-
-#: src/rc_formatters.py:769
-#, python-brace-format
-msgid "Groups changed from {old_groups} to {new_groups}{reason}"
-msgstr ""
-
-#: src/rc_formatters.py:773
-#, python-brace-format
-msgid "Protected {target}"
-msgstr ""
-
-#: src/rc_formatters.py:779
-#, python-brace-format
-msgid "Changed protection level for {article}"
-msgstr ""
-
-#: src/rc_formatters.py:785
-#, python-brace-format
-msgid "Removed protection from {article}"
-msgstr ""
-
-#: src/rc_formatters.py:789
-#, python-brace-format
-msgid "Changed visibility of revision on page {article} "
-msgid_plural "Changed visibility of {amount} revisions on page {article} "
-msgstr[0] ""
-
-#: src/rc_formatters.py:801
-#, python-brace-format
-msgid "Imported {article} with {count} revision"
-msgid_plural "Imported {article} with {count} revisions"
-msgstr[0] ""
-
-#: src/rc_formatters.py:806
-#, python-brace-format
-msgid "Restored {article}"
-msgstr ""
-
-#: src/rc_formatters.py:809
-msgid "Changed visibility of log events"
-msgstr ""
-
-#: src/rc_formatters.py:819
-msgid "Imported interwiki"
-msgstr ""
-
-#: src/rc_formatters.py:822
-#, python-brace-format
-msgid "Edited abuse filter number {number}"
-msgstr ""
-
-#: src/rc_formatters.py:825
-#, python-brace-format
-msgid "Created abuse filter number {number}"
-msgstr ""
-
-#: src/rc_formatters.py:828
-#, python-brace-format
-msgid "Merged revision histories of {article} into {dest}"
-msgstr ""
-
-#: src/rc_formatters.py:832
-msgid "Created account automatically"
-msgstr ""
-
-#: src/rc_formatters.py:835 src/rc_formatters.py:844
-msgid "Created account"
-msgstr ""
-
-#: src/rc_formatters.py:838
-#, python-brace-format
-msgid "Created account {article}"
-msgstr ""
-
-#: src/rc_formatters.py:841
-#, python-brace-format
-msgid "Created account {article} and password was sent by email"
-msgstr ""
-
-#: src/rc_formatters.py:847
-msgid "Added an entry to the interwiki table"
-msgstr ""
-
-#: src/rc_formatters.py:848 src/rc_formatters.py:854
-#, python-brace-format
-msgid "Prefix: {prefix}, website: {website} | {desc}"
-msgstr ""
-
-#: src/rc_formatters.py:853
-msgid "Edited an entry in interwiki table"
-msgstr ""
-
-#: src/rc_formatters.py:859
-msgid "Deleted an entry in interwiki table"
-msgstr ""
-
-#: src/rc_formatters.py:860
-#, python-brace-format
-msgid "Prefix: {prefix} | {desc}"
-msgstr ""
-
-#: src/rc_formatters.py:863
-#, python-brace-format
-msgid "Changed the content model of the page {article}"
-msgstr ""
-
-#: src/rc_formatters.py:864
-#, python-brace-format
-msgid "Model changed from {old} to {new}: {reason}"
-msgstr ""
-
-#: src/rc_formatters.py:869
-#, python-brace-format
-msgid "Edited the sprite for {article}"
-msgstr ""
-
-#: src/rc_formatters.py:872
-#, python-brace-format
-msgid "Created the sprite sheet for {article}"
-msgstr ""
-
-#: src/rc_formatters.py:875
-#, python-brace-format
-msgid "Edited the slice for {article}"
-msgstr ""
-
-#: src/rc_formatters.py:881
-#, python-brace-format
-msgid "Created the Cargo table \"{table}\""
-msgstr ""
-
-#: src/rc_formatters.py:885
-#, python-brace-format
-msgid "Deleted the Cargo table \"{table}\""
-msgstr ""
-
-#: src/rc_formatters.py:892
-#, python-brace-format
-msgid "Recreated the Cargo table \"{table}\""
-msgstr ""
-
-#: src/rc_formatters.py:899
-#, python-brace-format
-msgid "Replaced the Cargo table \"{table}\""
-msgstr ""
-
-#: src/rc_formatters.py:903
-#, python-brace-format
-msgid "Created a tag \"{tag}\""
-msgstr ""
-
-#: src/rc_formatters.py:907
-#, python-brace-format
-msgid "Deleted a tag \"{tag}\""
-msgstr ""
-
-#: src/rc_formatters.py:911
-#, python-brace-format
-msgid "Activated a tag \"{tag}\""
-msgstr ""
-
-#: src/rc_formatters.py:914
-#, python-brace-format
-msgid "Deactivated a tag \"{tag}\""
-msgstr ""
-
-#: src/rc_formatters.py:917
-msgid "Changed wiki settings"
-msgstr ""
-
-#: src/rc_formatters.py:921
-#, python-brace-format
-msgid "Deleted a \"{wiki}\" wiki"
-msgstr ""
-
-#: src/rc_formatters.py:924
-#, python-brace-format
-msgid "Locked a \"{wiki}\" wiki"
-msgstr ""
-
-#: src/rc_formatters.py:927
-#, python-brace-format
-msgid "Modified a \"{namespace_name}\" namespace"
-msgstr ""
-
-#: src/rc_formatters.py:929 src/rc_formatters.py:934
-msgid "Wiki"
-msgstr ""
-
-#: src/rc_formatters.py:931
-#, python-brace-format
-msgid "Deleted a \"{namespace_name}\" namespace"
-msgstr ""
-
-#: src/rc_formatters.py:936
-#, python-brace-format
-msgid "Modified \"{usergroup_name}\" usergroup"
-msgstr ""
-
-#: src/rc_formatters.py:939
-#, python-brace-format
-msgid "Restored a \"{wiki}\" wiki"
-msgstr ""
-
-#: src/rc_formatters.py:942
-#, python-brace-format
-msgid "Unlocked a \"{wiki}\" wiki"
-msgstr ""
-
-#: src/rc_formatters.py:946
-msgid "Action has been hidden by administration"
-msgstr ""
-
-#: src/rc_formatters.py:951
-#, python-brace-format
-msgid "Unknown event `{event}`"
-msgstr ""
-
-#: src/rc_formatters.py:957 src/rc_formatters.py:959
-msgid "Report this on the support server"
-msgstr ""
-
-#: src/rc_formatters.py:976
-msgid "Tags"
-msgstr ""
-
-#: src/rc_formatters.py:979
-msgid "**Added**: "
-msgstr ""
-
-#: src/rc_formatters.py:979
-msgid " and {} more\n"
-msgstr ""
-
-#: src/rc_formatters.py:980
-msgid "**Removed**: "
-msgstr ""
-
-#: src/rc_formatters.py:980
-msgid " and {} more"
-msgstr ""
-
-#: src/rc_formatters.py:981
-msgid "Changed categories"
-msgstr ""
diff --git a/locale/lol/LC_MESSAGES/discussion_formatters.mo b/locale/lol/LC_MESSAGES/discussion_formatters.mo
deleted file mode 100644
index 5cfeee0..0000000
Binary files a/locale/lol/LC_MESSAGES/discussion_formatters.mo and /dev/null differ
diff --git a/locale/lol/LC_MESSAGES/discussion_formatters.po b/locale/lol/LC_MESSAGES/discussion_formatters.po
deleted file mode 100644
index bfe9f74..0000000
--- a/locale/lol/LC_MESSAGES/discussion_formatters.po
+++ /dev/null
@@ -1,160 +0,0 @@
-# SOME DESCRIPTIVE TITLE.
-# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
-# This file is distributed under the same license as the RcGcDw package.
-# FIRST AUTHOR , YEAR.
-#
-msgid ""
-msgstr ""
-"Project-Id-Version: RcGcDw\n"
-"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2020-12-23 00:28+0100\n"
-"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
-"Last-Translator: Automatically generated\n"
-"Language-Team: none\n"
-"Language: lol\n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=UTF-8\n"
-"Content-Transfer-Encoding: 8bit\n"
-
-#: src/discussion_formatters.py:21 src/discussion_formatters.py:56
-#: src/discussion_formatters.py:67 src/discussion_formatters.py:95
-#: src/discussion_formatters.py:163 src/discussion_formatters.py:176
-msgid "unknown"
-msgstr ""
-
-#: src/discussion_formatters.py:27 src/discussion_formatters.py:102
-msgid "Unregistered user"
-msgstr ""
-
-#: src/discussion_formatters.py:39
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) created [{title}](<{url}f/p/{threadId}>) in "
-"{forumName}"
-msgstr ""
-
-#: src/discussion_formatters.py:42
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) created a poll [{title}](<{url}f/p/{threadId}>) in "
-"{forumName}"
-msgstr ""
-
-#: src/discussion_formatters.py:45
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) created a quiz [{title}](<{url}f/p/{threadId}>) in "
-"{forumName}"
-msgstr ""
-
-#: src/discussion_formatters.py:54
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) created a [reply](<{url}f/p/{threadId}/r/{postId}>) "
-"to [{title}](<{url}f/p/{threadId}>) in {forumName}"
-msgstr ""
-
-#: src/discussion_formatters.py:61
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) created [{title}](<{url}wiki/Message_Wall:"
-"{user_wall}?threadId={threadId}>) on [{user}'s Message Wall](<{url}wiki/"
-"Message_Wall:{user_wall}>)"
-msgstr ""
-
-#: src/discussion_formatters.py:64
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) created a [reply](<{url}wiki/Message_Wall:"
-"{user_wall}?threadId={threadId}#{replyId}>) to [{title}](<{url}wiki/"
-"Message_Wall:{user_wall}?threadId={threadId}>) on [{user}'s Message Wall]"
-"(<{url}wiki/Message_Wall:{user_wall}>)"
-msgstr ""
-
-#: src/discussion_formatters.py:72
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) created a [comment](<{url}?commentId={commentId}>) "
-"on [{article}](<{url}>)"
-msgstr ""
-
-#: src/discussion_formatters.py:78
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) created a [reply](<{url}?commentId={commentId}"
-"&replyId={replyId}>) to a [comment](<{url}?commentId={commentId}>) on "
-"[{article}](<{url}>)"
-msgstr ""
-
-#: src/discussion_formatters.py:86
-#, python-brace-format
-msgid ""
-"Unknown event `{event}` by [{author}]({author_url}), report it on the "
-"[support server](<{support}>)."
-msgstr ""
-
-#: src/discussion_formatters.py:123
-#, python-brace-format
-msgid "Created \"{title}\""
-msgstr ""
-
-#: src/discussion_formatters.py:127
-#, python-brace-format
-msgid "Created a poll \"{title}\""
-msgstr ""
-
-#: src/discussion_formatters.py:134
-msgid "Option {}"
-msgstr ""
-
-#: src/discussion_formatters.py:135
-#, python-brace-format
-msgid "__[View image]({image_url})__"
-msgstr ""
-
-#: src/discussion_formatters.py:139
-#, python-brace-format
-msgid "Created a quiz \"{title}\""
-msgstr ""
-
-#: src/discussion_formatters.py:155 src/discussion_formatters.py:157
-msgid "Tags"
-msgstr ""
-
-#: src/discussion_formatters.py:155
-msgid "{} tags"
-msgstr ""
-
-#: src/discussion_formatters.py:160
-#, python-brace-format
-msgid "Replied to \"{title}\""
-msgstr ""
-
-#: src/discussion_formatters.py:169
-#, python-brace-format
-msgid "Created \"{title}\" on {user}'s Message Wall"
-msgstr ""
-
-#: src/discussion_formatters.py:173
-#, python-brace-format
-msgid "Replied to \"{title}\" on {user}'s Message Wall"
-msgstr ""
-
-#: src/discussion_formatters.py:180
-#, python-brace-format
-msgid "Commented on {article}"
-msgstr ""
-
-#: src/discussion_formatters.py:184
-#, python-brace-format
-msgid "Replied to a comment on {article}"
-msgstr ""
-
-#: src/discussion_formatters.py:188
-#, python-brace-format
-msgid "Unknown event `{event}`"
-msgstr ""
-
-#: src/discussion_formatters.py:194 src/discussion_formatters.py:196
-msgid "Report this on the support server"
-msgstr ""
diff --git a/locale/lol/LC_MESSAGES/formatters.po b/locale/lol/LC_MESSAGES/formatters.po
new file mode 100644
index 0000000..1a82685
--- /dev/null
+++ b/locale/lol/LC_MESSAGES/formatters.po
@@ -0,0 +1,1680 @@
+# #-#-#-#-# rcgcdw.po (PACKAGE VERSION) #-#-#-#-#
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR , YEAR.
+#
+# #-#-#-#-# formatters.po (RcGcDw) #-#-#-#-#
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the RcGcDw package.
+# FIRST AUTHOR , YEAR.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: RcGcDw\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2021-07-11 14:32+0200\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: Automatically generated\n"
+"Language-Team: none\n"
+"Language: lol\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"#-#-#-#-# rcgcdw.po (PACKAGE VERSION) #-#-#-#-#\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+"X-Generator: Weblate 4.1.1\n"
+"#-#-#-#-# formatters.po (RcGcDw) #-#-#-#-#\n"
+"#-#-#-#-# discussion_formatters.po (RcGcDw) #-#-#-#-#\n"
+"#-#-#-#-# rc_formatters.po (RcGcDw) #-#-#-#-#\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+
+#: src/api/util.py:61 src/api/util.py:66
+msgid "__Only whitespace__"
+msgstr ""
+
+#: src/api/util.py:71
+msgid "Removed"
+msgstr ""
+
+#: src/api/util.py:73
+msgid "Added"
+msgstr ""
+
+#: src/api/util.py:94 src/api/util.py:126 src/api/util.py:133
+#: src/api/util.py:141 extensions/base/discussions.py:247
+#: extensions/base/discussions.py:264 extensions/base/abusefilter.py:45
+msgid "Unregistered user"
+msgstr ""
+
+#: src/api/util.py:160
+msgctxt "recent changes Tags"
+msgid "Tags"
+msgstr ""
+
+#: src/api/util.py:162
+msgid "**Added**: "
+msgstr ""
+
+#: src/api/util.py:163
+msgid " and {} more\n"
+msgstr ""
+
+#: src/api/util.py:165
+msgid "**Removed**: "
+msgstr ""
+
+#: src/api/util.py:166
+msgid " and {} more"
+msgstr ""
+
+#: src/api/util.py:168
+msgid "Changed categories"
+msgstr ""
+
+#: extensions/base/cargo.py:37
+#, python-brace-format
+msgid "Created the Cargo table \"{table}\""
+msgstr ""
+
+#: extensions/base/cargo.py:45
+#, python-brace-format
+msgid "[{author}]({author_url}) created the Cargo table \"{table}\""
+msgstr ""
+
+#: extensions/base/cargo.py:60
+#, python-brace-format
+msgid "Recreated the Cargo table \"{table}\""
+msgstr ""
+
+#: extensions/base/cargo.py:68
+#, python-brace-format
+msgid "[{author}]({author_url}) recreated the Cargo table \"{table}\""
+msgstr ""
+
+#: extensions/base/cargo.py:83
+#, python-brace-format
+msgid "Replaced the Cargo table \"{table}\""
+msgstr ""
+
+#: extensions/base/cargo.py:91
+#, python-brace-format
+msgid "[{author}]({author_url}) replaced the Cargo table \"{table}\""
+msgstr ""
+
+#: extensions/base/cargo.py:105
+#, python-brace-format
+msgid "Deleted the Cargo table \"{table}\""
+msgstr ""
+
+#: extensions/base/cargo.py:112
+#, python-brace-format
+msgid "[{author}]({author_url}) deleted the Cargo table \"{table}\""
+msgstr ""
+
+#: extensions/base/translate.py:41
+#, python-brace-format
+msgid "Marked \"{article}\" for translation"
+msgstr ""
+
+#: extensions/base/translate.py:55
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) marked [{article}]({article_url}) for "
+"translation{comment}"
+msgstr ""
+
+#: extensions/base/translate.py:70
+#, python-brace-format
+msgid "Removed \"{article}\" from the translation system"
+msgstr ""
+
+#: extensions/base/translate.py:80
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) removed [{article}]({article_url}) from the "
+"translation system{comment}"
+msgstr ""
+
+#: extensions/base/translate.py:95
+#, python-brace-format
+msgid "Completed moving translation pages from \"{article}\" to \"{target}\""
+msgstr ""
+
+#: extensions/base/translate.py:106
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) completed moving translation pages from *{article}* "
+"to [{target}]({target_url}){comment}"
+msgstr ""
+
+#: extensions/base/translate.py:121
+#, python-brace-format
+msgid "Encountered a problem while moving \"{article}\" to \"{target}\""
+msgstr ""
+
+#: extensions/base/translate.py:133
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) encountered a problem while moving [{article}]"
+"({article_url}) to [{target}]({target_url}){comment}"
+msgstr ""
+
+#: extensions/base/translate.py:149
+#, python-brace-format
+msgid ""
+"Failed to delete \"{article}\" which belongs to translatable page "
+"\"{target}\""
+msgstr ""
+
+#: extensions/base/translate.py:161
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) failed to delete [{article}]({article_url}) which "
+"belongs to translatable page [{target}]({target_url}){comment}"
+msgstr ""
+
+#: extensions/base/translate.py:177
+#, python-brace-format
+msgid "Completed deletion of translation page \"{article}\""
+msgstr ""
+
+#: extensions/base/translate.py:188
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) completed deletion of translation page [{article}]"
+"({article_url}){comment}"
+msgstr ""
+
+#: extensions/base/translate.py:203
+#, python-brace-format
+msgid ""
+"Failed to delete \"{article}\" which belongs to translation page \"{target}\""
+msgstr ""
+
+#: extensions/base/translate.py:215
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) failed to delete [{article}]({article_url}) which "
+"belongs to translation page [{target}]({target_url}){comment}"
+msgstr ""
+
+#: extensions/base/translate.py:231
+#, python-brace-format
+msgid "Encouraged translation of \"{article}\""
+msgstr ""
+
+#: extensions/base/translate.py:240
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) encouraged translation of [{article}]({article_url})"
+"{comment}"
+msgstr ""
+
+#: extensions/base/translate.py:255
+#, python-brace-format
+msgid "Discouraged translation of \"{article}\""
+msgstr ""
+
+#: extensions/base/translate.py:264
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) discouraged translation of [{article}]"
+"({article_url}){comment}"
+msgstr ""
+
+#: extensions/base/translate.py:282
+#, python-brace-format
+msgid "Limited languages for \"{article}\" to `{languages}`"
+msgstr ""
+
+#: extensions/base/translate.py:285
+#, python-brace-format
+msgid "Priority languages for \"{article}\" set to `{languages}`"
+msgstr ""
+
+#: extensions/base/translate.py:288
+#, python-brace-format
+msgid "Removed priority languages from \"{article}\""
+msgstr ""
+
+#: extensions/base/translate.py:301
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) limited languages for [{article}]({article_url}) to "
+"`{languages}`{comment}"
+msgstr ""
+
+#: extensions/base/translate.py:308
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) set the priority languages for [{article}]"
+"({article_url}) to `{languages}`{comment}"
+msgstr ""
+
+#: extensions/base/translate.py:315
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) removed priority languages from [{article}]"
+"({article_url}){comment}"
+msgstr ""
+
+#: extensions/base/translate.py:331
+#, python-brace-format
+msgid "Added translatable page \"{article}\" to aggregate group \"{group}\""
+msgstr ""
+
+#: extensions/base/translate.py:342
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) added translatable page [{article}]({article_url}) "
+"to aggregate group \"{group}\"{comment}"
+msgstr ""
+
+#: extensions/base/translate.py:357
+#, python-brace-format
+msgid ""
+"Removed translatable page \"{article}\" from aggregate group \"{group}\""
+msgstr ""
+
+#: extensions/base/translate.py:368
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) removed translatable page [{article}]"
+"({article_url}) from aggregate group \"{group}\"{comment}"
+msgstr ""
+
+#: extensions/base/translate.py:387
+#, python-brace-format
+msgid "Reviewed translation \"{article}\""
+msgstr ""
+
+#: extensions/base/translate.py:401
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) reviewed translation [{article}]({article_url})"
+"{comment}"
+msgstr ""
+
+#: extensions/base/translate.py:416
+#, python-brace-format
+msgid "Changed the state of `{language}` translations of \"{article}\""
+msgstr ""
+
+#: extensions/base/translate.py:419
+msgid "Old state"
+msgstr ""
+
+#: extensions/base/translate.py:420
+msgid "New state"
+msgstr ""
+
+#: extensions/base/translate.py:431
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) changed the state of `{language}` translations of "
+"[{article}]({article_url}) from `{old_state}` to `{new_state}`{comment}"
+msgstr ""
+
+#: extensions/base/translate.py:439
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) changed the state of `{language}` translations of "
+"[{article}]({article_url}) to `{new_state}`{comment}"
+msgstr ""
+
+#: extensions/base/translate.py:452 extensions/base/translate.py:455
+msgid "(default)"
+msgstr ""
+
+#: extensions/base/translate.py:464
+#, python-brace-format
+msgid "Changed the language of \"{article}\""
+msgstr ""
+
+#: extensions/base/translate.py:465
+msgid "Old language"
+msgstr ""
+
+#: extensions/base/translate.py:466
+msgid "New language"
+msgstr ""
+
+#: extensions/base/translate.py:477
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) changed the language of [{article}]({article_url}) "
+"from {old_lang} to {new_lang}{comment}"
+msgstr ""
+
+#: extensions/base/discussions.py:148 extensions/base/discussions.py:207
+#: extensions/base/discussions.py:245 extensions/base/discussions.py:261
+#: extensions/base/discussions.py:284 extensions/base/discussions.py:306
+#: extensions/base/discussions.py:334 extensions/base/discussions.py:354
+msgid "unknown"
+msgstr ""
+
+#: extensions/base/discussions.py:157
+#, python-brace-format
+msgid "Created \"{title}\""
+msgstr ""
+
+#: extensions/base/discussions.py:161
+#, python-brace-format
+msgid "Created a poll \"{title}\""
+msgstr ""
+
+#: extensions/base/discussions.py:168
+msgid "Option {}"
+msgstr ""
+
+#: extensions/base/discussions.py:170
+#, python-brace-format
+msgid "__[View image]({image_url})__"
+msgstr ""
+
+#: extensions/base/discussions.py:174
+#, python-brace-format
+msgid "Created a quiz \"{title}\""
+msgstr ""
+
+#: extensions/base/discussions.py:193 extensions/base/discussions.py:195
+msgctxt "Fandom discussions Tags/Forums"
+msgid "Tags"
+msgstr ""
+
+#: extensions/base/discussions.py:193
+msgctxt "Fandom discussions amount of Tags/Forums"
+msgid "{} tags"
+msgstr ""
+
+#: extensions/base/discussions.py:198
+#, python-brace-format
+msgid "Replied to \"{title}\""
+msgstr ""
+
+#: extensions/base/discussions.py:214
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) created [{title}](<{url}f/p/{threadId}>) in "
+"{forumName}"
+msgstr ""
+
+#: extensions/base/discussions.py:217
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) created a poll [{title}](<{url}f/p/{threadId}>) in "
+"{forumName}"
+msgstr ""
+
+#: extensions/base/discussions.py:220
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) created a quiz [{title}](<{url}f/p/{threadId}>) in "
+"{forumName}"
+msgstr ""
+
+#: extensions/base/discussions.py:234
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) created a [reply](<{url}f/p/{threadId}/r/{postId}>) "
+"to [{title}](<{url}f/p/{threadId}>) in {forumName}"
+msgstr ""
+
+#: extensions/base/discussions.py:292
+#, python-brace-format
+msgid "Created \"{title}\" on {user}'s Message Wall"
+msgstr ""
+
+#: extensions/base/discussions.py:298
+#, python-brace-format
+msgid "Replied to \"{title}\" on {user}'s Message Wall"
+msgstr ""
+
+#: extensions/base/discussions.py:312
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) created [{title}](<{url}wiki/Message_Wall:"
+"{user_wall}?threadId={threadId}>) on [{user}'s Message Wall](<{url}wiki/"
+"Message_Wall:{user_wall}>)"
+msgstr ""
+
+#: extensions/base/discussions.py:318
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) created a [reply](<{url}wiki/Message_Wall:"
+"{user_wall}?threadId={threadId}#{replyId}>) to [{title}](<{url}wiki/"
+"Message_Wall:{user_wall}?threadId={threadId}>) on [{user}'s Message Wall]"
+"(<{url}wiki/Message_Wall:{user_wall}>)"
+msgstr ""
+
+#: extensions/base/discussions.py:338
+#, python-brace-format
+msgid "Commented on {article}"
+msgstr ""
+
+#: extensions/base/discussions.py:344
+#, python-brace-format
+msgid "Replied to a comment on {article}"
+msgstr ""
+
+#: extensions/base/discussions.py:359
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) created a [comment](<{url}?commentId={commentId}>) "
+"on [{article}](<{url}>)"
+msgstr ""
+
+#: extensions/base/discussions.py:365
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) created a [reply](<{url}?commentId={commentId}"
+"&replyId={replyId}>) to a [comment](<{url}?commentId={commentId}>) on "
+"[{article}](<{url}>)"
+msgstr ""
+
+#: extensions/base/managewiki.py:34
+msgid "Changed wiki settings"
+msgstr ""
+
+#: extensions/base/managewiki.py:44
+#, python-brace-format
+msgid "[{author}]({author_url}) changed wiki settings{reason}"
+msgstr ""
+
+#: extensions/base/managewiki.py:55
+#, python-brace-format
+msgid "Deleted a \"{wiki}\" wiki"
+msgstr ""
+
+#: extensions/base/managewiki.py:55 extensions/base/managewiki.py:67
+#: extensions/base/managewiki.py:103 extensions/base/managewiki.py:112
+#: extensions/base/managewiki.py:125 extensions/base/managewiki.py:126
+#: extensions/base/managewiki.py:135 extensions/base/managewiki.py:136
+#: extensions/base/managewiki.py:148 extensions/base/managewiki.py:149
+#: extensions/base/managewiki.py:160 extensions/base/managewiki.py:161
+#: extensions/base/managewiki.py:195 extensions/base/managewiki.py:204
+#: extensions/base/managewiki.py:217 extensions/base/managewiki.py:226
+#: extensions/base/abusefilter.py:55 extensions/base/abusefilter.py:56
+#: extensions/base/abusefilter.py:57 extensions/base/abusefilter.py:68
+#: extensions/base/abusefilter.py:69 extensions/base/abusefilter.py:70
+#: extensions/base/mediawiki.py:743
+msgid "Unknown"
+msgstr ""
+
+#: extensions/base/managewiki.py:63
+#, python-brace-format
+msgid "[{author}]({author_url}) deleted a wiki *{wiki_name}*{comment}"
+msgstr ""
+
+#: extensions/base/managewiki.py:80
+#, python-brace-format
+msgid "Deleted a \"{group}\" user group"
+msgstr ""
+
+#: extensions/base/managewiki.py:89
+#, python-brace-format
+msgid "[{author}]({author_url}) deleted a usergroup *{group}*{comment}"
+msgstr ""
+
+#: extensions/base/managewiki.py:103
+#, python-brace-format
+msgid "Locked a \"{wiki}\" wiki"
+msgstr ""
+
+#: extensions/base/managewiki.py:111
+#, python-brace-format
+msgid "[{author}]({author_url}) locked a wiki *{wiki_name}*{comment}"
+msgstr ""
+
+#: extensions/base/managewiki.py:124
+#, python-brace-format
+msgid "Modified \"{namespace_name}\" namespace"
+msgstr ""
+
+#: extensions/base/managewiki.py:126 extensions/base/managewiki.py:149
+msgid "Wiki"
+msgstr ""
+
+#: extensions/base/managewiki.py:134
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) modified namespace *{namespace_name}* on "
+"*{wiki_name}*{comment}"
+msgstr ""
+
+#: extensions/base/managewiki.py:147
+#, python-brace-format
+msgid "Deleted a \"{namespace_name}\" namespace"
+msgstr ""
+
+#: extensions/base/managewiki.py:158
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) deleted a namespace *{namespace_name}* on "
+"*{wiki_name}*{comment}"
+msgstr ""
+
+#: extensions/base/managewiki.py:173
+#, python-brace-format
+msgid "Modified \"{usergroup_name}\" usergroup"
+msgstr ""
+
+#: extensions/base/managewiki.py:182
+#, python-brace-format
+msgid "[{author}]({author_url}) modified user group *{group_name}*{comment}"
+msgstr ""
+
+#: extensions/base/managewiki.py:195
+#, python-brace-format
+msgid "Undeleted a \"{wiki}\" wiki"
+msgstr ""
+
+#: extensions/base/managewiki.py:203
+#, python-brace-format
+msgid "[{author}]({author_url}) undeleted a wiki *{wiki_name}*{comment}"
+msgstr ""
+
+#: extensions/base/managewiki.py:217
+#, python-brace-format
+msgid "Unlocked a \"{wiki}\" wiki"
+msgstr ""
+
+#: extensions/base/managewiki.py:225
+#, python-brace-format
+msgid "[{author}]({author_url}) unlocked a wiki *{wiki_name}*{comment}"
+msgstr ""
+
+#: extensions/base/datadump.py:36
+#, python-brace-format
+msgid "Generated {file} dump"
+msgstr ""
+
+#: extensions/base/datadump.py:45
+#, python-brace-format
+msgid "[{author}]({author_url}) generated *{file}* dump{comment}"
+msgstr ""
+
+#: extensions/base/datadump.py:58
+#, python-brace-format
+msgid "Deleted {file} dump"
+msgstr ""
+
+#: extensions/base/datadump.py:67
+#, python-brace-format
+msgid "[{author}]({author_url}) deleted *{file}* dump{comment}"
+msgstr ""
+
+#: extensions/base/curseprofile.py:40
+#, python-brace-format
+msgid "Edited {target}'s profile"
+msgstr ""
+
+#: extensions/base/curseprofile.py:42
+msgid "Edited their own profile"
+msgstr ""
+
+#: extensions/base/curseprofile.py:44
+#, python-brace-format
+msgid "Cleared the {field} field"
+msgstr ""
+
+#: extensions/base/curseprofile.py:46
+#, python-brace-format
+msgid "{field} field changed to: {desc}"
+msgstr ""
+
+#: extensions/base/curseprofile.py:58
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) cleared the {field} on [{target}]({target_url})'s "
+"profile."
+msgstr ""
+
+#: extensions/base/curseprofile.py:60
+#, fuzzy, python-brace-format
+msgid ""
+"[{author}]({author_url}) edited the {field} on [{target}]({target_url})'s "
+"profile. *({desc})*"
+msgstr ""
+"[{author}]({author_url}) rearranged lettwers of [{article}]({edit_link})"
+"{comment} ({sign}{edit_size})"
+
+#: extensions/base/curseprofile.py:65
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) cleared the {field} on [their own]({target_url}) "
+"profile."
+msgstr ""
+
+#: extensions/base/curseprofile.py:67
+#, fuzzy, python-brace-format
+msgid ""
+"[{author}]({author_url}) edited the {field} on [their own]({target_url}) "
+"profile. *({desc})*"
+msgstr ""
+"[{author}]({author_url}) rearranged lettwers of [{article}]({edit_link})"
+"{comment} ({sign}{edit_size})"
+
+#: extensions/base/curseprofile.py:82
+#, python-brace-format
+msgid "Left a comment on {target}'s profile"
+msgstr ""
+
+#: extensions/base/curseprofile.py:84
+msgid "Left a comment on their own profile"
+msgstr ""
+
+#: extensions/base/curseprofile.py:97
+#, fuzzy, python-brace-format
+msgid ""
+"[{author}]({author_url}) left a [comment]({comment}) on {target}'s profile."
+msgstr ""
+"[{author}]({author_url}) rearranged lettwers of [{article}]({edit_link})"
+"{comment} ({sign}{edit_size})"
+
+#: extensions/base/curseprofile.py:100
+#, fuzzy, python-brace-format
+msgid ""
+"[{author}]({author_url}) left a [comment]({comment}) on their own profile."
+msgstr ""
+"[{author}]({author_url}) rearranged lettwers of [{article}]({edit_link})"
+"{comment} ({sign}{edit_size})"
+
+#: extensions/base/curseprofile.py:113
+#, python-brace-format
+msgid "Edited a comment on {target}'s profile"
+msgstr ""
+
+#: extensions/base/curseprofile.py:115
+msgid "Edited a comment on their own profile"
+msgstr ""
+
+#: extensions/base/curseprofile.py:128
+#, fuzzy, python-brace-format
+msgid ""
+"[{author}]({author_url}) edited a [comment]({comment}) on {target}'s profile."
+msgstr ""
+"[{author}]({author_url}) rearranged lettwers of [{article}]({edit_link})"
+"{comment} ({sign}{edit_size})"
+
+#: extensions/base/curseprofile.py:131
+#, fuzzy, python-brace-format
+msgid ""
+"[{author}]({author_url}) edited a [comment]({comment}) on their own profile."
+msgstr ""
+"[{author}]({author_url}) rearranged lettwers of [{article}]({edit_link})"
+"{comment} ({sign}{edit_size})"
+
+#: extensions/base/curseprofile.py:144
+#, python-brace-format
+msgid "Replied to a comment on {target}'s profile"
+msgstr ""
+
+#: extensions/base/curseprofile.py:146
+msgid "Replied to a comment on their own profile"
+msgstr ""
+
+#: extensions/base/curseprofile.py:159
+#, fuzzy, python-brace-format
+msgid ""
+"[{author}]({author_url}) replied to a [comment]({comment}) on {target}'s "
+"profile."
+msgstr ""
+"[{author}]({author_url}) rearranged lettwers of [{article}]({edit_link})"
+"{comment} ({sign}{edit_size})"
+
+#: extensions/base/curseprofile.py:162
+#, fuzzy, python-brace-format
+msgid ""
+"[{author}]({author_url}) replied to a [comment]({comment}) on their own "
+"profile."
+msgstr ""
+"[{author}]({author_url}) rearranged lettwers of [{article}]({edit_link})"
+"{comment} ({sign}{edit_size})"
+
+#: extensions/base/curseprofile.py:175
+#, python-brace-format
+msgid "Deleted a comment on {target}'s profile"
+msgstr ""
+
+#: extensions/base/curseprofile.py:177
+msgid "Deleted a comment on their own profile"
+msgstr ""
+
+#: extensions/base/curseprofile.py:197
+#, fuzzy, python-brace-format
+msgid ""
+"[{author}]({author_url}) deleted a [comment]({comment}) on {target}'s "
+"profile.{reason}"
+msgstr ""
+"[{author}]({author_url}) rearranged lettwers of [{article}]({edit_link})"
+"{comment} ({sign}{edit_size})"
+
+#: extensions/base/curseprofile.py:200
+#, fuzzy, python-brace-format
+msgid ""
+"[{author}]({author_url}) deleted a [comment]({comment}) on their own profile."
+"{reason}"
+msgstr ""
+"[{author}]({author_url}) rearranged lettwers of [{article}]({edit_link})"
+"{comment} ({sign}{edit_size})"
+
+#: extensions/base/curseprofile.py:214
+#, python-brace-format
+msgid "Purged a comment on {target}'s profile"
+msgstr ""
+
+#: extensions/base/curseprofile.py:216
+msgid "Purged a comment on their own profile"
+msgstr ""
+
+#: extensions/base/curseprofile.py:230
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) purged a comment on [{target}]({link})'s profile."
+"{reason}"
+msgstr ""
+
+#: extensions/base/curseprofile.py:233
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) purged a comment on [their own]({link}) profile."
+"{reason}"
+msgstr ""
+
+#: extensions/base/renameuser.py:38
+#, python-brace-format
+msgid "Renamed user \"{old_name}\" with {edits} edit to \"{new_name}\""
+msgid_plural "Renamed user \"{old_name}\" with {edits} edits to \"{new_name}\""
+msgstr[0] ""
+msgstr[1] ""
+
+#: extensions/base/renameuser.py:43
+#, python-brace-format
+msgid "Renamed user \"{old_name}\" to \"{new_name}\""
+msgstr ""
+
+#: extensions/base/renameuser.py:58
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) renamed user *{old_name}* with {edits} edit to "
+"[{new_name}]({link}){comment}"
+msgid_plural ""
+"[{author}]({author_url}) renamed user *{old_name}* with {edits} edits to "
+"[{new_name}]({link}){comment}"
+msgstr[0] ""
+msgstr[1] ""
+
+#: extensions/base/renameuser.py:66
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) renamed user *{old_name}* to [{new_name}]({link})"
+"{comment}"
+msgstr ""
+
+#: extensions/base/interwiki.py:37
+msgid "Added an entry to the interwiki table"
+msgstr ""
+
+#: extensions/base/interwiki.py:38 extensions/base/interwiki.py:65
+#, python-brace-format
+msgid "Prefix: {prefix}, website: {website} | {desc}"
+msgstr ""
+
+#: extensions/base/interwiki.py:50
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) added an entry to the [interwiki table]"
+"({table_url}) pointing to {website} with {prefix} prefix"
+msgstr ""
+
+#: extensions/base/interwiki.py:64
+msgid "Edited an entry in interwiki table"
+msgstr ""
+
+#: extensions/base/interwiki.py:77
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) edited an entry in [interwiki table]({table_url}) "
+"pointing to {website} with {prefix} prefix"
+msgstr ""
+
+#: extensions/base/interwiki.py:91
+msgid "Deleted an entry in interwiki table"
+msgstr ""
+
+#: extensions/base/interwiki.py:92
+#, python-brace-format
+msgid "Prefix: {prefix} | {desc}"
+msgstr ""
+
+#: extensions/base/interwiki.py:102
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) deleted an entry in [interwiki table]({table_url})"
+"{desc}"
+msgstr ""
+
+#: extensions/base/abusefilter.py:29
+msgid "None"
+msgstr ""
+
+#: extensions/base/abusefilter.py:29
+msgid "Warning issued"
+msgstr ""
+
+#: extensions/base/abusefilter.py:29
+msgid "**Blocked user**"
+msgstr ""
+
+#: extensions/base/abusefilter.py:29
+msgid "Tagged the edit"
+msgstr ""
+
+#: extensions/base/abusefilter.py:29
+msgid "Disallowed the action"
+msgstr ""
+
+#: extensions/base/abusefilter.py:29
+msgid "**IP range blocked**"
+msgstr ""
+
+#: extensions/base/abusefilter.py:29
+msgid "Throttled actions"
+msgstr ""
+
+#: extensions/base/abusefilter.py:29
+msgid "Removed autoconfirmed group"
+msgstr ""
+
+#: extensions/base/abusefilter.py:29
+msgid "**Removed from privileged groups**"
+msgstr ""
+
+#: extensions/base/abusefilter.py:30
+msgid "Edit"
+msgstr ""
+
+#: extensions/base/abusefilter.py:30
+msgid "Upload"
+msgstr ""
+
+#: extensions/base/abusefilter.py:30
+msgid "Move"
+msgstr ""
+
+#: extensions/base/abusefilter.py:30
+msgid "Stash upload"
+msgstr ""
+
+#: extensions/base/abusefilter.py:30
+msgid "Deletion"
+msgstr ""
+
+#: extensions/base/abusefilter.py:30
+msgid "Account creation"
+msgstr ""
+
+#: extensions/base/abusefilter.py:30
+msgid "Auto account creation"
+msgstr ""
+
+#: extensions/base/abusefilter.py:54
+#, python-brace-format
+msgid "{user} triggered \"{abuse_filter}\""
+msgstr ""
+
+#: extensions/base/abusefilter.py:55
+msgid "Performed"
+msgstr ""
+
+#: extensions/base/abusefilter.py:56
+msgid "Action taken"
+msgstr ""
+
+#: extensions/base/abusefilter.py:57
+msgid "Title"
+msgstr ""
+
+#: extensions/base/abusefilter.py:66
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) triggered *{abuse_filter}*, performing the action "
+"\"{action}\" on *[{target}]({target_url})* - action taken: {result}."
+msgstr ""
+
+#: extensions/base/abusefilter.py:83
+#, python-brace-format
+msgid "Edited abuse filter number {number}"
+msgstr ""
+
+#: extensions/base/abusefilter.py:95
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) edited abuse filter [number {number}]({filter_url})"
+msgstr ""
+
+#: extensions/base/abusefilter.py:111
+#, python-brace-format
+msgid "Created abuse filter number {number}"
+msgstr ""
+
+#: extensions/base/abusefilter.py:119
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) created abuse filter [number {number}]({filter_url})"
+msgstr ""
+
+#: extensions/base/mediawiki.py:37
+msgid "director"
+msgstr ""
+
+#: extensions/base/mediawiki.py:37
+msgid "bot"
+msgstr "robut"
+
+#: extensions/base/mediawiki.py:37
+msgid "editor"
+msgstr "editur"
+
+#: extensions/base/mediawiki.py:37
+msgid "directors"
+msgstr "directurs"
+
+#: extensions/base/mediawiki.py:37
+msgid "sysop"
+msgstr "admen"
+
+#: extensions/base/mediawiki.py:37
+msgid "bureaucrat"
+msgstr "burocrat"
+
+#: extensions/base/mediawiki.py:37
+msgid "reviewer"
+msgstr "reviver"
+
+#: extensions/base/mediawiki.py:38
+msgid "autoreview"
+msgstr "autureviver"
+
+#: extensions/base/mediawiki.py:38
+msgid "autopatrol"
+msgstr ""
+
+#: extensions/base/mediawiki.py:38
+msgid "wiki_guardian"
+msgstr ""
+
+#: extensions/base/mediawiki.py:70
+msgid "(N!) "
+msgstr ""
+
+#: extensions/base/mediawiki.py:71
+msgid "m"
+msgstr ""
+
+#: extensions/base/mediawiki.py:72
+msgid "b"
+msgstr ""
+
+#: extensions/base/mediawiki.py:112
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) edited [{article}]({edit_link}){comment} {bold}"
+"({sign}{edit_size}){bold}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:117
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) created [{article}]({edit_link}){comment} {bold}"
+"({sign}{edit_size}){bold}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:190 extensions/base/mediawiki.py:223
+msgid "Options"
+msgstr ""
+
+#: extensions/base/mediawiki.py:190
+#, python-brace-format
+msgid "([preview]({link}) | [undo]({undolink}))"
+msgstr ""
+
+#: extensions/base/mediawiki.py:195
+#, python-brace-format
+msgid "Uploaded a new version of {name}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:197
+#, python-brace-format
+msgid "Reverted a version of {name}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:199
+#, python-brace-format
+msgid "Uploaded {name}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:208
+msgid "**No license!**"
+msgstr ""
+
+#: extensions/base/mediawiki.py:223
+#, python-brace-format
+msgid "([preview]({link}))"
+msgstr ""
+
+#: extensions/base/mediawiki.py:228
+msgid ""
+"\n"
+"License: {}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:237
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) reverted a version of [{file}]({file_link}){comment}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:248
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) uploaded a new version of [{file}]({file_link})"
+"{comment}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:259
+#, python-brace-format
+msgid "[{author}]({author_url}) uploaded [{file}]({file_link}){comment}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:274
+#, python-brace-format
+msgid "Deleted page {article}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:283
+#, python-brace-format
+msgid "[{author}]({author_url}) deleted [{page}]({page_link}){comment}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:298
+#, python-brace-format
+msgid "Deleted redirect {article} by overwriting"
+msgstr ""
+
+#: extensions/base/mediawiki.py:308
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) deleted redirect by overwriting [{page}]"
+"({page_link}){comment}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:322
+#, python-brace-format
+msgid "Restored {article}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:331
+#, python-brace-format
+msgid "[{author}]({author_url}) restored [{article}]({article_url}){comment}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:348
+msgid "Changed visibility of log events"
+msgstr ""
+
+#: extensions/base/mediawiki.py:356
+#, python-brace-format
+msgid "[{author}]({author_url}) changed visibility of log events{comment}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:370
+#, python-brace-format
+msgid "Changed visibility of revision on page {article} "
+msgid_plural "Changed visibility of {amount} revisions on page {article} "
+msgstr[0] ""
+msgstr[1] ""
+
+#: extensions/base/mediawiki.py:383
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) changed visibility of revision on page [{article}]"
+"({article_url}){comment}"
+msgid_plural ""
+"[{author}]({author_url}) changed visibility of {amount} revisions on page "
+"[{article}]({article_url}){comment}"
+msgstr[0] ""
+msgstr[1] ""
+
+#: extensions/base/mediawiki.py:399 extensions/base/mediawiki.py:432
+msgid "No redirect has been made"
+msgstr ""
+
+#: extensions/base/mediawiki.py:400 extensions/base/mediawiki.py:433
+msgid "A redirect has been made"
+msgstr ""
+
+#: extensions/base/mediawiki.py:401
+#, python-brace-format
+msgid "Moved {redirect}{article} to {target}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:412 extensions/base/mediawiki.py:444
+msgid "without making a redirect"
+msgstr ""
+
+#: extensions/base/mediawiki.py:413 extensions/base/mediawiki.py:445
+msgid "with a redirect"
+msgstr ""
+
+#: extensions/base/mediawiki.py:416
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) moved {redirect}*{article}* to [{target}]"
+"({target_url}) {made_a_redirect}{comment}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:434
+#, python-brace-format
+msgid "Moved {redirect}{article} to {title} over redirect"
+msgstr ""
+
+#: extensions/base/mediawiki.py:448
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) moved {redirect}*{article}* over redirect to "
+"[{target}]({target_url}) {made_a_redirect}{comment}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:464
+#, python-brace-format
+msgid "Moved protection settings from {redirect}{article} to {title}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:477
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) moved protection settings from {redirect}*{article}"
+"* to [{target}]({target_url}){comment}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:492
+#, python-brace-format
+msgid "Protected {target}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:495 extensions/base/mediawiki.py:510
+#: extensions/base/mediawiki.py:526 extensions/base/mediawiki.py:541
+msgid " [cascading]"
+msgstr ""
+
+#: extensions/base/mediawiki.py:506
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) protected [{article}]({article_url}) with the "
+"following settings: {settings}{comment}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:523
+#, python-brace-format
+msgid "Changed protection level for {article}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:537
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) modified protection settings of [{article}]"
+"({article_url}) to: {settings}{comment}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:554
+#, python-brace-format
+msgid "Removed protection from {article}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:563
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) removed protection from [{article}]({article_url})"
+"{comment}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:572
+msgid "for infinity and beyond"
+msgstr ""
+
+#: extensions/base/mediawiki.py:581
+msgid "for less than a minute"
+msgstr ""
+
+#: extensions/base/mediawiki.py:583
+msgid "year"
+msgid_plural "years"
+msgstr[0] ""
+msgstr[1] ""
+
+#: extensions/base/mediawiki.py:583
+msgid "day"
+msgid_plural "days"
+msgstr[0] ""
+msgstr[1] ""
+
+#: extensions/base/mediawiki.py:583
+msgid "hour"
+msgid_plural "hours"
+msgstr[0] ""
+msgstr[1] ""
+
+#: extensions/base/mediawiki.py:584
+msgid "minute"
+msgid_plural "minutes"
+msgstr[0] ""
+msgstr[1] ""
+
+#: extensions/base/mediawiki.py:589
+#, python-brace-format
+msgid "for {time_number} {time_unit}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:608
+msgid "Blocked from editing the following pages: "
+msgstr ""
+
+#: extensions/base/mediawiki.py:615 extensions/base/mediawiki.py:661
+msgid " and namespaces: "
+msgstr ""
+
+#: extensions/base/mediawiki.py:617
+msgid "Blocked from editing pages on following namespaces: "
+msgstr ""
+
+#: extensions/base/mediawiki.py:628
+msgid "Partial block details"
+msgstr ""
+
+#: extensions/base/mediawiki.py:631
+msgid "Block flags"
+msgstr ""
+
+#: extensions/base/mediawiki.py:633
+#, python-brace-format
+msgid "Blocked {blocked_user} {time}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:653
+msgid " on pages: "
+msgstr ""
+
+#: extensions/base/mediawiki.py:663
+msgid " on namespaces: "
+msgstr ""
+
+#: extensions/base/mediawiki.py:675
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) blocked [{user}]({user_url}) {time}"
+"{restriction_desc}{comment}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:693
+#, python-brace-format
+msgid "Changed block settings for {blocked_user}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:703
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) changed block settings for [{blocked_user}]"
+"({user_url}){comment}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:716
+#, python-brace-format
+msgid "Unblocked {blocked_user}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:726
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) unblocked [{blocked_user}]({user_url}){comment}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:742
+msgid "Action has been hidden by administration"
+msgstr ""
+
+#: extensions/base/mediawiki.py:749
+msgid "An action has been hidden by administration."
+msgstr ""
+
+#: extensions/base/mediawiki.py:760
+#, python-brace-format
+msgid "Imported {article} with {count} revision"
+msgid_plural "Imported {article} with {count} revisions"
+msgstr[0] ""
+msgstr[1] ""
+
+#: extensions/base/mediawiki.py:771
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) imported [{article}]({article_url}) with {count} "
+"revision{comment}"
+msgid_plural ""
+"[{author}]({author_url}) imported [{article}]({article_url}) with {count} "
+"revisions{comment}"
+msgstr[0] ""
+msgstr[1] ""
+
+#: extensions/base/mediawiki.py:787
+#, python-brace-format
+msgid "Imported {article} with {count} revision from \"{source}\""
+msgid_plural "Imported {article} with {count} revisions from \"{source}\""
+msgstr[0] ""
+msgstr[1] ""
+
+#: extensions/base/mediawiki.py:802
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) imported [{article}]({article_url}) with {count} "
+"revision from [{source}]({source_url}){comment}"
+msgid_plural ""
+"[{author}]({author_url}) imported [{article}]({article_url}) with {count} "
+"revisions from [{source}]({source_url}){comment}"
+msgstr[0] ""
+msgstr[1] ""
+
+#: extensions/base/mediawiki.py:817
+#, python-brace-format
+msgid " (until {date_and_time})"
+msgstr ""
+
+#: extensions/base/mediawiki.py:834
+#, python-brace-format
+msgid "Changed group membership for {target}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:836
+msgid "System"
+msgstr ""
+
+#: extensions/base/mediawiki.py:837
+#, python-brace-format
+msgid "{target} got autopromoted to a new usergroup"
+msgstr ""
+
+#: extensions/base/mediawiki.py:843
+msgid "Added group"
+msgid_plural "Added groups"
+msgstr[0] ""
+msgstr[1] ""
+
+#: extensions/base/mediawiki.py:845
+msgid "Removed group"
+msgid_plural "Removed groups"
+msgstr[0] ""
+msgstr[1] ""
+
+#: extensions/base/mediawiki.py:859
+#, python-brace-format
+msgid "Added to {added} and removed from {removed}."
+msgstr ""
+
+#: extensions/base/mediawiki.py:860 extensions/base/mediawiki.py:862
+#: extensions/base/mediawiki.py:864 extensions/base/mediawiki.py:871
+msgid ", "
+msgstr ""
+
+#: extensions/base/mediawiki.py:862
+#, python-brace-format
+msgid "Added to {added}."
+msgstr ""
+
+#: extensions/base/mediawiki.py:864
+#, python-brace-format
+msgid "Removed from {removed}."
+msgstr ""
+
+#: extensions/base/mediawiki.py:865
+#, fuzzy, python-brace-format
+msgid ""
+"[{author}]({author_url}) changed group membership for [{target}]"
+"({target_url}): {group_changes}{comment}"
+msgstr ""
+"[{author}]({author_url}) rearranged lettwers of [{article}]({edit_link})"
+"{comment} ({sign}{edit_size})"
+
+#: extensions/base/mediawiki.py:869
+#, python-brace-format
+msgid "The system autopromoted [{target}]({target_url}) to {added}.{comment}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:882
+#, python-brace-format
+msgid "Merged revision histories of {article} into {dest}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:896
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) merged revision histories of [{article}]"
+"({article_url}) into [{dest}]({dest_url}){comment}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:910
+msgid "Created account automatically"
+msgstr ""
+
+#: extensions/base/mediawiki.py:917
+#, python-brace-format
+msgid "Account [{author}]({author_url}) was created automatically"
+msgstr ""
+
+#: extensions/base/mediawiki.py:930 extensions/base/mediawiki.py:995
+msgid "Created account"
+msgstr ""
+
+#: extensions/base/mediawiki.py:937 extensions/base/mediawiki.py:1002
+#, python-brace-format
+msgid "Account [{author}]({author_url}) was created"
+msgstr ""
+
+#: extensions/base/mediawiki.py:949
+#, python-brace-format
+msgid "Created account {article}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:958
+#, python-brace-format
+msgid ""
+"Account [{article}]({article_url}) was created by [{author}]({author_url})"
+"{comment}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:971
+#, python-brace-format
+msgid "Created account {article} and password was sent by email"
+msgstr ""
+
+#: extensions/base/mediawiki.py:982
+#, python-brace-format
+msgid ""
+"Account [{article}]({article_url}) was created by [{author}]({author_url}) "
+"and password was sent by email{comment}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:1014
+#, python-brace-format
+msgid "Changed the content model of the page {article}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:1016
+#, python-brace-format
+msgid "Model changed from {old} to {new}: {reason}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:1028
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) changed the content model of the page [{article}]"
+"({article_url}) from {old} to {new}{comment}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:1043
+#, python-brace-format
+msgid "Created the page {article} using a non-default content model"
+msgstr ""
+
+#: extensions/base/mediawiki.py:1045
+#, python-brace-format
+msgid "Created with model {new}: {reason}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:1056
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) created the page [{article}]({article_url}) using a "
+"non-default content model {new}{comment}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:1071
+#, python-brace-format
+msgid "Created the tag \"{tag}\""
+msgstr ""
+
+#: extensions/base/mediawiki.py:1081
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) created the [tag]({tag_url}) \"{tag}\"{comment}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:1102
+#, python-brace-format
+msgid "Deleted the tag \"{tag}\""
+msgstr ""
+
+#: extensions/base/mediawiki.py:1104
+msgid "Removed from"
+msgstr ""
+
+#: extensions/base/mediawiki.py:1104
+msgid "{} revision or log entry"
+msgid_plural "{} revisions and/or log entries"
+msgstr[0] ""
+msgstr[1] ""
+
+#: extensions/base/mediawiki.py:1117
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) deleted the [tag]({tag_url}) \"{tag}\"{comment}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:1127
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) deleted the [tag]({tag_url}) \"{tag}\" and removed "
+"it from {count} revision or log entry{comment}"
+msgid_plural ""
+"[{author}]({author_url}) deleted the [tag]({tag_url}) \"{tag}\" and removed "
+"it from {count} revisions and/or log entries{comment}"
+msgstr[0] ""
+msgstr[1] ""
+
+#: extensions/base/mediawiki.py:1144
+#, python-brace-format
+msgid "Activated the tag \"{tag}\""
+msgstr ""
+
+#: extensions/base/mediawiki.py:1153
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) activated the [tag]({tag_url}) \"{tag}\"{comment}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:1172
+#, python-brace-format
+msgid "Deactivated the tag \"{tag}\""
+msgstr ""
+
+#: extensions/base/mediawiki.py:1181
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) deactivated the [tag]({tag_url}) \"{tag}\"{comment}"
+msgstr ""
+
+#: extensions/base/sprite.py:37
+#, python-brace-format
+msgid "Edited the sprite for {article}"
+msgstr ""
+
+#: extensions/base/sprite.py:45
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) edited the sprite for [{article}]({article_url})"
+msgstr ""
+
+#: extensions/base/sprite.py:60
+#, python-brace-format
+msgid "Created the sprite sheet for {article}"
+msgstr ""
+
+#: extensions/base/sprite.py:68
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) created the sprite sheet for [{article}]"
+"({article_url})"
+msgstr ""
+
+#: extensions/base/sprite.py:79
+#, python-brace-format
+msgid "Edited the slice for {article}"
+msgstr ""
+
+#: extensions/base/sprite.py:86
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) edited the slice for [{article}]({article_url})"
+msgstr ""
+
+#, python-brace-format
+#~ msgid "{value} (avg. {avg})"
+#~ msgstr "{value} (mor or less. {avg})"
+
+#~ msgid "Daily overview"
+#~ msgstr "Morn' newz"
+
+#~ msgid "No activity"
+#~ msgstr "No food"
+
+#~ msgid " ({} action)"
+#~ msgid_plural " ({} actions)"
+#~ msgstr[0] " ({} action)"
+#~ msgstr[1] " ({} actionz)"
+
+#~ msgid " UTC ({} action)"
+#~ msgid_plural " UTC ({} actions)"
+#~ msgstr[0] " UTC ({} action)"
+#~ msgstr[1] " UTC ({} actionz)"
+
+#~ msgid "But nobody came"
+#~ msgstr "No one brot food 😾"
+
+#~ msgid "Most active user"
+#~ msgid_plural "Most active users"
+#~ msgstr[0] "Most skilld cat"
+#~ msgstr[1] "Most skilld cats"
+
+#~ msgid "Edits made"
+#~ msgstr "edtz did"
+
+#~ msgid "New files"
+#~ msgstr "new picturz"
+
+#~ msgid "Location"
+#~ msgstr "Der place"
+
+#~ msgid "About me"
+#~ msgstr "Abot me"
diff --git a/locale/lol/LC_MESSAGES/misc.po b/locale/lol/LC_MESSAGES/misc.po
index d23c546..0fe34b9 100644
--- a/locale/lol/LC_MESSAGES/misc.po
+++ b/locale/lol/LC_MESSAGES/misc.po
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: RcGcDw\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2020-11-28 23:45+0100\n"
+"POT-Creation-Date: 2021-07-11 14:32+0200\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: Automatically generated\n"
"Language-Team: none\n"
@@ -68,16 +68,16 @@ msgstr ""
msgid "Battle.net handle"
msgstr ""
-#: src/misc.py:119
+#: src/misc.py:139
msgid ""
"\n"
"__And more__"
msgstr ""
-#: src/misc.py:276
+#: src/misc.py:328
msgid "Unknown"
msgstr ""
-#: src/misc.py:278
+#: src/misc.py:330
msgid "unknown"
msgstr ""
diff --git a/locale/lol/LC_MESSAGES/rc_formatters.mo b/locale/lol/LC_MESSAGES/rc_formatters.mo
deleted file mode 100644
index 3cc19c3..0000000
Binary files a/locale/lol/LC_MESSAGES/rc_formatters.mo and /dev/null differ
diff --git a/locale/lol/LC_MESSAGES/rcgcdw.po b/locale/lol/LC_MESSAGES/rcgcdw.po
index 1a6964d..475b29c 100644
--- a/locale/lol/LC_MESSAGES/rcgcdw.po
+++ b/locale/lol/LC_MESSAGES/rcgcdw.po
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2020-12-23 00:28+0100\n"
+"POT-Creation-Date: 2021-07-11 14:32+0200\n"
"PO-Revision-Date: 2020-08-16 19:13+0000\n"
"Last-Translator: Frisk The Evil Goat Overlord <>\n"
"Language-Team: Lolcat , YEAR.
-#
-msgid ""
-msgstr ""
-"Project-Id-Version: \n"
-"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2020-12-23 00:28+0100\n"
-"PO-Revision-Date: 2020-12-13 14:30+0000\n"
-"Last-Translator: MarkusRost \n"
-"Language-Team: Polish \n"
-"Language: pl\n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=UTF-8\n"
-"Content-Transfer-Encoding: 8bit\n"
-"Plural-Forms: nplurals=3; plural=n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 "
-"|| n%100>=20) ? 1 : 2;\n"
-"X-Generator: Weblate 4.2.1\n"
-
-#: src/discussion_formatters.py:21 src/discussion_formatters.py:56
-#: src/discussion_formatters.py:67 src/discussion_formatters.py:95
-#: src/discussion_formatters.py:163 src/discussion_formatters.py:176
-msgid "unknown"
-msgstr "nieznany"
-
-#: src/discussion_formatters.py:27 src/discussion_formatters.py:102
-msgid "Unregistered user"
-msgstr "Niezarejestrowany użytkownik"
-
-#: src/discussion_formatters.py:39
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) created [{title}](<{url}f/p/{threadId}>) in "
-"{forumName}"
-msgstr ""
-"[{author}]({author_url}) stworzył(a) [{title}](<{url}f/p/{threadId}>) w "
-"{forumName}"
-
-#: src/discussion_formatters.py:42
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) created a poll [{title}](<{url}f/p/{threadId}>) in "
-"{forumName}"
-msgstr ""
-"[{author}]({author_url}) stworzył(a) ankietę [{title}](<{url}f/p/{threadId}"
-">) w {forumName}"
-
-#: src/discussion_formatters.py:45
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) created a quiz [{title}](<{url}f/p/{threadId}>) in "
-"{forumName}"
-msgstr ""
-"[{author}]({author_url}) stworzył(a) quiz [{title}](<{url}f/p/{threadId}>) w "
-"{forumName}"
-
-#: src/discussion_formatters.py:54
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) created a [reply](<{url}f/p/{threadId}/r/{postId}>) "
-"to [{title}](<{url}f/p/{threadId}>) in {forumName}"
-msgstr ""
-"[{author}]({author_url}) dodał(a) [odpowiedź](<{url}f/p/{threadId}/r/{postId}"
-">) pod tematem [{title}](<{url}f/p/{threadId}>) w {forumName}"
-
-#: src/discussion_formatters.py:61
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) created [{title}](<{url}wiki/Message_Wall:"
-"{user_wall}?threadId={threadId}>) on [{user}'s Message Wall](<{url}wiki/"
-"Message_Wall:{user_wall}>)"
-msgstr ""
-"[{author}]({author_url}) zostawił(a) [{title}](<{url}wiki/Message_Wall:"
-"{user_wall}?threadId={threadId}>) na [tablicy wiadomości {user}](<{url}wiki/"
-"Message_Wall:{user_wall}>)"
-
-#: src/discussion_formatters.py:64
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) created a [reply](<{url}wiki/Message_Wall:"
-"{user_wall}?threadId={threadId}#{replyId}>) to [{title}](<{url}wiki/"
-"Message_Wall:{user_wall}?threadId={threadId}>) on [{user}'s Message Wall]"
-"(<{url}wiki/Message_Wall:{user_wall}>)"
-msgstr ""
-"[{author}]({author_url}) dodał(a) [odpowiedź](<{url}wiki/Message_Wall:"
-"{user_wall}?threadId={threadId}#{replyId}>) do [{title}](<{url}wiki/"
-"Message_Wall:{user_wall}?threadId={threadId}>) na [tablicy wiadomości {user}]"
-"(<{url}wiki/Message_Wall:{user_wall}>)"
-
-#: src/discussion_formatters.py:72
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) created a [comment](<{url}?commentId={commentId}>) "
-"on [{article}](<{url}>)"
-msgstr ""
-"[{author}]({author_url}) dodał(a) [komentarz](<{url}?commentId={commentId}>) "
-"w [{article}](<{url}>)"
-
-#: src/discussion_formatters.py:78
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) created a [reply](<{url}?commentId={commentId}"
-"&replyId={replyId}>) to a [comment](<{url}?commentId={commentId}>) on "
-"[{article}](<{url}>)"
-msgstr ""
-"[{author}]({author_url}) dodał(a) [odpowiedź](<{url}?commentId={commentId}"
-"&replyId={replyId}>) na [komentarz](<{url}?commentId={commentId}>) w "
-"artykule [{article}](<{url}>)"
-
-#: src/discussion_formatters.py:86
-#, python-brace-format
-msgid ""
-"Unknown event `{event}` by [{author}]({author_url}), report it on the "
-"[support server](<{support}>)."
-msgstr ""
-"Nieznane wydarzenie `{event}` wykonane przez [{author}]({author_url}), zgłoś "
-"je na [serwerze wsparcia](<{support}>)."
-
-#: src/discussion_formatters.py:123
-#, python-brace-format
-msgid "Created \"{title}\""
-msgstr "Stworzył(a) „{title}”"
-
-#: src/discussion_formatters.py:127
-#, python-brace-format
-msgid "Created a poll \"{title}\""
-msgstr "Stworzył(a) ankietę zatytułowaną „{title}”"
-
-#: src/discussion_formatters.py:134
-msgid "Option {}"
-msgstr "Opcja {}"
-
-#: src/discussion_formatters.py:135
-#, python-brace-format
-msgid "__[View image]({image_url})__"
-msgstr "__[Zobacz zdjęcie]({image_url})__"
-
-#: src/discussion_formatters.py:139
-#, python-brace-format
-msgid "Created a quiz \"{title}\""
-msgstr "Stworzył(a) quiz „{title}”"
-
-#: src/discussion_formatters.py:155 src/discussion_formatters.py:157
-msgid "Tags"
-msgstr "Fora"
-
-#: src/discussion_formatters.py:155
-msgid "{} tags"
-msgstr "{} tagów"
-
-#: src/discussion_formatters.py:160
-#, python-brace-format
-msgid "Replied to \"{title}\""
-msgstr "Odpowiedział(a) w „{title}”"
-
-#: src/discussion_formatters.py:169
-#, python-brace-format
-msgid "Created \"{title}\" on {user}'s Message Wall"
-msgstr "Stworzył(a) „{title}” na tablicy wiadomości {user}"
-
-#: src/discussion_formatters.py:173
-#, python-brace-format
-msgid "Replied to \"{title}\" on {user}'s Message Wall"
-msgstr "Odpowiedział(a) na „{title}” z tablicy wiadomości {user}"
-
-#: src/discussion_formatters.py:180
-#, python-brace-format
-msgid "Commented on {article}"
-msgstr "Skomentował(a) „{article}”"
-
-#: src/discussion_formatters.py:184
-#, python-brace-format
-msgid "Replied to a comment on {article}"
-msgstr "Odpowiedział(a) na komentarz w „{article}”"
-
-#: src/discussion_formatters.py:188
-#, python-brace-format
-msgid "Unknown event `{event}`"
-msgstr "Nieznane wydarzenie `{event}`"
-
-#: src/discussion_formatters.py:194 src/discussion_formatters.py:196
-msgid "Report this on the support server"
-msgstr "Zgłoś to na serwerze wsparcia"
diff --git a/locale/pl/LC_MESSAGES/formatters.mo b/locale/pl/LC_MESSAGES/formatters.mo
new file mode 100644
index 0000000..4eec8f3
Binary files /dev/null and b/locale/pl/LC_MESSAGES/formatters.mo differ
diff --git a/locale/pl/LC_MESSAGES/formatters.po b/locale/pl/LC_MESSAGES/formatters.po
new file mode 100644
index 0000000..d776626
--- /dev/null
+++ b/locale/pl/LC_MESSAGES/formatters.po
@@ -0,0 +1,2012 @@
+# #-#-#-#-# rcgcdw.po (RcGcDw) #-#-#-#-#
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR ORGANIZATION
+# FIRST AUTHOR , YEAR.
+#
+# #-#-#-#-# formatters.po (RcGcDw) #-#-#-#-#
+# #-#-#-#-# discussion_formatters.po #-#-#-#-#
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR , YEAR.
+#
+# #-#-#-#-# rc_formatters.po (RcGcDw) #-#-#-#-#
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR ORGANIZATION
+# FIRST AUTHOR , YEAR.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: RcGcDw\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2021-07-11 14:32+0200\n"
+"PO-Revision-Date: 2021-07-11 12:33+0000\n"
+"Last-Translator: Frisk The Evil Goat Overlord \n"
+"Language-Team: Polish \n"
+"Language: pl\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=3; plural=n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 "
+"|| n%100>=20) ? 1 : 2;\n"
+"X-Generator: Weblate 4.6.2\n"
+"Generated-By: pygettext.py 1.5\n"
+
+#: src/api/util.py:61 src/api/util.py:66
+msgid "__Only whitespace__"
+msgstr "__Tylko znaki niedrukowane__"
+
+#: src/api/util.py:71
+msgid "Removed"
+msgstr "Usunięto"
+
+#: src/api/util.py:73
+msgid "Added"
+msgstr "Dodano"
+
+#: src/api/util.py:94 src/api/util.py:126 src/api/util.py:133
+#: src/api/util.py:141 extensions/base/discussions.py:247
+#: extensions/base/discussions.py:264 extensions/base/abusefilter.py:45
+msgid "Unregistered user"
+msgstr "Niezarejestrowany użytkownik"
+
+#: src/api/util.py:160
+msgctxt "recent changes Tags"
+msgid "Tags"
+msgstr "Tagi"
+
+#: src/api/util.py:162
+msgid "**Added**: "
+msgstr "**Dodane**: "
+
+#: src/api/util.py:163
+msgid " and {} more\n"
+msgstr " oraz {} innych\n"
+
+#: src/api/util.py:165
+msgid "**Removed**: "
+msgstr "**Usunięte**: "
+
+#: src/api/util.py:166
+msgid " and {} more"
+msgstr " oraz {} innych"
+
+#: src/api/util.py:168
+msgid "Changed categories"
+msgstr "Zmienione kategorie"
+
+#: extensions/base/cargo.py:37
+#, python-brace-format
+msgid "Created the Cargo table \"{table}\""
+msgstr "Utworzono tabelę Cargo „{table}”"
+
+#: extensions/base/cargo.py:45
+#, python-brace-format
+msgid "[{author}]({author_url}) created the Cargo table \"{table}\""
+msgstr "[{author}]({author_url}) utworzył(a) tabelę Cargo „{table}”"
+
+#: extensions/base/cargo.py:60
+#, python-brace-format
+msgid "Recreated the Cargo table \"{table}\""
+msgstr "Utworzono ponownie tabelę Cargo „{table}”"
+
+#: extensions/base/cargo.py:68
+#, python-brace-format
+msgid "[{author}]({author_url}) recreated the Cargo table \"{table}\""
+msgstr "[{author}]({author_url}) utworzył(a) ponownie tabelę Cargo „{table}”"
+
+#: extensions/base/cargo.py:83
+#, python-brace-format
+msgid "Replaced the Cargo table \"{table}\""
+msgstr "Zastąpiono tabelę Cargo „{table}”"
+
+#: extensions/base/cargo.py:91
+#, python-brace-format
+msgid "[{author}]({author_url}) replaced the Cargo table \"{table}\""
+msgstr "[{author}]({author_url}) zastąpił(a) tabelę Cargo „{table}”"
+
+#: extensions/base/cargo.py:105
+#, python-brace-format
+msgid "Deleted the Cargo table \"{table}\""
+msgstr "Usunięto tabelę Cargo „{table}”"
+
+#: extensions/base/cargo.py:112
+#, python-brace-format
+msgid "[{author}]({author_url}) deleted the Cargo table \"{table}\""
+msgstr "[{author}]({author_url}) usunął tabelę Cargo „{table}”"
+
+#: extensions/base/translate.py:41
+#, python-brace-format
+msgid "Marked \"{article}\" for translation"
+msgstr "Oznaczono „{article}” do tłumaczenia"
+
+#: extensions/base/translate.py:55
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) marked [{article}]({article_url}) for "
+"translation{comment}"
+msgstr ""
+"[{author}]({author_url}) oznaczył(a) [{article}]({article_url}) do "
+"tłumaczenia{comment}"
+
+#: extensions/base/translate.py:70
+#, python-brace-format
+msgid "Removed \"{article}\" from the translation system"
+msgstr "Usunięto „{article}” z systemu tłumaczeń"
+
+#: extensions/base/translate.py:80
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) removed [{article}]({article_url}) from the "
+"translation system{comment}"
+msgstr ""
+"[{author}]({author_url}) usunął/usunęła [{article}]({article_url}) z systemu "
+"tłumaczeń{comment}"
+
+#: extensions/base/translate.py:95
+#, python-brace-format
+msgid "Completed moving translation pages from \"{article}\" to \"{target}\""
+msgstr "Zakończono przenoszenie stron tłumaczeń z „{article}” do „{target}”"
+
+#: extensions/base/translate.py:106
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) completed moving translation pages from *{article}* "
+"to [{target}]({target_url}){comment}"
+msgstr ""
+"[{author}]({author_url}) zakończył(a) przenoszenie stron tłumaczeń z "
+"*{article}* do [{target}]({target_url}){comment}"
+
+#: extensions/base/translate.py:121
+#, python-brace-format
+msgid "Encountered a problem while moving \"{article}\" to \"{target}\""
+msgstr "Napotkano problem podczas przenoszenia „{article}” do „{target}”"
+
+#: extensions/base/translate.py:133
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) encountered a problem while moving [{article}]"
+"({article_url}) to [{target}]({target_url}){comment}"
+msgstr ""
+"[{author}]({author_url}) napotkał(a) problem podczas przenoszenia [{article}]"
+"({article_url}) do [{target}]({target_url}){comment}"
+
+#: extensions/base/translate.py:149
+#, python-brace-format
+msgid ""
+"Failed to delete \"{article}\" which belongs to translatable page "
+"\"{target}\""
+msgstr ""
+"Usuwanie „{article}” należącego do tłumaczonej strony „{target}” nie "
+"powiodło się"
+
+#: extensions/base/translate.py:161
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) failed to delete [{article}]({article_url}) which "
+"belongs to translatable page [{target}]({target_url}){comment}"
+msgstr ""
+"Usuwanie [{article}]({article_url}) należącego do [{target}]({target_url}) "
+"przez [{author}]({author_url}) nie powiodło się{comment}"
+
+#: extensions/base/translate.py:177
+#, python-brace-format
+msgid "Completed deletion of translation page \"{article}\""
+msgstr "Zmieniono widoczność wersji na stronie „{article}”"
+
+#: extensions/base/translate.py:188
+#, fuzzy, python-brace-format
+msgid ""
+"[{author}]({author_url}) completed deletion of translation page [{article}]"
+"({article_url}){comment}"
+msgstr ""
+"[{author}]({author_url}) zmienił(a) widoczność wersji strony [{article}]"
+"({article_url}){comment}"
+
+#: extensions/base/translate.py:203
+#, python-brace-format
+msgid ""
+"Failed to delete \"{article}\" which belongs to translation page \"{target}\""
+msgstr ""
+
+#: extensions/base/translate.py:215
+#, fuzzy, python-brace-format
+msgid ""
+"[{author}]({author_url}) failed to delete [{article}]({article_url}) which "
+"belongs to translation page [{target}]({target_url}){comment}"
+msgstr ""
+"[{author}]({author_url}) zaimportował(a) [{article}]({article_url}) z jedną "
+"wersją{comment}"
+
+#: extensions/base/translate.py:231
+#, fuzzy, python-brace-format
+msgid "Encouraged translation of \"{article}\""
+msgstr "Usunięto zabezpieczenie z {article}"
+
+#: extensions/base/translate.py:240
+#, fuzzy, python-brace-format
+msgid ""
+"[{author}]({author_url}) encouraged translation of [{article}]({article_url})"
+"{comment}"
+msgstr ""
+"[{author}]({author_url}) usunął zabezpieczenia z [{article}]({article_url})"
+"{comment}"
+
+#: extensions/base/translate.py:255
+#, python-brace-format
+msgid "Discouraged translation of \"{article}\""
+msgstr ""
+
+#: extensions/base/translate.py:264
+#, fuzzy, python-brace-format
+msgid ""
+"[{author}]({author_url}) discouraged translation of [{article}]"
+"({article_url}){comment}"
+msgstr ""
+"[{author}]({author_url}) odtworzył(a) [{article}]({article_url}){comment}"
+
+#: extensions/base/translate.py:282
+#, python-brace-format
+msgid "Limited languages for \"{article}\" to `{languages}`"
+msgstr ""
+
+#: extensions/base/translate.py:285
+#, python-brace-format
+msgid "Priority languages for \"{article}\" set to `{languages}`"
+msgstr ""
+
+#: extensions/base/translate.py:288
+#, fuzzy, python-brace-format
+msgid "Removed priority languages from \"{article}\""
+msgstr "Usunięto zabezpieczenie z {article}"
+
+#: extensions/base/translate.py:301
+#, fuzzy, python-brace-format
+msgid ""
+"[{author}]({author_url}) limited languages for [{article}]({article_url}) to "
+"`{languages}`{comment}"
+msgstr ""
+"[{author}]({author_url}) zmienił(a) ustawienia zabezpieczeń [{article}]"
+"({article_url}) na: {settings}{comment}"
+
+#: extensions/base/translate.py:308
+#, fuzzy, python-brace-format
+msgid ""
+"[{author}]({author_url}) set the priority languages for [{article}]"
+"({article_url}) to `{languages}`{comment}"
+msgstr ""
+"[{author}]({author_url}) zmienił(a) ustawienia zabezpieczeń [{article}]"
+"({article_url}) na: {settings}{comment}"
+
+#: extensions/base/translate.py:315
+#, fuzzy, python-brace-format
+msgid ""
+"[{author}]({author_url}) removed priority languages from [{article}]"
+"({article_url}){comment}"
+msgstr ""
+"[{author}]({author_url}) usunął zabezpieczenia z [{article}]({article_url})"
+"{comment}"
+
+#: extensions/base/translate.py:331
+#, python-brace-format
+msgid "Added translatable page \"{article}\" to aggregate group \"{group}\""
+msgstr ""
+
+#: extensions/base/translate.py:342
+#, fuzzy, python-brace-format
+msgid ""
+"[{author}]({author_url}) added translatable page [{article}]({article_url}) "
+"to aggregate group \"{group}\"{comment}"
+msgstr ""
+"[{author}]({author_url}) zmienił(a) model zawartości [{article}]"
+"({article_url}) z {old} na {new}{comment}"
+
+#: extensions/base/translate.py:357
+#, python-brace-format
+msgid ""
+"Removed translatable page \"{article}\" from aggregate group \"{group}\""
+msgstr ""
+
+#: extensions/base/translate.py:368
+#, fuzzy, python-brace-format
+msgid ""
+"[{author}]({author_url}) removed translatable page [{article}]"
+"({article_url}) from aggregate group \"{group}\"{comment}"
+msgstr ""
+"[{author}]({author_url}) usunął zabezpieczenia z [{article}]({article_url})"
+"{comment}"
+
+#: extensions/base/translate.py:387
+#, fuzzy, python-brace-format
+msgid "Reviewed translation \"{article}\""
+msgstr "Usunięto zabezpieczenie z {article}"
+
+#: extensions/base/translate.py:401
+#, fuzzy, python-brace-format
+msgid ""
+"[{author}]({author_url}) reviewed translation [{article}]({article_url})"
+"{comment}"
+msgstr ""
+"[{author}]({author_url}) odtworzył(a) [{article}]({article_url}){comment}"
+
+#: extensions/base/translate.py:416
+#, python-brace-format
+msgid "Changed the state of `{language}` translations of \"{article}\""
+msgstr ""
+
+#: extensions/base/translate.py:419
+msgid "Old state"
+msgstr ""
+
+#: extensions/base/translate.py:420
+msgid "New state"
+msgstr ""
+
+#: extensions/base/translate.py:431
+#, fuzzy, python-brace-format
+msgid ""
+"[{author}]({author_url}) changed the state of `{language}` translations of "
+"[{article}]({article_url}) from `{old_state}` to `{new_state}`{comment}"
+msgstr ""
+"[{author}]({author_url}) zmienił(a) model zawartości [{article}]"
+"({article_url}) z {old} na {new}{comment}"
+
+#: extensions/base/translate.py:439
+#, fuzzy, python-brace-format
+msgid ""
+"[{author}]({author_url}) changed the state of `{language}` translations of "
+"[{article}]({article_url}) to `{new_state}`{comment}"
+msgstr ""
+"[{author}]({author_url}) zmienił(a) model zawartości [{article}]"
+"({article_url}) z {old} na {new}{comment}"
+
+#: extensions/base/translate.py:452 extensions/base/translate.py:455
+msgid "(default)"
+msgstr ""
+
+#: extensions/base/translate.py:464
+#, fuzzy, python-brace-format
+msgid "Changed the language of \"{article}\""
+msgstr "Usunięto zabezpieczenie z {article}"
+
+#: extensions/base/translate.py:465
+msgid "Old language"
+msgstr ""
+
+#: extensions/base/translate.py:466
+msgid "New language"
+msgstr ""
+
+#: extensions/base/translate.py:477
+#, fuzzy, python-brace-format
+msgid ""
+"[{author}]({author_url}) changed the language of [{article}]({article_url}) "
+"from {old_lang} to {new_lang}{comment}"
+msgstr ""
+"[{author}]({author_url}) zmienił(a) model zawartości [{article}]"
+"({article_url}) z {old} na {new}{comment}"
+
+#: extensions/base/discussions.py:148 extensions/base/discussions.py:207
+#: extensions/base/discussions.py:245 extensions/base/discussions.py:261
+#: extensions/base/discussions.py:284 extensions/base/discussions.py:306
+#: extensions/base/discussions.py:334 extensions/base/discussions.py:354
+msgid "unknown"
+msgstr "nieznany"
+
+#: extensions/base/discussions.py:157
+#, python-brace-format
+msgid "Created \"{title}\""
+msgstr "Stworzył(a) „{title}”"
+
+#: extensions/base/discussions.py:161
+#, python-brace-format
+msgid "Created a poll \"{title}\""
+msgstr "Stworzył(a) ankietę zatytułowaną „{title}”"
+
+#: extensions/base/discussions.py:168
+msgid "Option {}"
+msgstr "Opcja {}"
+
+#: extensions/base/discussions.py:170
+#, python-brace-format
+msgid "__[View image]({image_url})__"
+msgstr "__[Zobacz zdjęcie]({image_url})__"
+
+#: extensions/base/discussions.py:174
+#, python-brace-format
+msgid "Created a quiz \"{title}\""
+msgstr "Stworzył(a) quiz „{title}”"
+
+#: extensions/base/discussions.py:193 extensions/base/discussions.py:195
+msgctxt "Fandom discussions Tags/Forums"
+msgid "Tags"
+msgstr "Artykuły"
+
+#: extensions/base/discussions.py:193
+msgctxt "Fandom discussions amount of Tags/Forums"
+msgid "{} tags"
+msgstr "{} artykułów"
+
+#: extensions/base/discussions.py:198
+#, python-brace-format
+msgid "Replied to \"{title}\""
+msgstr "Odpowiedział(a) w „{title}”"
+
+#: extensions/base/discussions.py:214
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) created [{title}](<{url}f/p/{threadId}>) in "
+"{forumName}"
+msgstr ""
+"[{author}]({author_url}) stworzył(a) [{title}](<{url}f/p/{threadId}>) w "
+"{forumName}"
+
+#: extensions/base/discussions.py:217
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) created a poll [{title}](<{url}f/p/{threadId}>) in "
+"{forumName}"
+msgstr ""
+"[{author}]({author_url}) stworzył(a) ankietę [{title}](<{url}f/p/{threadId}"
+">) w {forumName}"
+
+#: extensions/base/discussions.py:220
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) created a quiz [{title}](<{url}f/p/{threadId}>) in "
+"{forumName}"
+msgstr ""
+"[{author}]({author_url}) stworzył(a) quiz [{title}](<{url}f/p/{threadId}>) w "
+"{forumName}"
+
+#: extensions/base/discussions.py:234
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) created a [reply](<{url}f/p/{threadId}/r/{postId}>) "
+"to [{title}](<{url}f/p/{threadId}>) in {forumName}"
+msgstr ""
+"[{author}]({author_url}) dodał(a) [odpowiedź](<{url}f/p/{threadId}/r/{postId}"
+">) pod tematem [{title}](<{url}f/p/{threadId}>) w {forumName}"
+
+#: extensions/base/discussions.py:292
+#, python-brace-format
+msgid "Created \"{title}\" on {user}'s Message Wall"
+msgstr "Stworzył(a) „{title}” na tablicy wiadomości {user}"
+
+#: extensions/base/discussions.py:298
+#, python-brace-format
+msgid "Replied to \"{title}\" on {user}'s Message Wall"
+msgstr "Odpowiedział(a) na „{title}” z tablicy wiadomości {user}"
+
+#: extensions/base/discussions.py:312
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) created [{title}](<{url}wiki/Message_Wall:"
+"{user_wall}?threadId={threadId}>) on [{user}'s Message Wall](<{url}wiki/"
+"Message_Wall:{user_wall}>)"
+msgstr ""
+"[{author}]({author_url}) zostawił(a) [{title}](<{url}wiki/Message_Wall:"
+"{user_wall}?threadId={threadId}>) na [tablicy wiadomości {user}](<{url}wiki/"
+"Message_Wall:{user_wall}>)"
+
+#: extensions/base/discussions.py:318
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) created a [reply](<{url}wiki/Message_Wall:"
+"{user_wall}?threadId={threadId}#{replyId}>) to [{title}](<{url}wiki/"
+"Message_Wall:{user_wall}?threadId={threadId}>) on [{user}'s Message Wall]"
+"(<{url}wiki/Message_Wall:{user_wall}>)"
+msgstr ""
+"[{author}]({author_url}) dodał(a) [odpowiedź](<{url}wiki/Message_Wall:"
+"{user_wall}?threadId={threadId}#{replyId}>) do [{title}](<{url}wiki/"
+"Message_Wall:{user_wall}?threadId={threadId}>) na [tablicy wiadomości {user}]"
+"(<{url}wiki/Message_Wall:{user_wall}>)"
+
+#: extensions/base/discussions.py:338
+#, python-brace-format
+msgid "Commented on {article}"
+msgstr "Skomentował(a) „{article}”"
+
+#: extensions/base/discussions.py:344
+#, python-brace-format
+msgid "Replied to a comment on {article}"
+msgstr "Odpowiedział(a) na komentarz w „{article}”"
+
+#: extensions/base/discussions.py:359
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) created a [comment](<{url}?commentId={commentId}>) "
+"on [{article}](<{url}>)"
+msgstr ""
+"[{author}]({author_url}) dodał(a) [komentarz](<{url}?commentId={commentId}>) "
+"w [{article}](<{url}>)"
+
+#: extensions/base/discussions.py:365
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) created a [reply](<{url}?commentId={commentId}"
+"&replyId={replyId}>) to a [comment](<{url}?commentId={commentId}>) on "
+"[{article}](<{url}>)"
+msgstr ""
+"[{author}]({author_url}) dodał(a) [odpowiedź](<{url}?commentId={commentId}"
+"&replyId={replyId}>) na [komentarz](<{url}?commentId={commentId}>) w "
+"artykule [{article}](<{url}>)"
+
+#: extensions/base/managewiki.py:34
+msgid "Changed wiki settings"
+msgstr "Zmieniono ustawienia wiki"
+
+#: extensions/base/managewiki.py:44
+#, python-brace-format
+msgid "[{author}]({author_url}) changed wiki settings{reason}"
+msgstr "[{author}]({author_url}) zmienił(a) ustawienia wiki{reason}"
+
+#: extensions/base/managewiki.py:55
+#, python-brace-format
+msgid "Deleted a \"{wiki}\" wiki"
+msgstr "Usunięto wiki „{wiki}”"
+
+#: extensions/base/managewiki.py:55 extensions/base/managewiki.py:67
+#: extensions/base/managewiki.py:103 extensions/base/managewiki.py:112
+#: extensions/base/managewiki.py:125 extensions/base/managewiki.py:126
+#: extensions/base/managewiki.py:135 extensions/base/managewiki.py:136
+#: extensions/base/managewiki.py:148 extensions/base/managewiki.py:149
+#: extensions/base/managewiki.py:160 extensions/base/managewiki.py:161
+#: extensions/base/managewiki.py:195 extensions/base/managewiki.py:204
+#: extensions/base/managewiki.py:217 extensions/base/managewiki.py:226
+#: extensions/base/abusefilter.py:55 extensions/base/abusefilter.py:56
+#: extensions/base/abusefilter.py:57 extensions/base/abusefilter.py:68
+#: extensions/base/abusefilter.py:69 extensions/base/abusefilter.py:70
+#: extensions/base/mediawiki.py:743
+msgid "Unknown"
+msgstr "Nieznana"
+
+#: extensions/base/managewiki.py:63
+#, python-brace-format
+msgid "[{author}]({author_url}) deleted a wiki *{wiki_name}*{comment}"
+msgstr "[{author}]({author_url}) usunął/usunęła wiki *{wiki_name}*{comment}"
+
+#: extensions/base/managewiki.py:80
+#, python-brace-format
+msgid "Deleted a \"{group}\" user group"
+msgstr "Usunięto grupę użytkowników „{group}”"
+
+#: extensions/base/managewiki.py:89
+#, python-brace-format
+msgid "[{author}]({author_url}) deleted a usergroup *{group}*{comment}"
+msgstr "[{author}]({author_url}) usunął grupę użytkowników *{group}*{comment}"
+
+#: extensions/base/managewiki.py:103
+#, python-brace-format
+msgid "Locked a \"{wiki}\" wiki"
+msgstr "Zablokowano wiki „{wiki}”"
+
+#: extensions/base/managewiki.py:111
+#, python-brace-format
+msgid "[{author}]({author_url}) locked a wiki *{wiki_name}*{comment}"
+msgstr "[{author}]({author_url}) zablokował(a) wiki *{wiki_name}*{comment}"
+
+#: extensions/base/managewiki.py:124
+#, python-brace-format
+msgid "Modified \"{namespace_name}\" namespace"
+msgstr "Zmodyfikowano przestrzeń nazw „{namespace_name}”"
+
+#: extensions/base/managewiki.py:126 extensions/base/managewiki.py:149
+msgid "Wiki"
+msgstr "Wiki"
+
+#: extensions/base/managewiki.py:134
+#, fuzzy, python-brace-format
+msgid ""
+"[{author}]({author_url}) modified namespace *{namespace_name}* on "
+"*{wiki_name}*{comment}"
+msgstr ""
+"[{author}]({author_url}) zmodyfikował(a) przestrzeń nazw *{namespace_name}* "
+"na *{wiki_name}*{comment}"
+
+#: extensions/base/managewiki.py:147
+#, python-brace-format
+msgid "Deleted a \"{namespace_name}\" namespace"
+msgstr "Usunięto przestrzeń nazw „{namespace_name}”"
+
+#: extensions/base/managewiki.py:158
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) deleted a namespace *{namespace_name}* on "
+"*{wiki_name}*{comment}"
+msgstr ""
+"[{author}]({author_url}) usunął/usunęła przestrzeń nazw *{namespace_name}* "
+"na *{wiki_name}*{comment}"
+
+#: extensions/base/managewiki.py:173
+#, python-brace-format
+msgid "Modified \"{usergroup_name}\" usergroup"
+msgstr "Modyfikowano grupę użytkowników „{usergroup_name}”"
+
+#: extensions/base/managewiki.py:182
+#, python-brace-format
+msgid "[{author}]({author_url}) modified user group *{group_name}*{comment}"
+msgstr ""
+"[{author}]({author_url}) zaimportował(a) grupę użytkownika *{group_name}"
+"*{comment}"
+
+#: extensions/base/managewiki.py:195
+#, fuzzy, python-brace-format
+msgid "Undeleted a \"{wiki}\" wiki"
+msgstr "Usunięto wiki „{wiki}”"
+
+#: extensions/base/managewiki.py:203
+#, fuzzy, python-brace-format
+msgid "[{author}]({author_url}) undeleted a wiki *{wiki_name}*{comment}"
+msgstr "[{author}]({author_url}) usunął/usunęła wiki *{wiki_name}*{comment}"
+
+#: extensions/base/managewiki.py:217
+#, python-brace-format
+msgid "Unlocked a \"{wiki}\" wiki"
+msgstr "Odblokowano wiki „{wiki}”"
+
+#: extensions/base/managewiki.py:225
+#, python-brace-format
+msgid "[{author}]({author_url}) unlocked a wiki *{wiki_name}*{comment}"
+msgstr "[{author}]({author_url}) odblokował(a) wiki *{wiki_name}*{comment}"
+
+#: extensions/base/datadump.py:36
+#, python-brace-format
+msgid "Generated {file} dump"
+msgstr ""
+
+#: extensions/base/datadump.py:45
+#, python-brace-format
+msgid "[{author}]({author_url}) generated *{file}* dump{comment}"
+msgstr ""
+"[{author}]({author_url}) wygenerował(a) kopię zapasową w *{file}*{comment}"
+
+#: extensions/base/datadump.py:58
+#, python-brace-format
+msgid "Deleted {file} dump"
+msgstr "Usunął plik kopii {file}"
+
+#: extensions/base/datadump.py:67
+#, python-brace-format
+msgid "[{author}]({author_url}) deleted *{file}* dump{comment}"
+msgstr ""
+"[{author}]({author_url}) usunął/usunęła kopię zapasową *{file}*{comment}"
+
+#: extensions/base/curseprofile.py:40
+#, python-brace-format
+msgid "Edited {target}'s profile"
+msgstr "Edytowano profil użytkownika {target}"
+
+#: extensions/base/curseprofile.py:42
+msgid "Edited their own profile"
+msgstr "Edytował(a) swój profil"
+
+#: extensions/base/curseprofile.py:44
+#, python-brace-format
+msgid "Cleared the {field} field"
+msgstr "Wyczyszczono pole {field}"
+
+#: extensions/base/curseprofile.py:46
+#, python-brace-format
+msgid "{field} field changed to: {desc}"
+msgstr "pole „{field}” zostało zmienione na: {desc}"
+
+#: extensions/base/curseprofile.py:58
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) cleared the {field} on [{target}]({target_url})'s "
+"profile."
+msgstr ""
+"[{author}]({author_url}) wyczyścił(a) pole {field} na profilu użytkownika "
+"[{target}]({target_url})"
+
+#: extensions/base/curseprofile.py:60
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) edited the {field} on [{target}]({target_url})'s "
+"profile. *({desc})*"
+msgstr ""
+"[{author}]({author_url}) edytował(a) pole {field} na profilu użytkownika "
+"[{target}]({target_url}). *({desc})*"
+
+#: extensions/base/curseprofile.py:65
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) cleared the {field} on [their own]({target_url}) "
+"profile."
+msgstr ""
+"[{author}]({author_url}) wyczyścił(a) pole {field} na [swoim własnym]"
+"({target_url}) profilu."
+
+#: extensions/base/curseprofile.py:67
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) edited the {field} on [their own]({target_url}) "
+"profile. *({desc})*"
+msgstr ""
+"[{author}]({author_url}) edytował(a) pole {field} na [swoim własnym]"
+"({target_url}) profilu. *({desc})*"
+
+#: extensions/base/curseprofile.py:82
+#, python-brace-format
+msgid "Left a comment on {target}'s profile"
+msgstr "Zostawiono komentarz na profilu użytkownika {target}"
+
+#: extensions/base/curseprofile.py:84
+msgid "Left a comment on their own profile"
+msgstr "Zostawił(a) komentarz na swoim profilu"
+
+#: extensions/base/curseprofile.py:97
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) left a [comment]({comment}) on {target}'s profile."
+msgstr ""
+"[{author}]({author_url}) zostawił(a) [komentarz]({comment}) na profilu "
+"użytkownika {target}."
+
+#: extensions/base/curseprofile.py:100
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) left a [comment]({comment}) on their own profile."
+msgstr ""
+"[{author}]({author_url}) zostawił(a) [komentarz]({comment}) na swoim własnym "
+"profilu."
+
+#: extensions/base/curseprofile.py:113
+#, python-brace-format
+msgid "Edited a comment on {target}'s profile"
+msgstr "Edytowano komentarz na profilu użytkownika {target}"
+
+#: extensions/base/curseprofile.py:115
+msgid "Edited a comment on their own profile"
+msgstr "Edytował(a) komentarz na swoim profilu"
+
+#: extensions/base/curseprofile.py:128
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) edited a [comment]({comment}) on {target}'s profile."
+msgstr ""
+"[{author}]({author_url}) edytował(a) [komentarz]({comment}) na profilu "
+"użytkownika {target}"
+
+#: extensions/base/curseprofile.py:131
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) edited a [comment]({comment}) on their own profile."
+msgstr ""
+"[{author}]({author_url}) edytował(a) [komentarz]({comment}) na swoim własnym "
+"profilu"
+
+#: extensions/base/curseprofile.py:144
+#, python-brace-format
+msgid "Replied to a comment on {target}'s profile"
+msgstr "Odpowiedziano na komentarz na profilu użytkownika {target}"
+
+#: extensions/base/curseprofile.py:146
+msgid "Replied to a comment on their own profile"
+msgstr "Odpowiedział(a) na komentarz na swoim profilu"
+
+#: extensions/base/curseprofile.py:159
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) replied to a [comment]({comment}) on {target}'s "
+"profile."
+msgstr ""
+"[{author}]({author_url}) odpowiedział(a) na [komentarz]({comment}) na "
+"profilu użytkownika {target}"
+
+#: extensions/base/curseprofile.py:162
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) replied to a [comment]({comment}) on their own "
+"profile."
+msgstr ""
+"[{author}]({author_url}) odpowiedział(a) na [komentarz]({comment}) na swoim "
+"własnym profilu"
+
+#: extensions/base/curseprofile.py:175
+#, python-brace-format
+msgid "Deleted a comment on {target}'s profile"
+msgstr "Usunął komentarz na profilu użytkownika {target}"
+
+#: extensions/base/curseprofile.py:177
+msgid "Deleted a comment on their own profile"
+msgstr "Usunął/usunęła komentarz na swoim profilu"
+
+#: extensions/base/curseprofile.py:197
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) deleted a [comment]({comment}) on {target}'s "
+"profile.{reason}"
+msgstr ""
+"[{author}]({author_url}) usunął [komentarz]({comment}) na profilu "
+"użytkownika {target}"
+
+#: extensions/base/curseprofile.py:200
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) deleted a [comment]({comment}) on their own profile."
+"{reason}"
+msgstr ""
+"[{author}]({author_url}) usunął [komentarz]({comment}) na swoim własnym "
+"profilu"
+
+#: extensions/base/curseprofile.py:214
+#, python-brace-format
+msgid "Purged a comment on {target}'s profile"
+msgstr "Usunął permanentnie komentarz na profilu użytkownika {target}"
+
+#: extensions/base/curseprofile.py:216
+#, fuzzy
+msgid "Purged a comment on their own profile"
+msgstr "Edytował(a) komentarz na swoim profilu"
+
+#: extensions/base/curseprofile.py:230
+#, fuzzy, python-brace-format
+msgid ""
+"[{author}]({author_url}) purged a comment on [{target}]({link})'s profile."
+"{reason}"
+msgstr ""
+"[{author}]({author_url}) usunął/usunęła permanentnie komentarz na profilu "
+"użytkownika {target}"
+
+#: extensions/base/curseprofile.py:233
+#, fuzzy, python-brace-format
+msgid ""
+"[{author}]({author_url}) purged a comment on [their own]({link}) profile."
+"{reason}"
+msgstr ""
+"[{author}]({author_url}) usunął/usunęła permanentnie komentarz na swoim "
+"własnym profilu"
+
+#: extensions/base/renameuser.py:38
+#, python-brace-format
+msgid "Renamed user \"{old_name}\" with {edits} edit to \"{new_name}\""
+msgid_plural "Renamed user \"{old_name}\" with {edits} edits to \"{new_name}\""
+msgstr[0] ""
+"Zmienił(a) nazwę użytkownika „{old_name}” z jedną edycją na „{new_name}”"
+msgstr[1] ""
+"Zmienił(a) nazwę użytkownika „{old_name}” z {edits} edycjami na „{new_name}”"
+msgstr[2] ""
+"Zmienił(a) nazwę użytkownika „{old_name}” z {edits} edycjami na „{new_name}”"
+
+#: extensions/base/renameuser.py:43
+#, python-brace-format
+msgid "Renamed user \"{old_name}\" to \"{new_name}\""
+msgstr "Zmieniono nazwę użytkownika „{old_name}” na „{new_name}”"
+
+#: extensions/base/renameuser.py:58
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) renamed user *{old_name}* with {edits} edit to "
+"[{new_name}]({link}){comment}"
+msgid_plural ""
+"[{author}]({author_url}) renamed user *{old_name}* with {edits} edits to "
+"[{new_name}]({link}){comment}"
+msgstr[0] ""
+"[{author}]({author_url}) zmienił(a) nazwę użytkownika *{old_name}* z {edits} "
+"edycją na [{new_name}]({link}){comment}"
+msgstr[1] ""
+"[{author}]({author_url}) zmienił(a) nazwę użytkownika *{old_name}* z {edits} "
+"edycjami na [{new_name}]({link}){comment}"
+msgstr[2] ""
+"[{author}]({author_url}) zmienił(a) nazwę użytkownika *{old_name}* z {edits} "
+"edycjami na [{new_name}]({link}){comment}"
+
+#: extensions/base/renameuser.py:66
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) renamed user *{old_name}* to [{new_name}]({link})"
+"{comment}"
+msgstr ""
+"[{author}]({author_url}) zmienił(a) nazwę użytkownika {old_name} na "
+"[{new_name}]({link}){comment}"
+
+#: extensions/base/interwiki.py:37
+msgid "Added an entry to the interwiki table"
+msgstr "Dodano wpis do tabeli interwiki"
+
+#: extensions/base/interwiki.py:38 extensions/base/interwiki.py:65
+#, python-brace-format
+msgid "Prefix: {prefix}, website: {website} | {desc}"
+msgstr "Prefix: {prefix}, strona: {website} | {desc}"
+
+#: extensions/base/interwiki.py:50
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) added an entry to the [interwiki table]"
+"({table_url}) pointing to {website} with {prefix} prefix"
+msgstr ""
+"[{author}]({author_url}) dodał(a) do [tabeli interwiki]({table_url}) wpis "
+"{prefix}, który prowadzi do {website}"
+
+#: extensions/base/interwiki.py:64
+msgid "Edited an entry in interwiki table"
+msgstr "Edytowano wpis interwiki"
+
+#: extensions/base/interwiki.py:77
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) edited an entry in [interwiki table]({table_url}) "
+"pointing to {website} with {prefix} prefix"
+msgstr ""
+"[{author}]({author_url}) edytował(a) w [tabeli interwiki]({table_url}) wpis "
+"{prefix}, który prowadzi do {website}"
+
+#: extensions/base/interwiki.py:91
+msgid "Deleted an entry in interwiki table"
+msgstr "Usunięto wpis interwiki"
+
+#: extensions/base/interwiki.py:92
+#, python-brace-format
+msgid "Prefix: {prefix} | {desc}"
+msgstr "Prefix: {prefix} | {desc}"
+
+#: extensions/base/interwiki.py:102
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) deleted an entry in [interwiki table]({table_url})"
+"{desc}"
+msgstr ""
+"[{author}]({author_url}) usunął wpis z [tabeli interwiki]({table_url}){desc}"
+
+#: extensions/base/abusefilter.py:29
+msgid "None"
+msgstr "Brak"
+
+#: extensions/base/abusefilter.py:29
+msgid "Warning issued"
+msgstr "Wydano ostrzeżenie"
+
+#: extensions/base/abusefilter.py:29
+msgid "**Blocked user**"
+msgstr "**Zablokowano użytkownika**"
+
+#: extensions/base/abusefilter.py:29
+msgid "Tagged the edit"
+msgstr "Otagowano edycję"
+
+#: extensions/base/abusefilter.py:29
+msgid "Disallowed the action"
+msgstr "Zabroniono akcji"
+
+#: extensions/base/abusefilter.py:29
+msgid "**IP range blocked**"
+msgstr "**Zablokowano zakres adresów IP**"
+
+#: extensions/base/abusefilter.py:29
+msgid "Throttled actions"
+msgstr "Spowolniono akcje użytkownika"
+
+#: extensions/base/abusefilter.py:29
+msgid "Removed autoconfirmed group"
+msgstr "Usunięto autopotwierdzoną grupę"
+
+#: extensions/base/abusefilter.py:29
+msgid "**Removed from privileged groups**"
+msgstr "**Usunięto z uprzywilejowanych grup**"
+
+#: extensions/base/abusefilter.py:30
+msgid "Edit"
+msgstr "Edycja"
+
+#: extensions/base/abusefilter.py:30
+msgid "Upload"
+msgstr "Przesłanie pliku"
+
+#: extensions/base/abusefilter.py:30
+msgid "Move"
+msgstr "Przeniesienie strony"
+
+#: extensions/base/abusefilter.py:30
+msgid "Stash upload"
+msgstr "Masowe przesłanie plików"
+
+#: extensions/base/abusefilter.py:30
+msgid "Deletion"
+msgstr "Usunięcie"
+
+#: extensions/base/abusefilter.py:30
+msgid "Account creation"
+msgstr "Utworzenie konta"
+
+#: extensions/base/abusefilter.py:30
+msgid "Auto account creation"
+msgstr "Automatyczne utworzenie konta"
+
+#: extensions/base/abusefilter.py:54
+#, python-brace-format
+msgid "{user} triggered \"{abuse_filter}\""
+msgstr "{user} wywołał(a) \"{abuse_filter}\""
+
+#: extensions/base/abusefilter.py:55
+msgid "Performed"
+msgstr "Wykonano"
+
+#: extensions/base/abusefilter.py:56
+msgid "Action taken"
+msgstr "Podjęte działania"
+
+#: extensions/base/abusefilter.py:57
+msgid "Title"
+msgstr "Tytuł"
+
+#: extensions/base/abusefilter.py:66
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) triggered *{abuse_filter}*, performing the action "
+"\"{action}\" on *[{target}]({target_url})* - action taken: {result}."
+msgstr ""
+"[{author}]({author_url}) wywołał(a) *{abuse_filter}*, wykonując akcję "
+"\"{action}\" w *[{target}]({target_url})* - podjęte działanie: {result}"
+
+#: extensions/base/abusefilter.py:83
+#, python-brace-format
+msgid "Edited abuse filter number {number}"
+msgstr "Edytowano filtr nadużyć numer {number}"
+
+#: extensions/base/abusefilter.py:95
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) edited abuse filter [number {number}]({filter_url})"
+msgstr ""
+"[{author}]({author_url}) edytował(a) filtr nadużyć [numer {number}]"
+"({filter_url})"
+
+#: extensions/base/abusefilter.py:111
+#, python-brace-format
+msgid "Created abuse filter number {number}"
+msgstr "Utworzono filtr nadużyć numer {number}"
+
+#: extensions/base/abusefilter.py:119
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) created abuse filter [number {number}]({filter_url})"
+msgstr ""
+"[{author}]({author_url}) stworzył(a) filtr nadużyć [numer {number}]"
+"({filter_url})"
+
+#: extensions/base/mediawiki.py:37
+msgid "director"
+msgstr "Dyrektor"
+
+#: extensions/base/mediawiki.py:37
+msgid "bot"
+msgstr "Bot"
+
+#: extensions/base/mediawiki.py:37
+msgid "editor"
+msgstr "Redaktor"
+
+#: extensions/base/mediawiki.py:37
+msgid "directors"
+msgstr "Dyrektorzy"
+
+#: extensions/base/mediawiki.py:37
+msgid "sysop"
+msgstr "Administrator"
+
+#: extensions/base/mediawiki.py:37
+msgid "bureaucrat"
+msgstr "Biurokrata"
+
+#: extensions/base/mediawiki.py:37
+msgid "reviewer"
+msgstr "Przeglądający"
+
+#: extensions/base/mediawiki.py:38
+msgid "autoreview"
+msgstr "Automatycznie przeglądający"
+
+#: extensions/base/mediawiki.py:38
+msgid "autopatrol"
+msgstr "Automatycznie zatwierdzający"
+
+#: extensions/base/mediawiki.py:38
+msgid "wiki_guardian"
+msgstr "Strażnik wiki"
+
+#: extensions/base/mediawiki.py:70
+msgid "(N!) "
+msgstr "(N!) "
+
+#: extensions/base/mediawiki.py:71
+msgid "m"
+msgstr "d"
+
+#: extensions/base/mediawiki.py:72
+msgid "b"
+msgstr "b"
+
+#: extensions/base/mediawiki.py:112
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) edited [{article}]({edit_link}){comment} {bold}"
+"({sign}{edit_size}){bold}"
+msgstr ""
+"[{author}]({author_url}) edytował(a) [{article}]({edit_link}){comment} {bold}"
+"({sign}{edit_size}){bold}"
+
+#: extensions/base/mediawiki.py:117
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) created [{article}]({edit_link}){comment} {bold}"
+"({sign}{edit_size}){bold}"
+msgstr ""
+"[{author}]({author_url}) stworzył(a) [{article}]({edit_link}){comment} {bold}"
+"({sign}{edit_size}){bold}"
+
+#: extensions/base/mediawiki.py:190 extensions/base/mediawiki.py:223
+msgid "Options"
+msgstr "Opcje"
+
+#: extensions/base/mediawiki.py:190
+#, python-brace-format
+msgid "([preview]({link}) | [undo]({undolink}))"
+msgstr "([podgląd]({link}) | [wycofaj]({undolink}))"
+
+#: extensions/base/mediawiki.py:195
+#, python-brace-format
+msgid "Uploaded a new version of {name}"
+msgstr "Przesłał(a) nową wersję {name}"
+
+#: extensions/base/mediawiki.py:197
+#, python-brace-format
+msgid "Reverted a version of {name}"
+msgstr "Wycofał(a) wersję {name}"
+
+#: extensions/base/mediawiki.py:199
+#, python-brace-format
+msgid "Uploaded {name}"
+msgstr "Przesłał(a) {name}"
+
+#: extensions/base/mediawiki.py:208
+msgid "**No license!**"
+msgstr "**Brak licencji!**"
+
+#: extensions/base/mediawiki.py:223
+#, python-brace-format
+msgid "([preview]({link}))"
+msgstr "([podgląd]({link}))"
+
+#: extensions/base/mediawiki.py:228
+msgid ""
+"\n"
+"License: {}"
+msgstr ""
+"\n"
+"Licencja: {}"
+
+#: extensions/base/mediawiki.py:237
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) reverted a version of [{file}]({file_link}){comment}"
+msgstr ""
+"[{author}]({author_url}) wycofał(a) wersję [{file}]({file_link}){comment}"
+
+#: extensions/base/mediawiki.py:248
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) uploaded a new version of [{file}]({file_link})"
+"{comment}"
+msgstr ""
+"[{author}]({author_url}) przesłał(a) nową wersję [{file}]({file_link})"
+"{comment}"
+
+#: extensions/base/mediawiki.py:259
+#, python-brace-format
+msgid "[{author}]({author_url}) uploaded [{file}]({file_link}){comment}"
+msgstr "[{author}]({author_url}) przesłał(a) [{file}]({file_link}){comment}"
+
+#: extensions/base/mediawiki.py:274
+#, python-brace-format
+msgid "Deleted page {article}"
+msgstr "Usunął stronę {article}"
+
+#: extensions/base/mediawiki.py:283
+#, python-brace-format
+msgid "[{author}]({author_url}) deleted [{page}]({page_link}){comment}"
+msgstr "[{author}]({author_url}) skasował(a) [{page}]({page_link}){comment}"
+
+#: extensions/base/mediawiki.py:298
+#, python-brace-format
+msgid "Deleted redirect {article} by overwriting"
+msgstr ""
+"Usunął przekierowanie ({article}), aby zrobić miejsce dla przenoszonej strony"
+
+#: extensions/base/mediawiki.py:308
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) deleted redirect by overwriting [{page}]"
+"({page_link}){comment}"
+msgstr ""
+"[{author}]({author_url}) usunął przekierowanie przez nadpisanie [{page}]"
+"({page_link}){comment}"
+
+#: extensions/base/mediawiki.py:322
+#, python-brace-format
+msgid "Restored {article}"
+msgstr "Przywrócono {article}"
+
+#: extensions/base/mediawiki.py:331
+#, python-brace-format
+msgid "[{author}]({author_url}) restored [{article}]({article_url}){comment}"
+msgstr ""
+"[{author}]({author_url}) odtworzył(a) [{article}]({article_url}){comment}"
+
+#: extensions/base/mediawiki.py:348
+msgid "Changed visibility of log events"
+msgstr "Zmieniono widoczność wpisów rejestru"
+
+#: extensions/base/mediawiki.py:356
+#, python-brace-format
+msgid "[{author}]({author_url}) changed visibility of log events{comment}"
+msgstr ""
+"[{author}]({author_url}) zmienił(a) widoczność wpisów rejestru{comment}"
+
+#: extensions/base/mediawiki.py:370
+#, python-brace-format
+msgid "Changed visibility of revision on page {article} "
+msgid_plural "Changed visibility of {amount} revisions on page {article} "
+msgstr[0] "Zmieniono widoczność wersji na stronie {article} "
+msgstr[1] "Zmieniono widoczność {amount} wersji na stronie {article} "
+msgstr[2] "Zmieniono widoczność {amount} wersji na stronie {article} "
+
+#: extensions/base/mediawiki.py:383
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) changed visibility of revision on page [{article}]"
+"({article_url}){comment}"
+msgid_plural ""
+"[{author}]({author_url}) changed visibility of {amount} revisions on page "
+"[{article}]({article_url}){comment}"
+msgstr[0] ""
+"[{author}]({author_url}) zmienił(a) widoczność wersji strony [{article}]"
+"({article_url}){comment}"
+msgstr[1] ""
+"[{author}]({author_url}) zmienił(a) widoczność {amount} wersji strony "
+"[{article}]({article_url}){comment}"
+msgstr[2] ""
+"[{author}]({author_url}) zmienił(a) widoczność {amount} wersji strony "
+"[{article}]({article_url}){comment}"
+
+#: extensions/base/mediawiki.py:399 extensions/base/mediawiki.py:432
+msgid "No redirect has been made"
+msgstr "Nie utworzono przekierowania"
+
+#: extensions/base/mediawiki.py:400 extensions/base/mediawiki.py:433
+msgid "A redirect has been made"
+msgstr "Zostało utworzone przekierowanie"
+
+#: extensions/base/mediawiki.py:401
+#, python-brace-format
+msgid "Moved {redirect}{article} to {target}"
+msgstr "Przeniósł {redirect}{article} do {target}"
+
+#: extensions/base/mediawiki.py:412 extensions/base/mediawiki.py:444
+msgid "without making a redirect"
+msgstr "bez utworzenia przekierowania"
+
+#: extensions/base/mediawiki.py:413 extensions/base/mediawiki.py:445
+msgid "with a redirect"
+msgstr "z przekierowaniem"
+
+#: extensions/base/mediawiki.py:416
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) moved {redirect}*{article}* to [{target}]"
+"({target_url}) {made_a_redirect}{comment}"
+msgstr ""
+"[{author}]({author_url}) przeniósł {redirect}*{article}* do [{target}]"
+"({target_url}) {made_a_redirect}{comment}"
+
+#: extensions/base/mediawiki.py:434
+#, python-brace-format
+msgid "Moved {redirect}{article} to {title} over redirect"
+msgstr "Przeniósł {redirect}{article} do strony przekierowującej {title}"
+
+#: extensions/base/mediawiki.py:448
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) moved {redirect}*{article}* over redirect to "
+"[{target}]({target_url}) {made_a_redirect}{comment}"
+msgstr ""
+"[{author}]({author_url}) przeniósł {redirect}*{article}* do przekierowania "
+"[{target}]({target_url}) {made_a_redirect}{comment}"
+
+#: extensions/base/mediawiki.py:464
+#, python-brace-format
+msgid "Moved protection settings from {redirect}{article} to {title}"
+msgstr "Przeniesiono ustawienia zabezpieczeń z {redirect}{article} do {title}"
+
+#: extensions/base/mediawiki.py:477
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) moved protection settings from {redirect}*{article}"
+"* to [{target}]({target_url}){comment}"
+msgstr ""
+"[{author}]({author_url}) przeniósł ustawienia zabezpieczeń z {redirect}"
+"*{article}* do [{target}]({target_url}){comment}"
+
+#: extensions/base/mediawiki.py:492
+#, python-brace-format
+msgid "Protected {target}"
+msgstr "Zabezpieczono {target}"
+
+#: extensions/base/mediawiki.py:495 extensions/base/mediawiki.py:510
+#: extensions/base/mediawiki.py:526 extensions/base/mediawiki.py:541
+msgid " [cascading]"
+msgstr " [kaskadowo]"
+
+#: extensions/base/mediawiki.py:506
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) protected [{article}]({article_url}) with the "
+"following settings: {settings}{comment}"
+msgstr ""
+"[{author}]({author_url}) zabezpieczył(a) [{article}]({article_url}) z "
+"ustawieniami: {settings}{comment}"
+
+#: extensions/base/mediawiki.py:523
+#, python-brace-format
+msgid "Changed protection level for {article}"
+msgstr "Zmieniono poziom zabezpieczeń {article}"
+
+#: extensions/base/mediawiki.py:537
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) modified protection settings of [{article}]"
+"({article_url}) to: {settings}{comment}"
+msgstr ""
+"[{author}]({author_url}) zmienił(a) ustawienia zabezpieczeń [{article}]"
+"({article_url}) na: {settings}{comment}"
+
+#: extensions/base/mediawiki.py:554
+#, python-brace-format
+msgid "Removed protection from {article}"
+msgstr "Usunięto zabezpieczenie z {article}"
+
+#: extensions/base/mediawiki.py:563
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) removed protection from [{article}]({article_url})"
+"{comment}"
+msgstr ""
+"[{author}]({author_url}) usunął zabezpieczenia z [{article}]({article_url})"
+"{comment}"
+
+#: extensions/base/mediawiki.py:572
+msgid "for infinity and beyond"
+msgstr "na wieczność"
+
+#: extensions/base/mediawiki.py:581
+msgid "for less than a minute"
+msgstr "na mniej niż minutę"
+
+#: extensions/base/mediawiki.py:583
+msgid "year"
+msgid_plural "years"
+msgstr[0] "rok"
+msgstr[1] "lata"
+msgstr[2] "lat"
+
+#: extensions/base/mediawiki.py:583
+msgid "day"
+msgid_plural "days"
+msgstr[0] "dzień"
+msgstr[1] "dni"
+msgstr[2] "dni"
+
+#: extensions/base/mediawiki.py:583
+msgid "hour"
+msgid_plural "hours"
+msgstr[0] "godzina"
+msgstr[1] "godziny"
+msgstr[2] "godzin"
+
+#: extensions/base/mediawiki.py:584
+msgid "minute"
+msgid_plural "minutes"
+msgstr[0] "minuta"
+msgstr[1] "minuty"
+msgstr[2] "minut"
+
+#: extensions/base/mediawiki.py:589
+#, fuzzy, python-brace-format
+msgid "for {time_number} {time_unit}"
+msgstr "na {time_number} {time_unit}"
+
+#: extensions/base/mediawiki.py:608
+msgid "Blocked from editing the following pages: "
+msgstr "Blokada przed edytowaniem następujących stron: "
+
+#: extensions/base/mediawiki.py:615 extensions/base/mediawiki.py:661
+msgid " and namespaces: "
+msgstr " oraz przestrzeniach nazw: "
+
+#: extensions/base/mediawiki.py:617
+msgid "Blocked from editing pages on following namespaces: "
+msgstr "Blokada przed edytowaniem stron na następujących przestrzeniach nazw: "
+
+#: extensions/base/mediawiki.py:628
+msgid "Partial block details"
+msgstr "Szczegóły częściowej blokady"
+
+#: extensions/base/mediawiki.py:631
+msgid "Block flags"
+msgstr "Opcje blokady"
+
+#: extensions/base/mediawiki.py:633
+#, python-brace-format
+msgid "Blocked {blocked_user} {time}"
+msgstr "Zablokowano {blocked_user} {time}"
+
+#: extensions/base/mediawiki.py:653
+msgid " on pages: "
+msgstr " na stronach: "
+
+#: extensions/base/mediawiki.py:663
+msgid " on namespaces: "
+msgstr " na przestrzeniach nazw: "
+
+#: extensions/base/mediawiki.py:675
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) blocked [{user}]({user_url}) {time}"
+"{restriction_desc}{comment}"
+msgstr ""
+"[{author}]({author_url}) zablokował(a) [{user}]({user_url}) {time}"
+"{restriction_desc}{comment}"
+
+#: extensions/base/mediawiki.py:693
+#, python-brace-format
+msgid "Changed block settings for {blocked_user}"
+msgstr "Zmienił ustawienia blokady {blocked_user}"
+
+#: extensions/base/mediawiki.py:703
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) changed block settings for [{blocked_user}]"
+"({user_url}){comment}"
+msgstr ""
+"[{author}]({author_url}) zmienił(a) ustawienia blokady dla [{blocked_user}]"
+"({user_url}){comment}"
+
+#: extensions/base/mediawiki.py:716
+#, python-brace-format
+msgid "Unblocked {blocked_user}"
+msgstr "Odblokował {blocked_user}"
+
+#: extensions/base/mediawiki.py:726
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) unblocked [{blocked_user}]({user_url}){comment}"
+msgstr ""
+"[{author}]({author_url}) odblokował(a) [{blocked_user}]({user_url}){comment}"
+
+#: extensions/base/mediawiki.py:742
+msgid "Action has been hidden by administration"
+msgstr "Akcja została ukryta przez administrację"
+
+#: extensions/base/mediawiki.py:749
+msgid "An action has been hidden by administration."
+msgstr "Akcja została ukryta przez administrację."
+
+#: extensions/base/mediawiki.py:760
+#, python-brace-format
+msgid "Imported {article} with {count} revision"
+msgid_plural "Imported {article} with {count} revisions"
+msgstr[0] "Zaimportowano {article} z {count} wersją"
+msgstr[1] "Zaimportowano {article} z {count} wersjami"
+msgstr[2] "Zaimportowano {article} z {count} wersjami"
+
+#: extensions/base/mediawiki.py:771
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) imported [{article}]({article_url}) with {count} "
+"revision{comment}"
+msgid_plural ""
+"[{author}]({author_url}) imported [{article}]({article_url}) with {count} "
+"revisions{comment}"
+msgstr[0] ""
+"[{author}]({author_url}) zaimportował(a) [{article}]({article_url}) z jedną "
+"wersją{comment}"
+msgstr[1] ""
+"[{author}]({author_url}) zaimportował(a) [{article}]({article_url}) z "
+"{count} wersjami{comment}"
+msgstr[2] ""
+"[{author}]({author_url}) zaimportował(a) [{article}]({article_url}) z "
+"{count} wersjami{comment}"
+
+#: extensions/base/mediawiki.py:787
+#, python-brace-format
+msgid "Imported {article} with {count} revision from \"{source}\""
+msgid_plural "Imported {article} with {count} revisions from \"{source}\""
+msgstr[0] "Zaimportowano {article} z {count} wersją z „{source}”"
+msgstr[1] "Zaimportowano {article} z {count} wersjami z „{source}”"
+msgstr[2] "Zaimportowano {article} z {count} wersjami z „{source}”"
+
+#: extensions/base/mediawiki.py:802
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) imported [{article}]({article_url}) with {count} "
+"revision from [{source}]({source_url}){comment}"
+msgid_plural ""
+"[{author}]({author_url}) imported [{article}]({article_url}) with {count} "
+"revisions from [{source}]({source_url}){comment}"
+msgstr[0] ""
+"[{author}]({author_url}) zaimportował(a) wersję [{article}]({article_url}) z "
+"[{source}]({source_url}){comment}"
+msgstr[1] ""
+"[{author}]({author_url}) zaimportował(a) {count} wersji artykułu [{article}]"
+"({article_url}) z [{source}]({source_url}){comment}"
+msgstr[2] ""
+"[{author}]({author_url}) zaimportował(a) {count} wersji artykułu [{article}]"
+"({article_url}) z [{source}]({source_url}){comment}"
+
+#: extensions/base/mediawiki.py:817
+#, python-brace-format
+msgid " (until {date_and_time})"
+msgstr " (do {date_and_time})"
+
+#: extensions/base/mediawiki.py:834
+#, python-brace-format
+msgid "Changed group membership for {target}"
+msgstr "Zmieniono przynależność do grup dla {target}"
+
+#: extensions/base/mediawiki.py:836
+msgid "System"
+msgstr "System"
+
+#: extensions/base/mediawiki.py:837
+#, python-brace-format
+msgid "{target} got autopromoted to a new usergroup"
+msgstr "{target} automatycznie otrzymał nową grupę użytkownika"
+
+#: extensions/base/mediawiki.py:843
+msgid "Added group"
+msgid_plural "Added groups"
+msgstr[0] "Dodana grupa"
+msgstr[1] "Dodane grupy"
+msgstr[2] "Dodane grupy"
+
+#: extensions/base/mediawiki.py:845
+msgid "Removed group"
+msgid_plural "Removed groups"
+msgstr[0] "Usunięta grupa"
+msgstr[1] "Usunięte grupy"
+msgstr[2] "Usunięte grupy"
+
+#: extensions/base/mediawiki.py:859
+#, python-brace-format
+msgid "Added to {added} and removed from {removed}."
+msgstr "Dodano do {added} oraz usunięto z {removed}."
+
+#: extensions/base/mediawiki.py:860 extensions/base/mediawiki.py:862
+#: extensions/base/mediawiki.py:864 extensions/base/mediawiki.py:871
+msgid ", "
+msgstr ", "
+
+#: extensions/base/mediawiki.py:862
+#, python-brace-format
+msgid "Added to {added}."
+msgstr "Dodany do {added}."
+
+#: extensions/base/mediawiki.py:864
+#, python-brace-format
+msgid "Removed from {removed}."
+msgstr "Usunięty z {removed}."
+
+#: extensions/base/mediawiki.py:865
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) changed group membership for [{target}]"
+"({target_url}): {group_changes}{comment}"
+msgstr ""
+"[{author}]({author_url}) zmienił(a) przynależność do grup dla [{target}]"
+"({target_url}): {group_changes}{comment}"
+
+#: extensions/base/mediawiki.py:869
+#, python-brace-format
+msgid "The system autopromoted [{target}]({target_url}) to {added}.{comment}"
+msgstr ""
+"System automatycznie zmienił przynależność do grup dla [{target}]"
+"({target_url}) na {added}.{comment}"
+
+#: extensions/base/mediawiki.py:882
+#, python-brace-format
+msgid "Merged revision histories of {article} into {dest}"
+msgstr "Połączono historie {article} z {dest}"
+
+#: extensions/base/mediawiki.py:896
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) merged revision histories of [{article}]"
+"({article_url}) into [{dest}]({dest_url}){comment}"
+msgstr ""
+"[{author}]({author_url}) połączył(a) historie zmian [{article}]"
+"({article_url}) z [{dest}]({dest_url}){comment}"
+
+#: extensions/base/mediawiki.py:910
+msgid "Created account automatically"
+msgstr "Konto zostało utworzone automatycznie"
+
+#: extensions/base/mediawiki.py:917
+#, python-brace-format
+msgid "Account [{author}]({author_url}) was created automatically"
+msgstr "Konto [{author}]({author_url}) zostało utworzone automatycznie"
+
+#: extensions/base/mediawiki.py:930 extensions/base/mediawiki.py:995
+msgid "Created account"
+msgstr "Stworzono konto"
+
+#: extensions/base/mediawiki.py:937 extensions/base/mediawiki.py:1002
+#, python-brace-format
+msgid "Account [{author}]({author_url}) was created"
+msgstr "Konto [{author}]({author_url}) zostało utworzone"
+
+#: extensions/base/mediawiki.py:949
+#, python-brace-format
+msgid "Created account {article}"
+msgstr "Utworzono konto {article}"
+
+#: extensions/base/mediawiki.py:958
+#, python-brace-format
+msgid ""
+"Account [{article}]({article_url}) was created by [{author}]({author_url})"
+"{comment}"
+msgstr ""
+"Konto [{article}]({article_url}) zostało utworzone przez [{author}]"
+"({author_url}){comment}"
+
+#: extensions/base/mediawiki.py:971
+#, python-brace-format
+msgid "Created account {article} and password was sent by email"
+msgstr "Utworzono konto {article} oraz wysłano hasło z użyciem emaila"
+
+#: extensions/base/mediawiki.py:982
+#, python-brace-format
+msgid ""
+"Account [{article}]({article_url}) was created by [{author}]({author_url}) "
+"and password was sent by email{comment}"
+msgstr ""
+"Konto [{article}]({article_url}) zostało utworzone przez [{author}]"
+"({author_url}) oraz hasło do konta zostało przesłane przez email {comment}"
+
+#: extensions/base/mediawiki.py:1014
+#, python-brace-format
+msgid "Changed the content model of the page {article}"
+msgstr "Zmieniono model zawartości {article}"
+
+#: extensions/base/mediawiki.py:1016
+#, python-brace-format
+msgid "Model changed from {old} to {new}: {reason}"
+msgstr "Model został zmieniony z {old} na {new}: {reason}"
+
+#: extensions/base/mediawiki.py:1028
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) changed the content model of the page [{article}]"
+"({article_url}) from {old} to {new}{comment}"
+msgstr ""
+"[{author}]({author_url}) zmienił(a) model zawartości [{article}]"
+"({article_url}) z {old} na {new}{comment}"
+
+#: extensions/base/mediawiki.py:1043
+#, python-brace-format
+msgid "Created the page {article} using a non-default content model"
+msgstr "Stworzono stronę {article} z użyciem niestandardowego modelu treści"
+
+#: extensions/base/mediawiki.py:1045
+#, python-brace-format
+msgid "Created with model {new}: {reason}"
+msgstr "Utworzono model {new}: {reason}"
+
+#: extensions/base/mediawiki.py:1056
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) created the page [{article}]({article_url}) using a "
+"non-default content model {new}{comment}"
+msgstr ""
+"[{author}]({author_url}) utworzył(a) stronę [{article}]({article_url}) "
+"używając niedomyślnego modelu zawartości {new}{comment}"
+
+#: extensions/base/mediawiki.py:1071
+#, python-brace-format
+msgid "Created the tag \"{tag}\""
+msgstr "Utworzono znacznik „{tag}”"
+
+#: extensions/base/mediawiki.py:1081
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) created the [tag]({tag_url}) \"{tag}\"{comment}"
+msgstr ""
+"[{author}]({author_url}) utworzył(a) [znacznik]({tag_url}) „{tag}”{comment}"
+
+#: extensions/base/mediawiki.py:1102
+#, python-brace-format
+msgid "Deleted the tag \"{tag}\""
+msgstr "Usunięto znacznik „{tag}”"
+
+#: extensions/base/mediawiki.py:1104
+#, fuzzy
+msgid "Removed from"
+msgstr "Usunięto"
+
+#: extensions/base/mediawiki.py:1104
+msgid "{} revision or log entry"
+msgid_plural "{} revisions and/or log entries"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
+#: extensions/base/mediawiki.py:1117
+#, fuzzy, python-brace-format
+msgid ""
+"[{author}]({author_url}) deleted the [tag]({tag_url}) \"{tag}\"{comment}"
+msgstr "[{author}]({author_url}) usunął [znacznik]({tag_url}) „{tag}”"
+
+#: extensions/base/mediawiki.py:1127
+#, fuzzy, python-brace-format
+msgid ""
+"[{author}]({author_url}) deleted the [tag]({tag_url}) \"{tag}\" and removed "
+"it from {count} revision or log entry{comment}"
+msgid_plural ""
+"[{author}]({author_url}) deleted the [tag]({tag_url}) \"{tag}\" and removed "
+"it from {count} revisions and/or log entries{comment}"
+msgstr[0] ""
+"[{author}]({author_url}) zaimportował(a) [{article}]({article_url}) z jedną "
+"wersją{comment}"
+msgstr[1] ""
+"[{author}]({author_url}) zaimportował(a) [{article}]({article_url}) z "
+"{count} wersjami{comment}"
+msgstr[2] ""
+"[{author}]({author_url}) zaimportował(a) [{article}]({article_url}) z "
+"{count} wersjami{comment}"
+
+#: extensions/base/mediawiki.py:1144
+#, python-brace-format
+msgid "Activated the tag \"{tag}\""
+msgstr "Aktywowano znacznik „{tag}”"
+
+#: extensions/base/mediawiki.py:1153
+#, fuzzy, python-brace-format
+msgid ""
+"[{author}]({author_url}) activated the [tag]({tag_url}) \"{tag}\"{comment}"
+msgstr "[{author}]({author_url}) aktywował(a) [znacznik]({tag_url}) „{tag}”"
+
+#: extensions/base/mediawiki.py:1172
+#, fuzzy, python-brace-format
+msgid "Deactivated the tag \"{tag}\""
+msgstr "Dezaktywowano znacznik „{tag}”"
+
+#: extensions/base/mediawiki.py:1181
+#, fuzzy, python-brace-format
+msgid ""
+"[{author}]({author_url}) deactivated the [tag]({tag_url}) \"{tag}\"{comment}"
+msgstr "[{author}]({author_url}) dezaktywował(a) [znacznik]({tag_url}) „{tag}”"
+
+#: extensions/base/sprite.py:37
+#, python-brace-format
+msgid "Edited the sprite for {article}"
+msgstr "Edytowano sprite dla {article}"
+
+#: extensions/base/sprite.py:45
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) edited the sprite for [{article}]({article_url})"
+msgstr "[{author}]({author_url}) edytował(a) sprite [{article}]({article_url})"
+
+#: extensions/base/sprite.py:60
+#, python-brace-format
+msgid "Created the sprite sheet for {article}"
+msgstr "Utworzono sprite sheet dla {article}"
+
+#: extensions/base/sprite.py:68
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) created the sprite sheet for [{article}]"
+"({article_url})"
+msgstr ""
+"[{author}]({author_url}) utworzył(a) sprite sheet [{article}]({article_url})"
+
+#: extensions/base/sprite.py:79
+#, python-brace-format
+msgid "Edited the slice for {article}"
+msgstr "Edytowano część sprite dla {article}"
+
+#: extensions/base/sprite.py:86
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) edited the slice for [{article}]({article_url})"
+msgstr "[{author}]({author_url}) edytował(a) slice [{article}]({article_url})"
+
+#, python-brace-format
+#~ msgid "{value} (avg. {avg})"
+#~ msgstr "{value} (średnio {avg})"
+
+#~ msgid "Daily overview"
+#~ msgstr "Podsumowanie dnia"
+
+#~ msgid "No activity"
+#~ msgstr "Brak aktywności"
+
+#~ msgid " ({} action)"
+#~ msgid_plural " ({} actions)"
+#~ msgstr[0] " ({} akcja)"
+#~ msgstr[1] " ({} akcje)"
+#~ msgstr[2] " ({} akcji)"
+
+#~ msgid " ({} edit)"
+#~ msgid_plural " ({} edits)"
+#~ msgstr[0] " ({} edycja)"
+#~ msgstr[1] " ({} edycje)"
+#~ msgstr[2] " ({} edycji)"
+
+#~ msgid " UTC ({} action)"
+#~ msgid_plural " UTC ({} actions)"
+#~ msgstr[0] " UTC ({} akcja)"
+#~ msgstr[1] " UTC ({} akcje)"
+#~ msgstr[2] " UTC ({} akcji)"
+
+#~ msgid "But nobody came"
+#~ msgstr "Ale nikt nie przyszedł"
+
+#~ msgid "Most active user"
+#~ msgid_plural "Most active users"
+#~ msgstr[0] "Najbardziej aktywny użytkownik"
+#~ msgstr[1] "Najbardziej aktywni użytkownicy"
+#~ msgstr[2] "Najbardziej aktywni użytkownicy"
+
+#~ msgid "Most edited article"
+#~ msgid_plural "Most edited articles"
+#~ msgstr[0] "Najczęściej edytowany artykuł"
+#~ msgstr[1] "Najczęściej edytowane artykuły"
+#~ msgstr[2] "Najczęściej edytowane artykuły"
+
+#~ msgid "Edits made"
+#~ msgstr "Wykonanych edycji"
+
+#~ msgid "New files"
+#~ msgstr "Nowych plików"
+
+#~ msgid "Admin actions"
+#~ msgstr "Akcji administratorskich"
+
+#~ msgid "Bytes changed"
+#~ msgstr "Zmienionych bajtów"
+
+#~ msgid "New articles"
+#~ msgstr "Nowych artykułów"
+
+#~ msgid "Unique contributors"
+#~ msgstr "Unikalnych edytujących"
+
+#~ msgid "Most active hour"
+#~ msgid_plural "Most active hours"
+#~ msgstr[0] "Najbardziej aktywna godzina"
+#~ msgstr[1] "Najbardziej aktywne godziny"
+#~ msgstr[2] "Najbardziej aktywne godziny"
+
+#~ msgid "Day score"
+#~ msgstr "Wynik dnia"
+
+#~ msgid "No description provided"
+#~ msgstr "Nie podano opisu zmian"
+
+#~ msgid "second"
+#~ msgid_plural "seconds"
+#~ msgstr[0] "sekunda"
+#~ msgstr[1] "sekundy"
+#~ msgstr[2] "sekund"
+
+#~ msgid "week"
+#~ msgid_plural "weeks"
+#~ msgstr[0] "tydzień"
+#~ msgstr[1] "tygodnie"
+#~ msgstr[2] "tygodni"
+
+#~ msgid "month"
+#~ msgid_plural "months"
+#~ msgstr[0] "miesiąc"
+#~ msgstr[1] "miesiące"
+#~ msgstr[2] "miesięcy"
+
+#~ msgid "millennium"
+#~ msgid_plural "millennia"
+#~ msgstr[0] "tysiąclecie"
+#~ msgstr[1] "tysiąclecia"
+#~ msgstr[2] "tysiącleci"
+
+#~ msgid "decade"
+#~ msgid_plural "decades"
+#~ msgstr[0] "dekada"
+#~ msgstr[1] "dekady"
+#~ msgstr[2] "dekad"
+
+#~ msgid "century"
+#~ msgid_plural "centuries"
+#~ msgstr[0] "stulecie"
+#~ msgstr[1] "stulecia"
+#~ msgstr[2] "stuleci"
+
+#, python-brace-format
+#~ msgid ""
+#~ "Unknown event `{event}` by [{author}]({author_url}), report it on the "
+#~ "[support server](<{support}>)."
+#~ msgstr ""
+#~ "Nieznane wydarzenie `{event}` wykonane przez [{author}]({author_url}), "
+#~ "zgłoś je na [serwerze wsparcia](<{support}>)."
+
+#, python-brace-format
+#~ msgid "Unknown event `{event}`"
+#~ msgstr "Nieznane wydarzenie `{event}`"
+
+#~ msgid "Report this on the support server"
+#~ msgstr "Zgłoś to na serwerze wsparcia"
+
+#, python-brace-format
+#~ msgid "for {num} {translated_length}"
+#~ msgstr "na {num} {translated_length}"
+
+#~ msgid "until {}"
+#~ msgstr "do {}"
+
+#~ msgid "none"
+#~ msgstr "brak"
+
+#, python-brace-format
+#~ msgid ""
+#~ "[{author}]({author_url}) completed deletion of translatable page "
+#~ "[{article}]({article_url}){comment}"
+#~ msgstr ""
+#~ "[{author}]({author_url}) zakończył(a) usuwanie tłumaczonej strony "
+#~ "[{article}]({article_url}){comment}"
+
+#~ msgid "unknown expiry time"
+#~ msgstr "nieznany czas zakończenia"
+
+#, python-brace-format
+#~ msgid "Groups changed from {old_groups} to {new_groups}{reason}"
+#~ msgstr "Grupy zmienione z {old_groups} do {new_groups}{reason}"
+
+#, python-brace-format
+#~ msgid "[{author}]({author_url}) restored a wiki *{wiki_name}*{comment}"
+#~ msgstr "[{author}]({author_url}) przywrócił(a) wiki *{wiki_name}*{comment}"
+
+#, python-brace-format
+#~ msgid "Restored a \"{wiki}\" wiki"
+#~ msgstr "Przywrócono wiki „{wiki}”"
+
+#, python-brace-format
+#~ msgid "[{author}]({author_url}) deleted a comment on {target}'s profile"
+#~ msgstr ""
+#~ "[{author}]({author_url}) usunął/usunęła komentarz na profilu użytkownika "
+#~ "{target}"
+
+#, python-brace-format
+#~ msgid "[{author}]({author_url}) deleted a comment on their own profile"
+#~ msgstr ""
+#~ "[{author}]({author_url}) usunął/usunęła komentarz na swoim własnym profilu"
+
+#, python-brace-format
+#~ msgid "[{author}]({author_url}) imported interwiki{comment}"
+#~ msgstr "[{author}]({author_url}) zaimportował(a) interwiki{comment}"
+
+#~ msgid "Imported interwiki"
+#~ msgstr "Zaimportowano interwiki"
+
+#~ msgid "their own profile"
+#~ msgstr "swoim własnym profilu"
+
+#~ msgid "their own"
+#~ msgstr "swój własny"
+
+#, python-brace-format
+#~ msgid "[{target}]({target_url})'s"
+#~ msgstr "na profilu użytkownika [{target}]({target_url})"
+
+#, python-brace-format
+#~ msgid "[their own]({target_url})"
+#~ msgstr "na [swoim własnym profilu użytkownika]({target_url})"
diff --git a/locale/pl/LC_MESSAGES/misc.po b/locale/pl/LC_MESSAGES/misc.po
index cabdf2d..b7b2aea 100644
--- a/locale/pl/LC_MESSAGES/misc.po
+++ b/locale/pl/LC_MESSAGES/misc.po
@@ -6,7 +6,7 @@ msgid ""
msgstr ""
"Project-Id-Version: RcGcDw\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2020-11-28 23:45+0100\n"
+"POT-Creation-Date: 2021-07-11 14:32+0200\n"
"PO-Revision-Date: 2020-03-17 20:57+0100\n"
"Last-Translator: Frisk <>\n"
"Language-Team: \n"
@@ -71,7 +71,7 @@ msgstr "konto Discord"
msgid "Battle.net handle"
msgstr "konto Battle.net"
-#: src/misc.py:119
+#: src/misc.py:139
msgid ""
"\n"
"__And more__"
@@ -79,10 +79,10 @@ msgstr ""
"\n"
"__Oraz więcej__"
-#: src/misc.py:276
+#: src/misc.py:328
msgid "Unknown"
msgstr "Nieznana"
-#: src/misc.py:278
+#: src/misc.py:330
msgid "unknown"
msgstr "nieznana sekcja"
diff --git a/locale/pl/LC_MESSAGES/rc_formatters.mo b/locale/pl/LC_MESSAGES/rc_formatters.mo
deleted file mode 100644
index 2c0acb3..0000000
Binary files a/locale/pl/LC_MESSAGES/rc_formatters.mo and /dev/null differ
diff --git a/locale/pl/LC_MESSAGES/rc_formatters.po b/locale/pl/LC_MESSAGES/rc_formatters.po
index 12357f3..e45f9ba 100644
--- a/locale/pl/LC_MESSAGES/rc_formatters.po
+++ b/locale/pl/LC_MESSAGES/rc_formatters.po
@@ -7,8 +7,8 @@ msgstr ""
"Project-Id-Version: RcGcDw\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2021-04-14 16:24+0200\n"
-"PO-Revision-Date: 2021-04-14 14:22+0000\n"
-"Last-Translator: Frisk The Evil Goat Overlord \n"
+"PO-Revision-Date: 2021-05-06 14:10+0000\n"
+"Last-Translator: magiczocker \n"
"Language-Team: Polish \n"
"Language: pl\n"
@@ -17,7 +17,7 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=3; plural=n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 "
"|| n%100>=20) ? 1 : 2;\n"
-"X-Generator: Weblate 4.4.2\n"
+"X-Generator: Weblate 4.6\n"
"Generated-By: pygettext.py 1.5\n"
#: src/rc_formatters.py:28
@@ -95,8 +95,8 @@ msgid ""
"[{author}]({author_url}) triggered *{abuse_filter}*, performing the action "
"\"{action}\" on *[{target}]({target_url})* - action taken: {result}."
msgstr ""
-"[{author}]({author_url}) wywołał(a) *{abuse_filter}*, wykonując akcję "
-"\"{action}\" w *[{target}]({target_url})* - podjęte działanie: {result}"
+"[{author}]({author_url}) wywołał(a) *{abuse_filter}*, wykonując akcję \""
+"{action}\" w *[{target}]({target_url})* - podjęte działanie: {result}."
#: src/rc_formatters.py:85 src/rc_formatters.py:86 src/rc_formatters.py:87
#: src/rc_formatters.py:457 src/rc_formatters.py:460 src/rc_formatters.py:463
@@ -607,19 +607,20 @@ msgid "[{author}]({author_url}) replaced the Cargo table \"{table}\""
msgstr "[{author}]({author_url}) zastąpił(a) tabelę Cargo „{table}”"
#: src/rc_formatters.py:436
-#, fuzzy, python-brace-format
+#, python-brace-format
msgid ""
"[{author}]({author_url}) created the [tag]({tag_url}) \"{tag}\"{comment}"
-msgstr "[{author}]({author_url}) utworzył(a) [znacznik]({tag_url}) „{tag}”"
+msgstr ""
+"[{author}]({author_url}) utworzył(a) [znacznik]({tag_url}) „{tag}”{comment}"
#: src/rc_formatters.py:441
-#, fuzzy, python-brace-format
+#, python-brace-format
msgid ""
"[{author}]({author_url}) deleted the [tag]({tag_url}) \"{tag}\"{comment}"
-msgstr "[{author}]({author_url}) usunął [znacznik]({tag_url}) „{tag}”"
+msgstr "[{author}]({author_url}) usunął [znacznik]({tag_url}) „{tag}”{comment}"
#: src/rc_formatters.py:443
-#, fuzzy, python-brace-format
+#, python-brace-format
msgid ""
"[{author}]({author_url}) deleted the [tag]({tag_url}) \"{tag}\" and removed "
"it from {count} revision or log entry{comment}"
@@ -627,26 +628,29 @@ msgid_plural ""
"[{author}]({author_url}) deleted the [tag]({tag_url}) \"{tag}\" and removed "
"it from {count} revisions and/or log entries{comment}"
msgstr[0] ""
-"[{author}]({author_url}) zaimportował(a) [{article}]({article_url}) z jedną "
-"wersją{comment}"
+"[{author}]({author_url}) usunął/usunęła [znacznik]({tag_url}) „{tag}” "
+"usuwając go również z jednego logu zmian{comment}"
msgstr[1] ""
-"[{author}]({author_url}) zaimportował(a) [{article}]({article_url}) z "
-"{count} wersjami{comment}"
+"[{author}]({author_url}) usunął/usunęła [znacznik]({tag_url}) „{tag}” "
+"usuwając go również z {count} logów zmian{comment}"
msgstr[2] ""
-"[{author}]({author_url}) zaimportował(a) [{article}]({article_url}) z "
-"{count} wersjami{comment}"
+"[{author}]({author_url}) usunął/usunęła [znacznik]({tag_url}) „{tag}” "
+"usuwając go również z {count} logów zmian{comment}"
#: src/rc_formatters.py:449
-#, fuzzy, python-brace-format
+#, python-brace-format
msgid ""
"[{author}]({author_url}) activated the [tag]({tag_url}) \"{tag}\"{comment}"
-msgstr "[{author}]({author_url}) aktywował(a) [znacznik]({tag_url}) „{tag}”"
+msgstr ""
+"[{author}]({author_url}) aktywował(a) [znacznik]({tag_url}) „{tag}”{comment}"
#: src/rc_formatters.py:452
-#, fuzzy, python-brace-format
+#, python-brace-format
msgid ""
"[{author}]({author_url}) deactivated the [tag]({tag_url}) \"{tag}\"{comment}"
-msgstr "[{author}]({author_url}) dezaktywował(a) [znacznik]({tag_url}) „{tag}”"
+msgstr ""
+"[{author}]({author_url}) dezaktywował(a) [znacznik]({tag_url}) "
+"„{tag}”{comment}"
#: src/rc_formatters.py:454
#, python-brace-format
@@ -664,7 +668,7 @@ msgid "[{author}]({author_url}) locked a wiki *{wiki_name}*{comment}"
msgstr "[{author}]({author_url}) zablokował(a) wiki *{wiki_name}*{comment}"
#: src/rc_formatters.py:462
-#, fuzzy, python-brace-format
+#, python-brace-format
msgid ""
"[{author}]({author_url}) modified namespace *{namespace_name}* on "
"*{wiki_name}*{comment}"
@@ -689,9 +693,10 @@ msgstr ""
"*{comment}"
#: src/rc_formatters.py:477
-#, fuzzy, python-brace-format
+#, python-brace-format
msgid "[{author}]({author_url}) undeleted a wiki *{wiki_name}*{comment}"
-msgstr "[{author}]({author_url}) usunął/usunęła wiki *{wiki_name}*{comment}"
+msgstr ""
+"[{author}]({author_url}) przywrócił/przywróciła wiki *{wiki_name}*{comment}"
#: src/rc_formatters.py:481
#, python-brace-format
@@ -1424,9 +1429,9 @@ msgid ""
msgstr ""
#: src/rc_formatters.py:1195
-#, fuzzy, python-brace-format
+#, python-brace-format
msgid "Completed deletion of translation page \"{article}\""
-msgstr "Zmieniono widoczność wersji na stronie {article} "
+msgstr "Zmieniono widoczność wersji na stronie {article}"
#: src/rc_formatters.py:1198
#, python-brace-format
diff --git a/locale/pl/LC_MESSAGES/rcgcdw.mo b/locale/pl/LC_MESSAGES/rcgcdw.mo
index e5e0fba..11ab174 100644
Binary files a/locale/pl/LC_MESSAGES/rcgcdw.mo and b/locale/pl/LC_MESSAGES/rcgcdw.mo differ
diff --git a/locale/pl/LC_MESSAGES/rcgcdw.po b/locale/pl/LC_MESSAGES/rcgcdw.po
index 527280b..6b7a6ae 100644
--- a/locale/pl/LC_MESSAGES/rcgcdw.po
+++ b/locale/pl/LC_MESSAGES/rcgcdw.po
@@ -6,10 +6,10 @@ msgid ""
msgstr ""
"Project-Id-Version: RcGcDw\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2020-12-23 00:28+0100\n"
-"PO-Revision-Date: 2020-10-14 18:41+0000\n"
-"Last-Translator: Rail <>\n"
-"Language-Team: Polish \n"
+"Language-Team: Polish \n"
"Language: pl\n"
"MIME-Version: 1.0\n"
@@ -17,203 +17,194 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=3; plural=n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 "
"|| n%100>=20) ? 1 : 2;\n"
-"X-Generator: Weblate 4.2.1\n"
+"X-Generator: Weblate 4.6\n"
"Generated-By: pygettext.py 1.5\n"
-#: src/rcgcdw.py:115 src/rcgcdw.py:117 src/rcgcdw.py:119 src/rcgcdw.py:121
-#: src/rcgcdw.py:123 src/rcgcdw.py:125 src/rcgcdw.py:127
+#: src/rcgcdw.py:117
#, python-brace-format
msgid "{value} (avg. {avg})"
msgstr "{value} (średnio {avg})"
-#: src/rcgcdw.py:147
+#: src/rcgcdw.py:136
msgid "Daily overview"
msgstr "Podsumowanie dnia"
-#: src/rcgcdw.py:154
+#: src/rcgcdw.py:143
msgid "No activity"
msgstr "Brak aktywności"
-#: src/rcgcdw.py:178
+#: src/rcgcdw.py:167
msgid " ({} action)"
msgid_plural " ({} actions)"
msgstr[0] " ({} akcja)"
msgstr[1] " ({} akcje)"
msgstr[2] " ({} akcji)"
-#: src/rcgcdw.py:180
+#: src/rcgcdw.py:169
msgid " ({} edit)"
msgid_plural " ({} edits)"
msgstr[0] " ({} edycja)"
msgstr[1] " ({} edycje)"
msgstr[2] " ({} edycji)"
-#: src/rcgcdw.py:185
+#: src/rcgcdw.py:174
msgid " UTC ({} action)"
msgid_plural " UTC ({} actions)"
msgstr[0] " UTC ({} akcja)"
msgstr[1] " UTC ({} akcje)"
msgstr[2] " UTC ({} akcji)"
-#: src/rcgcdw.py:187 src/rcgcdw.py:188 src/rcgcdw.py:192
+#: src/rcgcdw.py:176 src/rcgcdw.py:179
msgid "But nobody came"
msgstr "Ale nikt nie przyszedł"
-#: src/rcgcdw.py:195
+#: src/rcgcdw.py:183
msgid "Most active user"
msgid_plural "Most active users"
msgstr[0] "Najbardziej aktywny użytkownik"
msgstr[1] "Najbardziej aktywni użytkownicy"
msgstr[2] "Najbardziej aktywni użytkownicy"
-#: src/rcgcdw.py:196
+#: src/rcgcdw.py:184
msgid "Most edited article"
msgid_plural "Most edited articles"
msgstr[0] "Najczęściej edytowany artykuł"
msgstr[1] "Najczęściej edytowane artykuły"
msgstr[2] "Najczęściej edytowane artykuły"
-#: src/rcgcdw.py:197
+#: src/rcgcdw.py:185
msgid "Edits made"
msgstr "Wykonanych edycji"
-#: src/rcgcdw.py:197
+#: src/rcgcdw.py:185
msgid "New files"
msgstr "Nowych plików"
-#: src/rcgcdw.py:197
+#: src/rcgcdw.py:186
msgid "Admin actions"
msgstr "Akcji administratorskich"
-#: src/rcgcdw.py:198
+#: src/rcgcdw.py:186
msgid "Bytes changed"
msgstr "Zmienionych bajtów"
-#: src/rcgcdw.py:198
+#: src/rcgcdw.py:187
msgid "New articles"
msgstr "Nowych artykułów"
-#: src/rcgcdw.py:199
+#: src/rcgcdw.py:187
msgid "Unique contributors"
msgstr "Unikalnych edytujących"
-#: src/rcgcdw.py:200
+#: src/rcgcdw.py:188
msgid "Most active hour"
msgid_plural "Most active hours"
msgstr[0] "Najbardziej aktywna godzina"
msgstr[1] "Najbardziej aktywne godziny"
msgstr[2] "Najbardziej aktywne godziny"
-#: src/rcgcdw.py:201
+#: src/rcgcdw.py:189
msgid "Day score"
msgstr "Wynik dnia"
-#: src/rcgcdw.py:243
-msgid "director"
-msgstr "Dyrektor"
+#: src/rcgcdw.py:223
+msgid "~~hidden~~"
+msgstr "~~ukryte~~"
-#: src/rcgcdw.py:243
-msgid "bot"
-msgstr "Bot"
+#: src/rcgcdw.py:225
+msgid "No description provided"
+msgstr "Nie podano opisu zmian"
-#: src/rcgcdw.py:243
-msgid "editor"
-msgstr "Redaktor"
+#: src/rcgcdw.py:228
+msgid "hidden"
+msgstr "ukryte"
-#: src/rcgcdw.py:243
-msgid "directors"
-msgstr "Dyrektorzy"
+#~ msgid "director"
+#~ msgstr "Dyrektor"
-#: src/rcgcdw.py:243
-msgid "sysop"
-msgstr "Administrator"
+#~ msgid "bot"
+#~ msgstr "Bot"
-#: src/rcgcdw.py:243
-msgid "bureaucrat"
-msgstr "Biurokrata"
+#~ msgid "editor"
+#~ msgstr "Redaktor"
-#: src/rcgcdw.py:243
-msgid "reviewer"
-msgstr "Przeglądający"
+#~ msgid "directors"
+#~ msgstr "Dyrektorzy"
-#: src/rcgcdw.py:244
-msgid "autoreview"
-msgstr "Automatycznie przeglądający"
+#~ msgid "sysop"
+#~ msgstr "Administrator"
-#: src/rcgcdw.py:244
-msgid "autopatrol"
-msgstr "Automatycznie zatwierdzający"
+#~ msgid "bureaucrat"
+#~ msgstr "Biurokrata"
-#: src/rcgcdw.py:244
-msgid "wiki_guardian"
-msgstr "Strażnik wiki"
+#~ msgid "reviewer"
+#~ msgstr "Przeglądający"
-#: src/rcgcdw.py:244
-msgid "second"
-msgid_plural "seconds"
-msgstr[0] "sekunda"
-msgstr[1] "sekundy"
-msgstr[2] "sekund"
+#~ msgid "autoreview"
+#~ msgstr "Automatycznie przeglądający"
-#: src/rcgcdw.py:244
-msgid "minute"
-msgid_plural "minutes"
-msgstr[0] "minuta"
-msgstr[1] "minuty"
-msgstr[2] "minut"
+#~ msgid "autopatrol"
+#~ msgstr "Automatycznie zatwierdzający"
-#: src/rcgcdw.py:244
-msgid "hour"
-msgid_plural "hours"
-msgstr[0] "godzina"
-msgstr[1] "godziny"
-msgstr[2] "godzin"
+#~ msgid "wiki_guardian"
+#~ msgstr "Strażnik wiki"
-#: src/rcgcdw.py:244
-msgid "day"
-msgid_plural "days"
-msgstr[0] "dzień"
-msgstr[1] "dni"
-msgstr[2] "dni"
+#~ msgid "second"
+#~ msgid_plural "seconds"
+#~ msgstr[0] "sekunda"
+#~ msgstr[1] "sekundy"
+#~ msgstr[2] "sekund"
-#: src/rcgcdw.py:244
-msgid "week"
-msgid_plural "weeks"
-msgstr[0] "tydzień"
-msgstr[1] "tygodnie"
-msgstr[2] "tygodni"
+#~ msgid "minute"
+#~ msgid_plural "minutes"
+#~ msgstr[0] "minuta"
+#~ msgstr[1] "minuty"
+#~ msgstr[2] "minut"
-#: src/rcgcdw.py:244
-msgid "month"
-msgid_plural "months"
-msgstr[0] "miesiąc"
-msgstr[1] "miesiące"
-msgstr[2] "miesięcy"
+#~ msgid "hour"
+#~ msgid_plural "hours"
+#~ msgstr[0] "godzina"
+#~ msgstr[1] "godziny"
+#~ msgstr[2] "godzin"
-#: src/rcgcdw.py:244
-msgid "year"
-msgid_plural "years"
-msgstr[0] "rok"
-msgstr[1] "lata"
-msgstr[2] "lat"
+#~ msgid "day"
+#~ msgid_plural "days"
+#~ msgstr[0] "dzień"
+#~ msgstr[1] "dni"
+#~ msgstr[2] "dni"
-#: src/rcgcdw.py:244
-msgid "millennium"
-msgid_plural "millennia"
-msgstr[0] "tysiąclecie"
-msgstr[1] "tysiąclecia"
-msgstr[2] "tysiącleci"
+#~ msgid "week"
+#~ msgid_plural "weeks"
+#~ msgstr[0] "tydzień"
+#~ msgstr[1] "tygodnie"
+#~ msgstr[2] "tygodni"
-#: src/rcgcdw.py:244
-msgid "decade"
-msgid_plural "decades"
-msgstr[0] "dekada"
-msgstr[1] "dekady"
-msgstr[2] "dekad"
+#~ msgid "month"
+#~ msgid_plural "months"
+#~ msgstr[0] "miesiąc"
+#~ msgstr[1] "miesiące"
+#~ msgstr[2] "miesięcy"
-#: src/rcgcdw.py:244
-msgid "century"
-msgid_plural "centuries"
-msgstr[0] "stulecie"
-msgstr[1] "stulecia"
-msgstr[2] "stuleci"
+#~ msgid "year"
+#~ msgid_plural "years"
+#~ msgstr[0] "rok"
+#~ msgstr[1] "lata"
+#~ msgstr[2] "lat"
+
+#~ msgid "millennium"
+#~ msgid_plural "millennia"
+#~ msgstr[0] "tysiąclecie"
+#~ msgstr[1] "tysiąclecia"
+#~ msgstr[2] "tysiącleci"
+
+#~ msgid "decade"
+#~ msgid_plural "decades"
+#~ msgstr[0] "dekada"
+#~ msgstr[1] "dekady"
+#~ msgstr[2] "dekad"
+
+#~ msgid "century"
+#~ msgid_plural "centuries"
+#~ msgstr[0] "stulecie"
+#~ msgstr[1] "stulecia"
+#~ msgstr[2] "stuleci"
diff --git a/locale/pl/LC_MESSAGES/redaction.mo b/locale/pl/LC_MESSAGES/redaction.mo
index 1050bd6..4354871 100644
Binary files a/locale/pl/LC_MESSAGES/redaction.mo and b/locale/pl/LC_MESSAGES/redaction.mo differ
diff --git a/locale/pl/LC_MESSAGES/redaction.po b/locale/pl/LC_MESSAGES/redaction.po
index 79bc1af..b48724b 100644
--- a/locale/pl/LC_MESSAGES/redaction.po
+++ b/locale/pl/LC_MESSAGES/redaction.po
@@ -7,19 +7,26 @@ msgid ""
msgstr ""
"Project-Id-Version: RcGcDw\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2020-12-23 00:28+0100\n"
-"PO-Revision-Date: 2020-11-16 22:51+0100\n"
-"Last-Translator: \n"
-"Language-Team: \n"
+"POT-Creation-Date: 2021-07-11 14:32+0200\n"
+"PO-Revision-Date: 2021-07-30 10:44+0000\n"
+"Last-Translator: Frisk The Evil Goat Overlord \n"
+"Language-Team: Polish \n"
"Language: pl\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Generator: Poedit 2.4.1\n"
-"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 "
-"|| n%100>14) ? 1 : 2);\n"
+"Plural-Forms: nplurals=3; plural=n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 "
+"|| n%100>=20) ? 1 : 2;\n"
+"X-Generator: Weblate 4.6.2\n"
-#: src/discord/redaction.py:62 src/discord/redaction.py:65
-#: src/discord/redaction.py:70
-msgid "Removed"
-msgstr "Usunięte"
+#: src/discord/redaction.py:77
+msgid "hidden"
+msgstr "ukryte"
+
+#: src/discord/redaction.py:80 src/discord/redaction.py:85
+msgid "~~hidden~~"
+msgstr "~~ukryte~~"
+
+#~ msgid "Removed"
+#~ msgstr "Usunięte"
diff --git a/locale/pt-br/LC_MESSAGES/discussion_formatters.mo b/locale/pt-br/LC_MESSAGES/discussion_formatters.mo
deleted file mode 100644
index 045b2a6..0000000
Binary files a/locale/pt-br/LC_MESSAGES/discussion_formatters.mo and /dev/null differ
diff --git a/locale/pt-br/LC_MESSAGES/discussion_formatters.po b/locale/pt-br/LC_MESSAGES/discussion_formatters.po
deleted file mode 100644
index ab555ae..0000000
--- a/locale/pt-br/LC_MESSAGES/discussion_formatters.po
+++ /dev/null
@@ -1,184 +0,0 @@
-# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
-# This file is distributed under the same license as the PACKAGE package.
-#
-# Frisk <>, 2020.
-msgid ""
-msgstr ""
-"Project-Id-Version: \n"
-"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2020-12-23 00:28+0100\n"
-"PO-Revision-Date: 2020-12-13 14:30+0000\n"
-"Last-Translator: MarkusRost \n"
-"Language-Team: Portuguese (Brazil) \n"
-"Language: pt-br\n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=UTF-8\n"
-"Content-Transfer-Encoding: 8bit\n"
-"Plural-Forms: nplurals=2; plural=(n != 1);\n"
-"X-Generator: Weblate 4.2.1\n"
-
-#: src/discussion_formatters.py:21 src/discussion_formatters.py:56
-#: src/discussion_formatters.py:67 src/discussion_formatters.py:95
-#: src/discussion_formatters.py:163 src/discussion_formatters.py:176
-msgid "unknown"
-msgstr "desconhecido"
-
-#: src/discussion_formatters.py:27 src/discussion_formatters.py:102
-msgid "Unregistered user"
-msgstr "Usuário não registrado"
-
-#: src/discussion_formatters.py:39
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) created [{title}](<{url}f/p/{threadId}>) in "
-"{forumName}"
-msgstr ""
-"[{author}]({author_url}) criou [{title}](<{url}f/p/{threadId}>) em "
-"{forumName}"
-
-#: src/discussion_formatters.py:42
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) created a poll [{title}](<{url}f/p/{threadId}>) in "
-"{forumName}"
-msgstr ""
-"[{author}]({author_url}) criou uma pesquisa [{title}](<{url}f/p/{threadId}>) "
-"em {forumName}"
-
-#: src/discussion_formatters.py:45
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) created a quiz [{title}](<{url}f/p/{threadId}>) in "
-"{forumName}"
-msgstr ""
-"[{author}]({author_url}) criou um quiz [{title}](<{url}f/p/{threadId}>) em "
-"{forumName}"
-
-#: src/discussion_formatters.py:54
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) created a [reply](<{url}f/p/{threadId}/r/{postId}>) "
-"to [{title}](<{url}f/p/{threadId}>) in {forumName}"
-msgstr ""
-"[{author}]({author_url}) criou uma [resposta](<{url}f/p/{threadId}/r/{postId}"
-">) a [{title}](<{url}f/p/{threadId}>) em {forumName}"
-
-#: src/discussion_formatters.py:61
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) created [{title}](<{url}wiki/Message_Wall:"
-"{user_wall}?threadId={threadId}>) on [{user}'s Message Wall](<{url}wiki/"
-"Message_Wall:{user_wall}>)"
-msgstr ""
-"[{author}]({author_url}) criou [{title}](<{url}wiki/Message_Wall:{user_wall}?"
-"threadId={threadId}>) no mural de mensagens de [{user}](<{url}wiki/"
-"Message_Wall:{user_wall}>)"
-
-#: src/discussion_formatters.py:64
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) created a [reply](<{url}wiki/Message_Wall:"
-"{user_wall}?threadId={threadId}#{replyId}>) to [{title}](<{url}wiki/"
-"Message_Wall:{user_wall}?threadId={threadId}>) on [{user}'s Message Wall]"
-"(<{url}wiki/Message_Wall:{user_wall}>)"
-msgstr ""
-"[{author}]({author_url}) criou uma [resposta](<{url}wiki/Message_Wall:"
-"{user_wall}?threadId={threadId}#{replyId}>) a [{title}](<{url}wiki/"
-"Message_Wall:{user_wall}?threadId={threadId}>) no mural de mensagens de "
-"[{user}](<{url}wiki/Message_Wall:{user_wall}>)"
-
-#: src/discussion_formatters.py:72
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) created a [comment](<{url}?commentId={commentId}>) "
-"on [{article}](<{url}>)"
-msgstr ""
-"[{author}]({author_url}) fez um [comentário](<{url}?commentId={commentId}>) "
-"em [{article}](<{url}>)"
-
-#: src/discussion_formatters.py:78
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) created a [reply](<{url}?commentId={commentId}"
-"&replyId={replyId}>) to a [comment](<{url}?commentId={commentId}>) on "
-"[{article}](<{url}>)"
-msgstr ""
-"[{author}]({author_url}) criou uma [resposta](<{url}?commentId={commentId}"
-"&replyId={replyId}>) a um [comentário](<{url}?commentId={commentId}>) em "
-"[{article}](<{url}>)"
-
-#: src/discussion_formatters.py:86
-#, python-brace-format
-msgid ""
-"Unknown event `{event}` by [{author}]({author_url}), report it on the "
-"[support server](<{support}>)."
-msgstr ""
-"Evento `{event}` desconhecido por [{author}]({author_url}), relate no "
-"[servidor de suporte](<{support}>)."
-
-#: src/discussion_formatters.py:123
-#, python-brace-format
-msgid "Created \"{title}\""
-msgstr "Criou \"{title}\""
-
-#: src/discussion_formatters.py:127
-#, python-brace-format
-msgid "Created a poll \"{title}\""
-msgstr "Criou uma pesquisa \"{title}\""
-
-#: src/discussion_formatters.py:134
-msgid "Option {}"
-msgstr "Opção {}"
-
-#: src/discussion_formatters.py:135
-#, python-brace-format
-msgid "__[View image]({image_url})__"
-msgstr "__[Ver imagem]({image_url})__"
-
-#: src/discussion_formatters.py:139
-#, python-brace-format
-msgid "Created a quiz \"{title}\""
-msgstr "Criou um quiz \"{title}\""
-
-#: src/discussion_formatters.py:155 src/discussion_formatters.py:157
-msgid "Tags"
-msgstr "Etiquetas"
-
-#: src/discussion_formatters.py:155
-msgid "{} tags"
-msgstr "{} etiquetas"
-
-#: src/discussion_formatters.py:160
-#, python-brace-format
-msgid "Replied to \"{title}\""
-msgstr "Respondeu \"{title}\""
-
-#: src/discussion_formatters.py:169
-#, python-brace-format
-msgid "Created \"{title}\" on {user}'s Message Wall"
-msgstr "Criou \"{title}\" no mural de mensagens de {user}"
-
-#: src/discussion_formatters.py:173
-#, python-brace-format
-msgid "Replied to \"{title}\" on {user}'s Message Wall"
-msgstr "Respondeu \"{title}\" no mural de mensagens de {user}"
-
-#: src/discussion_formatters.py:180
-#, python-brace-format
-msgid "Commented on {article}"
-msgstr "Comentou em {article}"
-
-#: src/discussion_formatters.py:184
-#, python-brace-format
-msgid "Replied to a comment on {article}"
-msgstr "Respondeu a um comentário em {article}"
-
-#: src/discussion_formatters.py:188
-#, python-brace-format
-msgid "Unknown event `{event}`"
-msgstr "Evento `{event}` desconhecido"
-
-#: src/discussion_formatters.py:194 src/discussion_formatters.py:196
-msgid "Report this on the support server"
-msgstr "Reportar isso no servidor de suporte"
diff --git a/locale/pt-br/LC_MESSAGES/formatters.mo b/locale/pt-br/LC_MESSAGES/formatters.mo
new file mode 100644
index 0000000..3dbd6dd
Binary files /dev/null and b/locale/pt-br/LC_MESSAGES/formatters.mo differ
diff --git a/locale/pt-br/LC_MESSAGES/formatters.po b/locale/pt-br/LC_MESSAGES/formatters.po
new file mode 100644
index 0000000..cf6116d
--- /dev/null
+++ b/locale/pt-br/LC_MESSAGES/formatters.po
@@ -0,0 +1,1985 @@
+# #-#-#-#-# rcgcdw.po #-#-#-#-#
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR , YEAR.
+#
+# #-#-#-#-# formatters.po #-#-#-#-#
+# #-#-#-#-# discussion_formatters.po #-#-#-#-#
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+#
+# Frisk <>, 2020.
+# #-#-#-#-# rc_formatters.po #-#-#-#-#
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR , YEAR.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: \n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2021-07-11 14:34+0200\n"
+"PO-Revision-Date: 2021-07-30 10:44+0000\n"
+"Last-Translator: Eduaddad \n"
+"Language-Team: Portuguese (Brazil) \n"
+"Language: pt-br\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n > 1;\n"
+"X-Generator: Weblate 4.6.2\n"
+
+#: src/api/util.py:61 src/api/util.py:66
+msgid "__Only whitespace__"
+msgstr "__Apenas espaço em branco__"
+
+#: src/api/util.py:71
+msgid "Removed"
+msgstr "Removido"
+
+#: src/api/util.py:73
+msgid "Added"
+msgstr "Adicionado"
+
+#: src/api/util.py:94 src/api/util.py:126 src/api/util.py:133
+#: src/api/util.py:141 extensions/base/discussions.py:247
+#: extensions/base/discussions.py:264 extensions/base/abusefilter.py:45
+msgid "Unregistered user"
+msgstr "Usuário não registrado"
+
+#: src/api/util.py:160
+msgctxt "recent changes Tags"
+msgid "Tags"
+msgstr "Etiquetas"
+
+#: src/api/util.py:162
+msgid "**Added**: "
+msgstr "**Adicionado**: "
+
+#: src/api/util.py:163
+msgid " and {} more\n"
+msgstr " e {} mais\n"
+
+#: src/api/util.py:165
+msgid "**Removed**: "
+msgstr "**Removida**: "
+
+#: src/api/util.py:166
+msgid " and {} more"
+msgstr " e {} mais"
+
+#: src/api/util.py:168
+msgid "Changed categories"
+msgstr "Mudanças de categorias"
+
+#: extensions/base/cargo.py:37
+#, python-brace-format
+msgid "Created the Cargo table \"{table}\""
+msgstr "Criou a tabela Cargo \"{table}\""
+
+#: extensions/base/cargo.py:45
+#, python-brace-format
+msgid "[{author}]({author_url}) created the Cargo table \"{table}\""
+msgstr "[{author}]({author_url}) criou a tabela Cargo \"{table}\""
+
+#: extensions/base/cargo.py:60
+#, python-brace-format
+msgid "Recreated the Cargo table \"{table}\""
+msgstr "Recriou a tabela Cargo \"{table}\""
+
+#: extensions/base/cargo.py:68
+#, python-brace-format
+msgid "[{author}]({author_url}) recreated the Cargo table \"{table}\""
+msgstr "[{author}]({author_url}) recriou a tabela Cargo \"{table}\""
+
+#: extensions/base/cargo.py:83
+#, python-brace-format
+msgid "Replaced the Cargo table \"{table}\""
+msgstr "Substituiu a tabela Cargo \"{table}\""
+
+#: extensions/base/cargo.py:91
+#, python-brace-format
+msgid "[{author}]({author_url}) replaced the Cargo table \"{table}\""
+msgstr "[{author}]({author_url}) substituiu a tabela Cargo \"{table}\""
+
+#: extensions/base/cargo.py:105
+#, python-brace-format
+msgid "Deleted the Cargo table \"{table}\""
+msgstr "Excluiu a tabela Cargo \"{table}\""
+
+#: extensions/base/cargo.py:112
+#, python-brace-format
+msgid "[{author}]({author_url}) deleted the Cargo table \"{table}\""
+msgstr "[{author}]({author_url}) excluiu a tabela Cargo \"{table}\""
+
+#: extensions/base/translate.py:41
+#, python-brace-format
+msgid "Marked \"{article}\" for translation"
+msgstr "Marcado \"{article}\" para tradução"
+
+#: extensions/base/translate.py:55
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) marked [{article}]({article_url}) for "
+"translation{comment}"
+msgstr ""
+"[{author}]({author_url}) marcou [{article}]({article_url}) para "
+"tradução{comment}"
+
+#: extensions/base/translate.py:70
+#, python-brace-format
+msgid "Removed \"{article}\" from the translation system"
+msgstr "Removido \"{article}\" do sistema de tradução"
+
+#: extensions/base/translate.py:80
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) removed [{article}]({article_url}) from the "
+"translation system{comment}"
+msgstr ""
+"[{author}]({author_url}) removeu [{article}]({article_url}) do sistema de "
+"tradução{comment}"
+
+#: extensions/base/translate.py:95
+#, python-brace-format
+msgid "Completed moving translation pages from \"{article}\" to \"{target}\""
+msgstr ""
+"Concluída a movimentação das páginas de tradução de \"{article}\" para "
+"\"{target}\""
+
+#: extensions/base/translate.py:106
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) completed moving translation pages from *{article}* "
+"to [{target}]({target_url}){comment}"
+msgstr ""
+"[{author}]({author_url}) completou a movimentação das páginas de tradução de "
+"*{article}* para [{target}]({target_url}){comment}"
+
+#: extensions/base/translate.py:121
+#, python-brace-format
+msgid "Encountered a problem while moving \"{article}\" to \"{target}\""
+msgstr ""
+"Encontrou um problema durante o movimento \"{article}\" para \"{target}\""
+
+#: extensions/base/translate.py:133
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) encountered a problem while moving [{article}]"
+"({article_url}) to [{target}]({target_url}){comment}"
+msgstr ""
+"[{author}]({author_url}) encontrou um problema ao se mover [{article}]"
+"({article_url}) para [{target}]({target_url}){comment}"
+
+#: extensions/base/translate.py:149
+#, python-brace-format
+msgid ""
+"Failed to delete \"{article}\" which belongs to translatable page "
+"\"{target}\""
+msgstr ""
+"Falha ao excluir \"{article}\" que pertence à página traduzível \"{target}\""
+
+#: extensions/base/translate.py:161
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) failed to delete [{article}]({article_url}) which "
+"belongs to translatable page [{target}]({target_url}){comment}"
+msgstr ""
+"[{author}]({author_url}) falhou em deletar [{article}]({article_url}) que "
+"pertence à página traduzível [{target}]({target_url}){comment}"
+
+#: extensions/base/translate.py:177
+#, python-brace-format
+msgid "Completed deletion of translation page \"{article}\""
+msgstr "Concluiu a exclusão da página de tradução \"{article}\""
+
+#: extensions/base/translate.py:188
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) completed deletion of translation page [{article}]"
+"({article_url}){comment}"
+msgstr ""
+"[{author}]({author_url}) completou a exclusão da página de tradução "
+"[{article}]({article_url}){comment}"
+
+#: extensions/base/translate.py:203
+#, python-brace-format
+msgid ""
+"Failed to delete \"{article}\" which belongs to translation page \"{target}\""
+msgstr ""
+"Falha ao excluir \"{article}\" que pertence à página de tradução \"{target}\""
+
+#: extensions/base/translate.py:215
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) failed to delete [{article}]({article_url}) which "
+"belongs to translation page [{target}]({target_url}){comment}"
+msgstr ""
+"[{author}]({author_url}) falhou em deletar [{article}]({article_url}) que "
+"pertence à página de tradução [{target}]({target_url}){comment}"
+
+#: extensions/base/translate.py:231
+#, python-brace-format
+msgid "Encouraged translation of \"{article}\""
+msgstr "Incentivou a tradução de \"{article}\""
+
+#: extensions/base/translate.py:240
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) encouraged translation of [{article}]({article_url})"
+"{comment}"
+msgstr ""
+"[{author}]({author_url}) incentivou a tradução de [{article}]({article_url})"
+"{comment}"
+
+#: extensions/base/translate.py:255
+#, python-brace-format
+msgid "Discouraged translation of \"{article}\""
+msgstr "Tradução desencorajada de \"{article}\""
+
+#: extensions/base/translate.py:264
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) discouraged translation of [{article}]"
+"({article_url}){comment}"
+msgstr ""
+"[{author}]({author_url}) incentivou a tradução de [{article}]({article_url})"
+"{comment}"
+
+#: extensions/base/translate.py:282
+#, python-brace-format
+msgid "Limited languages for \"{article}\" to `{languages}`"
+msgstr "Idiomas limitados para \"{article}\" para `{languages}`"
+
+#: extensions/base/translate.py:285
+#, python-brace-format
+msgid "Priority languages for \"{article}\" set to `{languages}`"
+msgstr "Idiomas prioritários para \"{article}\" definido como `{languages}`"
+
+#: extensions/base/translate.py:288
+#, python-brace-format
+msgid "Removed priority languages from \"{article}\""
+msgstr "Removeu Idiomas prioritários de \"{article}\""
+
+#: extensions/base/translate.py:301
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) limited languages for [{article}]({article_url}) to "
+"`{languages}`{comment}"
+msgstr ""
+"[{author}]({author_url}) limitou idiomas para [{article}]({article_url}) "
+"para`{languages}`{comment}"
+
+#: extensions/base/translate.py:308
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) set the priority languages for [{article}]"
+"({article_url}) to `{languages}`{comment}"
+msgstr ""
+"[{author}]({author_url}) definiu os idiomas prioritários para [{article}]"
+"({article_url}) para `{languages}`{comment}"
+
+#: extensions/base/translate.py:315
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) removed priority languages from [{article}]"
+"({article_url}){comment}"
+msgstr ""
+"[{author}]({author_url}) removeu idiomas prioritários de [{article}]"
+"({article_url}){comment}"
+
+#: extensions/base/translate.py:331
+#, python-brace-format
+msgid "Added translatable page \"{article}\" to aggregate group \"{group}\""
+msgstr ""
+"Adicionada página traduzível \"{article}\" para agregar o grupo \"{group}\""
+
+#: extensions/base/translate.py:342
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) added translatable page [{article}]({article_url}) "
+"to aggregate group \"{group}\"{comment}"
+msgstr ""
+"[{author}]({author_url}) adicionou a página traduzível [{article}]"
+"({article_url}) para agregar o grupo \"{group}\"{comment}"
+
+#: extensions/base/translate.py:357
+#, python-brace-format
+msgid ""
+"Removed translatable page \"{article}\" from aggregate group \"{group}\""
+msgstr "Página traduzível removida \"{article}\" do grupo agregado \"{group}\""
+
+#: extensions/base/translate.py:368
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) removed translatable page [{article}]"
+"({article_url}) from aggregate group \"{group}\"{comment}"
+msgstr ""
+"[{author}]({author_url}) removeu a página traduzida [{article}]"
+"({article_url}) do grupo agregado \"{group}\"{comment}"
+
+#: extensions/base/translate.py:387
+#, python-brace-format
+msgid "Reviewed translation \"{article}\""
+msgstr "Revisou a tradução \"{article}\""
+
+#: extensions/base/translate.py:401
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) reviewed translation [{article}]({article_url})"
+"{comment}"
+msgstr ""
+"[{author}]({author_url}) revisou a tradução [{article}]({article_url})"
+"{comment}"
+
+#: extensions/base/translate.py:416
+#, python-brace-format
+msgid "Changed the state of `{language}` translations of \"{article}\""
+msgstr "Mudou o estado de traduções de`{language}` de \"{article}\""
+
+#: extensions/base/translate.py:419
+msgid "Old state"
+msgstr "Estado antigo"
+
+#: extensions/base/translate.py:420
+msgid "New state"
+msgstr "Novo estado"
+
+#: extensions/base/translate.py:431
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) changed the state of `{language}` translations of "
+"[{article}]({article_url}) from `{old_state}` to `{new_state}`{comment}"
+msgstr ""
+"[{author}]({author_url}) mudou o estado das traduçõe de `{language}` de "
+"[{article}]({article_url}) de `{old_state}` para `{new_state}`{comment}"
+
+#: extensions/base/translate.py:439
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) changed the state of `{language}` translations of "
+"[{article}]({article_url}) to `{new_state}`{comment}"
+msgstr ""
+"[{author}]({author_url}) mudou o estado de traduções `{language}` de "
+"[{article}]({article_url}) para `{new_state}`{comment}"
+
+#: extensions/base/translate.py:452 extensions/base/translate.py:455
+msgid "(default)"
+msgstr "(padrão)"
+
+#: extensions/base/translate.py:464
+#, python-brace-format
+msgid "Changed the language of \"{article}\""
+msgstr "Mudou o idioma de \"{article}\""
+
+#: extensions/base/translate.py:465
+msgid "Old language"
+msgstr "Idioma antigo"
+
+#: extensions/base/translate.py:466
+msgid "New language"
+msgstr "Novo idioma"
+
+#: extensions/base/translate.py:477
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) changed the language of [{article}]({article_url}) "
+"from {old_lang} to {new_lang}{comment}"
+msgstr ""
+"[{author}]({author_url}) mudou o idioma do [{article}]({article_url}) de "
+"{old_lang} para {new_lang}{comment}"
+
+#: extensions/base/discussions.py:148 extensions/base/discussions.py:207
+#: extensions/base/discussions.py:245 extensions/base/discussions.py:261
+#: extensions/base/discussions.py:284 extensions/base/discussions.py:306
+#: extensions/base/discussions.py:334 extensions/base/discussions.py:354
+msgid "unknown"
+msgstr "desconhecido"
+
+#: extensions/base/discussions.py:157
+#, python-brace-format
+msgid "Created \"{title}\""
+msgstr "Criou \"{title}\""
+
+#: extensions/base/discussions.py:161
+#, python-brace-format
+msgid "Created a poll \"{title}\""
+msgstr "Criou uma pesquisa \"{title}\""
+
+#: extensions/base/discussions.py:168
+msgid "Option {}"
+msgstr "Opção {}"
+
+#: extensions/base/discussions.py:170
+#, python-brace-format
+msgid "__[View image]({image_url})__"
+msgstr "__[Ver imagem]({image_url})__"
+
+#: extensions/base/discussions.py:174
+#, python-brace-format
+msgid "Created a quiz \"{title}\""
+msgstr "Criou um quiz \"{title}\""
+
+#: extensions/base/discussions.py:193 extensions/base/discussions.py:195
+msgctxt "Fandom discussions Tags/Forums"
+msgid "Tags"
+msgstr "Etiquetas"
+
+#: extensions/base/discussions.py:193
+msgctxt "Fandom discussions amount of Tags/Forums"
+msgid "{} tags"
+msgstr "{} etiquetas"
+
+#: extensions/base/discussions.py:198
+#, python-brace-format
+msgid "Replied to \"{title}\""
+msgstr "Respondeu \"{title}\""
+
+#: extensions/base/discussions.py:214
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) created [{title}](<{url}f/p/{threadId}>) in "
+"{forumName}"
+msgstr ""
+"[{author}]({author_url}) criou [{title}](<{url}f/p/{threadId}>) em "
+"{forumName}"
+
+#: extensions/base/discussions.py:217
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) created a poll [{title}](<{url}f/p/{threadId}>) in "
+"{forumName}"
+msgstr ""
+"[{author}]({author_url}) criou uma pesquisa [{title}](<{url}f/p/{threadId}>) "
+"em {forumName}"
+
+#: extensions/base/discussions.py:220
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) created a quiz [{title}](<{url}f/p/{threadId}>) in "
+"{forumName}"
+msgstr ""
+"[{author}]({author_url}) criou um quiz [{title}](<{url}f/p/{threadId}>) em "
+"{forumName}"
+
+#: extensions/base/discussions.py:234
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) created a [reply](<{url}f/p/{threadId}/r/{postId}>) "
+"to [{title}](<{url}f/p/{threadId}>) in {forumName}"
+msgstr ""
+"[{author}]({author_url}) criou uma [resposta](<{url}f/p/{threadId}/r/{postId}"
+">) a [{title}](<{url}f/p/{threadId}>) em {forumName}"
+
+#: extensions/base/discussions.py:292
+#, python-brace-format
+msgid "Created \"{title}\" on {user}'s Message Wall"
+msgstr "Criou \"{title}\" no mural de mensagens de {user}"
+
+#: extensions/base/discussions.py:298
+#, python-brace-format
+msgid "Replied to \"{title}\" on {user}'s Message Wall"
+msgstr "Respondeu \"{title}\" no mural de mensagens de {user}"
+
+#: extensions/base/discussions.py:312
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) created [{title}](<{url}wiki/Message_Wall:"
+"{user_wall}?threadId={threadId}>) on [{user}'s Message Wall](<{url}wiki/"
+"Message_Wall:{user_wall}>)"
+msgstr ""
+"[{author}]({author_url}) criou [{title}](<{url}wiki/Message_Wall:{user_wall}?"
+"threadId={threadId}>) no mural de mensagens de [{user}](<{url}wiki/"
+"Message_Wall:{user_wall}>)"
+
+#: extensions/base/discussions.py:318
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) created a [reply](<{url}wiki/Message_Wall:"
+"{user_wall}?threadId={threadId}#{replyId}>) to [{title}](<{url}wiki/"
+"Message_Wall:{user_wall}?threadId={threadId}>) on [{user}'s Message Wall]"
+"(<{url}wiki/Message_Wall:{user_wall}>)"
+msgstr ""
+"[{author}]({author_url}) criou uma [resposta](<{url}wiki/Message_Wall:"
+"{user_wall}?threadId={threadId}#{replyId}>) a [{title}](<{url}wiki/"
+"Message_Wall:{user_wall}?threadId={threadId}>) no mural de mensagens de "
+"[{user}](<{url}wiki/Message_Wall:{user_wall}>)"
+
+#: extensions/base/discussions.py:338
+#, python-brace-format
+msgid "Commented on {article}"
+msgstr "Comentou em {article}"
+
+#: extensions/base/discussions.py:344
+#, python-brace-format
+msgid "Replied to a comment on {article}"
+msgstr "Respondeu a um comentário em {article}"
+
+#: extensions/base/discussions.py:359
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) created a [comment](<{url}?commentId={commentId}>) "
+"on [{article}](<{url}>)"
+msgstr ""
+"[{author}]({author_url}) fez um [comentário](<{url}?commentId={commentId}>) "
+"em [{article}](<{url}>)"
+
+#: extensions/base/discussions.py:365
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) created a [reply](<{url}?commentId={commentId}"
+"&replyId={replyId}>) to a [comment](<{url}?commentId={commentId}>) on "
+"[{article}](<{url}>)"
+msgstr ""
+"[{author}]({author_url}) criou uma [resposta](<{url}?commentId={commentId}"
+"&replyId={replyId}>) a um [comentário](<{url}?commentId={commentId}>) em "
+"[{article}](<{url}>)"
+
+#: extensions/base/managewiki.py:34
+msgid "Changed wiki settings"
+msgstr "Alterou configurações da wiki"
+
+#: extensions/base/managewiki.py:44
+#, python-brace-format
+msgid "[{author}]({author_url}) changed wiki settings{reason}"
+msgstr "[{author}]({author_url}) alterou as configurações da wiki{reason}"
+
+#: extensions/base/managewiki.py:55
+#, python-brace-format
+msgid "Deleted a \"{wiki}\" wiki"
+msgstr "Excluiu a wiki \"{wiki}\""
+
+#: extensions/base/managewiki.py:55 extensions/base/managewiki.py:67
+#: extensions/base/managewiki.py:103 extensions/base/managewiki.py:112
+#: extensions/base/managewiki.py:125 extensions/base/managewiki.py:126
+#: extensions/base/managewiki.py:135 extensions/base/managewiki.py:136
+#: extensions/base/managewiki.py:148 extensions/base/managewiki.py:149
+#: extensions/base/managewiki.py:160 extensions/base/managewiki.py:161
+#: extensions/base/managewiki.py:195 extensions/base/managewiki.py:204
+#: extensions/base/managewiki.py:217 extensions/base/managewiki.py:226
+#: extensions/base/abusefilter.py:55 extensions/base/abusefilter.py:56
+#: extensions/base/abusefilter.py:57 extensions/base/abusefilter.py:68
+#: extensions/base/abusefilter.py:69 extensions/base/abusefilter.py:70
+#: extensions/base/mediawiki.py:743
+msgid "Unknown"
+msgstr "Desconhecido"
+
+#: extensions/base/managewiki.py:63
+#, python-brace-format
+msgid "[{author}]({author_url}) deleted a wiki *{wiki_name}*{comment}"
+msgstr "[{author}]({author_url}) excluiu uma wiki *{wiki_name}*{comment}"
+
+#: extensions/base/managewiki.py:80
+#, python-brace-format
+msgid "Deleted a \"{group}\" user group"
+msgstr "Excluiu um grupo de usuários \"{group}\""
+
+#: extensions/base/managewiki.py:89
+#, python-brace-format
+msgid "[{author}]({author_url}) deleted a usergroup *{group}*{comment}"
+msgstr "[{author}]({author_url}) excluiu o grupo de usuário *{group}*{comment}"
+
+#: extensions/base/managewiki.py:103
+#, python-brace-format
+msgid "Locked a \"{wiki}\" wiki"
+msgstr "Travou a wiki \"{wiki}\""
+
+#: extensions/base/managewiki.py:111
+#, python-brace-format
+msgid "[{author}]({author_url}) locked a wiki *{wiki_name}*{comment}"
+msgstr "[{author}]({author_url}) travou uma wiki *{wiki_name}*{comment}"
+
+#: extensions/base/managewiki.py:124
+#, python-brace-format
+msgid "Modified \"{namespace_name}\" namespace"
+msgstr "Modificou o espaço nominal \"{namespace_name}\""
+
+#: extensions/base/managewiki.py:126 extensions/base/managewiki.py:149
+msgid "Wiki"
+msgstr "Wiki"
+
+#: extensions/base/managewiki.py:134
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) modified namespace *{namespace_name}* on "
+"*{wiki_name}*{comment}"
+msgstr ""
+"[{author}]({author_url}) modificou o espaço nominal *{namespace_name}* em "
+"*{wiki_name}*{comment}"
+
+#: extensions/base/managewiki.py:147
+#, python-brace-format
+msgid "Deleted a \"{namespace_name}\" namespace"
+msgstr "Excluiu o espaço nominal \"{namespace_name}\""
+
+#: extensions/base/managewiki.py:158
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) deleted a namespace *{namespace_name}* on "
+"*{wiki_name}*{comment}"
+msgstr ""
+"[{author}]({author_url}) excluiu o espaço nominal *{namespace_name}* em "
+"*{wiki_name}* ({comment})"
+
+#: extensions/base/managewiki.py:173
+#, python-brace-format
+msgid "Modified \"{usergroup_name}\" usergroup"
+msgstr "Modificou o grupo de usuário \"{usergroup_name}\""
+
+#: extensions/base/managewiki.py:182
+#, python-brace-format
+msgid "[{author}]({author_url}) modified user group *{group_name}*{comment}"
+msgstr ""
+"[{author}]({author_url}) modificou o grupo de usuário *{group_name}*{comment}"
+
+#: extensions/base/managewiki.py:195
+#, python-brace-format
+msgid "Undeleted a \"{wiki}\" wiki"
+msgstr "Recuperou a exclusão de uma wiki \"{wiki}\""
+
+#: extensions/base/managewiki.py:203
+#, python-brace-format
+msgid "[{author}]({author_url}) undeleted a wiki *{wiki_name}*{comment}"
+msgstr ""
+"[{author}]({author_url}) recuperou a exclusão de uma wiki *{wiki_name}"
+"*{comment}"
+
+#: extensions/base/managewiki.py:217
+#, python-brace-format
+msgid "Unlocked a \"{wiki}\" wiki"
+msgstr "Destravou a wiki \"{wiki}\""
+
+#: extensions/base/managewiki.py:225
+#, python-brace-format
+msgid "[{author}]({author_url}) unlocked a wiki *{wiki_name}*{comment}"
+msgstr "[{author}]({author_url}) destravou a wiki *{wiki_name}*{comment}"
+
+#: extensions/base/datadump.py:36
+#, python-brace-format
+msgid "Generated {file} dump"
+msgstr "Gerou despejo de {file}"
+
+#: extensions/base/datadump.py:45
+#, python-brace-format
+msgid "[{author}]({author_url}) generated *{file}* dump{comment}"
+msgstr "[{author}]({author_url}) gerou *{file}* de despejo{comment}"
+
+#: extensions/base/datadump.py:58
+#, python-brace-format
+msgid "Deleted {file} dump"
+msgstr "Excluiu {file} de despejo"
+
+#: extensions/base/datadump.py:67
+#, python-brace-format
+msgid "[{author}]({author_url}) deleted *{file}* dump{comment}"
+msgstr "[{author}]({author_url}) excluiu *{file}* de despejo{comment}"
+
+#: extensions/base/curseprofile.py:40
+#, python-brace-format
+msgid "Edited {target}'s profile"
+msgstr "Editado perfil {target}"
+
+#: extensions/base/curseprofile.py:42
+msgid "Edited their own profile"
+msgstr "Editou seu próprio perfil"
+
+#: extensions/base/curseprofile.py:44
+#, python-brace-format
+msgid "Cleared the {field} field"
+msgstr "Limpou o campo {field}"
+
+#: extensions/base/curseprofile.py:46
+#, python-brace-format
+msgid "{field} field changed to: {desc}"
+msgstr "Campo {field} alterado para: {desc}"
+
+#: extensions/base/curseprofile.py:58
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) cleared the {field} on [{target}]({target_url})'s "
+"profile."
+msgstr ""
+"[{author}]({author_url}) limpou o {field} no perfil de [{target}]"
+"({target_url})."
+
+#: extensions/base/curseprofile.py:60
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) edited the {field} on [{target}]({target_url})'s "
+"profile. *({desc})*"
+msgstr ""
+"[{author}]({author_url}) editou o {field} no perfil de [{target}]"
+"({target_url}). *({desc})*"
+
+#: extensions/base/curseprofile.py:65
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) cleared the {field} on [their own]({target_url}) "
+"profile."
+msgstr ""
+"[{author}]({author_url}) limpou o {field} em seu [próprio perfil]"
+"({target_url})."
+
+#: extensions/base/curseprofile.py:67
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) edited the {field} on [their own]({target_url}) "
+"profile. *({desc})*"
+msgstr ""
+"[{author}]({author_url}) editou o {field} em seu [próprio perfil]"
+"({target_url}). *({desc})*"
+
+#: extensions/base/curseprofile.py:82
+#, python-brace-format
+msgid "Left a comment on {target}'s profile"
+msgstr "Deixou um comentário no perfil de {target}"
+
+#: extensions/base/curseprofile.py:84
+msgid "Left a comment on their own profile"
+msgstr "Deixou um comentário em seu próprio perfil"
+
+#: extensions/base/curseprofile.py:97
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) left a [comment]({comment}) on {target}'s profile."
+msgstr ""
+"[{author}]({author_url}) deixou um [comentário]({comment}) no perfil de "
+"{target}."
+
+#: extensions/base/curseprofile.py:100
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) left a [comment]({comment}) on their own profile."
+msgstr ""
+"[{author}]({author_url}) deixou um [comentário]({comment}) no próprio perfil."
+
+#: extensions/base/curseprofile.py:113
+#, python-brace-format
+msgid "Edited a comment on {target}'s profile"
+msgstr "Editou um comentário no perfil de {target}"
+
+#: extensions/base/curseprofile.py:115
+msgid "Edited a comment on their own profile"
+msgstr "Editou um comentário em seu próprio perfil"
+
+#: extensions/base/curseprofile.py:128
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) edited a [comment]({comment}) on {target}'s profile."
+msgstr ""
+"[{author}]({author_url}) editou um [comentário]({comment}) no perfil de "
+"{target}."
+
+#: extensions/base/curseprofile.py:131
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) edited a [comment]({comment}) on their own profile."
+msgstr ""
+"[{author}]({author_url}) editou um [comentário]({comment}) no próprio perfil."
+
+#: extensions/base/curseprofile.py:144
+#, python-brace-format
+msgid "Replied to a comment on {target}'s profile"
+msgstr "Respondeu a um comentário no perfil de {target}"
+
+#: extensions/base/curseprofile.py:146
+msgid "Replied to a comment on their own profile"
+msgstr "Respondeu a um comentário em seu próprio perfil"
+
+#: extensions/base/curseprofile.py:159
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) replied to a [comment]({comment}) on {target}'s "
+"profile."
+msgstr ""
+"[{author}]({author_url}) respondeu a um [comentário]({comment}) no perfil de "
+"{target}."
+
+#: extensions/base/curseprofile.py:162
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) replied to a [comment]({comment}) on their own "
+"profile."
+msgstr ""
+"[{author}]({author_url}) respondeu a um [comentário]({comment}) no próprio "
+"perfil."
+
+#: extensions/base/curseprofile.py:175
+#, python-brace-format
+msgid "Deleted a comment on {target}'s profile"
+msgstr "Excluiu um comentário no perfil de {target}"
+
+#: extensions/base/curseprofile.py:177
+msgid "Deleted a comment on their own profile"
+msgstr "Excluiu um comentário em seu próprio perfil"
+
+#: extensions/base/curseprofile.py:197
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) deleted a [comment]({comment}) on {target}'s "
+"profile.{reason}"
+msgstr ""
+"[{author}]({author_url}) excluiu um [comentário]({comment}) no perfil de "
+"{target}.{reason}"
+
+#: extensions/base/curseprofile.py:200
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) deleted a [comment]({comment}) on their own profile."
+"{reason}"
+msgstr ""
+"[{author}]({author_url}) excluiu um [comentário]({comment}) no próprio "
+"perfil.{reason}"
+
+#: extensions/base/curseprofile.py:214
+#, python-brace-format
+msgid "Purged a comment on {target}'s profile"
+msgstr "Excluiu permanentemente um comentário no perfil de {target}"
+
+#: extensions/base/curseprofile.py:216
+msgid "Purged a comment on their own profile"
+msgstr "Limitou um comentário em seu próprio perfil"
+
+#: extensions/base/curseprofile.py:230
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) purged a comment on [{target}]({link})'s profile."
+"{reason}"
+msgstr ""
+"[{author}]({author_url}) limpou um comentário no perfil de [{target}]"
+"({link}).{reason}"
+
+#: extensions/base/curseprofile.py:233
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) purged a comment on [their own]({link}) profile."
+"{reason}"
+msgstr ""
+"[{author}]({author_url}) limpou um comentário no [próprio perfil]{link}."
+"{reason}"
+
+#: extensions/base/renameuser.py:38
+#, python-brace-format
+msgid "Renamed user \"{old_name}\" with {edits} edit to \"{new_name}\""
+msgid_plural "Renamed user \"{old_name}\" with {edits} edits to \"{new_name}\""
+msgstr[0] ""
+"Usuário renomeado \"{old_name}\" com edição de {edits} para \"{new_name}\""
+msgstr[1] ""
+"Usuário renomeado \"{old_name}\" com edições {edits} para \"{new_name}\""
+
+#: extensions/base/renameuser.py:43
+#, python-brace-format
+msgid "Renamed user \"{old_name}\" to \"{new_name}\""
+msgstr "Renomeou usuário \"{old_name}\" para \"{new_name}\""
+
+#: extensions/base/renameuser.py:58
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) renamed user *{old_name}* with {edits} edit to "
+"[{new_name}]({link}){comment}"
+msgid_plural ""
+"[{author}]({author_url}) renamed user *{old_name}* with {edits} edits to "
+"[{new_name}]({link}){comment}"
+msgstr[0] ""
+"[{author}]({author_url}) renomeou usuário *{old_name}* com edição {edits} "
+"para [{new_name}]({link}){comment}"
+msgstr[1] ""
+"[{author}]({author_url}) renomeou usuário *{old_name}* com edições {edits} "
+"para [{new_name}]({link}){comment}"
+
+#: extensions/base/renameuser.py:66
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) renamed user *{old_name}* to [{new_name}]({link})"
+"{comment}"
+msgstr ""
+"[{author}]({author_url}) renomeou o usuário *{old_name}* para [{new_name}]"
+"({link}){comment}"
+
+#: extensions/base/interwiki.py:37
+msgid "Added an entry to the interwiki table"
+msgstr "Adicionou uma entrada para a tabela interwiki"
+
+#: extensions/base/interwiki.py:38 extensions/base/interwiki.py:65
+#, python-brace-format
+msgid "Prefix: {prefix}, website: {website} | {desc}"
+msgstr "Prefixo: {prefix}, site: {website} | {desc}"
+
+#: extensions/base/interwiki.py:50
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) added an entry to the [interwiki table]"
+"({table_url}) pointing to {website} with {prefix} prefix"
+msgstr ""
+"[{author}]({author_url}) adicionou uma entrada à [tabela de interwiki]"
+"({table_url}) apontando para {website} com o prefixo {prefix}"
+
+#: extensions/base/interwiki.py:64
+msgid "Edited an entry in interwiki table"
+msgstr "Editou uma entrada na tabela interwiki"
+
+#: extensions/base/interwiki.py:77
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) edited an entry in [interwiki table]({table_url}) "
+"pointing to {website} with {prefix} prefix"
+msgstr ""
+"[{author}]({author_url}) editou uma entrada na [tabela de Interwiki]"
+"({table_url}) apontando para {website} com o prefixo {prefix}"
+
+#: extensions/base/interwiki.py:91
+msgid "Deleted an entry in interwiki table"
+msgstr "Excluiu uma entrada na tabela interwiki"
+
+#: extensions/base/interwiki.py:92
+#, python-brace-format
+msgid "Prefix: {prefix} | {desc}"
+msgstr "Prefixo: {prefix} | {desc}"
+
+#: extensions/base/interwiki.py:102
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) deleted an entry in [interwiki table]({table_url})"
+"{desc}"
+msgstr ""
+"[{author}]({author_url}) excluiu uma entrada na [tabela de Interwiki]"
+"({table_url}){desc}"
+
+#: extensions/base/abusefilter.py:29
+msgid "None"
+msgstr "Nenhum"
+
+#: extensions/base/abusefilter.py:29
+msgid "Warning issued"
+msgstr "Aviso emitido"
+
+#: extensions/base/abusefilter.py:29
+msgid "**Blocked user**"
+msgstr "**Usuário bloqueado**"
+
+#: extensions/base/abusefilter.py:29
+msgid "Tagged the edit"
+msgstr "Marcou a edição"
+
+#: extensions/base/abusefilter.py:29
+msgid "Disallowed the action"
+msgstr "Desautorizado a ação"
+
+#: extensions/base/abusefilter.py:29
+msgid "**IP range blocked**"
+msgstr "**Faixa de IP bloqueada**"
+
+#: extensions/base/abusefilter.py:29
+msgid "Throttled actions"
+msgstr "Ações estranguladas"
+
+#: extensions/base/abusefilter.py:29
+msgid "Removed autoconfirmed group"
+msgstr "Grupo auto-confirmado removido"
+
+#: extensions/base/abusefilter.py:29
+msgid "**Removed from privileged groups**"
+msgstr "**Removido de grupos privilegiados**"
+
+#: extensions/base/abusefilter.py:30
+msgid "Edit"
+msgstr "Edição"
+
+#: extensions/base/abusefilter.py:30
+msgid "Upload"
+msgstr "Carregamento"
+
+#: extensions/base/abusefilter.py:30
+msgid "Move"
+msgstr "Movimentação"
+
+#: extensions/base/abusefilter.py:30
+msgid "Stash upload"
+msgstr "Carregamento múltiplo"
+
+#: extensions/base/abusefilter.py:30
+msgid "Deletion"
+msgstr "Exclusão"
+
+#: extensions/base/abusefilter.py:30
+msgid "Account creation"
+msgstr "Criação de conta"
+
+#: extensions/base/abusefilter.py:30
+msgid "Auto account creation"
+msgstr "Criação automática de contas"
+
+#: extensions/base/abusefilter.py:54
+#, python-brace-format
+msgid "{user} triggered \"{abuse_filter}\""
+msgstr "{user} disparou \"{abuse_filter}\""
+
+#: extensions/base/abusefilter.py:55
+msgid "Performed"
+msgstr "Realizado"
+
+#: extensions/base/abusefilter.py:56
+msgid "Action taken"
+msgstr "Medida tomada"
+
+#: extensions/base/abusefilter.py:57
+msgid "Title"
+msgstr "Título"
+
+#: extensions/base/abusefilter.py:66
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) triggered *{abuse_filter}*, performing the action "
+"\"{action}\" on *[{target}]({target_url})* - action taken: {result}."
+msgstr ""
+"[{author}]({author_url}) disparou *{abuse_filter}*, executando a ação "
+"\"{action}\" em *[{target}]({target_url})* - ação realizada: {result}."
+
+#: extensions/base/abusefilter.py:83
+#, python-brace-format
+msgid "Edited abuse filter number {number}"
+msgstr "Editou filtro de abusos número {number}"
+
+#: extensions/base/abusefilter.py:95
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) edited abuse filter [number {number}]({filter_url})"
+msgstr ""
+"[{author}]({author_url}) editou o filtro de abuso [number {number}]"
+"({filter_url})"
+
+#: extensions/base/abusefilter.py:111
+#, python-brace-format
+msgid "Created abuse filter number {number}"
+msgstr "Criou filtro de abusos número {number}"
+
+#: extensions/base/abusefilter.py:119
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) created abuse filter [number {number}]({filter_url})"
+msgstr ""
+"[{author}]({author_url}) criou o filtro de abuso [number {number}]"
+"({filter_url})"
+
+#: extensions/base/mediawiki.py:37
+msgid "director"
+msgstr "diretor"
+
+#: extensions/base/mediawiki.py:37
+msgid "bot"
+msgstr "robô"
+
+#: extensions/base/mediawiki.py:37
+msgid "editor"
+msgstr "editor"
+
+#: extensions/base/mediawiki.py:37
+msgid "directors"
+msgstr "diretores"
+
+#: extensions/base/mediawiki.py:37
+msgid "sysop"
+msgstr "administrador"
+
+#: extensions/base/mediawiki.py:37
+msgid "bureaucrat"
+msgstr "burocrata"
+
+#: extensions/base/mediawiki.py:37
+msgid "reviewer"
+msgstr "revisor"
+
+#: extensions/base/mediawiki.py:38
+msgid "autoreview"
+msgstr "revisor automático"
+
+#: extensions/base/mediawiki.py:38
+msgid "autopatrol"
+msgstr "patrulheiro automático"
+
+#: extensions/base/mediawiki.py:38
+msgid "wiki_guardian"
+msgstr "guardião da wiki"
+
+#: extensions/base/mediawiki.py:70
+msgid "(N!) "
+msgstr "(N!) "
+
+#: extensions/base/mediawiki.py:71
+msgid "m"
+msgstr "m"
+
+#: extensions/base/mediawiki.py:72
+msgid "b"
+msgstr "r"
+
+#: extensions/base/mediawiki.py:112
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) edited [{article}]({edit_link}){comment} {bold}"
+"({sign}{edit_size}){bold}"
+msgstr ""
+"[{author}]({author_url}) editou [{article}]({edit_link}){comment} {bold}"
+"({sign}{edit_size}){bold}"
+
+#: extensions/base/mediawiki.py:117
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) created [{article}]({edit_link}){comment} {bold}"
+"({sign}{edit_size}){bold}"
+msgstr ""
+"[{author}]({author_url}) criou [{article}]({edit_link}){comment} {bold}"
+"({sign}{edit_size}){bold}"
+
+#: extensions/base/mediawiki.py:190 extensions/base/mediawiki.py:223
+msgid "Options"
+msgstr "Opções"
+
+#: extensions/base/mediawiki.py:190
+#, python-brace-format
+msgid "([preview]({link}) | [undo]({undolink}))"
+msgstr "([visualização]({link}) | [desfazer]({undolink}))"
+
+#: extensions/base/mediawiki.py:195
+#, python-brace-format
+msgid "Uploaded a new version of {name}"
+msgstr "Carregou uma nova versão de {name}"
+
+#: extensions/base/mediawiki.py:197
+#, python-brace-format
+msgid "Reverted a version of {name}"
+msgstr "Reverteu uma versão do {name}"
+
+#: extensions/base/mediawiki.py:199
+#, python-brace-format
+msgid "Uploaded {name}"
+msgstr "Carregou {name}"
+
+#: extensions/base/mediawiki.py:208
+msgid "**No license!**"
+msgstr "**Sem licença!**"
+
+#: extensions/base/mediawiki.py:223
+#, python-brace-format
+msgid "([preview]({link}))"
+msgstr "([visualização]({link}))"
+
+#: extensions/base/mediawiki.py:228
+msgid ""
+"\n"
+"License: {}"
+msgstr ""
+"\n"
+"Licença: {}"
+
+#: extensions/base/mediawiki.py:237
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) reverted a version of [{file}]({file_link}){comment}"
+msgstr ""
+"[{author}]({author_url}) reverteu uma versão de [{file}]({file_link})"
+"{comment}"
+
+#: extensions/base/mediawiki.py:248
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) uploaded a new version of [{file}]({file_link})"
+"{comment}"
+msgstr ""
+"[{author}]({author_url}) carregou uma nova versão de [{file}]({file_link})"
+"{comment}"
+
+#: extensions/base/mediawiki.py:259
+#, python-brace-format
+msgid "[{author}]({author_url}) uploaded [{file}]({file_link}){comment}"
+msgstr "[{author}]({author_url}) carregou [{file}]({file_link}){comment}"
+
+#: extensions/base/mediawiki.py:274
+#, python-brace-format
+msgid "Deleted page {article}"
+msgstr "Excluiu a página {article}"
+
+#: extensions/base/mediawiki.py:283
+#, python-brace-format
+msgid "[{author}]({author_url}) deleted [{page}]({page_link}){comment}"
+msgstr "[{author}]({author_url}) excluiu [{page}]({page_link}){comment}"
+
+#: extensions/base/mediawiki.py:298
+#, python-brace-format
+msgid "Deleted redirect {article} by overwriting"
+msgstr "Excluiu redirecionamento {article} ao sobrescrever"
+
+#: extensions/base/mediawiki.py:308
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) deleted redirect by overwriting [{page}]"
+"({page_link}){comment}"
+msgstr ""
+"[{author}]({author_url}) excluiu o redirecionamento substituindo [{page}]"
+"({page_link}){comment}"
+
+#: extensions/base/mediawiki.py:322
+#, python-brace-format
+msgid "Restored {article}"
+msgstr "Restaurou {article}"
+
+#: extensions/base/mediawiki.py:331
+#, python-brace-format
+msgid "[{author}]({author_url}) restored [{article}]({article_url}){comment}"
+msgstr "[{author}]({author_url}) restaurou [{article}]({article_url}){comment}"
+
+#: extensions/base/mediawiki.py:348
+msgid "Changed visibility of log events"
+msgstr "Alterou a visibilidade de eventos de registros"
+
+#: extensions/base/mediawiki.py:356
+#, python-brace-format
+msgid "[{author}]({author_url}) changed visibility of log events{comment}"
+msgstr ""
+"[{author}]({author_url}) mudou a visibilidade dos eventos de "
+"registro{comment}"
+
+#: extensions/base/mediawiki.py:370
+#, python-brace-format
+msgid "Changed visibility of revision on page {article} "
+msgid_plural "Changed visibility of {amount} revisions on page {article} "
+msgstr[0] "Alterou a visibilidade da revisão na página {article} "
+msgstr[1] "Alterou a visibilidade de {amount} revisões na página {article} "
+
+#: extensions/base/mediawiki.py:383
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) changed visibility of revision on page [{article}]"
+"({article_url}){comment}"
+msgid_plural ""
+"[{author}]({author_url}) changed visibility of {amount} revisions on page "
+"[{article}]({article_url}){comment}"
+msgstr[0] ""
+"[{author}]({author_url}) alterou a visibilidade de uma revisão na página "
+"[{article}]({article_url}){comment}"
+msgstr[1] ""
+"[{author}]({author_url}) alterou a visibilidade de {amount} revisões na "
+"página [{article}]({article_url}){comment}"
+
+#: extensions/base/mediawiki.py:399 extensions/base/mediawiki.py:432
+msgid "No redirect has been made"
+msgstr "Nenhum redirecionamento foi feito"
+
+#: extensions/base/mediawiki.py:400 extensions/base/mediawiki.py:433
+msgid "A redirect has been made"
+msgstr "Foi feito um redirecionamento"
+
+#: extensions/base/mediawiki.py:401
+#, python-brace-format
+msgid "Moved {redirect}{article} to {target}"
+msgstr "Movido {redirect}{article} para {target}"
+
+#: extensions/base/mediawiki.py:412 extensions/base/mediawiki.py:444
+msgid "without making a redirect"
+msgstr "sem fazer um redirecionamento"
+
+#: extensions/base/mediawiki.py:413 extensions/base/mediawiki.py:445
+msgid "with a redirect"
+msgstr "com um redirecionamento"
+
+#: extensions/base/mediawiki.py:416
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) moved {redirect}*{article}* to [{target}]"
+"({target_url}) {made_a_redirect}{comment}"
+msgstr ""
+"[{author}]({author_url}) moveu {redirect}*{article}* para [{target}]"
+"({target_url}) {made_a_redirect}{comment}"
+
+#: extensions/base/mediawiki.py:434
+#, python-brace-format
+msgid "Moved {redirect}{article} to {title} over redirect"
+msgstr "Moveu {redirect}{article} para {title} deixando um redirecionamento"
+
+#: extensions/base/mediawiki.py:448
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) moved {redirect}*{article}* over redirect to "
+"[{target}]({target_url}) {made_a_redirect}{comment}"
+msgstr ""
+"[{author}]({author_url}) moveu {redirect}*{article}* para [{target}]"
+"({target_url}) deixando um redirecionamento {made_a_redirect}{comment}"
+
+#: extensions/base/mediawiki.py:464
+#, python-brace-format
+msgid "Moved protection settings from {redirect}{article} to {title}"
+msgstr "Moveu configurações de proteção de {redirect}{article} para {title}"
+
+#: extensions/base/mediawiki.py:477
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) moved protection settings from {redirect}*{article}"
+"* to [{target}]({target_url}){comment}"
+msgstr ""
+"[{author}]({author_url}) moveu as configurações de proteção de {redirect}"
+"*{article}* para [{target}]({target_url}){comment}"
+
+#: extensions/base/mediawiki.py:492
+#, python-brace-format
+msgid "Protected {target}"
+msgstr "Protegeu {target}"
+
+#: extensions/base/mediawiki.py:495 extensions/base/mediawiki.py:510
+#: extensions/base/mediawiki.py:526 extensions/base/mediawiki.py:541
+msgid " [cascading]"
+msgstr " [em cascata]"
+
+#: extensions/base/mediawiki.py:506
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) protected [{article}]({article_url}) with the "
+"following settings: {settings}{comment}"
+msgstr ""
+"[{author}]({author_url}) protegeu [{article}]({article_url}) com as "
+"seguintes configurações: {settings}{comment}"
+
+#: extensions/base/mediawiki.py:523
+#, python-brace-format
+msgid "Changed protection level for {article}"
+msgstr "Alterou nível de proteção de {article}"
+
+#: extensions/base/mediawiki.py:537
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) modified protection settings of [{article}]"
+"({article_url}) to: {settings}{comment}"
+msgstr ""
+"[{author}]({author_url}) modificou as configurações de proteção de "
+"[{article}]({article_url}) para: {settings}{comment}"
+
+#: extensions/base/mediawiki.py:554
+#, python-brace-format
+msgid "Removed protection from {article}"
+msgstr "Removeu a proteção de {article}"
+
+#: extensions/base/mediawiki.py:563
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) removed protection from [{article}]({article_url})"
+"{comment}"
+msgstr ""
+"[{author}]({author_url}) removeu a proteção de [{article}]({article_url})"
+"{comment}"
+
+#: extensions/base/mediawiki.py:572
+msgid "for infinity and beyond"
+msgstr "para o infinito e além"
+
+#: extensions/base/mediawiki.py:581
+msgid "for less than a minute"
+msgstr "por menos de um minuto"
+
+#: extensions/base/mediawiki.py:583
+msgid "year"
+msgid_plural "years"
+msgstr[0] "ano"
+msgstr[1] "anos"
+
+#: extensions/base/mediawiki.py:583
+msgid "day"
+msgid_plural "days"
+msgstr[0] "dia"
+msgstr[1] "dias"
+
+#: extensions/base/mediawiki.py:583
+msgid "hour"
+msgid_plural "hours"
+msgstr[0] "hora"
+msgstr[1] "horas"
+
+#: extensions/base/mediawiki.py:584
+msgid "minute"
+msgid_plural "minutes"
+msgstr[0] "minuto"
+msgstr[1] "minutos"
+
+#: extensions/base/mediawiki.py:589
+#, python-brace-format
+msgid "for {time_number} {time_unit}"
+msgstr "por {time_number} {time_unit}"
+
+#: extensions/base/mediawiki.py:608
+msgid "Blocked from editing the following pages: "
+msgstr "Bloqueado de editar as seguintes páginas: "
+
+#: extensions/base/mediawiki.py:615 extensions/base/mediawiki.py:661
+msgid " and namespaces: "
+msgstr " e espaços nominais: "
+
+#: extensions/base/mediawiki.py:617
+msgid "Blocked from editing pages on following namespaces: "
+msgstr "Bloqueado de editar páginas nos seguintes espaços nominais: "
+
+#: extensions/base/mediawiki.py:628
+msgid "Partial block details"
+msgstr "Detalhes do bloqueio parcial"
+
+#: extensions/base/mediawiki.py:631
+msgid "Block flags"
+msgstr "Bloquear sinalizadores"
+
+#: extensions/base/mediawiki.py:633
+#, python-brace-format
+msgid "Blocked {blocked_user} {time}"
+msgstr "Bloqueou {blocked_user} {time}"
+
+#: extensions/base/mediawiki.py:653
+msgid " on pages: "
+msgstr " nas páginas: "
+
+#: extensions/base/mediawiki.py:663
+msgid " on namespaces: "
+msgstr " nos espaços nominais: "
+
+#: extensions/base/mediawiki.py:675
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) blocked [{user}]({user_url}) {time}"
+"{restriction_desc}{comment}"
+msgstr ""
+"[{author}]({author_url}) bloqueou [{user}]({user_url}) {time}"
+"{restriction_desc}{comment}"
+
+#: extensions/base/mediawiki.py:693
+#, python-brace-format
+msgid "Changed block settings for {blocked_user}"
+msgstr "Alterou configurações de bloqueio de {blocked_user}"
+
+#: extensions/base/mediawiki.py:703
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) changed block settings for [{blocked_user}]"
+"({user_url}){comment}"
+msgstr ""
+"[{author}]({author_url}) alterou as configurações de bloqueio de "
+"[{blocked_user}]({user_url}){comment}"
+
+#: extensions/base/mediawiki.py:716
+#, python-brace-format
+msgid "Unblocked {blocked_user}"
+msgstr "Desbloqueou {blocked_user}"
+
+#: extensions/base/mediawiki.py:726
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) unblocked [{blocked_user}]({user_url}){comment}"
+msgstr ""
+"[{author}]({author_url}) desbloqueou [{blocked_user}]({user_url}){comment}"
+
+#: extensions/base/mediawiki.py:742
+msgid "Action has been hidden by administration"
+msgstr "A ação foi oculta pela administração"
+
+#: extensions/base/mediawiki.py:749
+msgid "An action has been hidden by administration."
+msgstr "Uma ação foi oculta pela administração."
+
+#: extensions/base/mediawiki.py:760
+#, python-brace-format
+msgid "Imported {article} with {count} revision"
+msgid_plural "Imported {article} with {count} revisions"
+msgstr[0] "Importou {article} com {count} revisão"
+msgstr[1] "Importou {article} com {count} revisões"
+
+#: extensions/base/mediawiki.py:771
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) imported [{article}]({article_url}) with {count} "
+"revision{comment}"
+msgid_plural ""
+"[{author}]({author_url}) imported [{article}]({article_url}) with {count} "
+"revisions{comment}"
+msgstr[0] ""
+"[{author}]({author_url}) importou [{article}]({article_url}) com {count} "
+"revisão{comment}"
+msgstr[1] ""
+"[{author}]({author_url}) importou [{article}]({article_url}) com {count} "
+"revisões{comment}"
+
+#: extensions/base/mediawiki.py:787
+#, python-brace-format
+msgid "Imported {article} with {count} revision from \"{source}\""
+msgid_plural "Imported {article} with {count} revisions from \"{source}\""
+msgstr[0] "Importou {article} com {count} revisão de \"{source}\""
+msgstr[1] "Importou {article} com {count} revisões de \"{source}\""
+
+#: extensions/base/mediawiki.py:802
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) imported [{article}]({article_url}) with {count} "
+"revision from [{source}]({source_url}){comment}"
+msgid_plural ""
+"[{author}]({author_url}) imported [{article}]({article_url}) with {count} "
+"revisions from [{source}]({source_url}){comment}"
+msgstr[0] ""
+"[{author}]({author_url}) importou [{article}]({article_url}) com {count} "
+"revisão{comment} de [{source}]({source_url}){comment}"
+msgstr[1] ""
+"[{author}]({author_url}) importou [{article}]({article_url}) com {count} "
+"revisões{comment} de [{source}]({source_url}){comment}"
+
+#: extensions/base/mediawiki.py:817
+#, python-brace-format
+msgid " (until {date_and_time})"
+msgstr " (até {date_and_time})"
+
+#: extensions/base/mediawiki.py:834
+#, python-brace-format
+msgid "Changed group membership for {target}"
+msgstr "Alterou privilégios de usuário de {target}"
+
+#: extensions/base/mediawiki.py:836
+msgid "System"
+msgstr "Sistema"
+
+#: extensions/base/mediawiki.py:837
+#, python-brace-format
+msgid "{target} got autopromoted to a new usergroup"
+msgstr "{target} foi promovido para um novo grupo de usuários"
+
+#: extensions/base/mediawiki.py:843
+msgid "Added group"
+msgid_plural "Added groups"
+msgstr[0] "Adicionado grupo"
+msgstr[1] "Adicionado grupos"
+
+#: extensions/base/mediawiki.py:845
+msgid "Removed group"
+msgid_plural "Removed groups"
+msgstr[0] "Removido grupo"
+msgstr[1] "Removido grupos"
+
+#: extensions/base/mediawiki.py:859
+#, python-brace-format
+msgid "Added to {added} and removed from {removed}."
+msgstr "Adicionado a {added} e removido de {removed}."
+
+#: extensions/base/mediawiki.py:860 extensions/base/mediawiki.py:862
+#: extensions/base/mediawiki.py:864 extensions/base/mediawiki.py:871
+msgid ", "
+msgstr ", "
+
+#: extensions/base/mediawiki.py:862
+#, python-brace-format
+msgid "Added to {added}."
+msgstr "Adicionado a {added}."
+
+#: extensions/base/mediawiki.py:864
+#, python-brace-format
+msgid "Removed from {removed}."
+msgstr "Removido de {removed}."
+
+#: extensions/base/mediawiki.py:865
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) changed group membership for [{target}]"
+"({target_url}): {group_changes}{comment}"
+msgstr ""
+"[{author}]({author_url}) mudou a associação do grupo para [{target}]"
+"({target_url}): {group_changes}{comment}"
+
+#: extensions/base/mediawiki.py:869
+#, python-brace-format
+msgid "The system autopromoted [{target}]({target_url}) to {added}.{comment}"
+msgstr ""
+"O sistema foi promovido automaticamente [{target}]({target_url}) para "
+"{added}.{comment}"
+
+#: extensions/base/mediawiki.py:882
+#, python-brace-format
+msgid "Merged revision histories of {article} into {dest}"
+msgstr "Mesclou os históricos de revisão de {article} com {dest}"
+
+#: extensions/base/mediawiki.py:896
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) merged revision histories of [{article}]"
+"({article_url}) into [{dest}]({dest_url}){comment}"
+msgstr ""
+"[{author}]({author_url}) mesclou o histórico de revisão de [{article}]"
+"({article_url}) com [{dest}]({dest_url}){comment}"
+
+#: extensions/base/mediawiki.py:910
+msgid "Created account automatically"
+msgstr "Criou uma conta automaticamente"
+
+#: extensions/base/mediawiki.py:917
+#, python-brace-format
+msgid "Account [{author}]({author_url}) was created automatically"
+msgstr "Conta [{author}]({author_url}) foi criada automaticamente"
+
+#: extensions/base/mediawiki.py:930 extensions/base/mediawiki.py:995
+msgid "Created account"
+msgstr "Criou uma conta"
+
+#: extensions/base/mediawiki.py:937 extensions/base/mediawiki.py:1002
+#, python-brace-format
+msgid "Account [{author}]({author_url}) was created"
+msgstr "Conta [{author}]({author_url}) foi criada"
+
+#: extensions/base/mediawiki.py:949
+#, python-brace-format
+msgid "Created account {article}"
+msgstr "Criou conta {article}"
+
+#: extensions/base/mediawiki.py:958
+#, python-brace-format
+msgid ""
+"Account [{article}]({article_url}) was created by [{author}]({author_url})"
+"{comment}"
+msgstr ""
+"Conta [{article}]({article_url}) foi criada por [{author}]({author_url})"
+"{comment}"
+
+#: extensions/base/mediawiki.py:971
+#, python-brace-format
+msgid "Created account {article} and password was sent by email"
+msgstr "Criou conta {article} e a senha foi enviada por e-mail"
+
+#: extensions/base/mediawiki.py:982
+#, python-brace-format
+msgid ""
+"Account [{article}]({article_url}) was created by [{author}]({author_url}) "
+"and password was sent by email{comment}"
+msgstr ""
+"Conta [{article}]({article_url}) foi criada por [{author}]({author_url}) e a "
+"senha foi enviada por e-mail{comment}"
+
+#: extensions/base/mediawiki.py:1014
+#, python-brace-format
+msgid "Changed the content model of the page {article}"
+msgstr "Alterou o modelo de conteúdo da página {article}"
+
+#: extensions/base/mediawiki.py:1016
+#, python-brace-format
+msgid "Model changed from {old} to {new}: {reason}"
+msgstr "Modelo alterado de {old} para {new}: {reason}"
+
+#: extensions/base/mediawiki.py:1028
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) changed the content model of the page [{article}]"
+"({article_url}) from {old} to {new}{comment}"
+msgstr ""
+"[{author}]({author_url}) mudou o modelo de conteúdo da página [{article}]"
+"({article_url}) de {old} para {new}{comment}"
+
+#: extensions/base/mediawiki.py:1043
+#, python-brace-format
+msgid "Created the page {article} using a non-default content model"
+msgstr "Criou a página {article} usando um modelo de conteúdo não padrão"
+
+#: extensions/base/mediawiki.py:1045
+#, python-brace-format
+msgid "Created with model {new}: {reason}"
+msgstr "Criado com modelo {new}: {reason}"
+
+#: extensions/base/mediawiki.py:1056
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) created the page [{article}]({article_url}) using a "
+"non-default content model {new}{comment}"
+msgstr ""
+"[{author}]({author_url}) criou a página [{article}]({article_url}) usando um "
+"modelo de conteúdo não padrão {new}{comment}"
+
+#: extensions/base/mediawiki.py:1071
+#, python-brace-format
+msgid "Created the tag \"{tag}\""
+msgstr "Criou uma etiqueta \"{tag}\""
+
+#: extensions/base/mediawiki.py:1081
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) created the [tag]({tag_url}) \"{tag}\"{comment}"
+msgstr ""
+"[{author}]({author_url}) criou a [etiqueta]({tag_url}) \"{tag}\"{comment}"
+
+#: extensions/base/mediawiki.py:1102
+#, python-brace-format
+msgid "Deleted the tag \"{tag}\""
+msgstr "Excluiu uma etiqueta \"{tag}\""
+
+#: extensions/base/mediawiki.py:1104
+msgid "Removed from"
+msgstr "Removido de"
+
+#: extensions/base/mediawiki.py:1104
+msgid "{} revision or log entry"
+msgid_plural "{} revisions and/or log entries"
+msgstr[0] "{} revisão ou entrada de registro"
+msgstr[1] "{} revisões e/ou entradas de registro"
+
+#: extensions/base/mediawiki.py:1117
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) deleted the [tag]({tag_url}) \"{tag}\"{comment}"
+msgstr ""
+"[{author}]({author_url}) excluiu a [etiqueta]({tag_url}) \"{tag}\"{comment}"
+
+#: extensions/base/mediawiki.py:1127
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) deleted the [tag]({tag_url}) \"{tag}\" and removed "
+"it from {count} revision or log entry{comment}"
+msgid_plural ""
+"[{author}]({author_url}) deleted the [tag]({tag_url}) \"{tag}\" and removed "
+"it from {count} revisions and/or log entries{comment}"
+msgstr[0] ""
+"[{author}]({author_url}) excluiu [etiqueta]({tag_url}) \"{tag}\" e o removeu "
+"{count} revisão ou entrada de registro{comment}"
+msgstr[1] ""
+"[{author}]({author_url}) excluiu [etiqueta]({tag_url}) \"{tag}\" e o removeu "
+"{count} revisões e/ou entradas de registro{comment}"
+
+#: extensions/base/mediawiki.py:1144
+#, python-brace-format
+msgid "Activated the tag \"{tag}\""
+msgstr "Ativou a etiqueta \"{tag}\""
+
+#: extensions/base/mediawiki.py:1153
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) activated the [tag]({tag_url}) \"{tag}\"{comment}"
+msgstr ""
+"[{author}]({author_url}) ativou a [etiqueta]({tag_url}) \"{tag}\"{comment}"
+
+#: extensions/base/mediawiki.py:1172
+#, python-brace-format
+msgid "Deactivated the tag \"{tag}\""
+msgstr "Desativou a etiqueta \"{tag}\""
+
+#: extensions/base/mediawiki.py:1181
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) deactivated the [tag]({tag_url}) \"{tag}\"{comment}"
+msgstr ""
+"[{author}]({author_url}) desativou a [etiqueta]({tag_url}) \"{tag}\"{comment}"
+
+#: extensions/base/sprite.py:37
+#, python-brace-format
+msgid "Edited the sprite for {article}"
+msgstr "Editou o sprite de {article}"
+
+#: extensions/base/sprite.py:45
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) edited the sprite for [{article}]({article_url})"
+msgstr ""
+"[{author}]({author_url}) editou o sprite para [{article}]({article_url})"
+
+#: extensions/base/sprite.py:60
+#, python-brace-format
+msgid "Created the sprite sheet for {article}"
+msgstr "Criou a folha de sprites de {article}"
+
+#: extensions/base/sprite.py:68
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) created the sprite sheet for [{article}]"
+"({article_url})"
+msgstr ""
+"[{author}]({author_url}) criou a folha de sprite para [{article}]"
+"({article_url})"
+
+#: extensions/base/sprite.py:79
+#, python-brace-format
+msgid "Edited the slice for {article}"
+msgstr "Editou a peça de {article}"
+
+#: extensions/base/sprite.py:86
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) edited the slice for [{article}]({article_url})"
+msgstr "[{author}]({author_url}) editou a peça para [{article}]({article_url})"
+
+#, python-brace-format
+#~ msgid "{value} (avg. {avg})"
+#~ msgstr "{value} (med. {avg})"
+
+#~ msgid "Daily overview"
+#~ msgstr "Visão geral diária"
+
+#~ msgid "No activity"
+#~ msgstr "Sem atividade"
+
+#~ msgid " ({} action)"
+#~ msgid_plural " ({} actions)"
+#~ msgstr[0] " ({} ação)"
+#~ msgstr[1] " ({} ações)"
+
+#~ msgid " ({} edit)"
+#~ msgid_plural " ({} edits)"
+#~ msgstr[0] " ({} edição)"
+#~ msgstr[1] " ({} edições)"
+
+#~ msgid " UTC ({} action)"
+#~ msgid_plural " UTC ({} actions)"
+#~ msgstr[0] " UTC ({} ação)"
+#~ msgstr[1] " UTC ({} ações)"
+
+#~ msgid "But nobody came"
+#~ msgstr "Ninguém apareceu por aqui"
+
+#~ msgid "Most active user"
+#~ msgid_plural "Most active users"
+#~ msgstr[0] "Usuário mais ativo"
+#~ msgstr[1] "Usuários mais ativos"
+
+#~ msgid "Most edited article"
+#~ msgid_plural "Most edited articles"
+#~ msgstr[0] "Artigo mais editado"
+#~ msgstr[1] "Artigos mais editados"
+
+#~ msgid "Edits made"
+#~ msgstr "Edições feitas"
+
+#~ msgid "New files"
+#~ msgstr "Novos arquivos"
+
+#~ msgid "Admin actions"
+#~ msgstr "Ações de administração"
+
+#~ msgid "Bytes changed"
+#~ msgstr "Bytes alterados"
+
+#~ msgid "New articles"
+#~ msgstr "Novos artigos"
+
+#~ msgid "Unique contributors"
+#~ msgstr "Contribuidores exclusivos"
+
+#~ msgid "Most active hour"
+#~ msgid_plural "Most active hours"
+#~ msgstr[0] "Hora mais ativa"
+#~ msgstr[1] "Horas mais ativas"
+
+#~ msgid "Day score"
+#~ msgstr "Pontuação do dia"
+
+#~ msgid "No description provided"
+#~ msgstr "Nenhuma descrição fornecida"
+
+#~ msgid "second"
+#~ msgid_plural "seconds"
+#~ msgstr[0] "segundo"
+#~ msgstr[1] "segundos"
+
+#~ msgid "week"
+#~ msgid_plural "weeks"
+#~ msgstr[0] "semana"
+#~ msgstr[1] "semanas"
+
+#~ msgid "month"
+#~ msgid_plural "months"
+#~ msgstr[0] "mês"
+#~ msgstr[1] "meses"
+
+#~ msgid "millennium"
+#~ msgid_plural "millennia"
+#~ msgstr[0] "milênio"
+#~ msgstr[1] "milênios"
+
+#~ msgid "decade"
+#~ msgid_plural "decades"
+#~ msgstr[0] "década"
+#~ msgstr[1] "décadas"
+
+#~ msgid "century"
+#~ msgid_plural "centuries"
+#~ msgstr[0] "século"
+#~ msgstr[1] "séculos"
+
+#, python-brace-format
+#~ msgid ""
+#~ "Unknown event `{event}` by [{author}]({author_url}), report it on the "
+#~ "[support server](<{support}>)."
+#~ msgstr ""
+#~ "Evento `{event}` desconhecido por [{author}]({author_url}), relate no "
+#~ "[servidor de suporte](<{support}>)."
+
+#, fuzzy, python-brace-format
+#~ msgid "Unknown event `{event}`"
+#~ msgstr ""
+#~ "#-#-#-#-# discussion_formatters.po #-#-#-#-#\n"
+#~ "Evento `{event}` desconhecido\n"
+#~ "#-#-#-#-# rc_formatters.po #-#-#-#-#\n"
+#~ "Evento desconhecido `{event}`"
+
+#~ msgid "Report this on the support server"
+#~ msgstr "Reportar isso no servidor de suporte"
+
+#, python-brace-format
+#~ msgid "for {num} {translated_length}"
+#~ msgstr "por {num} {translated_length}"
+
+#~ msgid "until {}"
+#~ msgstr "até {}"
+
+#~ msgid "none"
+#~ msgstr "nenhum"
+
+#, python-brace-format
+#~ msgid ""
+#~ "[{author}]({author_url}) completed deletion of translatable page "
+#~ "[{article}]({article_url}){comment}"
+#~ msgstr ""
+#~ "[{author}]({author_url}) completou a exclusão da página traduzível "
+#~ "[{article}]({article_url}){comment}"
+
+#~ msgid "unknown expiry time"
+#~ msgstr "tempo de expiração desconhecido"
+
+#, python-brace-format
+#~ msgid "Groups changed from {old_groups} to {new_groups}{reason}"
+#~ msgstr "Grupos alterados de {old_groups} para {new_groups}{reason}"
+
+#, python-brace-format
+#~ msgid "Completed deletion of translatable page \"{article}\""
+#~ msgstr "Exclusão concluída da página traduzível \"{article}\""
+
+#, python-brace-format
+#~ msgid "[{author}]({author_url}) restored a wiki *{wiki_name}*{comment}"
+#~ msgstr "[{author}]({author_url}) restaurou a wiki *{wiki_name}*{comment}"
+
+#, python-brace-format
+#~ msgid "Restored a \"{wiki}\" wiki"
+#~ msgstr "Restaurou uma wiki \"{wiki}\""
+
+#, python-brace-format
+#~ msgid "[{author}]({author_url}) deleted a comment on {target}'s profile"
+#~ msgstr ""
+#~ "[{author}]({author_url}) excluiu um comentário no perfil de {target}"
+
+#, python-brace-format
+#~ msgid "[{author}]({author_url}) deleted a comment on their own profile"
+#~ msgstr "[{author}]({author_url}) excluiu um comentário no próprio perfil"
+
+#, python-brace-format
+#~ msgid "[{author}]({author_url}) imported interwiki{comment}"
+#~ msgstr "[{author}]({author_url}) importou um interwiki{comment}"
+
+#~ msgid "Imported interwiki"
+#~ msgstr "Importou interwiki"
+
+#~ msgid "their own profile"
+#~ msgstr "seu próprio perfil"
+
+#~ msgid "their own"
+#~ msgstr "próprio"
+
+#, python-brace-format
+#~ msgid "[{target}]({target_url})'s"
+#~ msgstr "[{target}]({target_url})"
+
+#, python-brace-format
+#~ msgid "[their own]({target_url})"
+#~ msgstr "[seu próprio]({target_url})"
diff --git a/locale/pt-br/LC_MESSAGES/misc.po b/locale/pt-br/LC_MESSAGES/misc.po
index f06eac9..c02c36b 100644
--- a/locale/pt-br/LC_MESSAGES/misc.po
+++ b/locale/pt-br/LC_MESSAGES/misc.po
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2020-11-28 23:45+0100\n"
+"POT-Creation-Date: 2021-07-11 14:32+0200\n"
"PO-Revision-Date: 2020-11-27 13:07+0000\n"
"Last-Translator: dr03ramos \n"
"Language-Team: Portuguese (Brazil) \n"
"Language-Team: Portuguese (Brazil) \n"
@@ -17,7 +17,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n > 1;\n"
-"X-Generator: Weblate 4.2.1\n"
+"X-Generator: Weblate 4.6\n"
#: src/rc_formatters.py:28
msgid "None"
@@ -595,19 +595,21 @@ msgid "[{author}]({author_url}) replaced the Cargo table \"{table}\""
msgstr "[{author}]({author_url}) substituiu a tabela Cargo \"{table}\""
#: src/rc_formatters.py:436
-#, fuzzy, python-brace-format
+#, python-brace-format
msgid ""
"[{author}]({author_url}) created the [tag]({tag_url}) \"{tag}\"{comment}"
-msgstr "[{author}]({author_url}) criou a [etiqueta]({tag_url}) \"{tag}\""
+msgstr ""
+"[{author}]({author_url}) criou a [etiqueta]({tag_url}) \"{tag}\"{comment}"
#: src/rc_formatters.py:441
-#, fuzzy, python-brace-format
+#, python-brace-format
msgid ""
"[{author}]({author_url}) deleted the [tag]({tag_url}) \"{tag}\"{comment}"
-msgstr "[{author}]({author_url}) excluiu a [etiqueta]({tag_url}) \"{tag}\""
+msgstr ""
+"[{author}]({author_url}) excluiu a [etiqueta]({tag_url}) \"{tag}\"{comment}"
#: src/rc_formatters.py:443
-#, fuzzy, python-brace-format
+#, python-brace-format
msgid ""
"[{author}]({author_url}) deleted the [tag]({tag_url}) \"{tag}\" and removed "
"it from {count} revision or log entry{comment}"
@@ -615,23 +617,25 @@ msgid_plural ""
"[{author}]({author_url}) deleted the [tag]({tag_url}) \"{tag}\" and removed "
"it from {count} revisions and/or log entries{comment}"
msgstr[0] ""
-"[{author}]({author_url}) importou [{article}]({article_url}) com {count} "
-"revisão{comment}"
+"[{author}]({author_url}) excluiu a [etiqueta]({tag_url}) \"{tag}\" e removeu "
+"{count} revisão ou entrada de registro{comment}"
msgstr[1] ""
-"[{author}]({author_url}) importou [{article}]({article_url}) com {count} "
-"revisões{comment}"
+"[{author}]({author_url}) excluiu a [etiqueta]({tag_url}) \"{tag}\" e removeu "
+"{count} revisões e/ou entradas de registro{comment}"
#: src/rc_formatters.py:449
-#, fuzzy, python-brace-format
+#, python-brace-format
msgid ""
"[{author}]({author_url}) activated the [tag]({tag_url}) \"{tag}\"{comment}"
-msgstr "[{author}]({author_url}) ativou a [etiqueta]({tag_url}) \"{tag}\""
+msgstr ""
+"[{author}]({author_url}) ativou a [etiqueta]({tag_url}) \"{tag}\"{comment}"
#: src/rc_formatters.py:452
-#, fuzzy, python-brace-format
+#, python-brace-format
msgid ""
"[{author}]({author_url}) deactivated the [tag]({tag_url}) \"{tag}\"{comment}"
-msgstr "[{author}]({author_url}) desativou a [etiqueta]({tag_url}) \"{tag}\""
+msgstr ""
+"[{author}]({author_url}) desativou a [etiqueta]({tag_url}) \"{tag}\"{comment}"
#: src/rc_formatters.py:454
#, python-brace-format
@@ -649,13 +653,13 @@ msgid "[{author}]({author_url}) locked a wiki *{wiki_name}*{comment}"
msgstr "[{author}]({author_url}) travou uma wiki *{wiki_name}*{comment}"
#: src/rc_formatters.py:462
-#, fuzzy, python-brace-format
+#, python-brace-format
msgid ""
"[{author}]({author_url}) modified namespace *{namespace_name}* on "
"*{wiki_name}*{comment}"
msgstr ""
-"[{author}]({author_url}) modificou o espaço nominal *{namespace_name}* "
-"em*{wiki_name}*{comment}"
+"[{author}]({author_url}) modificou o espaço nominal *{namespace_name}* em "
+"*{wiki_name}*{comment}"
#: src/rc_formatters.py:467
#, python-brace-format
@@ -673,7 +677,7 @@ msgstr ""
"[{author}]({author_url}) modificou o grupo de usuário *{group_name}*{comment}"
#: src/rc_formatters.py:477
-#, fuzzy, python-brace-format
+#, python-brace-format
msgid "[{author}]({author_url}) undeleted a wiki *{wiki_name}*{comment}"
msgstr "[{author}]({author_url}) excluiu uma wiki *{wiki_name}*{comment}"
@@ -1290,35 +1294,34 @@ msgid "Replaced the Cargo table \"{table}\""
msgstr "Substituiu a tabela Cargo \"{table}\""
#: src/rc_formatters.py:1121
-#, fuzzy, python-brace-format
+#, python-brace-format
msgid "Created the tag \"{tag}\""
-msgstr "Criou uma etiqueta \"{tag}\""
+msgstr "Criou a etiqueta \"{tag}\""
#: src/rc_formatters.py:1125
-#, fuzzy, python-brace-format
+#, python-brace-format
msgid "Deleted the tag \"{tag}\""
-msgstr "Excluiu uma etiqueta \"{tag}\""
+msgstr "Excluiu a etiqueta \"{tag}\""
#: src/rc_formatters.py:1127
-#, fuzzy
msgid "Removed from"
-msgstr "Removido"
+msgstr "Removido de"
#: src/rc_formatters.py:1127
msgid "{} revision or log entry"
msgid_plural "{} revisions and/or log entries"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "revisão ou entrada no registro"
+msgstr[1] "revisões e/ou entradas no registro"
#: src/rc_formatters.py:1131
-#, fuzzy, python-brace-format
+#, python-brace-format
msgid "Activated the tag \"{tag}\""
-msgstr "Ativou uma etiqueta \"{tag}\""
+msgstr "Ativou a etiqueta \"{tag}\""
#: src/rc_formatters.py:1134
-#, fuzzy, python-brace-format
+#, python-brace-format
msgid "Deactivated the tag \"{tag}\""
-msgstr "Desativou uma etiqueta \"{tag}\""
+msgstr "Desativou a etiqueta \"{tag}\""
#: src/rc_formatters.py:1137
msgid "Changed wiki settings"
@@ -1335,7 +1338,7 @@ msgid "Locked a \"{wiki}\" wiki"
msgstr "Travou a wiki \"{wiki}\""
#: src/rc_formatters.py:1147
-#, fuzzy, python-brace-format
+#, python-brace-format
msgid "Modified \"{namespace_name}\" namespace"
msgstr "Modificou o espaço nominal \"{namespace_name}\""
@@ -1354,9 +1357,9 @@ msgid "Modified \"{usergroup_name}\" usergroup"
msgstr "Modificou o grupo de usuário \"{usergroup_name}\""
#: src/rc_formatters.py:1160
-#, fuzzy, python-brace-format
+#, python-brace-format
msgid "Undeleted a \"{wiki}\" wiki"
-msgstr "Excluiu a wiki \"{wiki}\""
+msgstr "Recuperou a exclusão de um wiki \"{wiki}\""
#: src/rc_formatters.py:1163
#, python-brace-format
diff --git a/locale/pt-br/LC_MESSAGES/rcgcdw.mo b/locale/pt-br/LC_MESSAGES/rcgcdw.mo
index 78e4730..b75e1b9 100644
Binary files a/locale/pt-br/LC_MESSAGES/rcgcdw.mo and b/locale/pt-br/LC_MESSAGES/rcgcdw.mo differ
diff --git a/locale/pt-br/LC_MESSAGES/rcgcdw.po b/locale/pt-br/LC_MESSAGES/rcgcdw.po
index 102f19b..4848675 100644
--- a/locale/pt-br/LC_MESSAGES/rcgcdw.po
+++ b/locale/pt-br/LC_MESSAGES/rcgcdw.po
@@ -7,9 +7,9 @@ msgid ""
msgstr ""
"Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2020-12-23 00:28+0100\n"
-"PO-Revision-Date: 2020-11-27 13:07+0000\n"
-"Last-Translator: dr03ramos \n"
+"POT-Creation-Date: 2021-07-11 14:32+0200\n"
+"PO-Revision-Date: 2021-05-21 18:18+0000\n"
+"Last-Translator: Eduaddad \n"
"Language-Team: Portuguese (Brazil) \n"
"Language: pt-br\n"
@@ -17,186 +17,177 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n > 1;\n"
-"X-Generator: Weblate 4.2.1\n"
+"X-Generator: Weblate 4.6\n"
-#: src/rcgcdw.py:115 src/rcgcdw.py:117 src/rcgcdw.py:119 src/rcgcdw.py:121
-#: src/rcgcdw.py:123 src/rcgcdw.py:125 src/rcgcdw.py:127
+#: src/rcgcdw.py:117
#, python-brace-format
msgid "{value} (avg. {avg})"
msgstr "{value} (med. {avg})"
-#: src/rcgcdw.py:147
+#: src/rcgcdw.py:136
msgid "Daily overview"
msgstr "Visão geral diária"
-#: src/rcgcdw.py:154
+#: src/rcgcdw.py:143
msgid "No activity"
msgstr "Sem atividade"
-#: src/rcgcdw.py:178
+#: src/rcgcdw.py:167
msgid " ({} action)"
msgid_plural " ({} actions)"
msgstr[0] " ({} ação)"
msgstr[1] " ({} ações)"
-#: src/rcgcdw.py:180
+#: src/rcgcdw.py:169
msgid " ({} edit)"
msgid_plural " ({} edits)"
msgstr[0] " ({} edição)"
msgstr[1] " ({} edições)"
-#: src/rcgcdw.py:185
+#: src/rcgcdw.py:174
msgid " UTC ({} action)"
msgid_plural " UTC ({} actions)"
msgstr[0] " UTC ({} ação)"
msgstr[1] " UTC ({} ações)"
-#: src/rcgcdw.py:187 src/rcgcdw.py:188 src/rcgcdw.py:192
+#: src/rcgcdw.py:176 src/rcgcdw.py:179
msgid "But nobody came"
msgstr "Ninguém apareceu por aqui"
-#: src/rcgcdw.py:195
+#: src/rcgcdw.py:183
msgid "Most active user"
msgid_plural "Most active users"
msgstr[0] "Usuário mais ativo"
msgstr[1] "Usuários mais ativos"
-#: src/rcgcdw.py:196
+#: src/rcgcdw.py:184
msgid "Most edited article"
msgid_plural "Most edited articles"
msgstr[0] "Artigo mais editado"
msgstr[1] "Artigos mais editados"
-#: src/rcgcdw.py:197
+#: src/rcgcdw.py:185
msgid "Edits made"
msgstr "Edições feitas"
-#: src/rcgcdw.py:197
+#: src/rcgcdw.py:185
msgid "New files"
msgstr "Novos arquivos"
-#: src/rcgcdw.py:197
+#: src/rcgcdw.py:186
msgid "Admin actions"
msgstr "Ações de administração"
-#: src/rcgcdw.py:198
+#: src/rcgcdw.py:186
msgid "Bytes changed"
msgstr "Bytes alterados"
-#: src/rcgcdw.py:198
+#: src/rcgcdw.py:187
msgid "New articles"
msgstr "Novos artigos"
-#: src/rcgcdw.py:199
+#: src/rcgcdw.py:187
msgid "Unique contributors"
msgstr "Contribuidores exclusivos"
-#: src/rcgcdw.py:200
+#: src/rcgcdw.py:188
msgid "Most active hour"
msgid_plural "Most active hours"
msgstr[0] "Hora mais ativa"
msgstr[1] "Horas mais ativas"
-#: src/rcgcdw.py:201
+#: src/rcgcdw.py:189
msgid "Day score"
msgstr "Pontuação do dia"
-#: src/rcgcdw.py:243
-msgid "director"
-msgstr "diretor"
+#: src/rcgcdw.py:223
+msgid "~~hidden~~"
+msgstr "~~oculto~~"
-#: src/rcgcdw.py:243
-msgid "bot"
-msgstr "robô"
+#: src/rcgcdw.py:225
+msgid "No description provided"
+msgstr "Nenhuma descrição fornecida"
-#: src/rcgcdw.py:243
-msgid "editor"
-msgstr "editor"
+#: src/rcgcdw.py:228
+msgid "hidden"
+msgstr "oculto"
-#: src/rcgcdw.py:243
-msgid "directors"
-msgstr "diretores"
+#~ msgid "director"
+#~ msgstr "diretor"
-#: src/rcgcdw.py:243
-msgid "sysop"
-msgstr "administrador"
+#~ msgid "bot"
+#~ msgstr "robô"
-#: src/rcgcdw.py:243
-msgid "bureaucrat"
-msgstr "burocrata"
+#~ msgid "editor"
+#~ msgstr "editor"
-#: src/rcgcdw.py:243
-msgid "reviewer"
-msgstr "revisor"
+#~ msgid "directors"
+#~ msgstr "diretores"
-#: src/rcgcdw.py:244
-msgid "autoreview"
-msgstr "revisor automático"
+#~ msgid "sysop"
+#~ msgstr "administrador"
-#: src/rcgcdw.py:244
-msgid "autopatrol"
-msgstr "patrulheiro automático"
+#~ msgid "bureaucrat"
+#~ msgstr "burocrata"
-#: src/rcgcdw.py:244
-msgid "wiki_guardian"
-msgstr "guardião da wiki"
+#~ msgid "reviewer"
+#~ msgstr "revisor"
-#: src/rcgcdw.py:244
-msgid "second"
-msgid_plural "seconds"
-msgstr[0] "segundo"
-msgstr[1] "segundos"
+#~ msgid "autoreview"
+#~ msgstr "revisor automático"
-#: src/rcgcdw.py:244
-msgid "minute"
-msgid_plural "minutes"
-msgstr[0] "minuto"
-msgstr[1] "minutos"
+#~ msgid "autopatrol"
+#~ msgstr "patrulheiro automático"
-#: src/rcgcdw.py:244
-msgid "hour"
-msgid_plural "hours"
-msgstr[0] "hora"
-msgstr[1] "horas"
+#~ msgid "wiki_guardian"
+#~ msgstr "guardião da wiki"
-#: src/rcgcdw.py:244
-msgid "day"
-msgid_plural "days"
-msgstr[0] "dia"
-msgstr[1] "dias"
+#~ msgid "second"
+#~ msgid_plural "seconds"
+#~ msgstr[0] "segundo"
+#~ msgstr[1] "segundos"
-#: src/rcgcdw.py:244
-msgid "week"
-msgid_plural "weeks"
-msgstr[0] "semana"
-msgstr[1] "semanas"
+#~ msgid "minute"
+#~ msgid_plural "minutes"
+#~ msgstr[0] "minuto"
+#~ msgstr[1] "minutos"
-#: src/rcgcdw.py:244
-msgid "month"
-msgid_plural "months"
-msgstr[0] "mês"
-msgstr[1] "meses"
+#~ msgid "hour"
+#~ msgid_plural "hours"
+#~ msgstr[0] "hora"
+#~ msgstr[1] "horas"
-#: src/rcgcdw.py:244
-msgid "year"
-msgid_plural "years"
-msgstr[0] "ano"
-msgstr[1] "anos"
+#~ msgid "day"
+#~ msgid_plural "days"
+#~ msgstr[0] "dia"
+#~ msgstr[1] "dias"
-#: src/rcgcdw.py:244
-msgid "millennium"
-msgid_plural "millennia"
-msgstr[0] "milênio"
-msgstr[1] "milênios"
+#~ msgid "week"
+#~ msgid_plural "weeks"
+#~ msgstr[0] "semana"
+#~ msgstr[1] "semanas"
-#: src/rcgcdw.py:244
-msgid "decade"
-msgid_plural "decades"
-msgstr[0] "década"
-msgstr[1] "décadas"
+#~ msgid "month"
+#~ msgid_plural "months"
+#~ msgstr[0] "mês"
+#~ msgstr[1] "meses"
-#: src/rcgcdw.py:244
-msgid "century"
-msgid_plural "centuries"
-msgstr[0] "século"
-msgstr[1] "séculos"
+#~ msgid "year"
+#~ msgid_plural "years"
+#~ msgstr[0] "ano"
+#~ msgstr[1] "anos"
+
+#~ msgid "millennium"
+#~ msgid_plural "millennia"
+#~ msgstr[0] "milênio"
+#~ msgstr[1] "milênios"
+
+#~ msgid "decade"
+#~ msgid_plural "decades"
+#~ msgstr[0] "década"
+#~ msgstr[1] "décadas"
+
+#~ msgid "century"
+#~ msgid_plural "centuries"
+#~ msgstr[0] "século"
+#~ msgstr[1] "séculos"
diff --git a/locale/pt-br/LC_MESSAGES/redaction.mo b/locale/pt-br/LC_MESSAGES/redaction.mo
index d155f9d..ecd853b 100644
Binary files a/locale/pt-br/LC_MESSAGES/redaction.mo and b/locale/pt-br/LC_MESSAGES/redaction.mo differ
diff --git a/locale/pt-br/LC_MESSAGES/redaction.po b/locale/pt-br/LC_MESSAGES/redaction.po
index c50c93b..eaf494d 100644
--- a/locale/pt-br/LC_MESSAGES/redaction.po
+++ b/locale/pt-br/LC_MESSAGES/redaction.po
@@ -7,19 +7,25 @@ msgid ""
msgstr ""
"Project-Id-Version: RcGcDw\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2020-12-23 00:28+0100\n"
-"PO-Revision-Date: 2020-11-21 01:09+0000\n"
+"POT-Creation-Date: 2021-07-11 14:32+0200\n"
+"PO-Revision-Date: 2021-07-30 10:44+0000\n"
"Last-Translator: Eduaddad \n"
-"Language-Team: Portuguese (Brazil) \n"
"Language: pt-br\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n > 1;\n"
-"X-Generator: Weblate 4.2.1\n"
+"X-Generator: Weblate 4.6.2\n"
-#: src/discord/redaction.py:62 src/discord/redaction.py:65
-#: src/discord/redaction.py:70
-msgid "Removed"
-msgstr "Removido"
+#: src/discord/redaction.py:77
+msgid "hidden"
+msgstr "oculto"
+
+#: src/discord/redaction.py:80 src/discord/redaction.py:85
+msgid "~~hidden~~"
+msgstr "~~oculto~~"
+
+#~ msgid "Removed"
+#~ msgstr "Removido"
diff --git a/locale/ru/LC_MESSAGES/discussion_formatters.mo b/locale/ru/LC_MESSAGES/discussion_formatters.mo
deleted file mode 100644
index f14e94d..0000000
Binary files a/locale/ru/LC_MESSAGES/discussion_formatters.mo and /dev/null differ
diff --git a/locale/ru/LC_MESSAGES/discussion_formatters.po b/locale/ru/LC_MESSAGES/discussion_formatters.po
deleted file mode 100644
index baebc6f..0000000
--- a/locale/ru/LC_MESSAGES/discussion_formatters.po
+++ /dev/null
@@ -1,184 +0,0 @@
-# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
-# This file is distributed under the same license as the PACKAGE package.
-#
-# Frisk <>, 2020.
-msgid ""
-msgstr ""
-"Project-Id-Version: \n"
-"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2020-12-23 00:28+0100\n"
-"PO-Revision-Date: 2020-12-29 15:21+0000\n"
-"Last-Translator: Philo04 \n"
-"Language-Team: Russian \n"
-"Language: ru\n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=UTF-8\n"
-"Content-Transfer-Encoding: 8bit\n"
-"Plural-Forms: nplurals=2; plural=(n != 1);\n"
-"X-Generator: Weblate 4.2.1\n"
-
-#: src/discussion_formatters.py:21 src/discussion_formatters.py:56
-#: src/discussion_formatters.py:67 src/discussion_formatters.py:95
-#: src/discussion_formatters.py:163 src/discussion_formatters.py:176
-msgid "unknown"
-msgstr "неизвестно"
-
-#: src/discussion_formatters.py:27 src/discussion_formatters.py:102
-msgid "Unregistered user"
-msgstr "Незарегистрированный пользователь"
-
-#: src/discussion_formatters.py:39
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) created [{title}](<{url}f/p/{threadId}>) in "
-"{forumName}"
-msgstr ""
-"[{author}]({author_url}) создал(а) [{title}](<{url}f/p/{threadId}>) в "
-"{forumName}"
-
-#: src/discussion_formatters.py:42
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) created a poll [{title}](<{url}f/p/{threadId}>) in "
-"{forumName}"
-msgstr ""
-"[{author}]({author_url}) создал(а) опрос [{title}](<{url}f/p/{threadId}>) в "
-"{forumName}"
-
-#: src/discussion_formatters.py:45
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) created a quiz [{title}](<{url}f/p/{threadId}>) in "
-"{forumName}"
-msgstr ""
-"[{author}]({author_url}) создал викторину [{title}](<{url}f/p/{threadId}>) в "
-"{forumName}"
-
-#: src/discussion_formatters.py:54
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) created a [reply](<{url}f/p/{threadId}/r/{postId}>) "
-"to [{title}](<{url}f/p/{threadId}>) in {forumName}"
-msgstr ""
-"[{author}]({author_url}) [ответил](<{url}f/p/{threadId}/r/{postId}>) на "
-"[{title}](<{url}f/p/{threadId}>) в {forumName}"
-
-#: src/discussion_formatters.py:61
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) created [{title}](<{url}wiki/Message_Wall:"
-"{user_wall}?threadId={threadId}>) on [{user}'s Message Wall](<{url}wiki/"
-"Message_Wall:{user_wall}>)"
-msgstr ""
-"[{author}]({author_url}) создал [{title}](<{url}wiki/Message_Wall:"
-"{user_wall}?threadId={threadId}>) на [Стене Обсуждения Участника {user}]"
-"(<{url}wiki/Message_Wall:{user_wall}>)"
-
-#: src/discussion_formatters.py:64
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) created a [reply](<{url}wiki/Message_Wall:"
-"{user_wall}?threadId={threadId}#{replyId}>) to [{title}](<{url}wiki/"
-"Message_Wall:{user_wall}?threadId={threadId}>) on [{user}'s Message Wall]"
-"(<{url}wiki/Message_Wall:{user_wall}>)"
-msgstr ""
-"[{author}]({author_url}) [ответил](<{url}wiki/Message_Wall:{user_wall}?"
-"threadId={threadId}#{replyId}>) на [{title}](<{url}wiki/Message_Wall:"
-"{user_wall}?threadId={threadId}>) на [Стене Обсуждения Участника {user}]"
-"(<{url}wiki/Message_Wall:{user_wall}>)"
-
-#: src/discussion_formatters.py:72
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) created a [comment](<{url}?commentId={commentId}>) "
-"on [{article}](<{url}>)"
-msgstr ""
-"[{author}]({author_url}) оставил [комментарий](<{url}?commentId={commentId}"
-">) к [{article}](<{url}>)"
-
-#: src/discussion_formatters.py:78
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) created a [reply](<{url}?commentId={commentId}"
-"&replyId={replyId}>) to a [comment](<{url}?commentId={commentId}>) on "
-"[{article}](<{url}>)"
-msgstr ""
-"[{author}]({author_url}) [ответил](<{url}?commentId={commentId}"
-"&replyId={replyId}>) на [комментарий](<{url}?commentId={commentId}>) к "
-"[{article}](<{url}>)"
-
-#: src/discussion_formatters.py:86
-#, python-brace-format
-msgid ""
-"Unknown event `{event}` by [{author}]({author_url}), report it on the "
-"[support server](<{support}>)."
-msgstr ""
-"Неизвестное событие `{event}`, выполненное участником [{author}]"
-"({author_url}), сообщите об этом на [сервере поддержки](<{support}>)."
-
-#: src/discussion_formatters.py:123
-#, python-brace-format
-msgid "Created \"{title}\""
-msgstr "Создал \"{title}\""
-
-#: src/discussion_formatters.py:127
-#, python-brace-format
-msgid "Created a poll \"{title}\""
-msgstr "Создал опрос \"{title}\""
-
-#: src/discussion_formatters.py:134
-msgid "Option {}"
-msgstr "Вариант {}"
-
-#: src/discussion_formatters.py:135
-#, python-brace-format
-msgid "__[View image]({image_url})__"
-msgstr "__[Просмотреть изображение]({image_url})__"
-
-#: src/discussion_formatters.py:139
-#, python-brace-format
-msgid "Created a quiz \"{title}\""
-msgstr "Создал викторину \"{title}\""
-
-#: src/discussion_formatters.py:155 src/discussion_formatters.py:157
-msgid "Tags"
-msgstr "Метки"
-
-#: src/discussion_formatters.py:155
-msgid "{} tags"
-msgstr "{} меток"
-
-#: src/discussion_formatters.py:160
-#, python-brace-format
-msgid "Replied to \"{title}\""
-msgstr "Ответил на \"{title}\""
-
-#: src/discussion_formatters.py:169
-#, python-brace-format
-msgid "Created \"{title}\" on {user}'s Message Wall"
-msgstr "Создал \"{title}\" на Стене Обсуждения Участника {user}"
-
-#: src/discussion_formatters.py:173
-#, python-brace-format
-msgid "Replied to \"{title}\" on {user}'s Message Wall"
-msgstr "Ответил на \"{title}\" на Стене Обсуждения Участника {user}"
-
-#: src/discussion_formatters.py:180
-#, python-brace-format
-msgid "Commented on {article}"
-msgstr "Оставил Комментарий к статье {article}"
-
-#: src/discussion_formatters.py:184
-#, python-brace-format
-msgid "Replied to a comment on {article}"
-msgstr "Ответил на Комментарий к статье {article}"
-
-#: src/discussion_formatters.py:188
-#, python-brace-format
-msgid "Unknown event `{event}`"
-msgstr "Неизвестное событие `{event}`"
-
-#: src/discussion_formatters.py:194 src/discussion_formatters.py:196
-msgid "Report this on the support server"
-msgstr "Сообщите об этом на сервере поддержки"
diff --git a/locale/ru/LC_MESSAGES/formatters.mo b/locale/ru/LC_MESSAGES/formatters.mo
new file mode 100644
index 0000000..4754ff0
Binary files /dev/null and b/locale/ru/LC_MESSAGES/formatters.mo differ
diff --git a/locale/ru/LC_MESSAGES/formatters.po b/locale/ru/LC_MESSAGES/formatters.po
new file mode 100644
index 0000000..a35b941
--- /dev/null
+++ b/locale/ru/LC_MESSAGES/formatters.po
@@ -0,0 +1,2046 @@
+# #-#-#-#-# rcgcdw.po #-#-#-#-#
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR , YEAR.
+#
+# #-#-#-#-# formatters.po #-#-#-#-#
+# #-#-#-#-# discussion_formatters.po #-#-#-#-#
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+#
+# Frisk <>, 2020.
+# #-#-#-#-# rc_formatters.po #-#-#-#-#
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR , YEAR.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: \n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2021-07-11 14:32+0200\n"
+"PO-Revision-Date: 2021-07-30 10:44+0000\n"
+"Last-Translator: MakandIv \n"
+"Language-Team: Russian \n"
+"Language: ru\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n"
+"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
+"X-Generator: Weblate 4.6.2\n"
+
+#: src/api/util.py:61 src/api/util.py:66
+msgid "__Only whitespace__"
+msgstr "__Только пробел__"
+
+#: src/api/util.py:71
+msgid "Removed"
+msgstr "Удалено"
+
+#: src/api/util.py:73
+msgid "Added"
+msgstr "Добавлено"
+
+#: src/api/util.py:94 src/api/util.py:126 src/api/util.py:133
+#: src/api/util.py:141 extensions/base/discussions.py:247
+#: extensions/base/discussions.py:264 extensions/base/abusefilter.py:45
+msgid "Unregistered user"
+msgstr "Незарегистрированный участник"
+
+#: src/api/util.py:160
+msgctxt "recent changes Tags"
+msgid "Tags"
+msgstr "Метки"
+
+#: src/api/util.py:162
+msgid "**Added**: "
+msgstr "**Добавлено**: "
+
+#: src/api/util.py:163
+msgid " and {} more\n"
+msgstr " и ещё {}\n"
+
+#: src/api/util.py:165
+msgid "**Removed**: "
+msgstr "**Удалено**: "
+
+#: src/api/util.py:166
+msgid " and {} more"
+msgstr " и ещё {}"
+
+#: src/api/util.py:168
+msgid "Changed categories"
+msgstr "Изменены категории"
+
+#: extensions/base/cargo.py:37
+#, python-brace-format
+msgid "Created the Cargo table \"{table}\""
+msgstr "Создал таблицу Cargo «{table}»"
+
+#: extensions/base/cargo.py:45
+#, python-brace-format
+msgid "[{author}]({author_url}) created the Cargo table \"{table}\""
+msgstr "[{author}]({author_url}) создал таблицу Cargo «{table}»"
+
+#: extensions/base/cargo.py:60
+#, python-brace-format
+msgid "Recreated the Cargo table \"{table}\""
+msgstr "Воссоздал таблицу Cargo «{table}»"
+
+#: extensions/base/cargo.py:68
+#, python-brace-format
+msgid "[{author}]({author_url}) recreated the Cargo table \"{table}\""
+msgstr "[{author}]({author_url}) воссоздал таблицу Cargo «{table}»"
+
+#: extensions/base/cargo.py:83
+#, python-brace-format
+msgid "Replaced the Cargo table \"{table}\""
+msgstr "Заменил таблицу Cargo «{table}»"
+
+#: extensions/base/cargo.py:91
+#, python-brace-format
+msgid "[{author}]({author_url}) replaced the Cargo table \"{table}\""
+msgstr "[{author}]({author_url}) заменил таблицу Cargo «{table}»"
+
+#: extensions/base/cargo.py:105
+#, python-brace-format
+msgid "Deleted the Cargo table \"{table}\""
+msgstr "Удалил таблицу Cargo «{table}»"
+
+#: extensions/base/cargo.py:112
+#, python-brace-format
+msgid "[{author}]({author_url}) deleted the Cargo table \"{table}\""
+msgstr "[{author}]({author_url}) удалил таблицу Cargo «{table}»"
+
+#: extensions/base/translate.py:41
+#, python-brace-format
+msgid "Marked \"{article}\" for translation"
+msgstr "Пометил страницу «{article}» как доступную для перевода"
+
+#: extensions/base/translate.py:55
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) marked [{article}]({article_url}) for "
+"translation{comment}"
+msgstr ""
+"[{author}]({author_url}) пометил страницу «[{article}]({article_url})» как "
+"доступную для перевода{comment}"
+
+#: extensions/base/translate.py:70
+#, python-brace-format
+msgid "Removed \"{article}\" from the translation system"
+msgstr "Удалил страницу «{article}» из системы перевода"
+
+#: extensions/base/translate.py:80
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) removed [{article}]({article_url}) from the "
+"translation system{comment}"
+msgstr ""
+"[{author}]({author_url}) удалил страницу «[{article}]({article_url})» из "
+"системы перевода{comment}"
+
+#: extensions/base/translate.py:95
+#, python-brace-format
+msgid "Completed moving translation pages from \"{article}\" to \"{target}\""
+msgstr "Переименовал доступную для перевода страницу «{article}» в «{target}»"
+
+#: extensions/base/translate.py:106
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) completed moving translation pages from *{article}* "
+"to [{target}]({target_url}){comment}"
+msgstr ""
+"[{author}]({author_url}) переименовал доступную для перевода страницу "
+"«*{article}*» в «[{target}]({target_url})»{comment}"
+
+#: extensions/base/translate.py:121
+#, python-brace-format
+msgid "Encountered a problem while moving \"{article}\" to \"{target}\""
+msgstr ""
+"Столкнулся с проблемой при попытке переименования «{article}» в «{target}»"
+
+#: extensions/base/translate.py:133
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) encountered a problem while moving [{article}]"
+"({article_url}) to [{target}]({target_url}){comment}"
+msgstr ""
+"[{author}]({author_url}) столкнулся с проблемой при попытке переименования "
+"«[{article}]({article_url})» в «[{target}]({target_url})»{comment}"
+
+#: extensions/base/translate.py:149
+#, python-brace-format
+msgid ""
+"Failed to delete \"{article}\" which belongs to translatable page "
+"\"{target}\""
+msgstr ""
+"Не смог удалить страницу «{article}», относящуюся к доступной для перевода "
+"странице «{target}»"
+
+#: extensions/base/translate.py:161
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) failed to delete [{article}]({article_url}) which "
+"belongs to translatable page [{target}]({target_url}){comment}"
+msgstr ""
+"[{author}]({author_url}) не смог удалить страницу «[{article}]"
+"({article_url})», относящуюся к доступной для перевода странице «[{target}]"
+"({target_url})»{comment}"
+
+#: extensions/base/translate.py:177
+#, python-brace-format
+msgid "Completed deletion of translation page \"{article}\""
+msgstr "Удалил страницу перевода «{article}»"
+
+#: extensions/base/translate.py:188
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) completed deletion of translation page [{article}]"
+"({article_url}){comment}"
+msgstr ""
+"[{author}]({author_url}) удалил страницу перевода «[{article}]"
+"({article_url})»{comment}"
+
+#: extensions/base/translate.py:203
+#, python-brace-format
+msgid ""
+"Failed to delete \"{article}\" which belongs to translation page \"{target}\""
+msgstr ""
+"Не смог удалить страницу «{article}», относящуюся к странице перевода "
+"«{target}»"
+
+#: extensions/base/translate.py:215
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) failed to delete [{article}]({article_url}) which "
+"belongs to translation page [{target}]({target_url}){comment}"
+msgstr ""
+"[{author}]({author_url}) не смог удалить страницу «[{article}]"
+"({article_url})», относящуюся к странице перевода «[{target}]"
+"({target_url})»{comment}"
+
+#: extensions/base/translate.py:231
+#, python-brace-format
+msgid "Encouraged translation of \"{article}\""
+msgstr "Повысил приоритет перевода страницы «{article}»"
+
+#: extensions/base/translate.py:240
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) encouraged translation of [{article}]({article_url})"
+"{comment}"
+msgstr ""
+"[{author}]({author_url}) повысил приоритет перевода страницы «[{article}]"
+"({article_url})»{comment}"
+
+#: extensions/base/translate.py:255
+#, python-brace-format
+msgid "Discouraged translation of \"{article}\""
+msgstr "Понизил приоритет перевода страницы «{article}»"
+
+#: extensions/base/translate.py:264
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) discouraged translation of [{article}]"
+"({article_url}){comment}"
+msgstr ""
+"[{author}]({author_url}) понизил приоритет перевода страницы «[{article}]"
+"({article_url})»{comment}"
+
+#: extensions/base/translate.py:282
+#, python-brace-format
+msgid "Limited languages for \"{article}\" to `{languages}`"
+msgstr "Ограничил для страницы «{article}» список языков: `{languages}`"
+
+#: extensions/base/translate.py:285
+#, python-brace-format
+msgid "Priority languages for \"{article}\" set to `{languages}`"
+msgstr ""
+"Задал для страницы «{article}» следующий список приоритетных языков: "
+"`{languages}`"
+
+#: extensions/base/translate.py:288
+#, python-brace-format
+msgid "Removed priority languages from \"{article}\""
+msgstr "Удалил приоритетные языки со страницы «{article}»"
+
+#: extensions/base/translate.py:301
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) limited languages for [{article}]({article_url}) to "
+"`{languages}`{comment}"
+msgstr ""
+"[{author}]({author_url}) ограничил для страницы «[{article}]({article_url})» "
+"список языков: `{languages}`{comment}"
+
+#: extensions/base/translate.py:308
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) set the priority languages for [{article}]"
+"({article_url}) to `{languages}`{comment}"
+msgstr ""
+"[{author}]({author_url}) задал для страницы «[{article}]({article_url})» "
+"следующий список приоритетных языков: `{languages}`{comment}"
+
+#: extensions/base/translate.py:315
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) removed priority languages from [{article}]"
+"({article_url}){comment}"
+msgstr ""
+"[{author}]({author_url}) удалил приоритетные языки со страницы «[{article}]"
+"({article_url})»{comment}"
+
+#: extensions/base/translate.py:331
+#, python-brace-format
+msgid "Added translatable page \"{article}\" to aggregate group \"{group}\""
+msgstr ""
+"Добавил доступную для перевода страницу «{article}» в агрегированную группу "
+"«{group}»"
+
+#: extensions/base/translate.py:342
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) added translatable page [{article}]({article_url}) "
+"to aggregate group \"{group}\"{comment}"
+msgstr ""
+"[{author}]({author_url}) добавил доступную для перевода страницу «[{article}]"
+"({article_url})» в агрегированную группу «{group}»{comment}"
+
+#: extensions/base/translate.py:357
+#, python-brace-format
+msgid ""
+"Removed translatable page \"{article}\" from aggregate group \"{group}\""
+msgstr ""
+"Удалил доступную для перевода страницу «{article}» из агрегированной группы "
+"«{group}»"
+
+#: extensions/base/translate.py:368
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) removed translatable page [{article}]"
+"({article_url}) from aggregate group \"{group}\"{comment}"
+msgstr ""
+"[{author}]({author_url}) удалил доступную для перевода страницу «[{article}]"
+"({article_url})» из агрегированной группы «{group}»{comment}"
+
+#: extensions/base/translate.py:387
+#, python-brace-format
+msgid "Reviewed translation \"{article}\""
+msgstr "Проверил перевод страницы «{article}»"
+
+#: extensions/base/translate.py:401
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) reviewed translation [{article}]({article_url})"
+"{comment}"
+msgstr ""
+"[{author}]({author_url}) проверил перевод страницы «[{article}]"
+"({article_url})»{comment}"
+
+#: extensions/base/translate.py:416
+#, python-brace-format
+msgid "Changed the state of `{language}` translations of \"{article}\""
+msgstr "Изменил состояние переводов страницы «{article}» на `{language}` язык"
+
+#: extensions/base/translate.py:419
+msgid "Old state"
+msgstr "Старое состояние"
+
+#: extensions/base/translate.py:420
+msgid "New state"
+msgstr "Новое состояние"
+
+#: extensions/base/translate.py:431
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) changed the state of `{language}` translations of "
+"[{article}]({article_url}) from `{old_state}` to `{new_state}`{comment}"
+msgstr ""
+"[{author}]({author_url}) изменил состояние переводов страницы «[{article}]"
+"({article_url})» на `{language}` язык с `{old_state}` на `{new_state}"
+"`{comment}"
+
+#: extensions/base/translate.py:439
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) changed the state of `{language}` translations of "
+"[{article}]({article_url}) to `{new_state}`{comment}"
+msgstr ""
+"[{author}]({author_url}) изменил состояние переводов страницы «[{article}]"
+"({article_url})» на `{language}` язык на `{new_state}`{comment}"
+
+#: extensions/base/translate.py:452 extensions/base/translate.py:455
+msgid "(default)"
+msgstr "(по умолчанию)"
+
+#: extensions/base/translate.py:464
+#, python-brace-format
+msgid "Changed the language of \"{article}\""
+msgstr "Изменил язык страницы «{article}»"
+
+#: extensions/base/translate.py:465
+msgid "Old language"
+msgstr "Старый язык"
+
+#: extensions/base/translate.py:466
+msgid "New language"
+msgstr "Новый язык"
+
+#: extensions/base/translate.py:477
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) changed the language of [{article}]({article_url}) "
+"from {old_lang} to {new_lang}{comment}"
+msgstr ""
+"[{author}]({author_url}) изменил язык страницы «[{article}]({article_url})» "
+"с {old_lang} на {new_lang}{comment}"
+
+#: extensions/base/discussions.py:148 extensions/base/discussions.py:207
+#: extensions/base/discussions.py:245 extensions/base/discussions.py:261
+#: extensions/base/discussions.py:284 extensions/base/discussions.py:306
+#: extensions/base/discussions.py:334 extensions/base/discussions.py:354
+msgid "unknown"
+msgstr "неизвестно"
+
+#: extensions/base/discussions.py:157
+#, python-brace-format
+msgid "Created \"{title}\""
+msgstr "Создал «{title}»"
+
+#: extensions/base/discussions.py:161
+#, python-brace-format
+msgid "Created a poll \"{title}\""
+msgstr "Создал опрос «{title}»"
+
+#: extensions/base/discussions.py:168
+msgid "Option {}"
+msgstr "Вариант {}"
+
+#: extensions/base/discussions.py:170
+#, python-brace-format
+msgid "__[View image]({image_url})__"
+msgstr "__[Просмотреть изображение]({image_url})__"
+
+#: extensions/base/discussions.py:174
+#, python-brace-format
+msgid "Created a quiz \"{title}\""
+msgstr "Создал викторину «{title}»"
+
+#: extensions/base/discussions.py:193 extensions/base/discussions.py:195
+msgctxt "Fandom discussions Tags/Forums"
+msgid "Tags"
+msgstr "Метки"
+
+#: extensions/base/discussions.py:193
+msgctxt "Fandom discussions amount of Tags/Forums"
+msgid "{} tags"
+msgstr "{} меток"
+
+#: extensions/base/discussions.py:198
+#, python-brace-format
+msgid "Replied to \"{title}\""
+msgstr "Ответил на «{title}»"
+
+#: extensions/base/discussions.py:214
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) created [{title}](<{url}f/p/{threadId}>) in "
+"{forumName}"
+msgstr ""
+"[{author}]({author_url}) создал(а) «[{title}](<{url}f/p/{threadId}>)» на "
+"странице «{forumName}»"
+
+#: extensions/base/discussions.py:217
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) created a poll [{title}](<{url}f/p/{threadId}>) in "
+"{forumName}"
+msgstr ""
+"[{author}]({author_url}) создал(а) опрос «[{title}](<{url}f/p/{threadId}>)» "
+"на странице «{forumName}»"
+
+#: extensions/base/discussions.py:220
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) created a quiz [{title}](<{url}f/p/{threadId}>) in "
+"{forumName}"
+msgstr ""
+"[{author}]({author_url}) создал викторину «[{title}](<{url}f/p/{threadId}>)» "
+"на странице «{forumName}»"
+
+#: extensions/base/discussions.py:234
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) created a [reply](<{url}f/p/{threadId}/r/{postId}>) "
+"to [{title}](<{url}f/p/{threadId}>) in {forumName}"
+msgstr ""
+"[{author}]({author_url}) [ответил](<{url}f/p/{threadId}/r/{postId}>) на "
+"«[{title}](<{url}f/p/{threadId}>)» на странице «{forumName}»"
+
+#: extensions/base/discussions.py:292
+#, python-brace-format
+msgid "Created \"{title}\" on {user}'s Message Wall"
+msgstr "Создал «{title}» на стене обсуждения участника {user}"
+
+#: extensions/base/discussions.py:298
+#, python-brace-format
+msgid "Replied to \"{title}\" on {user}'s Message Wall"
+msgstr "Ответил на «{title}» на стене обсуждения участника {user}"
+
+#: extensions/base/discussions.py:312
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) created [{title}](<{url}wiki/Message_Wall:"
+"{user_wall}?threadId={threadId}>) on [{user}'s Message Wall](<{url}wiki/"
+"Message_Wall:{user_wall}>)"
+msgstr ""
+"[{author}]({author_url}) создал «[{title}](<{url}wiki/Message_Wall:"
+"{user_wall}?threadId={threadId}>)» на [стене обсуждения участника {user}]"
+"(<{url}wiki/Message_Wall:{user_wall}>)"
+
+#: extensions/base/discussions.py:318
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) created a [reply](<{url}wiki/Message_Wall:"
+"{user_wall}?threadId={threadId}#{replyId}>) to [{title}](<{url}wiki/"
+"Message_Wall:{user_wall}?threadId={threadId}>) on [{user}'s Message Wall]"
+"(<{url}wiki/Message_Wall:{user_wall}>)"
+msgstr ""
+"[{author}]({author_url}) [ответил](<{url}wiki/Message_Wall:{user_wall}?"
+"threadId={threadId}#{replyId}>) на «[{title}](<{url}wiki/Message_Wall:"
+"{user_wall}?threadId={threadId}>)» на [стене обсуждения участника {user}]"
+"(<{url}wiki/Message_Wall:{user_wall}>)"
+
+#: extensions/base/discussions.py:338
+#, python-brace-format
+msgid "Commented on {article}"
+msgstr "Оставил комментарий к статье «{article}»"
+
+#: extensions/base/discussions.py:344
+#, python-brace-format
+msgid "Replied to a comment on {article}"
+msgstr "Ответил на комментарий к статье «{article}»"
+
+#: extensions/base/discussions.py:359
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) created a [comment](<{url}?commentId={commentId}>) "
+"on [{article}](<{url}>)"
+msgstr ""
+"[{author}]({author_url}) оставил [комментарий](<{url}?commentId={commentId}"
+">) к статье «[{article}](<{url}>)»"
+
+#: extensions/base/discussions.py:365
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) created a [reply](<{url}?commentId={commentId}"
+"&replyId={replyId}>) to a [comment](<{url}?commentId={commentId}>) on "
+"[{article}](<{url}>)"
+msgstr ""
+"[{author}]({author_url}) [ответил](<{url}?commentId={commentId}"
+"&replyId={replyId}>) на [комментарий](<{url}?commentId={commentId}>) к "
+"статье «[{article}](<{url}>)»"
+
+#: extensions/base/managewiki.py:34
+msgid "Changed wiki settings"
+msgstr "Изменил настройки вики"
+
+#: extensions/base/managewiki.py:44
+#, python-brace-format
+msgid "[{author}]({author_url}) changed wiki settings{reason}"
+msgstr "[{author}]({author_url}) изменил настройки вики{reason}"
+
+#: extensions/base/managewiki.py:55
+#, python-brace-format
+msgid "Deleted a \"{wiki}\" wiki"
+msgstr "Удалил вики «{wiki}»"
+
+#: extensions/base/managewiki.py:55 extensions/base/managewiki.py:67
+#: extensions/base/managewiki.py:103 extensions/base/managewiki.py:112
+#: extensions/base/managewiki.py:125 extensions/base/managewiki.py:126
+#: extensions/base/managewiki.py:135 extensions/base/managewiki.py:136
+#: extensions/base/managewiki.py:148 extensions/base/managewiki.py:149
+#: extensions/base/managewiki.py:160 extensions/base/managewiki.py:161
+#: extensions/base/managewiki.py:195 extensions/base/managewiki.py:204
+#: extensions/base/managewiki.py:217 extensions/base/managewiki.py:226
+#: extensions/base/abusefilter.py:55 extensions/base/abusefilter.py:56
+#: extensions/base/abusefilter.py:57 extensions/base/abusefilter.py:68
+#: extensions/base/abusefilter.py:69 extensions/base/abusefilter.py:70
+#: extensions/base/mediawiki.py:743
+msgid "Unknown"
+msgstr "Неизвестно"
+
+#: extensions/base/managewiki.py:63
+#, python-brace-format
+msgid "[{author}]({author_url}) deleted a wiki *{wiki_name}*{comment}"
+msgstr "[{author}]({author_url}) удалил вики «*{wiki_name}*»{comment}"
+
+#: extensions/base/managewiki.py:80
+#, python-brace-format
+msgid "Deleted a \"{group}\" user group"
+msgstr "Удалил группу «{group}»"
+
+#: extensions/base/managewiki.py:89
+#, python-brace-format
+msgid "[{author}]({author_url}) deleted a usergroup *{group}*{comment}"
+msgstr ""
+"[{author}]({author_url}) удалил группу пользователей «*{group}*»{comment}"
+
+#: extensions/base/managewiki.py:103
+#, python-brace-format
+msgid "Locked a \"{wiki}\" wiki"
+msgstr "Заблокировал вики «{wiki}»"
+
+#: extensions/base/managewiki.py:111
+#, python-brace-format
+msgid "[{author}]({author_url}) locked a wiki *{wiki_name}*{comment}"
+msgstr "[{author}]({author_url}) заблокировал вики «*{wiki_name}*»{comment}"
+
+#: extensions/base/managewiki.py:124
+#, python-brace-format
+msgid "Modified \"{namespace_name}\" namespace"
+msgstr "Изменил пространство имён «{namespace_name}»"
+
+#: extensions/base/managewiki.py:126 extensions/base/managewiki.py:149
+msgid "Wiki"
+msgstr "Вики"
+
+#: extensions/base/managewiki.py:134
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) modified namespace *{namespace_name}* on "
+"*{wiki_name}*{comment}"
+msgstr ""
+"[{author}]({author_url}) изменил пространство имён «*{namespace_name}*» на "
+"вики «*{wiki_name}*»{comment}"
+
+#: extensions/base/managewiki.py:147
+#, python-brace-format
+msgid "Deleted a \"{namespace_name}\" namespace"
+msgstr "Удалил пространство имён «{namespace_name}»"
+
+#: extensions/base/managewiki.py:158
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) deleted a namespace *{namespace_name}* on "
+"*{wiki_name}*{comment}"
+msgstr ""
+"[{author}]({author_url}) удалил пространство имён «*{namespace_name}*» на "
+"вики «*{wiki_name}*»{comment}"
+
+#: extensions/base/managewiki.py:173
+#, python-brace-format
+msgid "Modified \"{usergroup_name}\" usergroup"
+msgstr "Изменил группу «{usergroup_name}»"
+
+#: extensions/base/managewiki.py:182
+#, python-brace-format
+msgid "[{author}]({author_url}) modified user group *{group_name}*{comment}"
+msgstr "[{author}]({author_url}) изменил группу «*{group_name}*»{comment}"
+
+#: extensions/base/managewiki.py:195
+#, python-brace-format
+msgid "Undeleted a \"{wiki}\" wiki"
+msgstr "Восстановил вики «{wiki}»"
+
+#: extensions/base/managewiki.py:203
+#, python-brace-format
+msgid "[{author}]({author_url}) undeleted a wiki *{wiki_name}*{comment}"
+msgstr "[{author}]({author_url}) восстановил вики «*{wiki_name}*»{comment}"
+
+#: extensions/base/managewiki.py:217
+#, python-brace-format
+msgid "Unlocked a \"{wiki}\" wiki"
+msgstr "Разблокировал вики «{wiki}»"
+
+#: extensions/base/managewiki.py:225
+#, python-brace-format
+msgid "[{author}]({author_url}) unlocked a wiki *{wiki_name}*{comment}"
+msgstr "[{author}]({author_url}) разблокировал вики «*{wiki_name}*»{comment}"
+
+#: extensions/base/datadump.py:36
+#, python-brace-format
+msgid "Generated {file} dump"
+msgstr "Сгенерировал дамп для «{file}»"
+
+#: extensions/base/datadump.py:45
+#, python-brace-format
+msgid "[{author}]({author_url}) generated *{file}* dump{comment}"
+msgstr "[{author}]({author_url}) сгенерировал дамп для «*{file}*»{comment}"
+
+#: extensions/base/datadump.py:58
+#, python-brace-format
+msgid "Deleted {file} dump"
+msgstr "Удалил дамп для «{file}»"
+
+#: extensions/base/datadump.py:67
+#, python-brace-format
+msgid "[{author}]({author_url}) deleted *{file}* dump{comment}"
+msgstr "[{author}]({author_url}) удалил дамп для «*{file}*»{comment}"
+
+#: extensions/base/curseprofile.py:40
+#, python-brace-format
+msgid "Edited {target}'s profile"
+msgstr "Отредактировал профиль участника {target}"
+
+#: extensions/base/curseprofile.py:42
+msgid "Edited their own profile"
+msgstr "Отредактировал свой профиль"
+
+#: extensions/base/curseprofile.py:44
+#, python-brace-format
+msgid "Cleared the {field} field"
+msgstr "Очистил поле «{field}»"
+
+#: extensions/base/curseprofile.py:46
+#, python-brace-format
+msgid "{field} field changed to: {desc}"
+msgstr "Поле «{field}» изменено на: «{desc}»"
+
+#: extensions/base/curseprofile.py:58
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) cleared the {field} on [{target}]({target_url})'s "
+"profile."
+msgstr ""
+"[{author}]({author_url}) отредактировал поле «{field}» в профиле участника "
+"[{target}]({target_url})."
+
+#: extensions/base/curseprofile.py:60
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) edited the {field} on [{target}]({target_url})'s "
+"profile. *({desc})*"
+msgstr ""
+"[{author}]({author_url}) отредактировал поле «{field}» в профиле участника "
+"[{target}]({target_url}). *({desc})*"
+
+#: extensions/base/curseprofile.py:65
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) cleared the {field} on [their own]({target_url}) "
+"profile."
+msgstr ""
+"[{author}]({author_url}) отредактировал поле «{field}» в [своём]"
+"({target_url}) профиле."
+
+#: extensions/base/curseprofile.py:67
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) edited the {field} on [their own]({target_url}) "
+"profile. *({desc})*"
+msgstr ""
+"[{author}]({author_url}) отредактировал поле «{field}» в [своём]"
+"({target_url}) профиле. *({desc})*"
+
+#: extensions/base/curseprofile.py:82
+#, python-brace-format
+msgid "Left a comment on {target}'s profile"
+msgstr "Оставил комментарий в профиле участника {target}"
+
+#: extensions/base/curseprofile.py:84
+msgid "Left a comment on their own profile"
+msgstr "Оставил комментарий в своём профиле"
+
+#: extensions/base/curseprofile.py:97
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) left a [comment]({comment}) on {target}'s profile."
+msgstr ""
+"[{author}]({author_url}) оставил [комментарий]({comment}) в профиле "
+"участника {target}."
+
+#: extensions/base/curseprofile.py:100
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) left a [comment]({comment}) on their own profile."
+msgstr ""
+"[{author}]({author_url}) оставил [комментарий]({comment}) в своём профиле."
+
+#: extensions/base/curseprofile.py:113
+#, python-brace-format
+msgid "Edited a comment on {target}'s profile"
+msgstr "Отредактировал комментарий в профиле участника {target}"
+
+#: extensions/base/curseprofile.py:115
+msgid "Edited a comment on their own profile"
+msgstr "Отредактировал комментарий в своём профиле"
+
+#: extensions/base/curseprofile.py:128
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) edited a [comment]({comment}) on {target}'s profile."
+msgstr ""
+"[{author}]({author_url}) отредактировал [комментарий]({comment}) в профиле "
+"участника {target}."
+
+#: extensions/base/curseprofile.py:131
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) edited a [comment]({comment}) on their own profile."
+msgstr ""
+"[{author}]({author_url}) отредактировал [комментарий]({comment}) в своём "
+"профиле."
+
+#: extensions/base/curseprofile.py:144
+#, python-brace-format
+msgid "Replied to a comment on {target}'s profile"
+msgstr "Ответил на комментарий в профиле участника {target}"
+
+#: extensions/base/curseprofile.py:146
+msgid "Replied to a comment on their own profile"
+msgstr "Ответил на комментарий в своём профиле"
+
+#: extensions/base/curseprofile.py:159
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) replied to a [comment]({comment}) on {target}'s "
+"profile."
+msgstr ""
+"[{author}]({author_url}) ответил на [комментарий]({comment}) в профиле "
+"участника {target}."
+
+#: extensions/base/curseprofile.py:162
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) replied to a [comment]({comment}) on their own "
+"profile."
+msgstr ""
+"[{author}]({author_url}) ответил на [комментарий]({comment}) в своём профиле."
+
+#: extensions/base/curseprofile.py:175
+#, python-brace-format
+msgid "Deleted a comment on {target}'s profile"
+msgstr "Удалил комментарий в профиле участника {target}"
+
+#: extensions/base/curseprofile.py:177
+msgid "Deleted a comment on their own profile"
+msgstr "Удалил комментарий в своём профиле"
+
+#: extensions/base/curseprofile.py:197
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) deleted a [comment]({comment}) on {target}'s "
+"profile.{reason}"
+msgstr ""
+"[{author}]({author_url}) удалил [комментарий]({comment}) в профиле участника "
+"{target}.{reason}"
+
+#: extensions/base/curseprofile.py:200
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) deleted a [comment]({comment}) on their own profile."
+"{reason}"
+msgstr ""
+"[{author}]({author_url}) удалил [комментарий]({comment}) в своём профиле."
+"{reason}"
+
+#: extensions/base/curseprofile.py:214
+#, python-brace-format
+msgid "Purged a comment on {target}'s profile"
+msgstr "Навсегда удалил комментарий в профиле участника {target}"
+
+#: extensions/base/curseprofile.py:216
+msgid "Purged a comment on their own profile"
+msgstr "Навсегда удалил комментарий в своём профиле"
+
+#: extensions/base/curseprofile.py:230
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) purged a comment on [{target}]({link})'s profile."
+"{reason}"
+msgstr ""
+"[{author}]({author_url}) навсегда удалил комментарий в профиле участника "
+"[{target}]({link}).{reason}"
+
+#: extensions/base/curseprofile.py:233
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) purged a comment on [their own]({link}) profile."
+"{reason}"
+msgstr ""
+"[{author}]({author_url}) навсегда удалил комментарий в [своём]({link}) "
+"профиле.{reason}"
+
+#: extensions/base/renameuser.py:38
+#, python-brace-format
+msgid "Renamed user \"{old_name}\" with {edits} edit to \"{new_name}\""
+msgid_plural "Renamed user \"{old_name}\" with {edits} edits to \"{new_name}\""
+msgstr[0] "Переименовал участника {old_name} с {edits} правкой в {new_name}"
+msgstr[1] "Переименовал участника {old_name} с {edits} правками в {new_name}"
+msgstr[2] "Переименовал участника {old_name} с {edits} правками в {new_name}"
+
+#: extensions/base/renameuser.py:43
+#, python-brace-format
+msgid "Renamed user \"{old_name}\" to \"{new_name}\""
+msgstr "Переименовал участника {old_name} в {new_name}"
+
+#: extensions/base/renameuser.py:58
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) renamed user *{old_name}* with {edits} edit to "
+"[{new_name}]({link}){comment}"
+msgid_plural ""
+"[{author}]({author_url}) renamed user *{old_name}* with {edits} edits to "
+"[{new_name}]({link}){comment}"
+msgstr[0] ""
+"[{author}]({author_url}) переименовал участника *{old_name}* с {edits} "
+"правкой в [{new_name}]({link}){comment}"
+msgstr[1] ""
+"[{author}]({author_url}) переименовал участника *{old_name}* с {edits} "
+"правками в [{new_name}]({link}){comment}"
+msgstr[2] ""
+"[{author}]({author_url}) переименовал участника *{old_name}* с {edits} "
+"правками в [{new_name}]({link}){comment}"
+
+#: extensions/base/renameuser.py:66
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) renamed user *{old_name}* to [{new_name}]({link})"
+"{comment}"
+msgstr ""
+"[{author}]({author_url}) переименовал участника *{old_name}* в [{new_name}]"
+"({link}){comment}"
+
+#: extensions/base/interwiki.py:37
+msgid "Added an entry to the interwiki table"
+msgstr "Добавил запись в таблицу интервики"
+
+#: extensions/base/interwiki.py:38 extensions/base/interwiki.py:65
+#, python-brace-format
+msgid "Prefix: {prefix}, website: {website} | {desc}"
+msgstr "Префикс: {prefix}, сайт: {website} | {desc}"
+
+#: extensions/base/interwiki.py:50
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) added an entry to the [interwiki table]"
+"({table_url}) pointing to {website} with {prefix} prefix"
+msgstr ""
+"[{author}]({author_url}) добавил запись в [таблицу интервики]({table_url}), "
+"указывающая на {website} с префиксом {prefix}"
+
+#: extensions/base/interwiki.py:64
+msgid "Edited an entry in interwiki table"
+msgstr "Отредактировал запись в таблице интервики"
+
+#: extensions/base/interwiki.py:77
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) edited an entry in [interwiki table]({table_url}) "
+"pointing to {website} with {prefix} prefix"
+msgstr ""
+"[{author}]({author_url}) отредактировал запись в [таблице интервики]"
+"({table_url}), указывающая на {website} с префиксом {prefix}"
+
+#: extensions/base/interwiki.py:91
+msgid "Deleted an entry in interwiki table"
+msgstr "Удалил запись из таблицы интервики"
+
+#: extensions/base/interwiki.py:92
+#, python-brace-format
+msgid "Prefix: {prefix} | {desc}"
+msgstr "Префикс: {prefix} | {desc}"
+
+#: extensions/base/interwiki.py:102
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) deleted an entry in [interwiki table]({table_url})"
+"{desc}"
+msgstr ""
+"[{author}]({author_url}) удалил запись из [таблицы интервики]({table_url})"
+"{desc}"
+
+#: extensions/base/abusefilter.py:29
+msgid "None"
+msgstr "Нет"
+
+#: extensions/base/abusefilter.py:29
+msgid "Warning issued"
+msgstr "Выдано предупреждение"
+
+#: extensions/base/abusefilter.py:29
+msgid "**Blocked user**"
+msgstr "**Участник заблокирован**"
+
+#: extensions/base/abusefilter.py:29
+msgid "Tagged the edit"
+msgstr "Проставлена метка"
+
+#: extensions/base/abusefilter.py:29
+msgid "Disallowed the action"
+msgstr "Действие отклонено"
+
+#: extensions/base/abusefilter.py:29
+msgid "**IP range blocked**"
+msgstr "**Диапазон IP-адресов заблокирован**"
+
+#: extensions/base/abusefilter.py:29
+msgid "Throttled actions"
+msgstr "Действия замедлены"
+
+#: extensions/base/abusefilter.py:29
+msgid "Removed autoconfirmed group"
+msgstr "Сняты права автоподтверждённого"
+
+#: extensions/base/abusefilter.py:29
+msgid "**Removed from privileged groups**"
+msgstr "**Удаление из привилегированных групп**"
+
+#: extensions/base/abusefilter.py:30
+msgid "Edit"
+msgstr "Правка"
+
+#: extensions/base/abusefilter.py:30
+msgid "Upload"
+msgstr "Загрузка Файла"
+
+#: extensions/base/abusefilter.py:30
+msgid "Move"
+msgstr "Переименование"
+
+#: extensions/base/abusefilter.py:30
+msgid "Stash upload"
+msgstr "Загрузка Файла во временное хранилище"
+
+#: extensions/base/abusefilter.py:30
+msgid "Deletion"
+msgstr "Удаление"
+
+#: extensions/base/abusefilter.py:30
+msgid "Account creation"
+msgstr "Создание учётной записи"
+
+#: extensions/base/abusefilter.py:30
+msgid "Auto account creation"
+msgstr "Автоматическое создание учётной записи"
+
+#: extensions/base/abusefilter.py:54
+#, python-brace-format
+msgid "{user} triggered \"{abuse_filter}\""
+msgstr "{user} вызвал срабатывание фильтра \"{abuse_filter}\""
+
+#: extensions/base/abusefilter.py:55
+msgid "Performed"
+msgstr "Выполнил"
+
+#: extensions/base/abusefilter.py:56
+msgid "Action taken"
+msgstr "Предпринятые меры"
+
+#: extensions/base/abusefilter.py:57
+msgid "Title"
+msgstr "Заголовок"
+
+#: extensions/base/abusefilter.py:66
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) triggered *{abuse_filter}*, performing the action "
+"\"{action}\" on *[{target}]({target_url})* - action taken: {result}."
+msgstr ""
+"[{author}]({author_url}) вызвал срабатывание *{abuse_filter}*, выполнив "
+"действие \"{action}\" на странице *[{target}]({target_url})* - Предпринятые "
+"меры: {result}."
+
+#: extensions/base/abusefilter.py:83
+#, python-brace-format
+msgid "Edited abuse filter number {number}"
+msgstr "Отредактировал фильтр злоупотреблений под номером {number}"
+
+#: extensions/base/abusefilter.py:95
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) edited abuse filter [number {number}]({filter_url})"
+msgstr ""
+"[{author}]({author_url}) отредактировал фильтр злоупотреблений [под номером "
+"{number}]({filter_url})"
+
+#: extensions/base/abusefilter.py:111
+#, python-brace-format
+msgid "Created abuse filter number {number}"
+msgstr "Создал фильтр злоупотреблений под номером {number}"
+
+#: extensions/base/abusefilter.py:119
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) created abuse filter [number {number}]({filter_url})"
+msgstr ""
+"[{author}]({author_url}) создал фильтр злоупотреблений [под номером {number}]"
+"({filter_url})"
+
+#: extensions/base/mediawiki.py:37
+msgid "director"
+msgstr "директор"
+
+#: extensions/base/mediawiki.py:37
+msgid "bot"
+msgstr "бот"
+
+#: extensions/base/mediawiki.py:37
+msgid "editor"
+msgstr "досматривающий"
+
+#: extensions/base/mediawiki.py:37
+msgid "directors"
+msgstr "директора"
+
+#: extensions/base/mediawiki.py:37
+msgid "sysop"
+msgstr "администратор"
+
+#: extensions/base/mediawiki.py:37
+msgid "bureaucrat"
+msgstr "бюрократ"
+
+#: extensions/base/mediawiki.py:37
+msgid "reviewer"
+msgstr "выверяющий"
+
+#: extensions/base/mediawiki.py:38
+msgid "autoreview"
+msgstr "автодосматриваемый"
+
+#: extensions/base/mediawiki.py:38
+msgid "autopatrol"
+msgstr "автопатрулируемый"
+
+#: extensions/base/mediawiki.py:38
+msgid "wiki_guardian"
+msgstr "смотритель вики"
+
+#: extensions/base/mediawiki.py:70
+msgid "(N!) "
+msgstr "(Н!) "
+
+#: extensions/base/mediawiki.py:71
+msgid "m"
+msgstr "м"
+
+#: extensions/base/mediawiki.py:72
+msgid "b"
+msgstr "б"
+
+#: extensions/base/mediawiki.py:112
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) edited [{article}]({edit_link}){comment} {bold}"
+"({sign}{edit_size}){bold}"
+msgstr ""
+"[{author}]({author_url}) отредактировал страницу [{article}]({edit_link})"
+"{comment} {bold}({sign}{edit_size}){bold}"
+
+#: extensions/base/mediawiki.py:117
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) created [{article}]({edit_link}){comment} {bold}"
+"({sign}{edit_size}){bold}"
+msgstr ""
+"[{author}]({author_url}) создал страницу [{article}]({edit_link}){comment} "
+"{bold}({sign}{edit_size}){bold}"
+
+#: extensions/base/mediawiki.py:190 extensions/base/mediawiki.py:223
+msgid "Options"
+msgstr "Настройки"
+
+#: extensions/base/mediawiki.py:190
+#, python-brace-format
+msgid "([preview]({link}) | [undo]({undolink}))"
+msgstr "([просмотр]({link}) | [отмена]({undolink}))"
+
+#: extensions/base/mediawiki.py:195
+#, python-brace-format
+msgid "Uploaded a new version of {name}"
+msgstr "Загрузил новую версию {name}"
+
+#: extensions/base/mediawiki.py:197
+#, python-brace-format
+msgid "Reverted a version of {name}"
+msgstr "Возвратил версию {name}"
+
+#: extensions/base/mediawiki.py:199
+#, python-brace-format
+msgid "Uploaded {name}"
+msgstr "Загрузил {name}"
+
+#: extensions/base/mediawiki.py:208
+msgid "**No license!**"
+msgstr "**Отсутствует лицензия!**"
+
+#: extensions/base/mediawiki.py:223
+#, python-brace-format
+msgid "([preview]({link}))"
+msgstr "([просмотр]({link}))"
+
+#: extensions/base/mediawiki.py:228
+msgid ""
+"\n"
+"License: {}"
+msgstr ""
+"\n"
+"Лицензия: {}"
+
+#: extensions/base/mediawiki.py:237
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) reverted a version of [{file}]({file_link}){comment}"
+msgstr ""
+"[{author}]({author_url}) возвратил версию [{file}]({file_link}) {comment}"
+
+#: extensions/base/mediawiki.py:248
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) uploaded a new version of [{file}]({file_link})"
+"{comment}"
+msgstr ""
+"[{author}]({author_url}) загрузил новую версию [{file}]({file_link}){comment}"
+
+#: extensions/base/mediawiki.py:259
+#, python-brace-format
+msgid "[{author}]({author_url}) uploaded [{file}]({file_link}){comment}"
+msgstr "[{author}]({author_url}) загрузил [{file}]({file_link}){comment}"
+
+#: extensions/base/mediawiki.py:274
+#, python-brace-format
+msgid "Deleted page {article}"
+msgstr "Удалил страницу «{article}»"
+
+#: extensions/base/mediawiki.py:283
+#, python-brace-format
+msgid "[{author}]({author_url}) deleted [{page}]({page_link}){comment}"
+msgstr ""
+"[{author}]({author_url}) удалил страницу [{page}]({page_link}){comment}"
+
+#: extensions/base/mediawiki.py:298
+#, python-brace-format
+msgid "Deleted redirect {article} by overwriting"
+msgstr "Удалил перенаправление «{article}» с помощью перезаписи"
+
+#: extensions/base/mediawiki.py:308
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) deleted redirect by overwriting [{page}]"
+"({page_link}){comment}"
+msgstr ""
+"[{author}]({author_url}) удалил перенаправление с помощью перезаписи [{page}]"
+"({page_link}){comment}"
+
+#: extensions/base/mediawiki.py:322
+#, python-brace-format
+msgid "Restored {article}"
+msgstr "Восстановил страницу «{article}»"
+
+#: extensions/base/mediawiki.py:331
+#, python-brace-format
+msgid "[{author}]({author_url}) restored [{article}]({article_url}){comment}"
+msgstr ""
+"[{author}]({author_url}) восстановил страницу [{article}]({article_url})"
+"{comment}"
+
+#: extensions/base/mediawiki.py:348
+msgid "Changed visibility of log events"
+msgstr "Изменил видимость событий в журнале"
+
+#: extensions/base/mediawiki.py:356
+#, python-brace-format
+msgid "[{author}]({author_url}) changed visibility of log events{comment}"
+msgstr "[{author}]({author_url}) изменил видимость событий журнала{comment}"
+
+#: extensions/base/mediawiki.py:370
+#, python-brace-format
+msgid "Changed visibility of revision on page {article} "
+msgid_plural "Changed visibility of {amount} revisions on page {article} "
+msgstr[0] "Изменил видимость правки на странице «{article}» "
+msgstr[1] "Изменил видимость {amount} правок на странице «{article}» "
+msgstr[2] "Изменил видимость {amount} правок на странице «{article}» "
+
+#: extensions/base/mediawiki.py:383
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) changed visibility of revision on page [{article}]"
+"({article_url}){comment}"
+msgid_plural ""
+"[{author}]({author_url}) changed visibility of {amount} revisions on page "
+"[{article}]({article_url}){comment}"
+msgstr[0] ""
+"[{author}]({author_url}) изменил видимость правки на странице [{article}]"
+"({article_url}){comment}"
+msgstr[1] ""
+"[{author}]({author_url}) изменил видимость {amount} правок на странице "
+"[{article}]({article_url}){comment}"
+msgstr[2] ""
+"[{author}]({author_url}) изменил видимость {amount} правок на странице "
+"[{article}]({article_url}){comment}"
+
+#: extensions/base/mediawiki.py:399 extensions/base/mediawiki.py:432
+msgid "No redirect has been made"
+msgstr "Перенаправление не было сделано"
+
+#: extensions/base/mediawiki.py:400 extensions/base/mediawiki.py:433
+msgid "A redirect has been made"
+msgstr "Было сделано перенаправление"
+
+#: extensions/base/mediawiki.py:401
+#, python-brace-format
+msgid "Moved {redirect}{article} to {target}"
+msgstr "Переименовал страницу {redirect}{article} в {target}"
+
+#: extensions/base/mediawiki.py:412 extensions/base/mediawiki.py:444
+msgid "without making a redirect"
+msgstr "без перенаправления"
+
+#: extensions/base/mediawiki.py:413 extensions/base/mediawiki.py:445
+msgid "with a redirect"
+msgstr "с перенаправлением"
+
+#: extensions/base/mediawiki.py:416
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) moved {redirect}*{article}* to [{target}]"
+"({target_url}) {made_a_redirect}{comment}"
+msgstr ""
+"[{author}]({author_url}) переименовал страницу {redirect}*{article}* в "
+"[{target}]({target_url}) {made_a_redirect}{comment}"
+
+#: extensions/base/mediawiki.py:434
+#, python-brace-format
+msgid "Moved {redirect}{article} to {title} over redirect"
+msgstr ""
+"Переименовал страницу {redirect}{article} в {title} поверх перенаправления"
+
+#: extensions/base/mediawiki.py:448
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) moved {redirect}*{article}* over redirect to "
+"[{target}]({target_url}) {made_a_redirect}{comment}"
+msgstr ""
+"[{author}]({author_url}) переименовал страницу {redirect}*{article}* поверх "
+"перенаправления в [{target}]({target_url}) {made_a_redirect}{comment}"
+
+#: extensions/base/mediawiki.py:464
+#, python-brace-format
+msgid "Moved protection settings from {redirect}{article} to {title}"
+msgstr "Перенёс параметры защиты с «{redirect}{article}» на «{title}»"
+
+#: extensions/base/mediawiki.py:477
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) moved protection settings from {redirect}*{article}"
+"* to [{target}]({target_url}){comment}"
+msgstr ""
+"[{author}]({author_url}) перенёс параметры защиты со страницы {redirect}"
+"*{article}* на страницу [{target}]({target_url}){comment}"
+
+#: extensions/base/mediawiki.py:492
+#, python-brace-format
+msgid "Protected {target}"
+msgstr "Защитил страницу «{target}»"
+
+#: extensions/base/mediawiki.py:495 extensions/base/mediawiki.py:510
+#: extensions/base/mediawiki.py:526 extensions/base/mediawiki.py:541
+msgid " [cascading]"
+msgstr " [каскадно]"
+
+#: extensions/base/mediawiki.py:506
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) protected [{article}]({article_url}) with the "
+"following settings: {settings}{comment}"
+msgstr ""
+"[{author}]({author_url}) защитил страницу [{article}]({article_url}) со "
+"следующими настройками: {settings}{comment}"
+
+#: extensions/base/mediawiki.py:523
+#, python-brace-format
+msgid "Changed protection level for {article}"
+msgstr "Изменил уровень защиты для страницы «{article}»"
+
+#: extensions/base/mediawiki.py:537
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) modified protection settings of [{article}]"
+"({article_url}) to: {settings}{comment}"
+msgstr ""
+"[{author}]({author_url}) изменил настройки защиты страницы [{article}]"
+"({article_url}) на: {settings}{comment}"
+
+#: extensions/base/mediawiki.py:554
+#, python-brace-format
+msgid "Removed protection from {article}"
+msgstr "Убрал защиту со страницы «{article}»"
+
+#: extensions/base/mediawiki.py:563
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) removed protection from [{article}]({article_url})"
+"{comment}"
+msgstr ""
+"[{author}]({author_url}) снял защиту со страницу [{article}]({article_url})"
+"{comment}"
+
+#: extensions/base/mediawiki.py:572
+msgid "for infinity and beyond"
+msgstr "навеки и навсегда"
+
+#: extensions/base/mediawiki.py:581
+msgid "for less than a minute"
+msgstr "менее чем на минуту"
+
+#: extensions/base/mediawiki.py:583
+msgid "year"
+msgid_plural "years"
+msgstr[0] "год"
+msgstr[1] "года"
+msgstr[2] "лет"
+
+#: extensions/base/mediawiki.py:583
+msgid "day"
+msgid_plural "days"
+msgstr[0] "день"
+msgstr[1] "дня"
+msgstr[2] "дней"
+
+#: extensions/base/mediawiki.py:583
+msgid "hour"
+msgid_plural "hours"
+msgstr[0] "час"
+msgstr[1] "часа"
+msgstr[2] "часов"
+
+#: extensions/base/mediawiki.py:584
+msgid "minute"
+msgid_plural "minutes"
+msgstr[0] "минута"
+msgstr[1] "минуты"
+msgstr[2] "минут"
+
+#: extensions/base/mediawiki.py:589
+#, python-brace-format
+msgid "for {time_number} {time_unit}"
+msgstr "на {time_number} {time_unit}"
+
+#: extensions/base/mediawiki.py:608
+msgid "Blocked from editing the following pages: "
+msgstr "Заблокирован от редактирования в следующих страницах: "
+
+#: extensions/base/mediawiki.py:615 extensions/base/mediawiki.py:661
+msgid " and namespaces: "
+msgstr " и в пространствах имён: "
+
+#: extensions/base/mediawiki.py:617
+msgid "Blocked from editing pages on following namespaces: "
+msgstr ""
+"Заблокирован от редактирования на страницах в следующих пространствах имён: "
+
+#: extensions/base/mediawiki.py:628
+msgid "Partial block details"
+msgstr "Частичные детали блокировки"
+
+#: extensions/base/mediawiki.py:631
+msgid "Block flags"
+msgstr "Флаги блокировки"
+
+#: extensions/base/mediawiki.py:633
+#, python-brace-format
+msgid "Blocked {blocked_user} {time}"
+msgstr "Заблокировал участника {blocked_user} {time}"
+
+#: extensions/base/mediawiki.py:653
+msgid " on pages: "
+msgstr " на страницах: "
+
+#: extensions/base/mediawiki.py:663
+msgid " on namespaces: "
+msgstr " в пространствах имён: "
+
+#: extensions/base/mediawiki.py:675
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) blocked [{user}]({user_url}) {time}"
+"{restriction_desc}{comment}"
+msgstr ""
+"[{author}]({author_url}) заблокировал участника [{user}]({user_url}) на срок "
+"«{time}»{restriction_desc}{comment}"
+
+#: extensions/base/mediawiki.py:693
+#, python-brace-format
+msgid "Changed block settings for {blocked_user}"
+msgstr "Изменил параметры блокировки для {blocked_user}"
+
+#: extensions/base/mediawiki.py:703
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) changed block settings for [{blocked_user}]"
+"({user_url}){comment}"
+msgstr ""
+"[{author}]({author_url}) изменил параметры блокировки для участника "
+"[{blocked_user}]({user_url}){comment}"
+
+#: extensions/base/mediawiki.py:716
+#, python-brace-format
+msgid "Unblocked {blocked_user}"
+msgstr "Разблокировал участника {blocked_user}"
+
+#: extensions/base/mediawiki.py:726
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) unblocked [{blocked_user}]({user_url}){comment}"
+msgstr ""
+"[{author}]({author_url}) разблокировал участника [{blocked_user}]({user_url})"
+"{comment}"
+
+#: extensions/base/mediawiki.py:742
+msgid "Action has been hidden by administration"
+msgstr "Действие было скрыто администрацией"
+
+#: extensions/base/mediawiki.py:749
+msgid "An action has been hidden by administration."
+msgstr "Действие было скрыто администрацией."
+
+#: extensions/base/mediawiki.py:760
+#, python-brace-format
+msgid "Imported {article} with {count} revision"
+msgid_plural "Imported {article} with {count} revisions"
+msgstr[0] "Импортировал страницу «{article}» с {count} правкой"
+msgstr[1] "Импортировал страницу «{article}» с {count} правками"
+msgstr[2] "Импортировал страницу «{article}» с {count} правками"
+
+#: extensions/base/mediawiki.py:771
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) imported [{article}]({article_url}) with {count} "
+"revision{comment}"
+msgid_plural ""
+"[{author}]({author_url}) imported [{article}]({article_url}) with {count} "
+"revisions{comment}"
+msgstr[0] ""
+"[{author}]({author_url}) импортировал страницу [{article}]({article_url}) с "
+"{count} правкой{comment}"
+msgstr[1] ""
+"[{author}]({author_url}) импортировал страницу [{article}]({article_url}) с "
+"{count} правками{comment}"
+msgstr[2] ""
+"[{author}]({author_url}) импортировал страницу [{article}]({article_url}) с "
+"{count} правками{comment}"
+
+#: extensions/base/mediawiki.py:787
+#, python-brace-format
+msgid "Imported {article} with {count} revision from \"{source}\""
+msgid_plural "Imported {article} with {count} revisions from \"{source}\""
+msgstr[0] "Импортировал страницу «{article}» с {count} правкой из \"{source}\""
+msgstr[1] ""
+"Импортировал страницу «{article}» с {count} правками из \"{source}\""
+msgstr[2] ""
+"Импортировал страницу «{article}» с {count} правками из \"{source}\""
+
+#: extensions/base/mediawiki.py:802
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) imported [{article}]({article_url}) with {count} "
+"revision from [{source}]({source_url}){comment}"
+msgid_plural ""
+"[{author}]({author_url}) imported [{article}]({article_url}) with {count} "
+"revisions from [{source}]({source_url}){comment}"
+msgstr[0] ""
+"[{author}]({author_url}) импортировал страницу [{article}]({article_url}) с "
+"{count} версией [{source}]({source_url}){comment}"
+msgstr[1] ""
+"[{author}]({author_url}) импортировал страницу [{article}]({article_url}) с "
+"{count} версиями [{source}]({source_url}){comment}"
+msgstr[2] ""
+"[{author}]({author_url}) импортировал страницу [{article}]({article_url}) с "
+"{count} версиями [{source}]({source_url}){comment}"
+
+#: extensions/base/mediawiki.py:817
+#, python-brace-format
+msgid " (until {date_and_time})"
+msgstr " (до {date_and_time})"
+
+#: extensions/base/mediawiki.py:834
+#, python-brace-format
+msgid "Changed group membership for {target}"
+msgstr "Изменил членство в группах для участника {target}"
+
+#: extensions/base/mediawiki.py:836
+msgid "System"
+msgstr "Система"
+
+#: extensions/base/mediawiki.py:837
+#, python-brace-format
+msgid "{target} got autopromoted to a new usergroup"
+msgstr "Участник {target} был автоматически повышен до новой группы участников"
+
+#: extensions/base/mediawiki.py:843
+msgid "Added group"
+msgid_plural "Added groups"
+msgstr[0] "Добавленная группа"
+msgstr[1] "Добавленные группы"
+msgstr[2] "Добавленные группы"
+
+#: extensions/base/mediawiki.py:845
+msgid "Removed group"
+msgid_plural "Removed groups"
+msgstr[0] "Удалённая группа"
+msgstr[1] "Удалённые группы"
+msgstr[2] "Удалённые группы"
+
+#: extensions/base/mediawiki.py:859
+#, python-brace-format
+msgid "Added to {added} and removed from {removed}."
+msgstr "Добавил в {added} и убрал из {removed}."
+
+#: extensions/base/mediawiki.py:860 extensions/base/mediawiki.py:862
+#: extensions/base/mediawiki.py:864 extensions/base/mediawiki.py:871
+msgid ", "
+msgstr ", "
+
+#: extensions/base/mediawiki.py:862
+#, python-brace-format
+msgid "Added to {added}."
+msgstr "Добавил в {added}."
+
+#: extensions/base/mediawiki.py:864
+#, python-brace-format
+msgid "Removed from {removed}."
+msgstr "Убрал из {removed}."
+
+#: extensions/base/mediawiki.py:865
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) changed group membership for [{target}]"
+"({target_url}): {group_changes}{comment}"
+msgstr ""
+"[{author}]({author_url}) изменил членство в группах для участника [{target}]"
+"({target_url}): {group_changes}{comment}"
+
+#: extensions/base/mediawiki.py:869
+#, python-brace-format
+msgid "The system autopromoted [{target}]({target_url}) to {added}.{comment}"
+msgstr ""
+"Участник [{target}]({target_url}) был автоматически добавлен в группу "
+"{added}.{comment}"
+
+#: extensions/base/mediawiki.py:882
+#, python-brace-format
+msgid "Merged revision histories of {article} into {dest}"
+msgstr ""
+"Объединил историю правок страницы «{article}» с историей правок «{dest}»"
+
+#: extensions/base/mediawiki.py:896
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) merged revision histories of [{article}]"
+"({article_url}) into [{dest}]({dest_url}){comment}"
+msgstr ""
+"[{author}]({author_url}) объединил истории версий [{article}]({article_url}) "
+"с [{dest}]({dest_url}){comment}"
+
+#: extensions/base/mediawiki.py:910
+msgid "Created account automatically"
+msgstr "Учетная запись была создана автоматически"
+
+#: extensions/base/mediawiki.py:917
+#, python-brace-format
+msgid "Account [{author}]({author_url}) was created automatically"
+msgstr "Учётная запись [{author}]({author_url}) была автоматически создана"
+
+#: extensions/base/mediawiki.py:930 extensions/base/mediawiki.py:995
+msgid "Created account"
+msgstr "Создана учётная запись"
+
+#: extensions/base/mediawiki.py:937 extensions/base/mediawiki.py:1002
+#, python-brace-format
+msgid "Account [{author}]({author_url}) was created"
+msgstr "Учётная запись [{author}]({author_url}) была создана"
+
+#: extensions/base/mediawiki.py:949
+#, python-brace-format
+msgid "Created account {article}"
+msgstr "Создана учетная запись {article}"
+
+#: extensions/base/mediawiki.py:958
+#, python-brace-format
+msgid ""
+"Account [{article}]({article_url}) was created by [{author}]({author_url})"
+"{comment}"
+msgstr ""
+"Учётная запись [{article}]({article_url}) была создана [{author}]"
+"({author_url}){comment}"
+
+#: extensions/base/mediawiki.py:971
+#, python-brace-format
+msgid "Created account {article} and password was sent by email"
+msgstr ""
+"Создана учетная запись {article} и пароль был отправлен на электронную почту"
+
+#: extensions/base/mediawiki.py:982
+#, python-brace-format
+msgid ""
+"Account [{article}]({article_url}) was created by [{author}]({author_url}) "
+"and password was sent by email{comment}"
+msgstr ""
+"Учётная запись [{article}]({article_url}) была создана [{author}]"
+"({author_url}) и пароль был отправлен на электронную почту{comment}"
+
+#: extensions/base/mediawiki.py:1014
+#, python-brace-format
+msgid "Changed the content model of the page {article}"
+msgstr "Изменил модель содержимого для страницы «{article}»"
+
+#: extensions/base/mediawiki.py:1016
+#, python-brace-format
+msgid "Model changed from {old} to {new}: {reason}"
+msgstr "Модель изменена с «{old}» на «{new}»: {reason}"
+
+#: extensions/base/mediawiki.py:1028
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) changed the content model of the page [{article}]"
+"({article_url}) from {old} to {new}{comment}"
+msgstr ""
+"[{author}]({author_url}) изменил модель содержимого страницы [{article}]"
+"({article_url}) с {old} на {new}{comment}"
+
+#: extensions/base/mediawiki.py:1043
+#, python-brace-format
+msgid "Created the page {article} using a non-default content model"
+msgstr ""
+"Создал страницу {article} с использованием нестандартной модели содержимого"
+
+#: extensions/base/mediawiki.py:1045
+#, python-brace-format
+msgid "Created with model {new}: {reason}"
+msgstr "Создал с использованием модели содержимого {new}: {reason}"
+
+#: extensions/base/mediawiki.py:1056
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) created the page [{article}]({article_url}) using a "
+"non-default content model {new}{comment}"
+msgstr ""
+"[{author}]({author_url}) создал страницу [{article}]({article_url}) с "
+"использованием нестандартной модели содержимого {new}{comment}"
+
+#: extensions/base/mediawiki.py:1071
+#, python-brace-format
+msgid "Created the tag \"{tag}\""
+msgstr "Создал метку «{tag}»"
+
+#: extensions/base/mediawiki.py:1081
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) created the [tag]({tag_url}) \"{tag}\"{comment}"
+msgstr "[{author}]({author_url}) создал [метку]({tag_url}) \"{tag}\"{comment}"
+
+#: extensions/base/mediawiki.py:1102
+#, python-brace-format
+msgid "Deleted the tag \"{tag}\""
+msgstr "Удалил метку «{tag}»"
+
+#: extensions/base/mediawiki.py:1104
+msgid "Removed from"
+msgstr "Удалено"
+
+#: extensions/base/mediawiki.py:1104
+msgid "{} revision or log entry"
+msgid_plural "{} revisions and/or log entries"
+msgstr[0] "{} правка или запись в журнале"
+msgstr[1] "{} правки или записи в журнале"
+msgstr[2] "{} правок или записей в журнале"
+
+#: extensions/base/mediawiki.py:1117
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) deleted the [tag]({tag_url}) \"{tag}\"{comment}"
+msgstr "[{author}]({author_url}) удалил [метку]({tag_url}) \"{tag}\"{comment}"
+
+#: extensions/base/mediawiki.py:1127
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) deleted the [tag]({tag_url}) \"{tag}\" and removed "
+"it from {count} revision or log entry{comment}"
+msgid_plural ""
+"[{author}]({author_url}) deleted the [tag]({tag_url}) \"{tag}\" and removed "
+"it from {count} revisions and/or log entries{comment}"
+msgstr[0] ""
+"[{author}]({author_url}) удалил [метку]({tag_url}) \"{tag}\" и убрал её из "
+"{count} правки или записи в журнале{comment}"
+msgstr[1] ""
+"[{author}]({author_url}) удалил [метку]({tag_url}) \"{tag}\" и убрал её из "
+"{count} правок или записей в журнале{comment}"
+msgstr[2] ""
+"[{author}]({author_url}) удалил [метку]({tag_url}) \"{tag}\" и убрал её из "
+"{count} правок или записей в журнале{comment}"
+
+#: extensions/base/mediawiki.py:1144
+#, python-brace-format
+msgid "Activated the tag \"{tag}\""
+msgstr "Активировал метку «{tag}»"
+
+#: extensions/base/mediawiki.py:1153
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) activated the [tag]({tag_url}) \"{tag}\"{comment}"
+msgstr ""
+"[{author}]({author_url}) активировал [метку]({tag_url}) \"{tag}\"{comment}"
+
+#: extensions/base/mediawiki.py:1172
+#, python-brace-format
+msgid "Deactivated the tag \"{tag}\""
+msgstr "Деактивировал метку «{tag}»"
+
+#: extensions/base/mediawiki.py:1181
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) deactivated the [tag]({tag_url}) \"{tag}\"{comment}"
+msgstr ""
+"[{author}]({author_url}) деактивировал [метку]({tag_url}) \"{tag}\"{comment}"
+
+#: extensions/base/sprite.py:37
+#, python-brace-format
+msgid "Edited the sprite for {article}"
+msgstr "Отредактировал спрайт для страницы «{article}»"
+
+#: extensions/base/sprite.py:45
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) edited the sprite for [{article}]({article_url})"
+msgstr ""
+"[{author}]({author_url}) отредактировал спрайт для [{article}]({article_url})"
+
+#: extensions/base/sprite.py:60
+#, python-brace-format
+msgid "Created the sprite sheet for {article}"
+msgstr "Создал таблицу спрайтов для страницы «{article}»"
+
+#: extensions/base/sprite.py:68
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) created the sprite sheet for [{article}]"
+"({article_url})"
+msgstr ""
+"[{author}]({author_url}) создал таблицу спрайтов для [{article}]"
+"({article_url})"
+
+#: extensions/base/sprite.py:79
+#, python-brace-format
+msgid "Edited the slice for {article}"
+msgstr "Отредактировал срез для страницы «{article}»"
+
+#: extensions/base/sprite.py:86
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) edited the slice for [{article}]({article_url})"
+msgstr ""
+"[{author}]({author_url}) отредактировал фрагмент для [{article}]"
+"({article_url})"
+
+#, python-brace-format
+#~ msgid ""
+#~ "{reason}\n"
+#~ "{added}{linebreak}{removed}"
+#~ msgstr ""
+#~ "{reason}\n"
+#~ "{added}{linebreak}{removed}"
+
+#, python-brace-format
+#~ msgid "{value} (avg. {avg})"
+#~ msgstr "{value} (ср. {avg})"
+
+#~ msgid "Daily overview"
+#~ msgstr "Ежедневный обзор"
+
+#~ msgid "No activity"
+#~ msgstr "Нет активности"
+
+#~ msgid " ({} action)"
+#~ msgid_plural " ({} actions)"
+#~ msgstr[0] " ({} действие)"
+#~ msgstr[1] " ({} действия)"
+#~ msgstr[2] " ({} действий)"
+
+#~ msgid " ({} edit)"
+#~ msgid_plural " ({} edits)"
+#~ msgstr[0] " ({} правка)"
+#~ msgstr[1] " ({} правки)"
+#~ msgstr[2] " ({} правок)"
+
+#~ msgid " UTC ({} action)"
+#~ msgid_plural " UTC ({} actions)"
+#~ msgstr[0] " UTC ({} действие)"
+#~ msgstr[1] " UTC ({} действия)"
+#~ msgstr[2] " UTC ({} действий)"
+
+#~ msgid "But nobody came"
+#~ msgstr "Но никто не пришёл"
+
+#~ msgid "Most active user"
+#~ msgid_plural "Most active users"
+#~ msgstr[0] "Самый активный участник"
+#~ msgstr[1] "Самые активные участники"
+#~ msgstr[2] "Самые активные участники"
+
+#~ msgid "Most edited article"
+#~ msgid_plural "Most edited articles"
+#~ msgstr[0] "Самая редактируемая статья"
+#~ msgstr[1] "Самые редактируемые статьи"
+#~ msgstr[2] "Самые редактируемые статьи"
+
+#~ msgid "Edits made"
+#~ msgstr "Сделано правок"
+
+#~ msgid "New files"
+#~ msgstr "Новых файлов"
+
+#~ msgid "Admin actions"
+#~ msgstr "Административных действий"
+
+#~ msgid "Bytes changed"
+#~ msgstr "Изменено байтов"
+
+#~ msgid "New articles"
+#~ msgstr "Новых статей"
+
+#~ msgid "Unique contributors"
+#~ msgstr "Уникальных редакторов"
+
+#~ msgid "Most active hour"
+#~ msgid_plural "Most active hours"
+#~ msgstr[0] "Самый активный час"
+#~ msgstr[1] "Самые активные часы"
+#~ msgstr[2] "Самые активные часы"
+
+#~ msgid "Day score"
+#~ msgstr "Очков за день"
+
+#~ msgid "No description provided"
+#~ msgstr "Нет описания правки"
+
+#~ msgid "second"
+#~ msgid_plural "seconds"
+#~ msgstr[0] "секунда"
+#~ msgstr[1] "секунды"
+#~ msgstr[2] "секунд"
+
+#~ msgid "week"
+#~ msgid_plural "weeks"
+#~ msgstr[0] "неделя"
+#~ msgstr[1] "недели"
+#~ msgstr[2] "недель"
+
+#~ msgid "month"
+#~ msgid_plural "months"
+#~ msgstr[0] "месяц"
+#~ msgstr[1] "месяца"
+#~ msgstr[2] "месяцев"
+
+#~ msgid "millennium"
+#~ msgid_plural "millennia"
+#~ msgstr[0] "тысячелетие"
+#~ msgstr[1] "тысячелетия"
+#~ msgstr[2] "тысячелетий"
+
+#~ msgid "decade"
+#~ msgid_plural "decades"
+#~ msgstr[0] "десятилетие"
+#~ msgstr[1] "десятилетия"
+#~ msgstr[2] "десятилетий"
+
+#~ msgid "century"
+#~ msgid_plural "centuries"
+#~ msgstr[0] "век"
+#~ msgstr[1] "века"
+#~ msgstr[2] "веков"
+
+#, python-brace-format
+#~ msgid ""
+#~ "Unknown event `{event}` by [{author}]({author_url}), report it on the "
+#~ "[support server](<{support}>)."
+#~ msgstr ""
+#~ "Неизвестное событие `{event}`, выполненное участником [{author}]"
+#~ "({author_url}), сообщите об этом на [сервере поддержки](<{support}>)."
+
+#, python-brace-format
+#~ msgid "Unknown event `{event}`"
+#~ msgstr "Неизвестное событие `{event}`"
+
+#, fuzzy
+#~ msgid "Report this on the support server"
+#~ msgstr ""
+#~ "#-#-#-#-# discussion_formatters.po #-#-#-#-#\n"
+#~ "Сообщите об этом на сервере поддержки\n"
+#~ "#-#-#-#-# rc_formatters.po #-#-#-#-#\n"
+#~ "Сообщить об этом на сервер поддержки"
+
+#, python-brace-format
+#~ msgid "for {num} {translated_length}"
+#~ msgstr "на {num}{translated_length}"
+
+#~ msgid "until {}"
+#~ msgstr "до {}"
+
+#~ msgid "none"
+#~ msgstr "ничего"
+
+#, python-brace-format
+#~ msgid ""
+#~ "[{author}]({author_url}) completed deletion of translatable page "
+#~ "[{article}]({article_url}){comment}"
+#~ msgstr ""
+#~ "[{author}]({author_url}) удалил доступную для перевода страницу "
+#~ "[{article}]({article_url}){comment}"
+
+#~ msgid "unknown expiry time"
+#~ msgstr "неизвестный период"
+
+#, python-brace-format
+#~ msgid "Groups changed from {old_groups} to {new_groups}{reason}"
+#~ msgstr "Группы изменены с {old_groups} на {new_groups}{reason}"
+
+#, python-brace-format
+#~ msgid "Completed deletion of translatable page \"{article}\""
+#~ msgstr "Удалил доступную для перевода страницу \"{article}\""
+
+#, python-brace-format
+#~ msgid "[{author}]({author_url}) restored a wiki *{wiki_name}*{comment}"
+#~ msgstr "[{author}]({author_url}) восстановил вики *{wiki_name}*{comment}"
+
+#, python-brace-format
+#~ msgid "Restored a \"{wiki}\" wiki"
+#~ msgstr "Восстановил вики \"{wiki}\""
+
+#, fuzzy, python-brace-format
+#~ msgid "[{author}]({author_url}) deleted a comment on {target}'s profile"
+#~ msgstr ""
+#~ "[{author}]({author_url}) удалил комментарий на профиле участника {target}"
+
+#, fuzzy, python-brace-format
+#~ msgid "[{author}]({author_url}) deleted a comment on their own profile"
+#~ msgstr ""
+#~ "[{author}]({author_url}) удалил комментарий на профиле участника {target}"
+
+#, python-brace-format
+#~ msgid "[{author}]({author_url}) imported interwiki{comment}"
+#~ msgstr "[{author}]({author_url}) импортировал интервики{comment}"
+
+#~ msgid "Imported interwiki"
+#~ msgstr "Импортировал префикс интервики"
+
+#~ msgid "their own profile"
+#~ msgstr "на своём профиле"
+
+#~ msgid "their own"
+#~ msgstr "на своём"
+
+#, python-brace-format
+#~ msgid "[{target}]({target_url})'s"
+#~ msgstr "[{target}]({target_url})"
+
+#, python-brace-format
+#~ msgid "[their own]({target_url})"
+#~ msgstr "[на своём]({target_url})"
diff --git a/locale/ru/LC_MESSAGES/misc.po b/locale/ru/LC_MESSAGES/misc.po
index f93ef26..f193df2 100644
--- a/locale/ru/LC_MESSAGES/misc.po
+++ b/locale/ru/LC_MESSAGES/misc.po
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2020-11-28 23:45+0100\n"
+"POT-Creation-Date: 2021-07-11 14:32+0200\n"
"PO-Revision-Date: 2020-03-18 13:59+0100\n"
"Last-Translator: BabylonAS\n"
"Language-Team: \n"
@@ -71,7 +71,7 @@ msgstr "Ссылка на учётную запись Discord"
msgid "Battle.net handle"
msgstr "Ссылка на учётную запись Battle.net"
-#: src/misc.py:119
+#: src/misc.py:139
msgid ""
"\n"
"__And more__"
@@ -79,10 +79,10 @@ msgstr ""
"\n"
"__И ещё__"
-#: src/misc.py:276
+#: src/misc.py:328
msgid "Unknown"
msgstr "Неизвестно"
-#: src/misc.py:278
+#: src/misc.py:330
msgid "unknown"
msgstr "неизвестно"
diff --git a/locale/ru/LC_MESSAGES/rc_formatters.mo b/locale/ru/LC_MESSAGES/rc_formatters.mo
deleted file mode 100644
index 8665e00..0000000
Binary files a/locale/ru/LC_MESSAGES/rc_formatters.mo and /dev/null differ
diff --git a/locale/ru/LC_MESSAGES/rc_formatters.po b/locale/ru/LC_MESSAGES/rc_formatters.po
index 063670f..be17ae2 100644
--- a/locale/ru/LC_MESSAGES/rc_formatters.po
+++ b/locale/ru/LC_MESSAGES/rc_formatters.po
@@ -8,8 +8,8 @@ msgstr ""
"Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2021-04-14 16:24+0200\n"
-"PO-Revision-Date: 2020-12-30 13:26+0000\n"
-"Last-Translator: Philo04 \n"
+"PO-Revision-Date: 2021-05-06 14:10+0000\n"
+"Last-Translator: MakandIv \n"
"Language-Team: Russian \n"
"Language: ru\n"
@@ -18,7 +18,7 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n"
"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
-"X-Generator: Weblate 4.2.1\n"
+"X-Generator: Weblate 4.6\n"
#: src/rc_formatters.py:28
msgid "None"
@@ -356,8 +356,8 @@ msgid ""
"[{author}]({author_url}) changed group membership for [{target}]"
"({target_url}) from {old_groups} to {new_groups}{comment}"
msgstr ""
-"[{author}]({author_url}) изменил модель содержимого страницы [{target}]"
-"({target_url}) с {old_groups} на {new_groups}{comment}"
+"[{author}]({author_url}) изменил членство в группе для "
+"[{target}]({target_url}) с {old_groups} на {new_groups}{comment}"
#: src/rc_formatters.py:303
#, python-brace-format
@@ -611,19 +611,19 @@ msgid "[{author}]({author_url}) replaced the Cargo table \"{table}\""
msgstr "[{author}]({author_url}) заменил таблицу Cargo \"{table}\""
#: src/rc_formatters.py:436
-#, fuzzy, python-brace-format
+#, python-brace-format
msgid ""
"[{author}]({author_url}) created the [tag]({tag_url}) \"{tag}\"{comment}"
-msgstr "[{author}]({author_url}) создал [метку]({tag_url}) \"{tag}\""
+msgstr "[{author}]({author_url}) создал [метку]({tag_url}) \"{tag}\"{comment}"
#: src/rc_formatters.py:441
-#, fuzzy, python-brace-format
+#, python-brace-format
msgid ""
"[{author}]({author_url}) deleted the [tag]({tag_url}) \"{tag}\"{comment}"
-msgstr "[{author}]({author_url}) удалил [метку]({tag_url}) \"{tag}\""
+msgstr "[{author}]({author_url}) удалил [метку]({tag_url}) \"{tag}\"{comment}"
#: src/rc_formatters.py:443
-#, fuzzy, python-brace-format
+#, python-brace-format
msgid ""
"[{author}]({author_url}) deleted the [tag]({tag_url}) \"{tag}\" and removed "
"it from {count} revision or log entry{comment}"
@@ -631,26 +631,28 @@ msgid_plural ""
"[{author}]({author_url}) deleted the [tag]({tag_url}) \"{tag}\" and removed "
"it from {count} revisions and/or log entries{comment}"
msgstr[0] ""
-"[{author}]({author_url}) импортировал страницу [{article}]({article_url}) с "
-"{count} правкой{comment}"
+"[{author}]({author_url}) удалил [метку]({tag_url}) \"{tag}\" и убрал её с "
+"{count} правки или записи журнала{comment}"
msgstr[1] ""
-"[{author}]({author_url}) импортировал страницу [{article}]({article_url}) с "
-"{count} правками{comment}"
+"[{author}]({author_url}) удалил [метку]({tag_url}) \"{tag}\" и убрал её с "
+"{count} правок и/или записей журнала{comment}"
msgstr[2] ""
-"[{author}]({author_url}) импортировал страницу [{article}]({article_url}) с "
-"{count} правками{comment}"
+"[{author}]({author_url}) удалил [метку]({tag_url}) \"{tag}\" и убрал её с "
+"{count} правок и/или записей журнала{comment}"
#: src/rc_formatters.py:449
-#, fuzzy, python-brace-format
+#, python-brace-format
msgid ""
"[{author}]({author_url}) activated the [tag]({tag_url}) \"{tag}\"{comment}"
-msgstr "[{author}]({author_url}) активировал [метку]({tag_url}) \"{tag}\""
+msgstr ""
+"[{author}]({author_url}) активировал [метку]({tag_url}) \"{tag}\"{comment}"
#: src/rc_formatters.py:452
-#, fuzzy, python-brace-format
+#, python-brace-format
msgid ""
"[{author}]({author_url}) deactivated the [tag]({tag_url}) \"{tag}\"{comment}"
-msgstr "[{author}]({author_url}) деактивировал [метку]({tag_url}) \"{tag}\""
+msgstr ""
+"[{author}]({author_url}) деактивировал [метку]({tag_url}) \"{tag}\"{comment}"
#: src/rc_formatters.py:454
#, python-brace-format
@@ -668,7 +670,7 @@ msgid "[{author}]({author_url}) locked a wiki *{wiki_name}*{comment}"
msgstr "[{author}]({author_url}) заблокировал вики *{wiki_name}*{comment}"
#: src/rc_formatters.py:462
-#, fuzzy, python-brace-format
+#, python-brace-format
msgid ""
"[{author}]({author_url}) modified namespace *{namespace_name}* on "
"*{wiki_name}*{comment}"
@@ -692,9 +694,9 @@ msgstr ""
"[{author}]({author_url}) изменил группу пользователей *{group_name}*{comment}"
#: src/rc_formatters.py:477
-#, fuzzy, python-brace-format
+#, python-brace-format
msgid "[{author}]({author_url}) undeleted a wiki *{wiki_name}*{comment}"
-msgstr "[{author}]({author_url}) удалил вики *{wiki_name}*{comment}"
+msgstr "[{author}]({author_url}) восстановил вики *{wiki_name}*{comment}"
#: src/rc_formatters.py:481
#, python-brace-format
@@ -1323,12 +1325,12 @@ msgid "Replaced the Cargo table \"{table}\""
msgstr "Заменил Cargo таблицу \"{table}\""
#: src/rc_formatters.py:1121
-#, fuzzy, python-brace-format
+#, python-brace-format
msgid "Created the tag \"{tag}\""
msgstr "Создал метку «{tag}»"
#: src/rc_formatters.py:1125
-#, fuzzy, python-brace-format
+#, python-brace-format
msgid "Deleted the tag \"{tag}\""
msgstr "Удалил метку «{tag}»"
@@ -1340,17 +1342,17 @@ msgstr "Удалено"
#: src/rc_formatters.py:1127
msgid "{} revision or log entry"
msgid_plural "{} revisions and/or log entries"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
+msgstr[0] "{} правка или запись в журнале"
+msgstr[1] "{} правки и/или записи в журнале"
+msgstr[2] "{} правок и/или записей в журнале"
#: src/rc_formatters.py:1131
-#, fuzzy, python-brace-format
+#, python-brace-format
msgid "Activated the tag \"{tag}\""
msgstr "Активировал метку «{tag}»"
#: src/rc_formatters.py:1134
-#, fuzzy, python-brace-format
+#, python-brace-format
msgid "Deactivated the tag \"{tag}\""
msgstr "Деактивировал метку «{tag}»"
@@ -1369,7 +1371,7 @@ msgid "Locked a \"{wiki}\" wiki"
msgstr "Заблокировал вики \"{wiki}\""
#: src/rc_formatters.py:1147
-#, fuzzy, python-brace-format
+#, python-brace-format
msgid "Modified \"{namespace_name}\" namespace"
msgstr "Изменил пространство имён \"{namespace_name}\""
@@ -1388,9 +1390,9 @@ msgid "Modified \"{usergroup_name}\" usergroup"
msgstr "Изменил группу \"{usergroup_name}\""
#: src/rc_formatters.py:1160
-#, fuzzy, python-brace-format
+#, python-brace-format
msgid "Undeleted a \"{wiki}\" wiki"
-msgstr "Удалил вики \"{wiki}\""
+msgstr "Восстановил вики \"{wiki}\""
#: src/rc_formatters.py:1163
#, python-brace-format
diff --git a/locale/ru/LC_MESSAGES/rcgcdw.mo b/locale/ru/LC_MESSAGES/rcgcdw.mo
index f013f95..e6e112a 100644
Binary files a/locale/ru/LC_MESSAGES/rcgcdw.mo and b/locale/ru/LC_MESSAGES/rcgcdw.mo differ
diff --git a/locale/ru/LC_MESSAGES/rcgcdw.po b/locale/ru/LC_MESSAGES/rcgcdw.po
index 808e0da..ea2bc5a 100644
--- a/locale/ru/LC_MESSAGES/rcgcdw.po
+++ b/locale/ru/LC_MESSAGES/rcgcdw.po
@@ -7,212 +7,204 @@ msgid ""
msgstr ""
"Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2020-12-23 00:28+0100\n"
-"PO-Revision-Date: 2020-09-03 13:14+0200\n"
-"Last-Translator: BabylonAS\n"
-"Language-Team: \n"
-"Language: ru_RU\n"
+"POT-Creation-Date: 2021-07-11 14:32+0200\n"
+"PO-Revision-Date: 2021-05-22 12:08+0000\n"
+"Last-Translator: Philo04 \n"
+"Language-Team: Russian \n"
+"Language: ru\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n"
-"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
-"X-Generator: Poedit 2.4.1\n"
+"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n"
+"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
+"X-Generator: Weblate 4.6\n"
-#: src/rcgcdw.py:115 src/rcgcdw.py:117 src/rcgcdw.py:119 src/rcgcdw.py:121
-#: src/rcgcdw.py:123 src/rcgcdw.py:125 src/rcgcdw.py:127
+#: src/rcgcdw.py:117
#, python-brace-format
msgid "{value} (avg. {avg})"
msgstr "{value} (ср. {avg})"
-#: src/rcgcdw.py:147
+#: src/rcgcdw.py:136
msgid "Daily overview"
msgstr "Ежедневный обзор"
-#: src/rcgcdw.py:154
+#: src/rcgcdw.py:143
msgid "No activity"
msgstr "Нет активности"
-#: src/rcgcdw.py:178
+#: src/rcgcdw.py:167
msgid " ({} action)"
msgid_plural " ({} actions)"
msgstr[0] " ({} действие)"
msgstr[1] " ({} действия)"
msgstr[2] " ({} действий)"
-#: src/rcgcdw.py:180
+#: src/rcgcdw.py:169
msgid " ({} edit)"
msgid_plural " ({} edits)"
msgstr[0] " ({} правка)"
msgstr[1] " ({} правки)"
msgstr[2] " ({} правок)"
-#: src/rcgcdw.py:185
+#: src/rcgcdw.py:174
msgid " UTC ({} action)"
msgid_plural " UTC ({} actions)"
msgstr[0] " UTC ({} действие)"
msgstr[1] " UTC ({} действия)"
msgstr[2] " UTC ({} действий)"
-#: src/rcgcdw.py:187 src/rcgcdw.py:188 src/rcgcdw.py:192
+#: src/rcgcdw.py:176 src/rcgcdw.py:179
msgid "But nobody came"
msgstr "Но никто не пришёл"
-#: src/rcgcdw.py:195
+#: src/rcgcdw.py:183
msgid "Most active user"
msgid_plural "Most active users"
msgstr[0] "Самый активный участник"
msgstr[1] "Самые активные участники"
msgstr[2] "Самые активные участники"
-#: src/rcgcdw.py:196
+#: src/rcgcdw.py:184
msgid "Most edited article"
msgid_plural "Most edited articles"
msgstr[0] "Самая редактируемая статья"
msgstr[1] "Самые редактируемые статьи"
msgstr[2] "Самые редактируемые статьи"
-#: src/rcgcdw.py:197
+#: src/rcgcdw.py:185
msgid "Edits made"
msgstr "Сделано правок"
-#: src/rcgcdw.py:197
+#: src/rcgcdw.py:185
msgid "New files"
msgstr "Новых файлов"
-#: src/rcgcdw.py:197
+#: src/rcgcdw.py:186
msgid "Admin actions"
msgstr "Административных действий"
-#: src/rcgcdw.py:198
+#: src/rcgcdw.py:186
msgid "Bytes changed"
msgstr "Изменено байтов"
-#: src/rcgcdw.py:198
+#: src/rcgcdw.py:187
msgid "New articles"
msgstr "Новых статей"
-#: src/rcgcdw.py:199
+#: src/rcgcdw.py:187
msgid "Unique contributors"
msgstr "Уникальных редакторов"
-#: src/rcgcdw.py:200
+#: src/rcgcdw.py:188
msgid "Most active hour"
msgid_plural "Most active hours"
msgstr[0] "Самый активный час"
msgstr[1] "Самые активные часы"
msgstr[2] "Самые активные часы"
-#: src/rcgcdw.py:201
+#: src/rcgcdw.py:189
msgid "Day score"
msgstr "Очков за день"
-#: src/rcgcdw.py:243
-msgid "director"
-msgstr "директор"
+#: src/rcgcdw.py:223
+msgid "~~hidden~~"
+msgstr "~~скрыто~~"
-#: src/rcgcdw.py:243
-msgid "bot"
-msgstr "бот"
+#: src/rcgcdw.py:225
+msgid "No description provided"
+msgstr "Описание не предоставлено"
-#: src/rcgcdw.py:243
-msgid "editor"
-msgstr "досматривающий"
+#: src/rcgcdw.py:228
+msgid "hidden"
+msgstr "скрыто"
-#: src/rcgcdw.py:243
-msgid "directors"
-msgstr "директора"
+#~ msgid "director"
+#~ msgstr "директор"
-#: src/rcgcdw.py:243
-msgid "sysop"
-msgstr "администратор"
+#~ msgid "bot"
+#~ msgstr "бот"
-#: src/rcgcdw.py:243
-msgid "bureaucrat"
-msgstr "бюрократ"
+#~ msgid "editor"
+#~ msgstr "досматривающий"
-#: src/rcgcdw.py:243
-msgid "reviewer"
-msgstr "выверяющий"
+#~ msgid "directors"
+#~ msgstr "директора"
-#: src/rcgcdw.py:244
-msgid "autoreview"
-msgstr "автодосматриваемый"
+#~ msgid "sysop"
+#~ msgstr "администратор"
-#: src/rcgcdw.py:244
-msgid "autopatrol"
-msgstr "автопатрулируемый"
+#~ msgid "bureaucrat"
+#~ msgstr "бюрократ"
-#: src/rcgcdw.py:244
-msgid "wiki_guardian"
-msgstr "смотритель вики"
+#~ msgid "reviewer"
+#~ msgstr "выверяющий"
-#: src/rcgcdw.py:244
-msgid "second"
-msgid_plural "seconds"
-msgstr[0] "секунда"
-msgstr[1] "секунды"
-msgstr[2] "секунд"
+#~ msgid "autoreview"
+#~ msgstr "автодосматриваемый"
-#: src/rcgcdw.py:244
-msgid "minute"
-msgid_plural "minutes"
-msgstr[0] "минута"
-msgstr[1] "минуты"
-msgstr[2] "минут"
+#~ msgid "autopatrol"
+#~ msgstr "автопатрулируемый"
-#: src/rcgcdw.py:244
-msgid "hour"
-msgid_plural "hours"
-msgstr[0] "час"
-msgstr[1] "часа"
-msgstr[2] "часов"
+#~ msgid "wiki_guardian"
+#~ msgstr "смотритель вики"
-#: src/rcgcdw.py:244
-msgid "day"
-msgid_plural "days"
-msgstr[0] "день"
-msgstr[1] "дня"
-msgstr[2] "дней"
+#~ msgid "second"
+#~ msgid_plural "seconds"
+#~ msgstr[0] "секунда"
+#~ msgstr[1] "секунды"
+#~ msgstr[2] "секунд"
-#: src/rcgcdw.py:244
-msgid "week"
-msgid_plural "weeks"
-msgstr[0] "неделя"
-msgstr[1] "недели"
-msgstr[2] "недель"
+#~ msgid "minute"
+#~ msgid_plural "minutes"
+#~ msgstr[0] "минута"
+#~ msgstr[1] "минуты"
+#~ msgstr[2] "минут"
-#: src/rcgcdw.py:244
-msgid "month"
-msgid_plural "months"
-msgstr[0] "месяц"
-msgstr[1] "месяца"
-msgstr[2] "месяцев"
+#~ msgid "hour"
+#~ msgid_plural "hours"
+#~ msgstr[0] "час"
+#~ msgstr[1] "часа"
+#~ msgstr[2] "часов"
-#: src/rcgcdw.py:244
-msgid "year"
-msgid_plural "years"
-msgstr[0] "год"
-msgstr[1] "года"
-msgstr[2] "лет"
+#~ msgid "day"
+#~ msgid_plural "days"
+#~ msgstr[0] "день"
+#~ msgstr[1] "дня"
+#~ msgstr[2] "дней"
-#: src/rcgcdw.py:244
-msgid "millennium"
-msgid_plural "millennia"
-msgstr[0] "тысячелетие"
-msgstr[1] "тысячелетия"
-msgstr[2] "тысячелетий"
+#~ msgid "week"
+#~ msgid_plural "weeks"
+#~ msgstr[0] "неделя"
+#~ msgstr[1] "недели"
+#~ msgstr[2] "недель"
-#: src/rcgcdw.py:244
-msgid "decade"
-msgid_plural "decades"
-msgstr[0] "десятилетие"
-msgstr[1] "десятилетия"
-msgstr[2] "десятилетий"
+#~ msgid "month"
+#~ msgid_plural "months"
+#~ msgstr[0] "месяц"
+#~ msgstr[1] "месяца"
+#~ msgstr[2] "месяцев"
-#: src/rcgcdw.py:244
-msgid "century"
-msgid_plural "centuries"
-msgstr[0] "век"
-msgstr[1] "века"
-msgstr[2] "веков"
+#~ msgid "year"
+#~ msgid_plural "years"
+#~ msgstr[0] "год"
+#~ msgstr[1] "года"
+#~ msgstr[2] "лет"
+
+#~ msgid "millennium"
+#~ msgid_plural "millennia"
+#~ msgstr[0] "тысячелетие"
+#~ msgstr[1] "тысячелетия"
+#~ msgstr[2] "тысячелетий"
+
+#~ msgid "decade"
+#~ msgid_plural "decades"
+#~ msgstr[0] "десятилетие"
+#~ msgstr[1] "десятилетия"
+#~ msgstr[2] "десятилетий"
+
+#~ msgid "century"
+#~ msgid_plural "centuries"
+#~ msgstr[0] "век"
+#~ msgstr[1] "века"
+#~ msgstr[2] "веков"
diff --git a/locale/ru/LC_MESSAGES/redaction.mo b/locale/ru/LC_MESSAGES/redaction.mo
index b31ff26..058c06e 100644
Binary files a/locale/ru/LC_MESSAGES/redaction.mo and b/locale/ru/LC_MESSAGES/redaction.mo differ
diff --git a/locale/ru/LC_MESSAGES/redaction.po b/locale/ru/LC_MESSAGES/redaction.po
index c6ded93..298725a 100644
--- a/locale/ru/LC_MESSAGES/redaction.po
+++ b/locale/ru/LC_MESSAGES/redaction.po
@@ -7,9 +7,9 @@ msgid ""
msgstr ""
"Project-Id-Version: RcGcDw\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2020-12-23 00:28+0100\n"
-"PO-Revision-Date: 2020-12-22 00:13+0000\n"
-"Last-Translator: Philo04 \n"
+"POT-Creation-Date: 2021-07-11 14:32+0200\n"
+"PO-Revision-Date: 2021-07-30 10:44+0000\n"
+"Last-Translator: MakandIv \n"
"Language-Team: Russian \n"
"Language: ru\n"
@@ -18,9 +18,15 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n"
"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
-"X-Generator: Weblate 4.2.1\n"
+"X-Generator: Weblate 4.6.2\n"
-#: src/discord/redaction.py:62 src/discord/redaction.py:65
-#: src/discord/redaction.py:70
-msgid "Removed"
-msgstr "Удалено"
+#: src/discord/redaction.py:77
+msgid "hidden"
+msgstr "скрыто"
+
+#: src/discord/redaction.py:80 src/discord/redaction.py:85
+msgid "~~hidden~~"
+msgstr "~~скрыто~~"
+
+#~ msgid "Removed"
+#~ msgstr "Удалено"
diff --git a/locale/sv/LC_MESSAGES/formatters.mo b/locale/sv/LC_MESSAGES/formatters.mo
new file mode 100644
index 0000000..635b6a8
Binary files /dev/null and b/locale/sv/LC_MESSAGES/formatters.mo differ
diff --git a/locale/sv/LC_MESSAGES/formatters.po b/locale/sv/LC_MESSAGES/formatters.po
new file mode 100644
index 0000000..a7e6b55
--- /dev/null
+++ b/locale/sv/LC_MESSAGES/formatters.po
@@ -0,0 +1,1635 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the RcGcDw package.
+# FIRST AUTHOR , YEAR.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: RcGcDw\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2021-05-22 18:48+0200\n"
+"PO-Revision-Date: 2021-05-31 21:54+0000\n"
+"Last-Translator: Spisen \n"
+"Language-Team: Swedish \n"
+"Language: sv\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+"X-Generator: Weblate 4.6.2\n"
+
+#: src/api/util.py:61 src/api/util.py:66
+msgid "__Only whitespace__"
+msgstr "__Endast blanksteg__"
+
+#: src/api/util.py:71
+msgid "Removed"
+msgstr "Tog bort"
+
+#: src/api/util.py:73
+msgid "Added"
+msgstr "Lagt till"
+
+#: src/api/util.py:94 src/api/util.py:126 src/api/util.py:133
+#: src/api/util.py:141 extensions/base/discussions.py:247
+#: extensions/base/discussions.py:264 extensions/base/abusefilter.py:45
+msgid "Unregistered user"
+msgstr "Oregistrerad användare"
+
+#: src/api/util.py:160
+msgctxt "recent changes Tags"
+msgid "Tags"
+msgstr "Taggar"
+
+#: src/api/util.py:162
+msgid "**Added**: "
+msgstr "**Lagt till**: "
+
+#: src/api/util.py:163
+msgid " and {} more\n"
+msgstr " och {} mer\n"
+
+#: src/api/util.py:165
+msgid "**Removed**: "
+msgstr "**Tog bort**: "
+
+#: src/api/util.py:166
+msgid " and {} more"
+msgstr " och {} mer"
+
+#: src/api/util.py:168
+msgid "Changed categories"
+msgstr "Ändrade kategorier"
+
+#: extensions/base/cargo.py:37
+#, python-brace-format
+msgid "Created the Cargo table \"{table}\""
+msgstr ""
+
+#: extensions/base/cargo.py:45
+#, python-brace-format
+msgid "[{author}]({author_url}) created the Cargo table \"{table}\""
+msgstr ""
+
+#: extensions/base/cargo.py:60
+#, python-brace-format
+msgid "Recreated the Cargo table \"{table}\""
+msgstr ""
+
+#: extensions/base/cargo.py:68
+#, python-brace-format
+msgid "[{author}]({author_url}) recreated the Cargo table \"{table}\""
+msgstr ""
+
+#: extensions/base/cargo.py:83
+#, python-brace-format
+msgid "Replaced the Cargo table \"{table}\""
+msgstr ""
+
+#: extensions/base/cargo.py:91
+#, python-brace-format
+msgid "[{author}]({author_url}) replaced the Cargo table \"{table}\""
+msgstr ""
+
+#: extensions/base/cargo.py:105
+#, python-brace-format
+msgid "Deleted the Cargo table \"{table}\""
+msgstr ""
+
+#: extensions/base/cargo.py:112
+#, python-brace-format
+msgid "[{author}]({author_url}) deleted the Cargo table \"{table}\""
+msgstr ""
+
+#: extensions/base/translate.py:41
+#, python-brace-format
+msgid "Marked \"{article}\" for translation"
+msgstr "Markerade \"{article}\" för översättning"
+
+#: extensions/base/translate.py:55
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) marked [{article}]({article_url}) for "
+"translation{comment}"
+msgstr ""
+"[{author}]({author_url}) markerade [{article}]({article_url}) för "
+"översättning{comment}"
+
+#: extensions/base/translate.py:70
+#, python-brace-format
+msgid "Removed \"{article}\" from the translation system"
+msgstr "Tog bort \"{article}\" från översättningssystemet"
+
+#: extensions/base/translate.py:80
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) removed [{article}]({article_url}) from the "
+"translation system{comment}"
+msgstr ""
+"[{author}]({author_url}) tog bort [{article}]({article_url}) från "
+"översättningssystemet{comment}"
+
+#: extensions/base/translate.py:95
+#, python-brace-format
+msgid "Completed moving translation pages from \"{article}\" to \"{target}\""
+msgstr ""
+"Slutförde flytten av översättningssidor från \"{article}\" till \"{target}\""
+
+#: extensions/base/translate.py:106
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) completed moving translation pages from *{article}* "
+"to [{target}]({target_url}){comment}"
+msgstr ""
+"[{author}]({author_url}) slutförde flytten av översättningssidor från "
+"*{article}* till [{target}]({target_url}){comment}"
+
+#: extensions/base/translate.py:121
+#, python-brace-format
+msgid "Encountered a problem while moving \"{article}\" to \"{target}\""
+msgstr "Ett problem uppstod vid flytten av \"{article}\" till \"{target}\""
+
+#: extensions/base/translate.py:133
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) encountered a problem while moving [{article}]"
+"({article_url}) to [{target}]({target_url}){comment}"
+msgstr ""
+"[{author}]({author_url}) påträffade ett problem vid flytten av "
+"[{article}]({article_url}) till [{target}]({target_url}){comment}"
+
+#: extensions/base/translate.py:149
+#, python-brace-format
+msgid ""
+"Failed to delete \"{article}\" which belongs to translatable page "
+"\"{target}\""
+msgstr ""
+"Det gick inte att ta bort\"{article}\" som tillhör den översättbara sidan \""
+"{target}\""
+
+#: extensions/base/translate.py:161
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) failed to delete [{article}]({article_url}) which "
+"belongs to translatable page [{target}]({target_url}){comment}"
+msgstr ""
+"[{author}]({author_url}) kunde inte ta bort [{article}]({article_url}) som "
+"tillhör den översättbara sidan [{target}]({target_url}){comment}"
+
+#: extensions/base/translate.py:177
+#, python-brace-format
+msgid "Completed deletion of translation page \"{article}\""
+msgstr "Raderingen av översättningssidan \"{article}\" har slutförts"
+
+#: extensions/base/translate.py:188
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) completed deletion of translation page [{article}]"
+"({article_url}){comment}"
+msgstr ""
+"[{author}]({author_url}) lyckades med raderingen av översättningssidan "
+"[{article}]({article_url}){comment}"
+
+#: extensions/base/translate.py:203
+#, python-brace-format
+msgid ""
+"Failed to delete \"{article}\" which belongs to translation page \"{target}\""
+msgstr ""
+"Det gick inte att ta bort\"{article}\" som tillhör översättningssidan \""
+"{target}\""
+
+#: extensions/base/translate.py:215
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) failed to delete [{article}]({article_url}) which "
+"belongs to translation page [{target}]({target_url}){comment}"
+msgstr ""
+"[{author}]({author_url}) kunde inte ta bort [{article}]({article_url}) som "
+"tillhör översättningssidan [{target}]({target_url}){comment}"
+
+#: extensions/base/translate.py:231
+#, python-brace-format
+msgid "Encouraged translation of \"{article}\""
+msgstr "Uppmuntrade till översättning av \"{article}\""
+
+#: extensions/base/translate.py:240
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) encouraged translation of [{article}]({article_url})"
+"{comment}"
+msgstr ""
+"[{author}]({author_url}) uppmuntrade till översättning av "
+"[{article}]({article_url}){comment}"
+
+#: extensions/base/translate.py:255
+#, python-brace-format
+msgid "Discouraged translation of \"{article}\""
+msgstr "Uppmuntrade inte till översättning av \"{article}\""
+
+#: extensions/base/translate.py:264
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) discouraged translation of [{article}]"
+"({article_url}){comment}"
+msgstr ""
+"[{author}]({author_url}) uppmuntrade inte till översättning av "
+"[{article}]({article_url}){comment}"
+
+#: extensions/base/translate.py:282
+#, python-brace-format
+msgid "Limited languages for \"{article}\" to `{languages}`"
+msgstr "Begränsade språk för \"{article}\" till `{languages}`"
+
+#: extensions/base/translate.py:285
+#, python-brace-format
+msgid "Priority languages for \"{article}\" set to `{languages}`"
+msgstr "Prioriterade språk för \"{article}\" till`{languages}`"
+
+#: extensions/base/translate.py:288
+#, python-brace-format
+msgid "Removed priority languages from \"{article}\""
+msgstr "Tog bort prioriterade språk från \"{article}\""
+
+#: extensions/base/translate.py:301
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) limited languages for [{article}]({article_url}) to "
+"`{languages}`{comment}"
+msgstr ""
+"[{author}]({author_url}) begränsade språk för [{article}]({article_url}) "
+"till `{languages}`{comment}"
+
+#: extensions/base/translate.py:308
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) set the priority languages for [{article}]"
+"({article_url}) to `{languages}`{comment}"
+msgstr ""
+"[{author}]({author_url}) prioriterade språk för [{article}]({article_url}) "
+"till `{languages}`{comment}"
+
+#: extensions/base/translate.py:315
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) removed priority languages from [{article}]"
+"({article_url}){comment}"
+msgstr ""
+"[{author}]({author_url}) tog bort prioriterade språk från "
+"[{article}]({article_url}){comment}"
+
+#: extensions/base/translate.py:331
+#, python-brace-format
+msgid "Added translatable page \"{article}\" to aggregate group \"{group}\""
+msgstr ""
+
+#: extensions/base/translate.py:342
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) added translatable page [{article}]({article_url}) "
+"to aggregate group \"{group}\"{comment}"
+msgstr ""
+
+#: extensions/base/translate.py:357
+#, python-brace-format
+msgid ""
+"Removed translatable page \"{article}\" from aggregate group \"{group}\""
+msgstr ""
+
+#: extensions/base/translate.py:368
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) removed translatable page [{article}]"
+"({article_url}) from aggregate group \"{group}\"{comment}"
+msgstr ""
+
+#: extensions/base/translate.py:387
+#, python-brace-format
+msgid "Reviewed translation \"{article}\""
+msgstr ""
+
+#: extensions/base/translate.py:401
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) reviewed translation [{article}]({article_url})"
+"{comment}"
+msgstr ""
+
+#: extensions/base/translate.py:416
+#, python-brace-format
+msgid "Changed the state of `{language}` translations of \"{article}\""
+msgstr ""
+
+#: extensions/base/translate.py:419
+msgid "Old state"
+msgstr ""
+
+#: extensions/base/translate.py:420
+msgid "New state"
+msgstr ""
+
+#: extensions/base/translate.py:431
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) changed the state of `{language}` translations of "
+"[{article}]({article_url}) from `{old_state}` to `{new_state}`{comment}"
+msgstr ""
+
+#: extensions/base/translate.py:439
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) changed the state of `{language}` translations of "
+"[{article}]({article_url}) to `{new_state}`{comment}"
+msgstr ""
+
+#: extensions/base/translate.py:452 extensions/base/translate.py:455
+msgid "(default)"
+msgstr ""
+
+#: extensions/base/translate.py:464
+#, python-brace-format
+msgid "Changed the language of \"{article}\""
+msgstr ""
+
+#: extensions/base/translate.py:465
+msgid "Old language"
+msgstr ""
+
+#: extensions/base/translate.py:466
+msgid "New language"
+msgstr ""
+
+#: extensions/base/translate.py:477
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) changed the language of [{article}]({article_url}) "
+"from {old_lang} to {new_lang}{comment}"
+msgstr ""
+
+#: extensions/base/discussions.py:148 extensions/base/discussions.py:207
+#: extensions/base/discussions.py:245 extensions/base/discussions.py:261
+#: extensions/base/discussions.py:284 extensions/base/discussions.py:306
+#: extensions/base/discussions.py:334 extensions/base/discussions.py:354
+msgid "unknown"
+msgstr ""
+
+#: extensions/base/discussions.py:157
+#, python-brace-format
+msgid "Created \"{title}\""
+msgstr ""
+
+#: extensions/base/discussions.py:161
+#, python-brace-format
+msgid "Created a poll \"{title}\""
+msgstr ""
+
+#: extensions/base/discussions.py:168
+msgid "Option {}"
+msgstr ""
+
+#: extensions/base/discussions.py:170
+#, python-brace-format
+msgid "__[View image]({image_url})__"
+msgstr ""
+
+#: extensions/base/discussions.py:174
+#, python-brace-format
+msgid "Created a quiz \"{title}\""
+msgstr ""
+
+#: extensions/base/discussions.py:193 extensions/base/discussions.py:195
+msgctxt "Fandom discussions Tags/Forums"
+msgid "Tags"
+msgstr ""
+
+#: extensions/base/discussions.py:193
+msgctxt "Fandom discussions amount of Tags/Forums"
+msgid "{} tags"
+msgstr ""
+
+#: extensions/base/discussions.py:198
+#, python-brace-format
+msgid "Replied to \"{title}\""
+msgstr ""
+
+#: extensions/base/discussions.py:214
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) created [{title}](<{url}f/p/{threadId}>) in "
+"{forumName}"
+msgstr ""
+
+#: extensions/base/discussions.py:217
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) created a poll [{title}](<{url}f/p/{threadId}>) in "
+"{forumName}"
+msgstr ""
+
+#: extensions/base/discussions.py:220
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) created a quiz [{title}](<{url}f/p/{threadId}>) in "
+"{forumName}"
+msgstr ""
+
+#: extensions/base/discussions.py:234
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) created a [reply](<{url}f/p/{threadId}/r/{postId}>) "
+"to [{title}](<{url}f/p/{threadId}>) in {forumName}"
+msgstr ""
+
+#: extensions/base/discussions.py:292
+#, python-brace-format
+msgid "Created \"{title}\" on {user}'s Message Wall"
+msgstr ""
+
+#: extensions/base/discussions.py:298
+#, python-brace-format
+msgid "Replied to \"{title}\" on {user}'s Message Wall"
+msgstr ""
+
+#: extensions/base/discussions.py:312
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) created [{title}](<{url}wiki/Message_Wall:"
+"{user_wall}?threadId={threadId}>) on [{user}'s Message Wall](<{url}wiki/"
+"Message_Wall:{user_wall}>)"
+msgstr ""
+
+#: extensions/base/discussions.py:318
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) created a [reply](<{url}wiki/Message_Wall:"
+"{user_wall}?threadId={threadId}#{replyId}>) to [{title}](<{url}wiki/"
+"Message_Wall:{user_wall}?threadId={threadId}>) on [{user}'s Message Wall]"
+"(<{url}wiki/Message_Wall:{user_wall}>)"
+msgstr ""
+
+#: extensions/base/discussions.py:338
+#, python-brace-format
+msgid "Commented on {article}"
+msgstr ""
+
+#: extensions/base/discussions.py:344
+#, python-brace-format
+msgid "Replied to a comment on {article}"
+msgstr ""
+
+#: extensions/base/discussions.py:359
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) created a [comment](<{url}?commentId={commentId}>) "
+"on [{article}](<{url}>)"
+msgstr ""
+
+#: extensions/base/discussions.py:365
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) created a [reply](<{url}?commentId={commentId}"
+"&replyId={replyId}>) to a [comment](<{url}?commentId={commentId}>) on "
+"[{article}](<{url}>)"
+msgstr ""
+
+#: extensions/base/managewiki.py:34
+msgid "Changed wiki settings"
+msgstr ""
+
+#: extensions/base/managewiki.py:44
+#, python-brace-format
+msgid "[{author}]({author_url}) changed wiki settings{reason}"
+msgstr ""
+
+#: extensions/base/managewiki.py:55
+#, python-brace-format
+msgid "Deleted a \"{wiki}\" wiki"
+msgstr ""
+
+#: extensions/base/managewiki.py:55 extensions/base/managewiki.py:67
+#: extensions/base/managewiki.py:103 extensions/base/managewiki.py:112
+#: extensions/base/managewiki.py:125 extensions/base/managewiki.py:126
+#: extensions/base/managewiki.py:135 extensions/base/managewiki.py:136
+#: extensions/base/managewiki.py:148 extensions/base/managewiki.py:149
+#: extensions/base/managewiki.py:160 extensions/base/managewiki.py:161
+#: extensions/base/managewiki.py:195 extensions/base/managewiki.py:204
+#: extensions/base/managewiki.py:217 extensions/base/managewiki.py:226
+#: extensions/base/abusefilter.py:55 extensions/base/abusefilter.py:56
+#: extensions/base/abusefilter.py:57 extensions/base/abusefilter.py:68
+#: extensions/base/abusefilter.py:69 extensions/base/abusefilter.py:70
+#: extensions/base/mediawiki.py:744
+msgid "Unknown"
+msgstr ""
+
+#: extensions/base/managewiki.py:63
+#, python-brace-format
+msgid "[{author}]({author_url}) deleted a wiki *{wiki_name}*{comment}"
+msgstr ""
+
+#: extensions/base/managewiki.py:80
+#, python-brace-format
+msgid "Deleted a \"{group}\" user group"
+msgstr ""
+
+#: extensions/base/managewiki.py:89
+#, python-brace-format
+msgid "[{author}]({author_url}) deleted a usergroup *{group}*{comment}"
+msgstr ""
+
+#: extensions/base/managewiki.py:103
+#, python-brace-format
+msgid "Locked a \"{wiki}\" wiki"
+msgstr ""
+
+#: extensions/base/managewiki.py:111
+#, python-brace-format
+msgid "[{author}]({author_url}) locked a wiki *{wiki_name}*{comment}"
+msgstr ""
+
+#: extensions/base/managewiki.py:124
+#, python-brace-format
+msgid "Modified \"{namespace_name}\" namespace"
+msgstr ""
+
+#: extensions/base/managewiki.py:126 extensions/base/managewiki.py:149
+msgid "Wiki"
+msgstr ""
+
+#: extensions/base/managewiki.py:134
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) modified namespace *{namespace_name}* on "
+"*{wiki_name}*{comment}"
+msgstr ""
+
+#: extensions/base/managewiki.py:147
+#, python-brace-format
+msgid "Deleted a \"{namespace_name}\" namespace"
+msgstr ""
+
+#: extensions/base/managewiki.py:158
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) deleted a namespace *{namespace_name}* on "
+"*{wiki_name}*{comment}"
+msgstr ""
+
+#: extensions/base/managewiki.py:173
+#, python-brace-format
+msgid "Modified \"{usergroup_name}\" usergroup"
+msgstr ""
+
+#: extensions/base/managewiki.py:182
+#, python-brace-format
+msgid "[{author}]({author_url}) modified user group *{group_name}*{comment}"
+msgstr ""
+
+#: extensions/base/managewiki.py:195
+#, python-brace-format
+msgid "Undeleted a \"{wiki}\" wiki"
+msgstr ""
+
+#: extensions/base/managewiki.py:203
+#, python-brace-format
+msgid "[{author}]({author_url}) undeleted a wiki *{wiki_name}*{comment}"
+msgstr ""
+
+#: extensions/base/managewiki.py:217
+#, python-brace-format
+msgid "Unlocked a \"{wiki}\" wiki"
+msgstr ""
+
+#: extensions/base/managewiki.py:225
+#, python-brace-format
+msgid "[{author}]({author_url}) unlocked a wiki *{wiki_name}*{comment}"
+msgstr ""
+
+#: extensions/base/datadump.py:36
+#, python-brace-format
+msgid "Generated {file} dump"
+msgstr ""
+
+#: extensions/base/datadump.py:45
+#, python-brace-format
+msgid "[{author}]({author_url}) generated *{file}* dump{comment}"
+msgstr ""
+
+#: extensions/base/datadump.py:58
+#, python-brace-format
+msgid "Deleted {file} dump"
+msgstr ""
+
+#: extensions/base/datadump.py:67
+#, python-brace-format
+msgid "[{author}]({author_url}) deleted *{file}* dump{comment}"
+msgstr ""
+
+#: extensions/base/curseprofile.py:40
+#, python-brace-format
+msgid "Edited {target}'s profile"
+msgstr ""
+
+#: extensions/base/curseprofile.py:42
+msgid "Edited their own profile"
+msgstr ""
+
+#: extensions/base/curseprofile.py:44
+#, python-brace-format
+msgid "Cleared the {field} field"
+msgstr ""
+
+#: extensions/base/curseprofile.py:46
+#, python-brace-format
+msgid "{field} field changed to: {desc}"
+msgstr ""
+
+#: extensions/base/curseprofile.py:58
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) cleared the {field} on [{target}]({target_url})'s "
+"profile."
+msgstr ""
+
+#: extensions/base/curseprofile.py:60
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) edited the {field} on [{target}]({target_url})'s "
+"profile. *({desc})*"
+msgstr ""
+
+#: extensions/base/curseprofile.py:65
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) cleared the {field} on [their own]({target_url}) "
+"profile."
+msgstr ""
+
+#: extensions/base/curseprofile.py:67
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) edited the {field} on [their own]({target_url}) "
+"profile. *({desc})*"
+msgstr ""
+
+#: extensions/base/curseprofile.py:82
+#, python-brace-format
+msgid "Left a comment on {target}'s profile"
+msgstr ""
+
+#: extensions/base/curseprofile.py:84
+msgid "Left a comment on their own profile"
+msgstr ""
+
+#: extensions/base/curseprofile.py:97
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) left a [comment]({comment}) on {target}'s profile."
+msgstr ""
+
+#: extensions/base/curseprofile.py:100
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) left a [comment]({comment}) on their own profile."
+msgstr ""
+
+#: extensions/base/curseprofile.py:113
+#, python-brace-format
+msgid "Edited a comment on {target}'s profile"
+msgstr ""
+
+#: extensions/base/curseprofile.py:115
+msgid "Edited a comment on their own profile"
+msgstr ""
+
+#: extensions/base/curseprofile.py:128
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) edited a [comment]({comment}) on {target}'s profile."
+msgstr ""
+
+#: extensions/base/curseprofile.py:131
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) edited a [comment]({comment}) on their own profile."
+msgstr ""
+
+#: extensions/base/curseprofile.py:144
+#, python-brace-format
+msgid "Replied to a comment on {target}'s profile"
+msgstr ""
+
+#: extensions/base/curseprofile.py:146
+msgid "Replied to a comment on their own profile"
+msgstr ""
+
+#: extensions/base/curseprofile.py:159
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) replied to a [comment]({comment}) on {target}'s "
+"profile."
+msgstr ""
+
+#: extensions/base/curseprofile.py:162
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) replied to a [comment]({comment}) on their own "
+"profile."
+msgstr ""
+
+#: extensions/base/curseprofile.py:175
+#, python-brace-format
+msgid "Deleted a comment on {target}'s profile"
+msgstr ""
+
+#: extensions/base/curseprofile.py:177
+msgid "Deleted a comment on their own profile"
+msgstr ""
+
+#: extensions/base/curseprofile.py:197
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) deleted a [comment]({comment}) on {target}'s "
+"profile.{reason}"
+msgstr ""
+
+#: extensions/base/curseprofile.py:200
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) deleted a [comment]({comment}) on their own profile."
+"{reason}"
+msgstr ""
+
+#: extensions/base/curseprofile.py:214
+#, python-brace-format
+msgid "Purged a comment on {target}'s profile"
+msgstr ""
+
+#: extensions/base/curseprofile.py:216
+msgid "Purged a comment on their own profile"
+msgstr ""
+
+#: extensions/base/curseprofile.py:230
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) purged a comment on [{target}]({link})'s profile."
+"{reason}"
+msgstr ""
+
+#: extensions/base/curseprofile.py:233
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) purged a comment on [their own]({link}) profile."
+"{reason}"
+msgstr ""
+
+#: extensions/base/renameuser.py:38
+#, python-brace-format
+msgid "Renamed user \"{old_name}\" with {edits} edit to \"{new_name}\""
+msgid_plural "Renamed user \"{old_name}\" with {edits} edits to \"{new_name}\""
+msgstr[0] ""
+msgstr[1] ""
+
+#: extensions/base/renameuser.py:43
+#, python-brace-format
+msgid "Renamed user \"{old_name}\" to \"{new_name}\""
+msgstr ""
+
+#: extensions/base/renameuser.py:58
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) renamed user *{old_name}* with {edits} edit to "
+"[{new_name}]({link}){comment}"
+msgid_plural ""
+"[{author}]({author_url}) renamed user *{old_name}* with {edits} edits to "
+"[{new_name}]({link}){comment}"
+msgstr[0] ""
+msgstr[1] ""
+
+#: extensions/base/renameuser.py:66
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) renamed user *{old_name}* to [{new_name}]({link})"
+"{comment}"
+msgstr ""
+
+#: extensions/base/interwiki.py:37
+msgid "Added an entry to the interwiki table"
+msgstr ""
+
+#: extensions/base/interwiki.py:38 extensions/base/interwiki.py:65
+#, python-brace-format
+msgid "Prefix: {prefix}, website: {website} | {desc}"
+msgstr ""
+
+#: extensions/base/interwiki.py:50
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) added an entry to the [interwiki table]"
+"({table_url}) pointing to {website} with {prefix} prefix"
+msgstr ""
+
+#: extensions/base/interwiki.py:64
+msgid "Edited an entry in interwiki table"
+msgstr ""
+
+#: extensions/base/interwiki.py:77
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) edited an entry in [interwiki table]({table_url}) "
+"pointing to {website} with {prefix} prefix"
+msgstr ""
+
+#: extensions/base/interwiki.py:91
+msgid "Deleted an entry in interwiki table"
+msgstr ""
+
+#: extensions/base/interwiki.py:92
+#, python-brace-format
+msgid "Prefix: {prefix} | {desc}"
+msgstr ""
+
+#: extensions/base/interwiki.py:102
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) deleted an entry in [interwiki table]({table_url})"
+"{desc}"
+msgstr ""
+
+#: extensions/base/abusefilter.py:29
+msgid "None"
+msgstr ""
+
+#: extensions/base/abusefilter.py:29
+msgid "Warning issued"
+msgstr ""
+
+#: extensions/base/abusefilter.py:29
+msgid "**Blocked user**"
+msgstr ""
+
+#: extensions/base/abusefilter.py:29
+msgid "Tagged the edit"
+msgstr ""
+
+#: extensions/base/abusefilter.py:29
+msgid "Disallowed the action"
+msgstr ""
+
+#: extensions/base/abusefilter.py:29
+msgid "**IP range blocked**"
+msgstr ""
+
+#: extensions/base/abusefilter.py:29
+msgid "Throttled actions"
+msgstr ""
+
+#: extensions/base/abusefilter.py:29
+msgid "Removed autoconfirmed group"
+msgstr ""
+
+#: extensions/base/abusefilter.py:29
+msgid "**Removed from privileged groups**"
+msgstr ""
+
+#: extensions/base/abusefilter.py:30
+msgid "Edit"
+msgstr ""
+
+#: extensions/base/abusefilter.py:30
+msgid "Upload"
+msgstr ""
+
+#: extensions/base/abusefilter.py:30
+msgid "Move"
+msgstr ""
+
+#: extensions/base/abusefilter.py:30
+msgid "Stash upload"
+msgstr ""
+
+#: extensions/base/abusefilter.py:30
+msgid "Deletion"
+msgstr ""
+
+#: extensions/base/abusefilter.py:30
+msgid "Account creation"
+msgstr ""
+
+#: extensions/base/abusefilter.py:30
+msgid "Auto account creation"
+msgstr ""
+
+#: extensions/base/abusefilter.py:54
+#, python-brace-format
+msgid "{user} triggered \"{abuse_filter}\""
+msgstr ""
+
+#: extensions/base/abusefilter.py:55
+msgid "Performed"
+msgstr ""
+
+#: extensions/base/abusefilter.py:56
+msgid "Action taken"
+msgstr ""
+
+#: extensions/base/abusefilter.py:57
+msgid "Title"
+msgstr ""
+
+#: extensions/base/abusefilter.py:66
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) triggered *{abuse_filter}*, performing the action "
+"\"{action}\" on *[{target}]({target_url})* - action taken: {result}."
+msgstr ""
+
+#: extensions/base/abusefilter.py:83
+#, python-brace-format
+msgid "Edited abuse filter number {number}"
+msgstr ""
+
+#: extensions/base/abusefilter.py:95
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) edited abuse filter [number {number}]({filter_url})"
+msgstr ""
+
+#: extensions/base/abusefilter.py:111
+#, python-brace-format
+msgid "Created abuse filter number {number}"
+msgstr ""
+
+#: extensions/base/abusefilter.py:119
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) created abuse filter [number {number}]({filter_url})"
+msgstr ""
+
+#: extensions/base/mediawiki.py:37
+msgid "director"
+msgstr ""
+
+#: extensions/base/mediawiki.py:37
+msgid "bot"
+msgstr ""
+
+#: extensions/base/mediawiki.py:37
+msgid "editor"
+msgstr ""
+
+#: extensions/base/mediawiki.py:37
+msgid "directors"
+msgstr ""
+
+#: extensions/base/mediawiki.py:37
+msgid "sysop"
+msgstr ""
+
+#: extensions/base/mediawiki.py:37
+msgid "bureaucrat"
+msgstr ""
+
+#: extensions/base/mediawiki.py:37
+msgid "reviewer"
+msgstr ""
+
+#: extensions/base/mediawiki.py:38
+msgid "autoreview"
+msgstr ""
+
+#: extensions/base/mediawiki.py:38
+msgid "autopatrol"
+msgstr ""
+
+#: extensions/base/mediawiki.py:38
+msgid "wiki_guardian"
+msgstr ""
+
+#: extensions/base/mediawiki.py:71
+msgid "(N!) "
+msgstr ""
+
+#: extensions/base/mediawiki.py:72
+msgid "m"
+msgstr ""
+
+#: extensions/base/mediawiki.py:73
+msgid "b"
+msgstr ""
+
+#: extensions/base/mediawiki.py:112
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) edited [{article}]({edit_link}){comment} {bold}"
+"({sign}{edit_size}){bold}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:117
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) created [{article}]({edit_link}){comment} {bold}"
+"({sign}{edit_size}){bold}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:190 extensions/base/mediawiki.py:223
+msgid "Options"
+msgstr ""
+
+#: extensions/base/mediawiki.py:190
+#, python-brace-format
+msgid "([preview]({link}) | [undo]({undolink}))"
+msgstr ""
+
+#: extensions/base/mediawiki.py:195
+#, python-brace-format
+msgid "Uploaded a new version of {name}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:197
+#, python-brace-format
+msgid "Reverted a version of {name}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:199
+#, python-brace-format
+msgid "Uploaded {name}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:208
+msgid "**No license!**"
+msgstr ""
+
+#: extensions/base/mediawiki.py:223
+#, python-brace-format
+msgid "([preview]({link}))"
+msgstr ""
+
+#: extensions/base/mediawiki.py:228
+msgid ""
+"\n"
+"License: {}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:237
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) reverted a version of [{file}]({file_link}){comment}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:248
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) uploaded a new version of [{file}]({file_link})"
+"{comment}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:259
+#, python-brace-format
+msgid "[{author}]({author_url}) uploaded [{file}]({file_link}){comment}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:274
+#, python-brace-format
+msgid "Deleted page {article}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:283
+#, python-brace-format
+msgid "[{author}]({author_url}) deleted [{page}]({page_link}){comment}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:298
+#, python-brace-format
+msgid "Deleted redirect {article} by overwriting"
+msgstr ""
+
+#: extensions/base/mediawiki.py:308
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) deleted redirect by overwriting [{page}]"
+"({page_link}){comment}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:322
+#, python-brace-format
+msgid "Restored {article}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:331
+#, python-brace-format
+msgid "[{author}]({author_url}) restored [{article}]({article_url}){comment}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:348
+msgid "Changed visibility of log events"
+msgstr ""
+
+#: extensions/base/mediawiki.py:356
+#, python-brace-format
+msgid "[{author}]({author_url}) changed visibility of log events{comment}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:370
+#, python-brace-format
+msgid "Changed visibility of revision on page {article} "
+msgid_plural "Changed visibility of {amount} revisions on page {article} "
+msgstr[0] ""
+msgstr[1] ""
+
+#: extensions/base/mediawiki.py:383
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) changed visibility of revision on page [{article}]"
+"({article_url}){comment}"
+msgid_plural ""
+"[{author}]({author_url}) changed visibility of {amount} revisions on page "
+"[{article}]({article_url}){comment}"
+msgstr[0] ""
+msgstr[1] ""
+
+#: extensions/base/mediawiki.py:399 extensions/base/mediawiki.py:432
+msgid "No redirect has been made"
+msgstr ""
+
+#: extensions/base/mediawiki.py:400 extensions/base/mediawiki.py:433
+msgid "A redirect has been made"
+msgstr ""
+
+#: extensions/base/mediawiki.py:401
+#, python-brace-format
+msgid "Moved {redirect}{article} to {target}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:412 extensions/base/mediawiki.py:444
+msgid "without making a redirect"
+msgstr ""
+
+#: extensions/base/mediawiki.py:413 extensions/base/mediawiki.py:445
+msgid "with a redirect"
+msgstr ""
+
+#: extensions/base/mediawiki.py:416
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) moved {redirect}*{article}* to [{target}]"
+"({target_url}) {made_a_redirect}{comment}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:434
+#, python-brace-format
+msgid "Moved {redirect}{article} to {title} over redirect"
+msgstr ""
+
+#: extensions/base/mediawiki.py:448
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) moved {redirect}*{article}* over redirect to "
+"[{target}]({target_url}) {made_a_redirect}{comment}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:464
+#, python-brace-format
+msgid "Moved protection settings from {redirect}{article} to {title}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:477
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) moved protection settings from {redirect}*{article}"
+"* to [{target}]({target_url}){comment}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:492
+#, python-brace-format
+msgid "Protected {target}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:495 extensions/base/mediawiki.py:510
+#: extensions/base/mediawiki.py:526 extensions/base/mediawiki.py:541
+msgid " [cascading]"
+msgstr ""
+
+#: extensions/base/mediawiki.py:506
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) protected [{article}]({article_url}) with the "
+"following settings: {settings}{comment}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:523
+#, python-brace-format
+msgid "Changed protection level for {article}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:537
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) modified protection settings of [{article}]"
+"({article_url}) to: {settings}{comment}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:554
+#, python-brace-format
+msgid "Removed protection from {article}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:563
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) removed protection from [{article}]({article_url})"
+"{comment}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:572
+msgid "for infinity and beyond"
+msgstr ""
+
+#: extensions/base/mediawiki.py:582
+msgid "for less than a minute"
+msgstr ""
+
+#: extensions/base/mediawiki.py:584
+msgid "year"
+msgid_plural "years"
+msgstr[0] ""
+msgstr[1] ""
+
+#: extensions/base/mediawiki.py:584
+msgid "day"
+msgid_plural "days"
+msgstr[0] ""
+msgstr[1] ""
+
+#: extensions/base/mediawiki.py:584
+msgid "hour"
+msgid_plural "hours"
+msgstr[0] ""
+msgstr[1] ""
+
+#: extensions/base/mediawiki.py:585
+msgid "minute"
+msgid_plural "minutes"
+msgstr[0] ""
+msgstr[1] ""
+
+#: extensions/base/mediawiki.py:590
+#, python-brace-format
+msgid "for {time_number} {time_unit}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:609
+msgid "Blocked from editing the following pages: "
+msgstr ""
+
+#: extensions/base/mediawiki.py:616 extensions/base/mediawiki.py:662
+msgid " and namespaces: "
+msgstr ""
+
+#: extensions/base/mediawiki.py:618
+msgid "Blocked from editing pages on following namespaces: "
+msgstr ""
+
+#: extensions/base/mediawiki.py:629
+msgid "Partial block details"
+msgstr ""
+
+#: extensions/base/mediawiki.py:632
+msgid "Block flags"
+msgstr ""
+
+#: extensions/base/mediawiki.py:634
+#, python-brace-format
+msgid "Blocked {blocked_user} {time}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:654
+msgid " on pages: "
+msgstr ""
+
+#: extensions/base/mediawiki.py:664
+msgid " on namespaces: "
+msgstr ""
+
+#: extensions/base/mediawiki.py:676
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) blocked [{user}]({user_url}) {time}"
+"{restriction_desc}{comment}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:694
+#, python-brace-format
+msgid "Changed block settings for {blocked_user}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:704
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) changed block settings for [{blocked_user}]"
+"({user_url}){comment}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:717
+#, python-brace-format
+msgid "Unblocked {blocked_user}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:727
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) unblocked [{blocked_user}]({user_url}){comment}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:743
+msgid "Action has been hidden by administration"
+msgstr ""
+
+#: extensions/base/mediawiki.py:750
+msgid "An action has been hidden by administration."
+msgstr ""
+
+#: extensions/base/mediawiki.py:761
+#, python-brace-format
+msgid "Imported {article} with {count} revision"
+msgid_plural "Imported {article} with {count} revisions"
+msgstr[0] ""
+msgstr[1] ""
+
+#: extensions/base/mediawiki.py:772
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) imported [{article}]({article_url}) with {count} "
+"revision{comment}"
+msgid_plural ""
+"[{author}]({author_url}) imported [{article}]({article_url}) with {count} "
+"revisions{comment}"
+msgstr[0] ""
+msgstr[1] ""
+
+#: extensions/base/mediawiki.py:788
+#, python-brace-format
+msgid "Imported {article} with {count} revision from \"{source}\""
+msgid_plural "Imported {article} with {count} revisions from \"{source}\""
+msgstr[0] ""
+msgstr[1] ""
+
+#: extensions/base/mediawiki.py:803
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) imported [{article}]({article_url}) with {count} "
+"revision from [{source}]({source_url}){comment}"
+msgid_plural ""
+"[{author}]({author_url}) imported [{article}]({article_url}) with {count} "
+"revisions from [{source}]({source_url}){comment}"
+msgstr[0] ""
+msgstr[1] ""
+
+#: extensions/base/mediawiki.py:818
+#, python-brace-format
+msgid " (until {date_and_time})"
+msgstr ""
+
+#: extensions/base/mediawiki.py:835
+#, python-brace-format
+msgid "Changed group membership for {target}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:837
+msgid "System"
+msgstr ""
+
+#: extensions/base/mediawiki.py:838
+#, python-brace-format
+msgid "{target} got autopromoted to a new usergroup"
+msgstr ""
+
+#: extensions/base/mediawiki.py:844
+msgid "Added group"
+msgid_plural "Added groups"
+msgstr[0] ""
+msgstr[1] ""
+
+#: extensions/base/mediawiki.py:846
+msgid "Removed group"
+msgid_plural "Removed groups"
+msgstr[0] ""
+msgstr[1] ""
+
+#: extensions/base/mediawiki.py:860
+#, python-brace-format
+msgid "Added to {added} and removed from {removed}."
+msgstr ""
+
+#: extensions/base/mediawiki.py:861 extensions/base/mediawiki.py:863
+#: extensions/base/mediawiki.py:865 extensions/base/mediawiki.py:872
+msgid ", "
+msgstr ""
+
+#: extensions/base/mediawiki.py:863
+#, python-brace-format
+msgid "Added to {added}."
+msgstr ""
+
+#: extensions/base/mediawiki.py:865
+#, python-brace-format
+msgid "Removed from {removed}."
+msgstr ""
+
+#: extensions/base/mediawiki.py:866
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) changed group membership for [{target}]"
+"({target_url}): {group_changes}{comment}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:870
+#, python-brace-format
+msgid "The system autopromoted [{target}]({target_url}) to {added}.{comment}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:883
+#, python-brace-format
+msgid "Merged revision histories of {article} into {dest}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:897
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) merged revision histories of [{article}]"
+"({article_url}) into [{dest}]({dest_url}){comment}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:911
+msgid "Created account automatically"
+msgstr ""
+
+#: extensions/base/mediawiki.py:918
+#, python-brace-format
+msgid "Account [{author}]({author_url}) was created automatically"
+msgstr ""
+
+#: extensions/base/mediawiki.py:931 extensions/base/mediawiki.py:996
+msgid "Created account"
+msgstr ""
+
+#: extensions/base/mediawiki.py:938 extensions/base/mediawiki.py:1003
+#, python-brace-format
+msgid "Account [{author}]({author_url}) was created"
+msgstr ""
+
+#: extensions/base/mediawiki.py:950
+#, python-brace-format
+msgid "Created account {article}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:959
+#, python-brace-format
+msgid ""
+"Account [{article}]({article_url}) was created by [{author}]({author_url})"
+"{comment}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:972
+#, python-brace-format
+msgid "Created account {article} and password was sent by email"
+msgstr ""
+
+#: extensions/base/mediawiki.py:983
+#, python-brace-format
+msgid ""
+"Account [{article}]({article_url}) was created by [{author}]({author_url}) "
+"and password was sent by email{comment}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:1015
+#, python-brace-format
+msgid "Changed the content model of the page {article}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:1017
+#, python-brace-format
+msgid "Model changed from {old} to {new}: {reason}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:1029
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) changed the content model of the page [{article}]"
+"({article_url}) from {old} to {new}{comment}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:1044
+#, python-brace-format
+msgid "Created the page {article} using a non-default content model"
+msgstr ""
+
+#: extensions/base/mediawiki.py:1046
+#, python-brace-format
+msgid "Created with model {new}: {reason}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:1057
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) created the page [{article}]({article_url}) using a "
+"non-default content model {new}{comment}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:1072
+#, python-brace-format
+msgid "Created the tag \"{tag}\""
+msgstr ""
+
+#: extensions/base/mediawiki.py:1082
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) created the [tag]({tag_url}) \"{tag}\"{comment}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:1103
+#, python-brace-format
+msgid "Deleted the tag \"{tag}\""
+msgstr ""
+
+#: extensions/base/mediawiki.py:1105
+msgid "Removed from"
+msgstr ""
+
+#: extensions/base/mediawiki.py:1105
+msgid "{} revision or log entry"
+msgid_plural "{} revisions and/or log entries"
+msgstr[0] ""
+msgstr[1] ""
+
+#: extensions/base/mediawiki.py:1118
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) deleted the [tag]({tag_url}) \"{tag}\"{comment}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:1128
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) deleted the [tag]({tag_url}) \"{tag}\" and removed "
+"it from {count} revision or log entry{comment}"
+msgid_plural ""
+"[{author}]({author_url}) deleted the [tag]({tag_url}) \"{tag}\" and removed "
+"it from {count} revisions and/or log entries{comment}"
+msgstr[0] ""
+msgstr[1] ""
+
+#: extensions/base/mediawiki.py:1145
+#, python-brace-format
+msgid "Activated the tag \"{tag}\""
+msgstr ""
+
+#: extensions/base/mediawiki.py:1154
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) activated the [tag]({tag_url}) \"{tag}\"{comment}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:1173
+#, python-brace-format
+msgid "Deactivated the tag \"{tag}\""
+msgstr ""
+
+#: extensions/base/mediawiki.py:1182
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) deactivated the [tag]({tag_url}) \"{tag}\"{comment}"
+msgstr ""
+
+#: extensions/base/sprite.py:37
+#, python-brace-format
+msgid "Edited the sprite for {article}"
+msgstr ""
+
+#: extensions/base/sprite.py:45
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) edited the sprite for [{article}]({article_url})"
+msgstr ""
+
+#: extensions/base/sprite.py:60
+#, python-brace-format
+msgid "Created the sprite sheet for {article}"
+msgstr ""
+
+#: extensions/base/sprite.py:68
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) created the sprite sheet for [{article}]"
+"({article_url})"
+msgstr ""
+
+#: extensions/base/sprite.py:79
+#, python-brace-format
+msgid "Edited the slice for {article}"
+msgstr ""
+
+#: extensions/base/sprite.py:86
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) edited the slice for [{article}]({article_url})"
+msgstr ""
diff --git a/locale/sv/LC_MESSAGES/misc.mo b/locale/sv/LC_MESSAGES/misc.mo
new file mode 100644
index 0000000..30d6c10
Binary files /dev/null and b/locale/sv/LC_MESSAGES/misc.mo differ
diff --git a/locale/sv/LC_MESSAGES/misc.po b/locale/sv/LC_MESSAGES/misc.po
new file mode 100644
index 0000000..aa131dd
--- /dev/null
+++ b/locale/sv/LC_MESSAGES/misc.po
@@ -0,0 +1,88 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the RcGcDw package.
+# FIRST AUTHOR , YEAR.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: RcGcDw\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2021-05-22 18:48+0200\n"
+"PO-Revision-Date: 2021-05-31 21:54+0000\n"
+"Last-Translator: Spisen \n"
+"Language-Team: Swedish \n"
+"Language: sv\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+"X-Generator: Weblate 4.6.2\n"
+
+#: src/misc.py:44
+msgid "Location"
+msgstr "Plats"
+
+#: src/misc.py:44
+msgid "About me"
+msgstr "Om mig"
+
+#: src/misc.py:44
+msgid "Google link"
+msgstr "Google-länk"
+
+#: src/misc.py:44
+msgid "Facebook link"
+msgstr "Facebook-länk"
+
+#: src/misc.py:44
+msgid "Twitter link"
+msgstr "Twitter-länk"
+
+#: src/misc.py:44
+msgid "Reddit link"
+msgstr "Reddit-länk"
+
+#: src/misc.py:44
+msgid "Twitch link"
+msgstr "Twitch-länk"
+
+#: src/misc.py:44
+msgid "PSN link"
+msgstr "PSN-länk"
+
+#: src/misc.py:44
+msgid "VK link"
+msgstr "VK-länk"
+
+#: src/misc.py:44
+msgid "XBL link"
+msgstr "XBL-länk"
+
+#: src/misc.py:44
+msgid "Steam link"
+msgstr "Steam-länk"
+
+#: src/misc.py:44
+msgid "Discord handle"
+msgstr "Discord-länk"
+
+#: src/misc.py:44
+msgid "Battle.net handle"
+msgstr "Battle.net-länk"
+
+#: src/misc.py:138
+msgid ""
+"\n"
+"__And more__"
+msgstr ""
+"\n"
+"__Och mer__"
+
+#: src/misc.py:322
+msgid "Unknown"
+msgstr "Okänd"
+
+#: src/misc.py:324
+msgid "unknown"
+msgstr "okänd"
diff --git a/locale/sv/LC_MESSAGES/rcgcdw.mo b/locale/sv/LC_MESSAGES/rcgcdw.mo
new file mode 100644
index 0000000..a23fcb8
Binary files /dev/null and b/locale/sv/LC_MESSAGES/rcgcdw.mo differ
diff --git a/locale/sv/LC_MESSAGES/rcgcdw.po b/locale/sv/LC_MESSAGES/rcgcdw.po
new file mode 100644
index 0000000..0682604
--- /dev/null
+++ b/locale/sv/LC_MESSAGES/rcgcdw.po
@@ -0,0 +1,113 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the RcGcDw package.
+# FIRST AUTHOR , YEAR.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: RcGcDw\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2021-05-22 18:48+0200\n"
+"PO-Revision-Date: 2021-05-27 21:02+0000\n"
+"Last-Translator: Spisen \n"
+"Language-Team: Swedish \n"
+"Language: sv\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+"X-Generator: Weblate 4.6\n"
+
+#: src/rcgcdw.py:117
+#, python-brace-format
+msgid "{value} (avg. {avg})"
+msgstr "{value} (avg. {avg})"
+
+#: src/rcgcdw.py:136
+msgid "Daily overview"
+msgstr "Daglig översikt"
+
+#: src/rcgcdw.py:143
+msgid "No activity"
+msgstr "Ingen aktivitet"
+
+#: src/rcgcdw.py:167
+msgid " ({} action)"
+msgid_plural " ({} actions)"
+msgstr[0] " ({} handling)"
+msgstr[1] " ({} handlingar)"
+
+#: src/rcgcdw.py:169
+msgid " ({} edit)"
+msgid_plural " ({} edits)"
+msgstr[0] " ({} redigering)"
+msgstr[1] " ({} redigeringar)"
+
+#: src/rcgcdw.py:174
+msgid " UTC ({} action)"
+msgid_plural " UTC ({} actions)"
+msgstr[0] " UTC ({} handling)"
+msgstr[1] " UTC ({} handlingar)"
+
+#: src/rcgcdw.py:176 src/rcgcdw.py:179
+msgid "But nobody came"
+msgstr "Ingen kom hit"
+
+#: src/rcgcdw.py:183
+msgid "Most active user"
+msgid_plural "Most active users"
+msgstr[0] "Mest aktiva användaren"
+msgstr[1] "Mest aktiva användarna"
+
+#: src/rcgcdw.py:184
+msgid "Most edited article"
+msgid_plural "Most edited articles"
+msgstr[0] "Mest redigerade artikeln"
+msgstr[1] "Mest redigerade artiklarna"
+
+#: src/rcgcdw.py:185
+msgid "Edits made"
+msgstr "Redigeringar gjorda"
+
+#: src/rcgcdw.py:185
+msgid "New files"
+msgstr "Nya filer"
+
+#: src/rcgcdw.py:186
+msgid "Admin actions"
+msgstr "Administratörsåtgärder"
+
+#: src/rcgcdw.py:186
+msgid "Bytes changed"
+msgstr "Bytes ändrade"
+
+#: src/rcgcdw.py:187
+msgid "New articles"
+msgstr "Nya artiklar"
+
+#: src/rcgcdw.py:187
+msgid "Unique contributors"
+msgstr "Unika bidragsgivare"
+
+#: src/rcgcdw.py:188
+msgid "Most active hour"
+msgid_plural "Most active hours"
+msgstr[0] "Mest aktiva timme"
+msgstr[1] "Mest aktiva timmarna"
+
+#: src/rcgcdw.py:189
+msgid "Day score"
+msgstr "Dagligt poäng"
+
+#: src/rcgcdw.py:215
+msgid "~~hidden~~"
+msgstr "~~gömd~~"
+
+#: src/rcgcdw.py:217
+msgid "No description provided"
+msgstr "Ingen beskrivning gavs"
+
+#: src/rcgcdw.py:220
+msgid "hidden"
+msgstr "gömd"
diff --git a/locale/sv/LC_MESSAGES/redaction.mo b/locale/sv/LC_MESSAGES/redaction.mo
new file mode 100644
index 0000000..caa1d64
Binary files /dev/null and b/locale/sv/LC_MESSAGES/redaction.mo differ
diff --git a/locale/sv/LC_MESSAGES/redaction.po b/locale/sv/LC_MESSAGES/redaction.po
new file mode 100644
index 0000000..5535fc9
--- /dev/null
+++ b/locale/sv/LC_MESSAGES/redaction.po
@@ -0,0 +1,25 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the RcGcDw package.
+# FIRST AUTHOR , YEAR.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: RcGcDw\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2021-05-22 18:48+0200\n"
+"PO-Revision-Date: 2021-05-27 21:02+0000\n"
+"Last-Translator: Spisen \n"
+"Language-Team: Swedish \n"
+"Language: sv\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+"X-Generator: Weblate 4.6\n"
+
+#: src/discord/redaction.py:77 src/discord/redaction.py:80
+#: src/discord/redaction.py:85
+msgid "Removed"
+msgstr "Tog bort"
diff --git a/locale/templates/discussion_formatters.pot b/locale/templates/discussion_formatters.pot
deleted file mode 100644
index 2efce94..0000000
--- a/locale/templates/discussion_formatters.pot
+++ /dev/null
@@ -1,161 +0,0 @@
-# SOME DESCRIPTIVE TITLE.
-# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
-# This file is distributed under the same license as the RcGcDw package.
-# FIRST AUTHOR , YEAR.
-#
-#, fuzzy
-msgid ""
-msgstr ""
-"Project-Id-Version: RcGcDw\n"
-"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2021-04-14 16:24+0200\n"
-"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
-"Last-Translator: FULL NAME \n"
-"Language-Team: LANGUAGE \n"
-"Language: \n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=CHARSET\n"
-"Content-Transfer-Encoding: 8bit\n"
-
-#: src/discussion_formatters.py:21 src/discussion_formatters.py:56
-#: src/discussion_formatters.py:67 src/discussion_formatters.py:95
-#: src/discussion_formatters.py:163 src/discussion_formatters.py:176
-msgid "unknown"
-msgstr ""
-
-#: src/discussion_formatters.py:27 src/discussion_formatters.py:102
-msgid "Unregistered user"
-msgstr ""
-
-#: src/discussion_formatters.py:39
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) created [{title}](<{url}f/p/{threadId}>) in "
-"{forumName}"
-msgstr ""
-
-#: src/discussion_formatters.py:42
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) created a poll [{title}](<{url}f/p/{threadId}>) in "
-"{forumName}"
-msgstr ""
-
-#: src/discussion_formatters.py:45
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) created a quiz [{title}](<{url}f/p/{threadId}>) in "
-"{forumName}"
-msgstr ""
-
-#: src/discussion_formatters.py:54
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) created a [reply](<{url}f/p/{threadId}/r/{postId}>) "
-"to [{title}](<{url}f/p/{threadId}>) in {forumName}"
-msgstr ""
-
-#: src/discussion_formatters.py:61
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) created [{title}](<{url}wiki/Message_Wall:"
-"{user_wall}?threadId={threadId}>) on [{user}'s Message Wall](<{url}wiki/"
-"Message_Wall:{user_wall}>)"
-msgstr ""
-
-#: src/discussion_formatters.py:64
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) created a [reply](<{url}wiki/Message_Wall:"
-"{user_wall}?threadId={threadId}#{replyId}>) to [{title}](<{url}wiki/"
-"Message_Wall:{user_wall}?threadId={threadId}>) on [{user}'s Message Wall]"
-"(<{url}wiki/Message_Wall:{user_wall}>)"
-msgstr ""
-
-#: src/discussion_formatters.py:72
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) created a [comment](<{url}?commentId={commentId}>) "
-"on [{article}](<{url}>)"
-msgstr ""
-
-#: src/discussion_formatters.py:78
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) created a [reply](<{url}?commentId={commentId}"
-"&replyId={replyId}>) to a [comment](<{url}?commentId={commentId}>) on "
-"[{article}](<{url}>)"
-msgstr ""
-
-#: src/discussion_formatters.py:86
-#, python-brace-format
-msgid ""
-"Unknown event `{event}` by [{author}]({author_url}), report it on the "
-"[support server](<{support}>)."
-msgstr ""
-
-#: src/discussion_formatters.py:123
-#, python-brace-format
-msgid "Created \"{title}\""
-msgstr ""
-
-#: src/discussion_formatters.py:127
-#, python-brace-format
-msgid "Created a poll \"{title}\""
-msgstr ""
-
-#: src/discussion_formatters.py:134
-msgid "Option {}"
-msgstr ""
-
-#: src/discussion_formatters.py:135
-#, python-brace-format
-msgid "__[View image]({image_url})__"
-msgstr ""
-
-#: src/discussion_formatters.py:139
-#, python-brace-format
-msgid "Created a quiz \"{title}\""
-msgstr ""
-
-#: src/discussion_formatters.py:155 src/discussion_formatters.py:157
-msgid "Tags"
-msgstr ""
-
-#: src/discussion_formatters.py:155
-msgid "{} tags"
-msgstr ""
-
-#: src/discussion_formatters.py:160
-#, python-brace-format
-msgid "Replied to \"{title}\""
-msgstr ""
-
-#: src/discussion_formatters.py:169
-#, python-brace-format
-msgid "Created \"{title}\" on {user}'s Message Wall"
-msgstr ""
-
-#: src/discussion_formatters.py:173
-#, python-brace-format
-msgid "Replied to \"{title}\" on {user}'s Message Wall"
-msgstr ""
-
-#: src/discussion_formatters.py:180
-#, python-brace-format
-msgid "Commented on {article}"
-msgstr ""
-
-#: src/discussion_formatters.py:184
-#, python-brace-format
-msgid "Replied to a comment on {article}"
-msgstr ""
-
-#: src/discussion_formatters.py:188
-#, python-brace-format
-msgid "Unknown event `{event}`"
-msgstr ""
-
-#: src/discussion_formatters.py:194 src/discussion_formatters.py:196
-msgid "Report this on the support server"
-msgstr ""
diff --git a/locale/templates/rc_formatters.pot b/locale/templates/formatters.pot
similarity index 58%
rename from locale/templates/rc_formatters.pot
rename to locale/templates/formatters.pot
index f1fe0ca..e849e0c 100644
--- a/locale/templates/rc_formatters.pot
+++ b/locale/templates/formatters.pot
@@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: RcGcDw\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2021-04-14 16:24+0200\n"
+"POT-Creation-Date: 2021-07-11 14:34+0200\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME \n"
"Language-Team: LANGUAGE \n"
@@ -18,722 +18,753 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\n"
-#: src/rc_formatters.py:28
-msgid "None"
+#: src/api/util.py:61 src/api/util.py:66
+msgid "__Only whitespace__"
msgstr ""
-#: src/rc_formatters.py:28
-msgid "Warning issued"
+#: src/api/util.py:71
+msgid "Removed"
msgstr ""
-#: src/rc_formatters.py:28
-msgid "**Blocked user**"
+#: src/api/util.py:73
+msgid "Added"
msgstr ""
-#: src/rc_formatters.py:28
-msgid "Tagged the edit"
-msgstr ""
-
-#: src/rc_formatters.py:28
-msgid "Disallowed the action"
-msgstr ""
-
-#: src/rc_formatters.py:28
-msgid "**IP range blocked**"
-msgstr ""
-
-#: src/rc_formatters.py:28
-msgid "Throttled actions"
-msgstr ""
-
-#: src/rc_formatters.py:28
-msgid "Removed autoconfirmed group"
-msgstr ""
-
-#: src/rc_formatters.py:28
-msgid "**Removed from privileged groups**"
-msgstr ""
-
-#: src/rc_formatters.py:29
-msgid "Edit"
-msgstr ""
-
-#: src/rc_formatters.py:29
-msgid "Upload"
-msgstr ""
-
-#: src/rc_formatters.py:29
-msgid "Move"
-msgstr ""
-
-#: src/rc_formatters.py:29
-msgid "Stash upload"
-msgstr ""
-
-#: src/rc_formatters.py:29
-msgid "Deletion"
-msgstr ""
-
-#: src/rc_formatters.py:29
-msgid "Account creation"
-msgstr ""
-
-#: src/rc_formatters.py:29
-msgid "Auto account creation"
-msgstr ""
-
-#: src/rc_formatters.py:46 src/rc_formatters.py:53 src/rc_formatters.py:60
-#: src/rc_formatters.py:75 src/rc_formatters.py:96
+#: src/api/util.py:94 src/api/util.py:126 src/api/util.py:133
+#: src/api/util.py:141 extensions/base/discussions.py:247
+#: extensions/base/discussions.py:264 extensions/base/abusefilter.py:45
msgid "Unregistered user"
msgstr ""
-#: src/rc_formatters.py:83
+#: src/api/util.py:160
+msgctxt "recent changes Tags"
+msgid "Tags"
+msgstr ""
+
+#: src/api/util.py:162
+msgid "**Added**: "
+msgstr ""
+
+#: src/api/util.py:163
+msgid " and {} more\n"
+msgstr ""
+
+#: src/api/util.py:165
+msgid "**Removed**: "
+msgstr ""
+
+#: src/api/util.py:166
+msgid " and {} more"
+msgstr ""
+
+#: src/api/util.py:168
+msgid "Changed categories"
+msgstr ""
+
+#: extensions/base/cargo.py:37
#, python-brace-format
-msgid ""
-"[{author}]({author_url}) triggered *{abuse_filter}*, performing the action "
-"\"{action}\" on *[{target}]({target_url})* - action taken: {result}."
+msgid "Created the Cargo table \"{table}\""
msgstr ""
-#: src/rc_formatters.py:85 src/rc_formatters.py:86 src/rc_formatters.py:87
-#: src/rc_formatters.py:457 src/rc_formatters.py:460 src/rc_formatters.py:463
-#: src/rc_formatters.py:464 src/rc_formatters.py:469 src/rc_formatters.py:470
-#: src/rc_formatters.py:478 src/rc_formatters.py:482 src/rc_formatters.py:682
-#: src/rc_formatters.py:683 src/rc_formatters.py:684 src/rc_formatters.py:1141
-#: src/rc_formatters.py:1144 src/rc_formatters.py:1147
-#: src/rc_formatters.py:1149 src/rc_formatters.py:1152
-#: src/rc_formatters.py:1154 src/rc_formatters.py:1160
-#: src/rc_formatters.py:1163 src/rc_formatters.py:1255
-msgid "Unknown"
-msgstr ""
-
-#: src/rc_formatters.py:116
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) edited [{article}]({edit_link}){comment} {bold}"
-"({sign}{edit_size}){bold}"
-msgstr ""
-
-#: src/rc_formatters.py:118
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) created [{article}]({edit_link}){comment} {bold}"
-"({sign}{edit_size}){bold}"
-msgstr ""
-
-#: src/rc_formatters.py:121
-#, python-brace-format
-msgid "[{author}]({author_url}) uploaded [{file}]({file_link}){comment}"
-msgstr ""
-
-#: src/rc_formatters.py:128
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) reverted a version of [{file}]({file_link}){comment}"
-msgstr ""
-
-#: src/rc_formatters.py:132
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) uploaded a new version of [{file}]({file_link})"
-"{comment}"
-msgstr ""
-
-#: src/rc_formatters.py:135
-#, python-brace-format
-msgid "[{author}]({author_url}) deleted [{page}]({page_link}){comment}"
-msgstr ""
-
-#: src/rc_formatters.py:141
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) deleted redirect by overwriting [{page}]"
-"({page_link}){comment}"
-msgstr ""
-
-#: src/rc_formatters.py:147 src/rc_formatters.py:152
-msgid "without making a redirect"
-msgstr ""
-
-#: src/rc_formatters.py:147 src/rc_formatters.py:153
-msgid "with a redirect"
-msgstr ""
-
-#: src/rc_formatters.py:148
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) moved {redirect}*{article}* to [{target}]"
-"({target_url}) {made_a_redirect}{comment}"
-msgstr ""
-
-#: src/rc_formatters.py:154
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) moved {redirect}*{article}* over redirect to "
-"[{target}]({target_url}) {made_a_redirect}{comment}"
-msgstr ""
-
-#: src/rc_formatters.py:159
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) moved protection settings from {redirect}*{article}"
-"* to [{target}]({target_url}){comment}"
-msgstr ""
-
-#: src/rc_formatters.py:170 src/rc_formatters.py:855
-msgid "for infinity and beyond"
-msgstr ""
-
-#: src/rc_formatters.py:179 src/rc_formatters.py:863
-#, python-brace-format
-msgid "for {num} {translated_length}"
-msgstr ""
-
-#: src/rc_formatters.py:185 src/rc_formatters.py:867
-msgid "until {}"
-msgstr ""
-
-#: src/rc_formatters.py:189
-msgid " on pages: "
-msgstr ""
-
-#: src/rc_formatters.py:196 src/rc_formatters.py:881
-msgid " and namespaces: "
-msgstr ""
-
-#: src/rc_formatters.py:198
-msgid " on namespaces: "
-msgstr ""
-
-#: src/rc_formatters.py:210
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) blocked [{user}]({user_url}) {time}"
-"{restriction_desc}{comment}"
-msgstr ""
-
-#: src/rc_formatters.py:214
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) changed block settings for [{blocked_user}]"
-"({user_url}){comment}"
-msgstr ""
-
-#: src/rc_formatters.py:218
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) unblocked [{blocked_user}]({user_url}){comment}"
-msgstr ""
-
-#: src/rc_formatters.py:223
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) left a [comment]({comment}) on {target}'s profile"
-msgstr ""
-
-#: src/rc_formatters.py:225
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) left a [comment]({comment}) on their own profile"
-msgstr ""
-
-#: src/rc_formatters.py:231
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) replied to a [comment]({comment}) on {target}'s "
-"profile"
-msgstr ""
-
-#: src/rc_formatters.py:237
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) replied to a [comment]({comment}) on their own "
-"profile"
-msgstr ""
-
-#: src/rc_formatters.py:245
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) edited a [comment]({comment}) on {target}'s profile"
-msgstr ""
-
-#: src/rc_formatters.py:251
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) edited a [comment]({comment}) on their own profile"
-msgstr ""
-
-#: src/rc_formatters.py:257
-#, python-brace-format
-msgid "[{author}]({author_url}) purged a comment on {target}'s profile"
-msgstr ""
-
-#: src/rc_formatters.py:259
-#, python-brace-format
-msgid "[{author}]({author_url}) purged a comment on their own profile"
-msgstr ""
-
-#: src/rc_formatters.py:267
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) deleted a [comment]({comment}) on {target}'s profile"
-msgstr ""
-
-#: src/rc_formatters.py:269
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) deleted a [comment]({comment}) on their own profile"
-msgstr ""
-
-#: src/rc_formatters.py:274
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) edited the {field} on [{target}]({target_url})'s "
-"profile. *({desc})*"
-msgstr ""
-
-#: src/rc_formatters.py:281
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) edited the {field} on [their own]({target_url}) "
-"profile. *({desc})*"
-msgstr ""
-
-#: src/rc_formatters.py:296 src/rc_formatters.py:298 src/rc_formatters.py:977
-#: src/rc_formatters.py:979
-msgid "none"
-msgstr ""
-
-#: src/rc_formatters.py:301
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) changed group membership for [{target}]"
-"({target_url}) from {old_groups} to {new_groups}{comment}"
-msgstr ""
-
-#: src/rc_formatters.py:303
-#, python-brace-format
-msgid ""
-"{author} autopromoted [{target}]({target_url}) from {old_groups} to "
-"{new_groups}{comment}"
-msgstr ""
-
-#: src/rc_formatters.py:304 src/rc_formatters.py:965
-msgid "System"
-msgstr ""
-
-#: src/rc_formatters.py:309
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) protected [{article}]({article_url}) with the "
-"following settings: {settings}{comment}"
-msgstr ""
-
-#: src/rc_formatters.py:311 src/rc_formatters.py:319 src/rc_formatters.py:987
-#: src/rc_formatters.py:993
-msgid " [cascading]"
-msgstr ""
-
-#: src/rc_formatters.py:316
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) modified protection settings of [{article}]"
-"({article_url}) to: {settings}{comment}"
-msgstr ""
-
-#: src/rc_formatters.py:323
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) removed protection from [{article}]({article_url})"
-"{comment}"
-msgstr ""
-
-#: src/rc_formatters.py:327
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) changed visibility of revision on page [{article}]"
-"({article_url}){comment}"
-msgid_plural ""
-"[{author}]({author_url}) changed visibility of {amount} revisions on page "
-"[{article}]({article_url}){comment}"
-msgstr[0] ""
-msgstr[1] ""
-
-#: src/rc_formatters.py:340
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) imported [{article}]({article_url}) with {count} "
-"revision{comment}"
-msgid_plural ""
-"[{author}]({author_url}) imported [{article}]({article_url}) with {count} "
-"revisions{comment}"
-msgstr[0] ""
-msgstr[1] ""
-
-#: src/rc_formatters.py:345
-#, python-brace-format
-msgid "[{author}]({author_url}) restored [{article}]({article_url}){comment}"
-msgstr ""
-
-#: src/rc_formatters.py:347
-#, python-brace-format
-msgid "[{author}]({author_url}) changed visibility of log events{comment}"
-msgstr ""
-
-#: src/rc_formatters.py:359
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) imported [{article}]({article_url}) with {count} "
-"revision from [{source}]({source_url}){comment}"
-msgid_plural ""
-"[{author}]({author_url}) imported [{article}]({article_url}) with {count} "
-"revisions from [{source}]({source_url}){comment}"
-msgstr[0] ""
-msgstr[1] ""
-
-#: src/rc_formatters.py:364
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) edited abuse filter [number {number}]({filter_url})"
-msgstr ""
-
-#: src/rc_formatters.py:368
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) created abuse filter [number {number}]({filter_url})"
-msgstr ""
-
-#: src/rc_formatters.py:372
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) merged revision histories of [{article}]"
-"({article_url}) into [{dest}]({dest_url}){comment}"
-msgstr ""
-
-#: src/rc_formatters.py:375
-#, python-brace-format
-msgid "Account [{author}]({author_url}) was created automatically"
-msgstr ""
-
-#: src/rc_formatters.py:377 src/rc_formatters.py:385
-#, python-brace-format
-msgid "Account [{author}]({author_url}) was created"
-msgstr ""
-
-#: src/rc_formatters.py:380
-#, python-brace-format
-msgid ""
-"Account [{article}]({article_url}) was created by [{author}]({author_url})"
-"{comment}"
-msgstr ""
-
-#: src/rc_formatters.py:383
-#, python-brace-format
-msgid ""
-"Account [{article}]({article_url}) was created by [{author}]({author_url}) "
-"and password was sent by email{comment}"
-msgstr ""
-
-#: src/rc_formatters.py:388
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) added an entry to the [interwiki table]"
-"({table_url}) pointing to {website} with {prefix} prefix"
-msgstr ""
-
-#: src/rc_formatters.py:394
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) edited an entry in [interwiki table]({table_url}) "
-"pointing to {website} with {prefix} prefix"
-msgstr ""
-
-#: src/rc_formatters.py:400
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) deleted an entry in [interwiki table]({table_url})"
-msgstr ""
-
-#: src/rc_formatters.py:403
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) changed the content model of the page [{article}]"
-"({article_url}) from {old} to {new}{comment}"
-msgstr ""
-
-#: src/rc_formatters.py:407
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) created the page [{article}]({article_url}) using a "
-"non-default content model {new}{comment}"
-msgstr ""
-
-#: src/rc_formatters.py:410
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) edited the sprite for [{article}]({article_url})"
-msgstr ""
-
-#: src/rc_formatters.py:413
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) created the sprite sheet for [{article}]"
-"({article_url})"
-msgstr ""
-
-#: src/rc_formatters.py:416
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) edited the slice for [{article}]({article_url})"
-msgstr ""
-
-#: src/rc_formatters.py:421
+#: extensions/base/cargo.py:45
#, python-brace-format
msgid "[{author}]({author_url}) created the Cargo table \"{table}\""
msgstr ""
-#: src/rc_formatters.py:423
+#: extensions/base/cargo.py:60
#, python-brace-format
-msgid "[{author}]({author_url}) deleted the Cargo table \"{table}\""
+msgid "Recreated the Cargo table \"{table}\""
msgstr ""
-#: src/rc_formatters.py:428
+#: extensions/base/cargo.py:68
#, python-brace-format
msgid "[{author}]({author_url}) recreated the Cargo table \"{table}\""
msgstr ""
-#: src/rc_formatters.py:433
+#: extensions/base/cargo.py:83
+#, python-brace-format
+msgid "Replaced the Cargo table \"{table}\""
+msgstr ""
+
+#: extensions/base/cargo.py:91
#, python-brace-format
msgid "[{author}]({author_url}) replaced the Cargo table \"{table}\""
msgstr ""
-#: src/rc_formatters.py:436
+#: extensions/base/cargo.py:105
#, python-brace-format
-msgid ""
-"[{author}]({author_url}) created the [tag]({tag_url}) \"{tag}\"{comment}"
+msgid "Deleted the Cargo table \"{table}\""
msgstr ""
-#: src/rc_formatters.py:441
+#: extensions/base/cargo.py:112
#, python-brace-format
-msgid ""
-"[{author}]({author_url}) deleted the [tag]({tag_url}) \"{tag}\"{comment}"
+msgid "[{author}]({author_url}) deleted the Cargo table \"{table}\""
msgstr ""
-#: src/rc_formatters.py:443
+#: extensions/base/translate.py:41
#, python-brace-format
-msgid ""
-"[{author}]({author_url}) deleted the [tag]({tag_url}) \"{tag}\" and removed "
-"it from {count} revision or log entry{comment}"
-msgid_plural ""
-"[{author}]({author_url}) deleted the [tag]({tag_url}) \"{tag}\" and removed "
-"it from {count} revisions and/or log entries{comment}"
-msgstr[0] ""
-msgstr[1] ""
-
-#: src/rc_formatters.py:449
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) activated the [tag]({tag_url}) \"{tag}\"{comment}"
+msgid "Marked \"{article}\" for translation"
msgstr ""
-#: src/rc_formatters.py:452
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) deactivated the [tag]({tag_url}) \"{tag}\"{comment}"
-msgstr ""
-
-#: src/rc_formatters.py:454
-#, python-brace-format
-msgid "[{author}]({author_url}) changed wiki settings{reason}"
-msgstr ""
-
-#: src/rc_formatters.py:456
-#, python-brace-format
-msgid "[{author}]({author_url}) deleted a wiki *{wiki_name}*{comment}"
-msgstr ""
-
-#: src/rc_formatters.py:459
-#, python-brace-format
-msgid "[{author}]({author_url}) locked a wiki *{wiki_name}*{comment}"
-msgstr ""
-
-#: src/rc_formatters.py:462
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) modified namespace *{namespace_name}* on "
-"*{wiki_name}*{comment}"
-msgstr ""
-
-#: src/rc_formatters.py:467
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) deleted a namespace *{namespace_name}* on "
-"*{wiki_name}*{comment}"
-msgstr ""
-
-#: src/rc_formatters.py:473
-#, python-brace-format
-msgid "[{author}]({author_url}) modified user group *{group_name}*{comment}"
-msgstr ""
-
-#: src/rc_formatters.py:477
-#, python-brace-format
-msgid "[{author}]({author_url}) undeleted a wiki *{wiki_name}*{comment}"
-msgstr ""
-
-#: src/rc_formatters.py:481
-#, python-brace-format
-msgid "[{author}]({author_url}) unlocked a wiki *{wiki_name}*{comment}"
-msgstr ""
-
-#: src/rc_formatters.py:486
-#, python-brace-format
-msgid "[{author}]({author_url}) generated *{file}* dump{comment}"
-msgstr ""
-
-#: src/rc_formatters.py:491
-#, python-brace-format
-msgid "[{author}]({author_url}) deleted *{file}* dump{comment}"
-msgstr ""
-
-#: src/rc_formatters.py:502
+#: extensions/base/translate.py:55
#, python-brace-format
msgid ""
"[{author}]({author_url}) marked [{article}]({article_url}) for "
"translation{comment}"
msgstr ""
-#: src/rc_formatters.py:509
+#: extensions/base/translate.py:70
+#, python-brace-format
+msgid "Removed \"{article}\" from the translation system"
+msgstr ""
+
+#: extensions/base/translate.py:80
#, python-brace-format
msgid ""
"[{author}]({author_url}) removed [{article}]({article_url}) from the "
"translation system{comment}"
msgstr ""
-#: src/rc_formatters.py:516
+#: extensions/base/translate.py:95
+#, python-brace-format
+msgid "Completed moving translation pages from \"{article}\" to \"{target}\""
+msgstr ""
+
+#: extensions/base/translate.py:106
#, python-brace-format
msgid ""
"[{author}]({author_url}) completed moving translation pages from *{article}* "
"to [{target}]({target_url}){comment}"
msgstr ""
-#: src/rc_formatters.py:524
+#: extensions/base/translate.py:121
+#, python-brace-format
+msgid "Encountered a problem while moving \"{article}\" to \"{target}\""
+msgstr ""
+
+#: extensions/base/translate.py:133
#, python-brace-format
msgid ""
"[{author}]({author_url}) encountered a problem while moving [{article}]"
"({article_url}) to [{target}]({target_url}){comment}"
msgstr ""
-#: src/rc_formatters.py:532
+#: extensions/base/translate.py:149
#, python-brace-format
msgid ""
-"[{author}]({author_url}) completed deletion of translatable page [{article}]"
-"({article_url}){comment}"
+"Failed to delete \"{article}\" which belongs to translatable page "
+"\"{target}\""
msgstr ""
-#: src/rc_formatters.py:540
+#: extensions/base/translate.py:161
#, python-brace-format
msgid ""
"[{author}]({author_url}) failed to delete [{article}]({article_url}) which "
"belongs to translatable page [{target}]({target_url}){comment}"
msgstr ""
-#: src/rc_formatters.py:548
+#: extensions/base/translate.py:177
+#, python-brace-format
+msgid "Completed deletion of translation page \"{article}\""
+msgstr ""
+
+#: extensions/base/translate.py:188
#, python-brace-format
msgid ""
"[{author}]({author_url}) completed deletion of translation page [{article}]"
"({article_url}){comment}"
msgstr ""
-#: src/rc_formatters.py:556
+#: extensions/base/translate.py:203
+#, python-brace-format
+msgid ""
+"Failed to delete \"{article}\" which belongs to translation page \"{target}\""
+msgstr ""
+
+#: extensions/base/translate.py:215
#, python-brace-format
msgid ""
"[{author}]({author_url}) failed to delete [{article}]({article_url}) which "
"belongs to translation page [{target}]({target_url}){comment}"
msgstr ""
-#: src/rc_formatters.py:564
+#: extensions/base/translate.py:231
+#, python-brace-format
+msgid "Encouraged translation of \"{article}\""
+msgstr ""
+
+#: extensions/base/translate.py:240
#, python-brace-format
msgid ""
"[{author}]({author_url}) encouraged translation of [{article}]({article_url})"
"{comment}"
msgstr ""
-#: src/rc_formatters.py:571
+#: extensions/base/translate.py:255
+#, python-brace-format
+msgid "Discouraged translation of \"{article}\""
+msgstr ""
+
+#: extensions/base/translate.py:264
#, python-brace-format
msgid ""
"[{author}]({author_url}) discouraged translation of [{article}]"
"({article_url}){comment}"
msgstr ""
-#: src/rc_formatters.py:581
+#: extensions/base/translate.py:282
+#, python-brace-format
+msgid "Limited languages for \"{article}\" to `{languages}`"
+msgstr ""
+
+#: extensions/base/translate.py:285
+#, python-brace-format
+msgid "Priority languages for \"{article}\" set to `{languages}`"
+msgstr ""
+
+#: extensions/base/translate.py:288
+#, python-brace-format
+msgid "Removed priority languages from \"{article}\""
+msgstr ""
+
+#: extensions/base/translate.py:301
#, python-brace-format
msgid ""
"[{author}]({author_url}) limited languages for [{article}]({article_url}) to "
"`{languages}`{comment}"
msgstr ""
-#: src/rc_formatters.py:587
+#: extensions/base/translate.py:308
#, python-brace-format
msgid ""
"[{author}]({author_url}) set the priority languages for [{article}]"
"({article_url}) to `{languages}`{comment}"
msgstr ""
-#: src/rc_formatters.py:593
+#: extensions/base/translate.py:315
#, python-brace-format
msgid ""
"[{author}]({author_url}) removed priority languages from [{article}]"
"({article_url}){comment}"
msgstr ""
-#: src/rc_formatters.py:600
+#: extensions/base/translate.py:331
+#, python-brace-format
+msgid "Added translatable page \"{article}\" to aggregate group \"{group}\""
+msgstr ""
+
+#: extensions/base/translate.py:342
#, python-brace-format
msgid ""
"[{author}]({author_url}) added translatable page [{article}]({article_url}) "
"to aggregate group \"{group}\"{comment}"
msgstr ""
-#: src/rc_formatters.py:607
+#: extensions/base/translate.py:357
+#, python-brace-format
+msgid ""
+"Removed translatable page \"{article}\" from aggregate group \"{group}\""
+msgstr ""
+
+#: extensions/base/translate.py:368
#, python-brace-format
msgid ""
"[{author}]({author_url}) removed translatable page [{article}]"
"({article_url}) from aggregate group \"{group}\"{comment}"
msgstr ""
-#: src/rc_formatters.py:619
+#: extensions/base/translate.py:387
+#, python-brace-format
+msgid "Reviewed translation \"{article}\""
+msgstr ""
+
+#: extensions/base/translate.py:401
#, python-brace-format
msgid ""
"[{author}]({author_url}) reviewed translation [{article}]({article_url})"
"{comment}"
msgstr ""
-#: src/rc_formatters.py:627
+#: extensions/base/translate.py:416
+#, python-brace-format
+msgid "Changed the state of `{language}` translations of \"{article}\""
+msgstr ""
+
+#: extensions/base/translate.py:419
+msgid "Old state"
+msgstr ""
+
+#: extensions/base/translate.py:420
+msgid "New state"
+msgstr ""
+
+#: extensions/base/translate.py:431
#, python-brace-format
msgid ""
"[{author}]({author_url}) changed the state of `{language}` translations of "
"[{article}]({article_url}) from `{old_state}` to `{new_state}`{comment}"
msgstr ""
-#: src/rc_formatters.py:634
+#: extensions/base/translate.py:439
#, python-brace-format
msgid ""
"[{author}]({author_url}) changed the state of `{language}` translations of "
"[{article}]({article_url}) to `{new_state}`{comment}"
msgstr ""
-#: src/rc_formatters.py:643 src/rc_formatters.py:646 src/rc_formatters.py:1238
-#: src/rc_formatters.py:1241
+#: extensions/base/translate.py:452 extensions/base/translate.py:455
msgid "(default)"
msgstr ""
-#: src/rc_formatters.py:647
+#: extensions/base/translate.py:464
+#, python-brace-format
+msgid "Changed the language of \"{article}\""
+msgstr ""
+
+#: extensions/base/translate.py:465
+msgid "Old language"
+msgstr ""
+
+#: extensions/base/translate.py:466
+msgid "New language"
+msgstr ""
+
+#: extensions/base/translate.py:477
#, python-brace-format
msgid ""
"[{author}]({author_url}) changed the language of [{article}]({article_url}) "
"from {old_lang} to {new_lang}{comment}"
msgstr ""
-#: src/rc_formatters.py:656
+#: extensions/base/discussions.py:148 extensions/base/discussions.py:207
+#: extensions/base/discussions.py:245 extensions/base/discussions.py:261
+#: extensions/base/discussions.py:284 extensions/base/discussions.py:306
+#: extensions/base/discussions.py:334 extensions/base/discussions.py:354
+msgid "unknown"
+msgstr ""
+
+#: extensions/base/discussions.py:157
+#, python-brace-format
+msgid "Created \"{title}\""
+msgstr ""
+
+#: extensions/base/discussions.py:161
+#, python-brace-format
+msgid "Created a poll \"{title}\""
+msgstr ""
+
+#: extensions/base/discussions.py:168
+msgid "Option {}"
+msgstr ""
+
+#: extensions/base/discussions.py:170
+#, python-brace-format
+msgid "__[View image]({image_url})__"
+msgstr ""
+
+#: extensions/base/discussions.py:174
+#, python-brace-format
+msgid "Created a quiz \"{title}\""
+msgstr ""
+
+#: extensions/base/discussions.py:193 extensions/base/discussions.py:195
+msgctxt "Fandom discussions Tags/Forums"
+msgid "Tags"
+msgstr ""
+
+#: extensions/base/discussions.py:193
+msgctxt "Fandom discussions amount of Tags/Forums"
+msgid "{} tags"
+msgstr ""
+
+#: extensions/base/discussions.py:198
+#, python-brace-format
+msgid "Replied to \"{title}\""
+msgstr ""
+
+#: extensions/base/discussions.py:214
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) created [{title}](<{url}f/p/{threadId}>) in "
+"{forumName}"
+msgstr ""
+
+#: extensions/base/discussions.py:217
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) created a poll [{title}](<{url}f/p/{threadId}>) in "
+"{forumName}"
+msgstr ""
+
+#: extensions/base/discussions.py:220
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) created a quiz [{title}](<{url}f/p/{threadId}>) in "
+"{forumName}"
+msgstr ""
+
+#: extensions/base/discussions.py:234
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) created a [reply](<{url}f/p/{threadId}/r/{postId}>) "
+"to [{title}](<{url}f/p/{threadId}>) in {forumName}"
+msgstr ""
+
+#: extensions/base/discussions.py:292
+#, python-brace-format
+msgid "Created \"{title}\" on {user}'s Message Wall"
+msgstr ""
+
+#: extensions/base/discussions.py:298
+#, python-brace-format
+msgid "Replied to \"{title}\" on {user}'s Message Wall"
+msgstr ""
+
+#: extensions/base/discussions.py:312
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) created [{title}](<{url}wiki/Message_Wall:"
+"{user_wall}?threadId={threadId}>) on [{user}'s Message Wall](<{url}wiki/"
+"Message_Wall:{user_wall}>)"
+msgstr ""
+
+#: extensions/base/discussions.py:318
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) created a [reply](<{url}wiki/Message_Wall:"
+"{user_wall}?threadId={threadId}#{replyId}>) to [{title}](<{url}wiki/"
+"Message_Wall:{user_wall}?threadId={threadId}>) on [{user}'s Message Wall]"
+"(<{url}wiki/Message_Wall:{user_wall}>)"
+msgstr ""
+
+#: extensions/base/discussions.py:338
+#, python-brace-format
+msgid "Commented on {article}"
+msgstr ""
+
+#: extensions/base/discussions.py:344
+#, python-brace-format
+msgid "Replied to a comment on {article}"
+msgstr ""
+
+#: extensions/base/discussions.py:359
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) created a [comment](<{url}?commentId={commentId}>) "
+"on [{article}](<{url}>)"
+msgstr ""
+
+#: extensions/base/discussions.py:365
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) created a [reply](<{url}?commentId={commentId}"
+"&replyId={replyId}>) to a [comment](<{url}?commentId={commentId}>) on "
+"[{article}](<{url}>)"
+msgstr ""
+
+#: extensions/base/managewiki.py:34
+msgid "Changed wiki settings"
+msgstr ""
+
+#: extensions/base/managewiki.py:44
+#, python-brace-format
+msgid "[{author}]({author_url}) changed wiki settings{reason}"
+msgstr ""
+
+#: extensions/base/managewiki.py:55
+#, python-brace-format
+msgid "Deleted a \"{wiki}\" wiki"
+msgstr ""
+
+#: extensions/base/managewiki.py:55 extensions/base/managewiki.py:67
+#: extensions/base/managewiki.py:103 extensions/base/managewiki.py:112
+#: extensions/base/managewiki.py:125 extensions/base/managewiki.py:126
+#: extensions/base/managewiki.py:135 extensions/base/managewiki.py:136
+#: extensions/base/managewiki.py:148 extensions/base/managewiki.py:149
+#: extensions/base/managewiki.py:160 extensions/base/managewiki.py:161
+#: extensions/base/managewiki.py:195 extensions/base/managewiki.py:204
+#: extensions/base/managewiki.py:217 extensions/base/managewiki.py:226
+#: extensions/base/abusefilter.py:55 extensions/base/abusefilter.py:56
+#: extensions/base/abusefilter.py:57 extensions/base/abusefilter.py:68
+#: extensions/base/abusefilter.py:69 extensions/base/abusefilter.py:70
+#: extensions/base/mediawiki.py:743
+msgid "Unknown"
+msgstr ""
+
+#: extensions/base/managewiki.py:63
+#, python-brace-format
+msgid "[{author}]({author_url}) deleted a wiki *{wiki_name}*{comment}"
+msgstr ""
+
+#: extensions/base/managewiki.py:80
+#, python-brace-format
+msgid "Deleted a \"{group}\" user group"
+msgstr ""
+
+#: extensions/base/managewiki.py:89
+#, python-brace-format
+msgid "[{author}]({author_url}) deleted a usergroup *{group}*{comment}"
+msgstr ""
+
+#: extensions/base/managewiki.py:103
+#, python-brace-format
+msgid "Locked a \"{wiki}\" wiki"
+msgstr ""
+
+#: extensions/base/managewiki.py:111
+#, python-brace-format
+msgid "[{author}]({author_url}) locked a wiki *{wiki_name}*{comment}"
+msgstr ""
+
+#: extensions/base/managewiki.py:124
+#, python-brace-format
+msgid "Modified \"{namespace_name}\" namespace"
+msgstr ""
+
+#: extensions/base/managewiki.py:126 extensions/base/managewiki.py:149
+msgid "Wiki"
+msgstr ""
+
+#: extensions/base/managewiki.py:134
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) modified namespace *{namespace_name}* on "
+"*{wiki_name}*{comment}"
+msgstr ""
+
+#: extensions/base/managewiki.py:147
+#, python-brace-format
+msgid "Deleted a \"{namespace_name}\" namespace"
+msgstr ""
+
+#: extensions/base/managewiki.py:158
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) deleted a namespace *{namespace_name}* on "
+"*{wiki_name}*{comment}"
+msgstr ""
+
+#: extensions/base/managewiki.py:173
+#, python-brace-format
+msgid "Modified \"{usergroup_name}\" usergroup"
+msgstr ""
+
+#: extensions/base/managewiki.py:182
+#, python-brace-format
+msgid "[{author}]({author_url}) modified user group *{group_name}*{comment}"
+msgstr ""
+
+#: extensions/base/managewiki.py:195
+#, python-brace-format
+msgid "Undeleted a \"{wiki}\" wiki"
+msgstr ""
+
+#: extensions/base/managewiki.py:203
+#, python-brace-format
+msgid "[{author}]({author_url}) undeleted a wiki *{wiki_name}*{comment}"
+msgstr ""
+
+#: extensions/base/managewiki.py:217
+#, python-brace-format
+msgid "Unlocked a \"{wiki}\" wiki"
+msgstr ""
+
+#: extensions/base/managewiki.py:225
+#, python-brace-format
+msgid "[{author}]({author_url}) unlocked a wiki *{wiki_name}*{comment}"
+msgstr ""
+
+#: extensions/base/datadump.py:36
+#, python-brace-format
+msgid "Generated {file} dump"
+msgstr ""
+
+#: extensions/base/datadump.py:45
+#, python-brace-format
+msgid "[{author}]({author_url}) generated *{file}* dump{comment}"
+msgstr ""
+
+#: extensions/base/datadump.py:58
+#, python-brace-format
+msgid "Deleted {file} dump"
+msgstr ""
+
+#: extensions/base/datadump.py:67
+#, python-brace-format
+msgid "[{author}]({author_url}) deleted *{file}* dump{comment}"
+msgstr ""
+
+#: extensions/base/curseprofile.py:40
+#, python-brace-format
+msgid "Edited {target}'s profile"
+msgstr ""
+
+#: extensions/base/curseprofile.py:42
+msgid "Edited their own profile"
+msgstr ""
+
+#: extensions/base/curseprofile.py:44
+#, python-brace-format
+msgid "Cleared the {field} field"
+msgstr ""
+
+#: extensions/base/curseprofile.py:46
+#, python-brace-format
+msgid "{field} field changed to: {desc}"
+msgstr ""
+
+#: extensions/base/curseprofile.py:58
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) cleared the {field} on [{target}]({target_url})'s "
+"profile."
+msgstr ""
+
+#: extensions/base/curseprofile.py:60
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) edited the {field} on [{target}]({target_url})'s "
+"profile. *({desc})*"
+msgstr ""
+
+#: extensions/base/curseprofile.py:65
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) cleared the {field} on [their own]({target_url}) "
+"profile."
+msgstr ""
+
+#: extensions/base/curseprofile.py:67
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) edited the {field} on [their own]({target_url}) "
+"profile. *({desc})*"
+msgstr ""
+
+#: extensions/base/curseprofile.py:82
+#, python-brace-format
+msgid "Left a comment on {target}'s profile"
+msgstr ""
+
+#: extensions/base/curseprofile.py:84
+msgid "Left a comment on their own profile"
+msgstr ""
+
+#: extensions/base/curseprofile.py:97
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) left a [comment]({comment}) on {target}'s profile."
+msgstr ""
+
+#: extensions/base/curseprofile.py:100
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) left a [comment]({comment}) on their own profile."
+msgstr ""
+
+#: extensions/base/curseprofile.py:113
+#, python-brace-format
+msgid "Edited a comment on {target}'s profile"
+msgstr ""
+
+#: extensions/base/curseprofile.py:115
+msgid "Edited a comment on their own profile"
+msgstr ""
+
+#: extensions/base/curseprofile.py:128
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) edited a [comment]({comment}) on {target}'s profile."
+msgstr ""
+
+#: extensions/base/curseprofile.py:131
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) edited a [comment]({comment}) on their own profile."
+msgstr ""
+
+#: extensions/base/curseprofile.py:144
+#, python-brace-format
+msgid "Replied to a comment on {target}'s profile"
+msgstr ""
+
+#: extensions/base/curseprofile.py:146
+msgid "Replied to a comment on their own profile"
+msgstr ""
+
+#: extensions/base/curseprofile.py:159
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) replied to a [comment]({comment}) on {target}'s "
+"profile."
+msgstr ""
+
+#: extensions/base/curseprofile.py:162
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) replied to a [comment]({comment}) on their own "
+"profile."
+msgstr ""
+
+#: extensions/base/curseprofile.py:175
+#, python-brace-format
+msgid "Deleted a comment on {target}'s profile"
+msgstr ""
+
+#: extensions/base/curseprofile.py:177
+msgid "Deleted a comment on their own profile"
+msgstr ""
+
+#: extensions/base/curseprofile.py:197
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) deleted a [comment]({comment}) on {target}'s "
+"profile.{reason}"
+msgstr ""
+
+#: extensions/base/curseprofile.py:200
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) deleted a [comment]({comment}) on their own profile."
+"{reason}"
+msgstr ""
+
+#: extensions/base/curseprofile.py:214
+#, python-brace-format
+msgid "Purged a comment on {target}'s profile"
+msgstr ""
+
+#: extensions/base/curseprofile.py:216
+msgid "Purged a comment on their own profile"
+msgstr ""
+
+#: extensions/base/curseprofile.py:230
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) purged a comment on [{target}]({link})'s profile."
+"{reason}"
+msgstr ""
+
+#: extensions/base/curseprofile.py:233
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) purged a comment on [their own]({link}) profile."
+"{reason}"
+msgstr ""
+
+#: extensions/base/renameuser.py:38
+#, python-brace-format
+msgid "Renamed user \"{old_name}\" with {edits} edit to \"{new_name}\""
+msgid_plural "Renamed user \"{old_name}\" with {edits} edits to \"{new_name}\""
+msgstr[0] ""
+msgstr[1] ""
+
+#: extensions/base/renameuser.py:43
+#, python-brace-format
+msgid "Renamed user \"{old_name}\" to \"{new_name}\""
+msgstr ""
+
+#: extensions/base/renameuser.py:58
#, python-brace-format
msgid ""
"[{author}]({author_url}) renamed user *{old_name}* with {edits} edit to "
@@ -744,644 +775,831 @@ msgid_plural ""
msgstr[0] ""
msgstr[1] ""
-#: src/rc_formatters.py:661
+#: extensions/base/renameuser.py:66
#, python-brace-format
msgid ""
"[{author}]({author_url}) renamed user *{old_name}* to [{new_name}]({link})"
"{comment}"
msgstr ""
-#: src/rc_formatters.py:665
-msgid "An action has been hidden by administration."
+#: extensions/base/interwiki.py:37
+msgid "Added an entry to the interwiki table"
msgstr ""
-#: src/rc_formatters.py:672
+#: extensions/base/interwiki.py:38 extensions/base/interwiki.py:65
+#, python-brace-format
+msgid "Prefix: {prefix}, website: {website} | {desc}"
+msgstr ""
+
+#: extensions/base/interwiki.py:50
#, python-brace-format
msgid ""
-"Unknown event `{event}` by [{author}]({author_url}), report it on the "
-"[support server](<{support}>)."
+"[{author}]({author_url}) added an entry to the [interwiki table]"
+"({table_url}) pointing to {website} with {prefix} prefix"
msgstr ""
-#: src/rc_formatters.py:681
+#: extensions/base/interwiki.py:64
+msgid "Edited an entry in interwiki table"
+msgstr ""
+
+#: extensions/base/interwiki.py:77
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) edited an entry in [interwiki table]({table_url}) "
+"pointing to {website} with {prefix} prefix"
+msgstr ""
+
+#: extensions/base/interwiki.py:91
+msgid "Deleted an entry in interwiki table"
+msgstr ""
+
+#: extensions/base/interwiki.py:92
+#, python-brace-format
+msgid "Prefix: {prefix} | {desc}"
+msgstr ""
+
+#: extensions/base/interwiki.py:102
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) deleted an entry in [interwiki table]({table_url})"
+"{desc}"
+msgstr ""
+
+#: extensions/base/abusefilter.py:29
+msgid "None"
+msgstr ""
+
+#: extensions/base/abusefilter.py:29
+msgid "Warning issued"
+msgstr ""
+
+#: extensions/base/abusefilter.py:29
+msgid "**Blocked user**"
+msgstr ""
+
+#: extensions/base/abusefilter.py:29
+msgid "Tagged the edit"
+msgstr ""
+
+#: extensions/base/abusefilter.py:29
+msgid "Disallowed the action"
+msgstr ""
+
+#: extensions/base/abusefilter.py:29
+msgid "**IP range blocked**"
+msgstr ""
+
+#: extensions/base/abusefilter.py:29
+msgid "Throttled actions"
+msgstr ""
+
+#: extensions/base/abusefilter.py:29
+msgid "Removed autoconfirmed group"
+msgstr ""
+
+#: extensions/base/abusefilter.py:29
+msgid "**Removed from privileged groups**"
+msgstr ""
+
+#: extensions/base/abusefilter.py:30
+msgid "Edit"
+msgstr ""
+
+#: extensions/base/abusefilter.py:30
+msgid "Upload"
+msgstr ""
+
+#: extensions/base/abusefilter.py:30
+msgid "Move"
+msgstr ""
+
+#: extensions/base/abusefilter.py:30
+msgid "Stash upload"
+msgstr ""
+
+#: extensions/base/abusefilter.py:30
+msgid "Deletion"
+msgstr ""
+
+#: extensions/base/abusefilter.py:30
+msgid "Account creation"
+msgstr ""
+
+#: extensions/base/abusefilter.py:30
+msgid "Auto account creation"
+msgstr ""
+
+#: extensions/base/abusefilter.py:54
#, python-brace-format
msgid "{user} triggered \"{abuse_filter}\""
msgstr ""
-#: src/rc_formatters.py:682
+#: extensions/base/abusefilter.py:55
msgid "Performed"
msgstr ""
-#: src/rc_formatters.py:683
+#: extensions/base/abusefilter.py:56
msgid "Action taken"
msgstr ""
-#: src/rc_formatters.py:684
+#: extensions/base/abusefilter.py:57
msgid "Title"
msgstr ""
-#: src/rc_formatters.py:693 src/rc_formatters.py:980
-msgid "No description provided"
+#: extensions/base/abusefilter.py:66
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) triggered *{abuse_filter}*, performing the action "
+"\"{action}\" on *[{target}]({target_url})* - action taken: {result}."
msgstr ""
-#: src/rc_formatters.py:717
+#: extensions/base/abusefilter.py:83
+#, python-brace-format
+msgid "Edited abuse filter number {number}"
+msgstr ""
+
+#: extensions/base/abusefilter.py:95
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) edited abuse filter [number {number}]({filter_url})"
+msgstr ""
+
+#: extensions/base/abusefilter.py:111
+#, python-brace-format
+msgid "Created abuse filter number {number}"
+msgstr ""
+
+#: extensions/base/abusefilter.py:119
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) created abuse filter [number {number}]({filter_url})"
+msgstr ""
+
+#: extensions/base/mediawiki.py:37
+msgid "director"
+msgstr ""
+
+#: extensions/base/mediawiki.py:37
+msgid "bot"
+msgstr ""
+
+#: extensions/base/mediawiki.py:37
+msgid "editor"
+msgstr ""
+
+#: extensions/base/mediawiki.py:37
+msgid "directors"
+msgstr ""
+
+#: extensions/base/mediawiki.py:37
+msgid "sysop"
+msgstr ""
+
+#: extensions/base/mediawiki.py:37
+msgid "bureaucrat"
+msgstr ""
+
+#: extensions/base/mediawiki.py:37
+msgid "reviewer"
+msgstr ""
+
+#: extensions/base/mediawiki.py:38
+msgid "autoreview"
+msgstr ""
+
+#: extensions/base/mediawiki.py:38
+msgid "autopatrol"
+msgstr ""
+
+#: extensions/base/mediawiki.py:38
+msgid "wiki_guardian"
+msgstr ""
+
+#: extensions/base/mediawiki.py:70
msgid "(N!) "
msgstr ""
-#: src/rc_formatters.py:718
+#: extensions/base/mediawiki.py:71
msgid "m"
msgstr ""
-#: src/rc_formatters.py:718
+#: extensions/base/mediawiki.py:72
msgid "b"
msgstr ""
-#: src/rc_formatters.py:735 src/rc_formatters.py:740
-msgid "__Only whitespace__"
+#: extensions/base/mediawiki.py:112
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) edited [{article}]({edit_link}){comment} {bold}"
+"({sign}{edit_size}){bold}"
msgstr ""
-#: src/rc_formatters.py:745
-msgid "Removed"
+#: extensions/base/mediawiki.py:117
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) created [{article}]({edit_link}){comment} {bold}"
+"({sign}{edit_size}){bold}"
msgstr ""
-#: src/rc_formatters.py:747
-msgid "Added"
-msgstr ""
-
-#: src/rc_formatters.py:781 src/rc_formatters.py:820
+#: extensions/base/mediawiki.py:190 extensions/base/mediawiki.py:223
msgid "Options"
msgstr ""
-#: src/rc_formatters.py:781
+#: extensions/base/mediawiki.py:190
#, python-brace-format
msgid "([preview]({link}) | [undo]({undolink}))"
msgstr ""
-#: src/rc_formatters.py:786
+#: extensions/base/mediawiki.py:195
#, python-brace-format
msgid "Uploaded a new version of {name}"
msgstr ""
-#: src/rc_formatters.py:788
+#: extensions/base/mediawiki.py:197
#, python-brace-format
msgid "Reverted a version of {name}"
msgstr ""
-#: src/rc_formatters.py:790
+#: extensions/base/mediawiki.py:199
#, python-brace-format
msgid "Uploaded {name}"
msgstr ""
-#: src/rc_formatters.py:806
+#: extensions/base/mediawiki.py:208
msgid "**No license!**"
msgstr ""
-#: src/rc_formatters.py:818
+#: extensions/base/mediawiki.py:223
+#, python-brace-format
+msgid "([preview]({link}))"
+msgstr ""
+
+#: extensions/base/mediawiki.py:228
msgid ""
"\n"
"License: {}"
msgstr ""
-#: src/rc_formatters.py:820
+#: extensions/base/mediawiki.py:237
#, python-brace-format
-msgid "([preview]({link}))"
+msgid ""
+"[{author}]({author_url}) reverted a version of [{file}]({file_link}){comment}"
msgstr ""
-#: src/rc_formatters.py:825
+#: extensions/base/mediawiki.py:248
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) uploaded a new version of [{file}]({file_link})"
+"{comment}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:259
+#, python-brace-format
+msgid "[{author}]({author_url}) uploaded [{file}]({file_link}){comment}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:274
#, python-brace-format
msgid "Deleted page {article}"
msgstr ""
-#: src/rc_formatters.py:830
+#: extensions/base/mediawiki.py:283
+#, python-brace-format
+msgid "[{author}]({author_url}) deleted [{page}]({page_link}){comment}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:298
#, python-brace-format
msgid "Deleted redirect {article} by overwriting"
msgstr ""
-#: src/rc_formatters.py:836
-msgid "No redirect has been made"
-msgstr ""
-
-#: src/rc_formatters.py:837
-msgid "A redirect has been made"
-msgstr ""
-
-#: src/rc_formatters.py:838
+#: extensions/base/mediawiki.py:308
#, python-brace-format
-msgid "Moved {redirect}{article} to {target}"
+msgid ""
+"[{author}]({author_url}) deleted redirect by overwriting [{page}]"
+"({page_link}){comment}"
msgstr ""
-#: src/rc_formatters.py:841
+#: extensions/base/mediawiki.py:322
#, python-brace-format
-msgid "Moved {redirect}{article} to {title} over redirect"
+msgid "Restored {article}"
msgstr ""
-#: src/rc_formatters.py:845
+#: extensions/base/mediawiki.py:331
#, python-brace-format
-msgid "Moved protection settings from {redirect}{article} to {title}"
+msgid "[{author}]({author_url}) restored [{article}]({article_url}){comment}"
msgstr ""
-#: src/rc_formatters.py:869
-msgid "unknown expiry time"
+#: extensions/base/mediawiki.py:348
+msgid "Changed visibility of log events"
msgstr ""
-#: src/rc_formatters.py:874
-msgid "Blocked from editing the following pages: "
-msgstr ""
-
-#: src/rc_formatters.py:883
-msgid "Blocked from editing pages on following namespaces: "
-msgstr ""
-
-#: src/rc_formatters.py:894
-msgid "Partial block details"
-msgstr ""
-
-#: src/rc_formatters.py:895
+#: extensions/base/mediawiki.py:356
#, python-brace-format
-msgid "Blocked {blocked_user} {time}"
+msgid "[{author}]({author_url}) changed visibility of log events{comment}"
msgstr ""
-#: src/rc_formatters.py:899
-#, python-brace-format
-msgid "Changed block settings for {blocked_user}"
-msgstr ""
-
-#: src/rc_formatters.py:903
-#, python-brace-format
-msgid "Unblocked {blocked_user}"
-msgstr ""
-
-#: src/rc_formatters.py:910
-#, python-brace-format
-msgid "Left a comment on {target}'s profile"
-msgstr ""
-
-#: src/rc_formatters.py:912
-msgid "Left a comment on their own profile"
-msgstr ""
-
-#: src/rc_formatters.py:919
-#, python-brace-format
-msgid "Replied to a comment on {target}'s profile"
-msgstr ""
-
-#: src/rc_formatters.py:921
-msgid "Replied to a comment on their own profile"
-msgstr ""
-
-#: src/rc_formatters.py:928
-#, python-brace-format
-msgid "Edited a comment on {target}'s profile"
-msgstr ""
-
-#: src/rc_formatters.py:930
-msgid "Edited a comment on their own profile"
-msgstr ""
-
-#: src/rc_formatters.py:935
-#, python-brace-format
-msgid "Edited {target}'s profile"
-msgstr ""
-
-#: src/rc_formatters.py:937
-msgid "Edited their own profile"
-msgstr ""
-
-#: src/rc_formatters.py:939
-#, python-brace-format
-msgid "Cleared the {field} field"
-msgstr ""
-
-#: src/rc_formatters.py:941
-#, python-brace-format
-msgid "{field} field changed to: {desc}"
-msgstr ""
-
-#: src/rc_formatters.py:946
-#, python-brace-format
-msgid "Purged a comment on {target}'s profile"
-msgstr ""
-
-#: src/rc_formatters.py:948
-msgid "Purged a comment on their own profile"
-msgstr ""
-
-#: src/rc_formatters.py:956
-#, python-brace-format
-msgid "Deleted a comment on {target}'s profile"
-msgstr ""
-
-#: src/rc_formatters.py:958
-msgid "Deleted a comment on their own profile"
-msgstr ""
-
-#: src/rc_formatters.py:962
-#, python-brace-format
-msgid "Changed group membership for {target}"
-msgstr ""
-
-#: src/rc_formatters.py:966
-#, python-brace-format
-msgid "{target} got autopromoted to a new usergroup"
-msgstr ""
-
-#: src/rc_formatters.py:981
-#, python-brace-format
-msgid "Groups changed from {old_groups} to {new_groups}{reason}"
-msgstr ""
-
-#: src/rc_formatters.py:985
-#, python-brace-format
-msgid "Protected {target}"
-msgstr ""
-
-#: src/rc_formatters.py:991
-#, python-brace-format
-msgid "Changed protection level for {article}"
-msgstr ""
-
-#: src/rc_formatters.py:997
-#, python-brace-format
-msgid "Removed protection from {article}"
-msgstr ""
-
-#: src/rc_formatters.py:1001
+#: extensions/base/mediawiki.py:370
#, python-brace-format
msgid "Changed visibility of revision on page {article} "
msgid_plural "Changed visibility of {amount} revisions on page {article} "
msgstr[0] ""
msgstr[1] ""
-#: src/rc_formatters.py:1013
+#: extensions/base/mediawiki.py:383
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) changed visibility of revision on page [{article}]"
+"({article_url}){comment}"
+msgid_plural ""
+"[{author}]({author_url}) changed visibility of {amount} revisions on page "
+"[{article}]({article_url}){comment}"
+msgstr[0] ""
+msgstr[1] ""
+
+#: extensions/base/mediawiki.py:399 extensions/base/mediawiki.py:432
+msgid "No redirect has been made"
+msgstr ""
+
+#: extensions/base/mediawiki.py:400 extensions/base/mediawiki.py:433
+msgid "A redirect has been made"
+msgstr ""
+
+#: extensions/base/mediawiki.py:401
+#, python-brace-format
+msgid "Moved {redirect}{article} to {target}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:412 extensions/base/mediawiki.py:444
+msgid "without making a redirect"
+msgstr ""
+
+#: extensions/base/mediawiki.py:413 extensions/base/mediawiki.py:445
+msgid "with a redirect"
+msgstr ""
+
+#: extensions/base/mediawiki.py:416
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) moved {redirect}*{article}* to [{target}]"
+"({target_url}) {made_a_redirect}{comment}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:434
+#, python-brace-format
+msgid "Moved {redirect}{article} to {title} over redirect"
+msgstr ""
+
+#: extensions/base/mediawiki.py:448
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) moved {redirect}*{article}* over redirect to "
+"[{target}]({target_url}) {made_a_redirect}{comment}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:464
+#, python-brace-format
+msgid "Moved protection settings from {redirect}{article} to {title}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:477
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) moved protection settings from {redirect}*{article}"
+"* to [{target}]({target_url}){comment}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:492
+#, python-brace-format
+msgid "Protected {target}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:495 extensions/base/mediawiki.py:510
+#: extensions/base/mediawiki.py:526 extensions/base/mediawiki.py:541
+msgid " [cascading]"
+msgstr ""
+
+#: extensions/base/mediawiki.py:506
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) protected [{article}]({article_url}) with the "
+"following settings: {settings}{comment}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:523
+#, python-brace-format
+msgid "Changed protection level for {article}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:537
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) modified protection settings of [{article}]"
+"({article_url}) to: {settings}{comment}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:554
+#, python-brace-format
+msgid "Removed protection from {article}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:563
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) removed protection from [{article}]({article_url})"
+"{comment}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:572
+msgid "for infinity and beyond"
+msgstr ""
+
+#: extensions/base/mediawiki.py:581
+msgid "for less than a minute"
+msgstr ""
+
+#: extensions/base/mediawiki.py:583
+msgid "year"
+msgid_plural "years"
+msgstr[0] ""
+msgstr[1] ""
+
+#: extensions/base/mediawiki.py:583
+msgid "day"
+msgid_plural "days"
+msgstr[0] ""
+msgstr[1] ""
+
+#: extensions/base/mediawiki.py:583
+msgid "hour"
+msgid_plural "hours"
+msgstr[0] ""
+msgstr[1] ""
+
+#: extensions/base/mediawiki.py:584
+msgid "minute"
+msgid_plural "minutes"
+msgstr[0] ""
+msgstr[1] ""
+
+#: extensions/base/mediawiki.py:589
+#, python-brace-format
+msgid "for {time_number} {time_unit}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:608
+msgid "Blocked from editing the following pages: "
+msgstr ""
+
+#: extensions/base/mediawiki.py:615 extensions/base/mediawiki.py:661
+msgid " and namespaces: "
+msgstr ""
+
+#: extensions/base/mediawiki.py:617
+msgid "Blocked from editing pages on following namespaces: "
+msgstr ""
+
+#: extensions/base/mediawiki.py:628
+msgid "Partial block details"
+msgstr ""
+
+#: extensions/base/mediawiki.py:631
+msgid "Block flags"
+msgstr ""
+
+#: extensions/base/mediawiki.py:633
+#, python-brace-format
+msgid "Blocked {blocked_user} {time}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:653
+msgid " on pages: "
+msgstr ""
+
+#: extensions/base/mediawiki.py:663
+msgid " on namespaces: "
+msgstr ""
+
+#: extensions/base/mediawiki.py:675
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) blocked [{user}]({user_url}) {time}"
+"{restriction_desc}{comment}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:693
+#, python-brace-format
+msgid "Changed block settings for {blocked_user}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:703
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) changed block settings for [{blocked_user}]"
+"({user_url}){comment}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:716
+#, python-brace-format
+msgid "Unblocked {blocked_user}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:726
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) unblocked [{blocked_user}]({user_url}){comment}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:742
+msgid "Action has been hidden by administration"
+msgstr ""
+
+#: extensions/base/mediawiki.py:749
+msgid "An action has been hidden by administration."
+msgstr ""
+
+#: extensions/base/mediawiki.py:760
#, python-brace-format
msgid "Imported {article} with {count} revision"
msgid_plural "Imported {article} with {count} revisions"
msgstr[0] ""
msgstr[1] ""
-#: src/rc_formatters.py:1018
+#: extensions/base/mediawiki.py:771
#, python-brace-format
-msgid "Restored {article}"
-msgstr ""
+msgid ""
+"[{author}]({author_url}) imported [{article}]({article_url}) with {count} "
+"revision{comment}"
+msgid_plural ""
+"[{author}]({author_url}) imported [{article}]({article_url}) with {count} "
+"revisions{comment}"
+msgstr[0] ""
+msgstr[1] ""
-#: src/rc_formatters.py:1021
-msgid "Changed visibility of log events"
-msgstr ""
-
-#: src/rc_formatters.py:1031
+#: extensions/base/mediawiki.py:787
#, python-brace-format
msgid "Imported {article} with {count} revision from \"{source}\""
msgid_plural "Imported {article} with {count} revisions from \"{source}\""
msgstr[0] ""
msgstr[1] ""
-#: src/rc_formatters.py:1036
+#: extensions/base/mediawiki.py:802
#, python-brace-format
-msgid "Edited abuse filter number {number}"
+msgid ""
+"[{author}]({author_url}) imported [{article}]({article_url}) with {count} "
+"revision from [{source}]({source_url}){comment}"
+msgid_plural ""
+"[{author}]({author_url}) imported [{article}]({article_url}) with {count} "
+"revisions from [{source}]({source_url}){comment}"
+msgstr[0] ""
+msgstr[1] ""
+
+#: extensions/base/mediawiki.py:817
+#, python-brace-format
+msgid " (until {date_and_time})"
msgstr ""
-#: src/rc_formatters.py:1039
+#: extensions/base/mediawiki.py:834
#, python-brace-format
-msgid "Created abuse filter number {number}"
+msgid "Changed group membership for {target}"
msgstr ""
-#: src/rc_formatters.py:1042
+#: extensions/base/mediawiki.py:836
+msgid "System"
+msgstr ""
+
+#: extensions/base/mediawiki.py:837
+#, python-brace-format
+msgid "{target} got autopromoted to a new usergroup"
+msgstr ""
+
+#: extensions/base/mediawiki.py:843
+msgid "Added group"
+msgid_plural "Added groups"
+msgstr[0] ""
+msgstr[1] ""
+
+#: extensions/base/mediawiki.py:845
+msgid "Removed group"
+msgid_plural "Removed groups"
+msgstr[0] ""
+msgstr[1] ""
+
+#: extensions/base/mediawiki.py:859
+#, python-brace-format
+msgid "Added to {added} and removed from {removed}."
+msgstr ""
+
+#: extensions/base/mediawiki.py:860 extensions/base/mediawiki.py:862
+#: extensions/base/mediawiki.py:864 extensions/base/mediawiki.py:871
+msgid ", "
+msgstr ""
+
+#: extensions/base/mediawiki.py:862
+#, python-brace-format
+msgid "Added to {added}."
+msgstr ""
+
+#: extensions/base/mediawiki.py:864
+#, python-brace-format
+msgid "Removed from {removed}."
+msgstr ""
+
+#: extensions/base/mediawiki.py:865
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) changed group membership for [{target}]"
+"({target_url}): {group_changes}{comment}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:869
+#, python-brace-format
+msgid "The system autopromoted [{target}]({target_url}) to {added}.{comment}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:882
#, python-brace-format
msgid "Merged revision histories of {article} into {dest}"
msgstr ""
-#: src/rc_formatters.py:1046
+#: extensions/base/mediawiki.py:896
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) merged revision histories of [{article}]"
+"({article_url}) into [{dest}]({dest_url}){comment}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:910
msgid "Created account automatically"
msgstr ""
-#: src/rc_formatters.py:1049 src/rc_formatters.py:1058
+#: extensions/base/mediawiki.py:917
+#, python-brace-format
+msgid "Account [{author}]({author_url}) was created automatically"
+msgstr ""
+
+#: extensions/base/mediawiki.py:930 extensions/base/mediawiki.py:995
msgid "Created account"
msgstr ""
-#: src/rc_formatters.py:1052
+#: extensions/base/mediawiki.py:937 extensions/base/mediawiki.py:1002
+#, python-brace-format
+msgid "Account [{author}]({author_url}) was created"
+msgstr ""
+
+#: extensions/base/mediawiki.py:949
#, python-brace-format
msgid "Created account {article}"
msgstr ""
-#: src/rc_formatters.py:1055
+#: extensions/base/mediawiki.py:958
+#, python-brace-format
+msgid ""
+"Account [{article}]({article_url}) was created by [{author}]({author_url})"
+"{comment}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:971
#, python-brace-format
msgid "Created account {article} and password was sent by email"
msgstr ""
-#: src/rc_formatters.py:1061
-msgid "Added an entry to the interwiki table"
-msgstr ""
-
-#: src/rc_formatters.py:1062 src/rc_formatters.py:1068
+#: extensions/base/mediawiki.py:982
#, python-brace-format
-msgid "Prefix: {prefix}, website: {website} | {desc}"
+msgid ""
+"Account [{article}]({article_url}) was created by [{author}]({author_url}) "
+"and password was sent by email{comment}"
msgstr ""
-#: src/rc_formatters.py:1067
-msgid "Edited an entry in interwiki table"
-msgstr ""
-
-#: src/rc_formatters.py:1073
-msgid "Deleted an entry in interwiki table"
-msgstr ""
-
-#: src/rc_formatters.py:1074
-#, python-brace-format
-msgid "Prefix: {prefix} | {desc}"
-msgstr ""
-
-#: src/rc_formatters.py:1077
+#: extensions/base/mediawiki.py:1014
#, python-brace-format
msgid "Changed the content model of the page {article}"
msgstr ""
-#: src/rc_formatters.py:1078
+#: extensions/base/mediawiki.py:1016
#, python-brace-format
msgid "Model changed from {old} to {new}: {reason}"
msgstr ""
-#: src/rc_formatters.py:1083
+#: extensions/base/mediawiki.py:1028
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) changed the content model of the page [{article}]"
+"({article_url}) from {old} to {new}{comment}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:1043
#, python-brace-format
msgid "Created the page {article} using a non-default content model"
msgstr ""
-#: src/rc_formatters.py:1084
+#: extensions/base/mediawiki.py:1045
#, python-brace-format
msgid "Created with model {new}: {reason}"
msgstr ""
-#: src/rc_formatters.py:1087
+#: extensions/base/mediawiki.py:1056
#, python-brace-format
-msgid "Edited the sprite for {article}"
+msgid ""
+"[{author}]({author_url}) created the page [{article}]({article_url}) using a "
+"non-default content model {new}{comment}"
msgstr ""
-#: src/rc_formatters.py:1090
-#, python-brace-format
-msgid "Created the sprite sheet for {article}"
-msgstr ""
-
-#: src/rc_formatters.py:1093
-#, python-brace-format
-msgid "Edited the slice for {article}"
-msgstr ""
-
-#: src/rc_formatters.py:1099
-#, python-brace-format
-msgid "Created the Cargo table \"{table}\""
-msgstr ""
-
-#: src/rc_formatters.py:1103
-#, python-brace-format
-msgid "Deleted the Cargo table \"{table}\""
-msgstr ""
-
-#: src/rc_formatters.py:1110
-#, python-brace-format
-msgid "Recreated the Cargo table \"{table}\""
-msgstr ""
-
-#: src/rc_formatters.py:1117
-#, python-brace-format
-msgid "Replaced the Cargo table \"{table}\""
-msgstr ""
-
-#: src/rc_formatters.py:1121
+#: extensions/base/mediawiki.py:1071
#, python-brace-format
msgid "Created the tag \"{tag}\""
msgstr ""
-#: src/rc_formatters.py:1125
+#: extensions/base/mediawiki.py:1081
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) created the [tag]({tag_url}) \"{tag}\"{comment}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:1102
#, python-brace-format
msgid "Deleted the tag \"{tag}\""
msgstr ""
-#: src/rc_formatters.py:1127
+#: extensions/base/mediawiki.py:1104
msgid "Removed from"
msgstr ""
-#: src/rc_formatters.py:1127
+#: extensions/base/mediawiki.py:1104
msgid "{} revision or log entry"
msgid_plural "{} revisions and/or log entries"
msgstr[0] ""
msgstr[1] ""
-#: src/rc_formatters.py:1131
+#: extensions/base/mediawiki.py:1117
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) deleted the [tag]({tag_url}) \"{tag}\"{comment}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:1127
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) deleted the [tag]({tag_url}) \"{tag}\" and removed "
+"it from {count} revision or log entry{comment}"
+msgid_plural ""
+"[{author}]({author_url}) deleted the [tag]({tag_url}) \"{tag}\" and removed "
+"it from {count} revisions and/or log entries{comment}"
+msgstr[0] ""
+msgstr[1] ""
+
+#: extensions/base/mediawiki.py:1144
#, python-brace-format
msgid "Activated the tag \"{tag}\""
msgstr ""
-#: src/rc_formatters.py:1134
+#: extensions/base/mediawiki.py:1153
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) activated the [tag]({tag_url}) \"{tag}\"{comment}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:1172
#, python-brace-format
msgid "Deactivated the tag \"{tag}\""
msgstr ""
-#: src/rc_formatters.py:1137
-msgid "Changed wiki settings"
-msgstr ""
-
-#: src/rc_formatters.py:1141
-#, python-brace-format
-msgid "Deleted a \"{wiki}\" wiki"
-msgstr ""
-
-#: src/rc_formatters.py:1144
-#, python-brace-format
-msgid "Locked a \"{wiki}\" wiki"
-msgstr ""
-
-#: src/rc_formatters.py:1147
-#, python-brace-format
-msgid "Modified \"{namespace_name}\" namespace"
-msgstr ""
-
-#: src/rc_formatters.py:1149 src/rc_formatters.py:1154
-msgid "Wiki"
-msgstr ""
-
-#: src/rc_formatters.py:1151
-#, python-brace-format
-msgid "Deleted a \"{namespace_name}\" namespace"
-msgstr ""
-
-#: src/rc_formatters.py:1157
-#, python-brace-format
-msgid "Modified \"{usergroup_name}\" usergroup"
-msgstr ""
-
-#: src/rc_formatters.py:1160
-#, python-brace-format
-msgid "Undeleted a \"{wiki}\" wiki"
-msgstr ""
-
-#: src/rc_formatters.py:1163
-#, python-brace-format
-msgid "Unlocked a \"{wiki}\" wiki"
-msgstr ""
-
-#: src/rc_formatters.py:1166
-#, python-brace-format
-msgid "Generated {file} dump"
-msgstr ""
-
-#: src/rc_formatters.py:1169
-#, python-brace-format
-msgid "Deleted {file} dump"
-msgstr ""
-
-#: src/rc_formatters.py:1177
-#, python-brace-format
-msgid "Marked \"{article}\" for translation"
-msgstr ""
-
-#: src/rc_formatters.py:1180
-#, python-brace-format
-msgid "Removed \"{article}\" from the translation system"
-msgstr ""
-
-#: src/rc_formatters.py:1183
-#, python-brace-format
-msgid "Completed moving translation pages from \"{article}\" to \"{target}\""
-msgstr ""
-
-#: src/rc_formatters.py:1186
-#, python-brace-format
-msgid "Encountered a problem while moving \"{article}\" to \"{target}\""
-msgstr ""
-
-#: src/rc_formatters.py:1189
-#, python-brace-format
-msgid "Completed deletion of translatable page \"{article}\""
-msgstr ""
-
-#: src/rc_formatters.py:1192
+#: extensions/base/mediawiki.py:1181
#, python-brace-format
msgid ""
-"Failed to delete \"{article}\" which belongs to translatable page "
-"\"{target}\""
+"[{author}]({author_url}) deactivated the [tag]({tag_url}) \"{tag}\"{comment}"
msgstr ""
-#: src/rc_formatters.py:1195
+#: extensions/base/sprite.py:37
#, python-brace-format
-msgid "Completed deletion of translation page \"{article}\""
+msgid "Edited the sprite for {article}"
msgstr ""
-#: src/rc_formatters.py:1198
+#: extensions/base/sprite.py:45
#, python-brace-format
msgid ""
-"Failed to delete \"{article}\" which belongs to translation page \"{target}\""
+"[{author}]({author_url}) edited the sprite for [{article}]({article_url})"
msgstr ""
-#: src/rc_formatters.py:1201
+#: extensions/base/sprite.py:60
#, python-brace-format
-msgid "Encouraged translation of \"{article}\""
+msgid "Created the sprite sheet for {article}"
msgstr ""
-#: src/rc_formatters.py:1204
-#, python-brace-format
-msgid "Discouraged translation of \"{article}\""
-msgstr ""
-
-#: src/rc_formatters.py:1210
-#, python-brace-format
-msgid "Limited languages for \"{article}\" to `{languages}`"
-msgstr ""
-
-#: src/rc_formatters.py:1212
-#, python-brace-format
-msgid "Priority languages for \"{article}\" set to `{languages}`"
-msgstr ""
-
-#: src/rc_formatters.py:1214
-#, python-brace-format
-msgid "Removed priority languages from \"{article}\""
-msgstr ""
-
-#: src/rc_formatters.py:1217
-#, python-brace-format
-msgid "Added translatable page \"{article}\" to aggregate group \"{group}\""
-msgstr ""
-
-#: src/rc_formatters.py:1220
+#: extensions/base/sprite.py:68
#, python-brace-format
msgid ""
-"Removed translatable page \"{article}\" from aggregate group \"{group}\""
+"[{author}]({author_url}) created the sprite sheet for [{article}]"
+"({article_url})"
msgstr ""
-#: src/rc_formatters.py:1227
+#: extensions/base/sprite.py:79
#, python-brace-format
-msgid "Reviewed translation \"{article}\""
+msgid "Edited the slice for {article}"
msgstr ""
-#: src/rc_formatters.py:1230
+#: extensions/base/sprite.py:86
#, python-brace-format
-msgid "Changed the state of `{language}` translations of \"{article}\""
-msgstr ""
-
-#: src/rc_formatters.py:1232
-msgid "Old state"
-msgstr ""
-
-#: src/rc_formatters.py:1233
-msgid "New state"
-msgstr ""
-
-#: src/rc_formatters.py:1242
-#, python-brace-format
-msgid "Changed the language of \"{article}\""
-msgstr ""
-
-#: src/rc_formatters.py:1243
-msgid "Old language"
-msgstr ""
-
-#: src/rc_formatters.py:1244
-msgid "New language"
-msgstr ""
-
-#: src/rc_formatters.py:1248
-#, python-brace-format
-msgid "Renamed user \"{old_name}\" with {edits} edit to \"{new_name}\""
-msgid_plural "Renamed user \"{old_name}\" with {edits} edits to \"{new_name}\""
-msgstr[0] ""
-msgstr[1] ""
-
-#: src/rc_formatters.py:1250
-#, python-brace-format
-msgid "Renamed user \"{old_name}\" to \"{new_name}\""
-msgstr ""
-
-#: src/rc_formatters.py:1254
-msgid "Action has been hidden by administration"
-msgstr ""
-
-#: src/rc_formatters.py:1259
-#, python-brace-format
-msgid "Unknown event `{event}`"
-msgstr ""
-
-#: src/rc_formatters.py:1265 src/rc_formatters.py:1267
-msgid "Report this on the support server"
-msgstr ""
-
-#: src/rc_formatters.py:1283
-msgid "Tags"
-msgstr ""
-
-#: src/rc_formatters.py:1288
-msgid "**Added**: "
-msgstr ""
-
-#: src/rc_formatters.py:1288
-msgid " and {} more\n"
-msgstr ""
-
-#: src/rc_formatters.py:1289
-msgid "**Removed**: "
-msgstr ""
-
-#: src/rc_formatters.py:1289
-msgid " and {} more"
-msgstr ""
-
-#: src/rc_formatters.py:1290
-msgid "Changed categories"
+msgid ""
+"[{author}]({author_url}) edited the slice for [{article}]({article_url})"
msgstr ""
diff --git a/locale/templates/misc.pot b/locale/templates/misc.pot
index 9d2716c..91ccaac 100644
--- a/locale/templates/misc.pot
+++ b/locale/templates/misc.pot
@@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: RcGcDw\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2021-04-14 16:24+0200\n"
+"POT-Creation-Date: 2021-07-11 14:34+0200\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME \n"
"Language-Team: LANGUAGE \n"
@@ -69,16 +69,16 @@ msgstr ""
msgid "Battle.net handle"
msgstr ""
-#: src/misc.py:119
+#: src/misc.py:139
msgid ""
"\n"
"__And more__"
msgstr ""
-#: src/misc.py:276
+#: src/misc.py:328
msgid "Unknown"
msgstr ""
-#: src/misc.py:278
+#: src/misc.py:330
msgid "unknown"
msgstr ""
diff --git a/locale/templates/rc.pot b/locale/templates/rc.pot
deleted file mode 100644
index 4e205ec..0000000
--- a/locale/templates/rc.pot
+++ /dev/null
@@ -1,40 +0,0 @@
-# SOME DESCRIPTIVE TITLE.
-# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
-# This file is distributed under the same license as the RcGcDw package.
-# FIRST AUTHOR , YEAR.
-#
-#, fuzzy
-msgid ""
-msgstr ""
-"Project-Id-Version: RcGcDw\n"
-"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2021-04-14 16:24+0200\n"
-"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
-"Last-Translator: FULL NAME \n"
-"Language-Team: LANGUAGE \n"
-"Language: \n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=CHARSET\n"
-"Content-Transfer-Encoding: 8bit\n"
-
-#: src/rc.py:322
-#, python-brace-format
-msgid "{wiki} seems to be down or unreachable."
-msgstr ""
-
-#: src/rc.py:323 src/rc.py:335
-msgid "Connection status"
-msgstr ""
-
-#: src/rc.py:333
-#, python-brace-format
-msgid "Connection to {wiki} seems to be stable now."
-msgstr ""
-
-#: src/rc.py:404
-msgid "~~hidden~~"
-msgstr ""
-
-#: src/rc.py:408
-msgid "hidden"
-msgstr ""
diff --git a/locale/templates/rcgcdw.pot b/locale/templates/rcgcdw.pot
index f883bcd..6bbfd91 100644
--- a/locale/templates/rcgcdw.pot
+++ b/locale/templates/rcgcdw.pot
@@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: RcGcDw\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2021-04-14 16:24+0200\n"
+"POT-Creation-Date: 2021-07-11 14:34+0200\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME \n"
"Language-Team: LANGUAGE \n"
@@ -18,184 +18,95 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\n"
-#: src/rcgcdw.py:115 src/rcgcdw.py:117 src/rcgcdw.py:119 src/rcgcdw.py:121
-#: src/rcgcdw.py:123 src/rcgcdw.py:125 src/rcgcdw.py:127
+#: src/rcgcdw.py:117
#, python-brace-format
msgid "{value} (avg. {avg})"
msgstr ""
-#: src/rcgcdw.py:147
+#: src/rcgcdw.py:136
msgid "Daily overview"
msgstr ""
-#: src/rcgcdw.py:154
+#: src/rcgcdw.py:143
msgid "No activity"
msgstr ""
-#: src/rcgcdw.py:178
+#: src/rcgcdw.py:167
msgid " ({} action)"
msgid_plural " ({} actions)"
msgstr[0] ""
msgstr[1] ""
-#: src/rcgcdw.py:180
+#: src/rcgcdw.py:169
msgid " ({} edit)"
msgid_plural " ({} edits)"
msgstr[0] ""
msgstr[1] ""
-#: src/rcgcdw.py:185
+#: src/rcgcdw.py:174
msgid " UTC ({} action)"
msgid_plural " UTC ({} actions)"
msgstr[0] ""
msgstr[1] ""
-#: src/rcgcdw.py:187 src/rcgcdw.py:188 src/rcgcdw.py:192
+#: src/rcgcdw.py:176 src/rcgcdw.py:179
msgid "But nobody came"
msgstr ""
-#: src/rcgcdw.py:195
+#: src/rcgcdw.py:183
msgid "Most active user"
msgid_plural "Most active users"
msgstr[0] ""
msgstr[1] ""
-#: src/rcgcdw.py:196
+#: src/rcgcdw.py:184
msgid "Most edited article"
msgid_plural "Most edited articles"
msgstr[0] ""
msgstr[1] ""
-#: src/rcgcdw.py:197
+#: src/rcgcdw.py:185
msgid "Edits made"
msgstr ""
-#: src/rcgcdw.py:197
+#: src/rcgcdw.py:185
msgid "New files"
msgstr ""
-#: src/rcgcdw.py:197
+#: src/rcgcdw.py:186
msgid "Admin actions"
msgstr ""
-#: src/rcgcdw.py:198
+#: src/rcgcdw.py:186
msgid "Bytes changed"
msgstr ""
-#: src/rcgcdw.py:198
+#: src/rcgcdw.py:187
msgid "New articles"
msgstr ""
-#: src/rcgcdw.py:199
+#: src/rcgcdw.py:187
msgid "Unique contributors"
msgstr ""
-#: src/rcgcdw.py:200
+#: src/rcgcdw.py:188
msgid "Most active hour"
msgid_plural "Most active hours"
msgstr[0] ""
msgstr[1] ""
-#: src/rcgcdw.py:201
+#: src/rcgcdw.py:189
msgid "Day score"
msgstr ""
-#: src/rcgcdw.py:243
-msgid "director"
+#: src/rcgcdw.py:223
+msgid "~~hidden~~"
msgstr ""
-#: src/rcgcdw.py:243
-msgid "bot"
+#: src/rcgcdw.py:225
+msgid "No description provided"
msgstr ""
-#: src/rcgcdw.py:243
-msgid "editor"
+#: src/rcgcdw.py:228
+msgid "hidden"
msgstr ""
-
-#: src/rcgcdw.py:243
-msgid "directors"
-msgstr ""
-
-#: src/rcgcdw.py:243
-msgid "sysop"
-msgstr ""
-
-#: src/rcgcdw.py:243
-msgid "bureaucrat"
-msgstr ""
-
-#: src/rcgcdw.py:243
-msgid "reviewer"
-msgstr ""
-
-#: src/rcgcdw.py:244
-msgid "autoreview"
-msgstr ""
-
-#: src/rcgcdw.py:244
-msgid "autopatrol"
-msgstr ""
-
-#: src/rcgcdw.py:244
-msgid "wiki_guardian"
-msgstr ""
-
-#: src/rcgcdw.py:244
-msgid "second"
-msgid_plural "seconds"
-msgstr[0] ""
-msgstr[1] ""
-
-#: src/rcgcdw.py:244
-msgid "minute"
-msgid_plural "minutes"
-msgstr[0] ""
-msgstr[1] ""
-
-#: src/rcgcdw.py:244
-msgid "hour"
-msgid_plural "hours"
-msgstr[0] ""
-msgstr[1] ""
-
-#: src/rcgcdw.py:244
-msgid "day"
-msgid_plural "days"
-msgstr[0] ""
-msgstr[1] ""
-
-#: src/rcgcdw.py:244
-msgid "week"
-msgid_plural "weeks"
-msgstr[0] ""
-msgstr[1] ""
-
-#: src/rcgcdw.py:244
-msgid "month"
-msgid_plural "months"
-msgstr[0] ""
-msgstr[1] ""
-
-#: src/rcgcdw.py:244
-msgid "year"
-msgid_plural "years"
-msgstr[0] ""
-msgstr[1] ""
-
-#: src/rcgcdw.py:244
-msgid "millennium"
-msgid_plural "millennia"
-msgstr[0] ""
-msgstr[1] ""
-
-#: src/rcgcdw.py:244
-msgid "decade"
-msgid_plural "decades"
-msgstr[0] ""
-msgstr[1] ""
-
-#: src/rcgcdw.py:244
-msgid "century"
-msgid_plural "centuries"
-msgstr[0] ""
-msgstr[1] ""
diff --git a/locale/templates/redaction.pot b/locale/templates/redaction.pot
index 3af7f59..ab89d86 100644
--- a/locale/templates/redaction.pot
+++ b/locale/templates/redaction.pot
@@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: RcGcDw\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2021-04-14 16:24+0200\n"
+"POT-Creation-Date: 2021-07-11 14:34+0200\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME \n"
"Language-Team: LANGUAGE \n"
@@ -17,7 +17,10 @@ msgstr ""
"Content-Type: text/plain; charset=CHARSET\n"
"Content-Transfer-Encoding: 8bit\n"
-#: src/discord/redaction.py:62 src/discord/redaction.py:65
-#: src/discord/redaction.py:70
-msgid "Removed"
+#: src/discord/redaction.py:77
+msgid "hidden"
+msgstr ""
+
+#: src/discord/redaction.py:80 src/discord/redaction.py:85
+msgid "~~hidden~~"
msgstr ""
diff --git a/locale/tr/LC_MESSAGES/discussion_formatters.mo b/locale/tr/LC_MESSAGES/discussion_formatters.mo
deleted file mode 100644
index f83a6d6..0000000
Binary files a/locale/tr/LC_MESSAGES/discussion_formatters.mo and /dev/null differ
diff --git a/locale/tr/LC_MESSAGES/discussion_formatters.po b/locale/tr/LC_MESSAGES/discussion_formatters.po
deleted file mode 100644
index 580247f..0000000
--- a/locale/tr/LC_MESSAGES/discussion_formatters.po
+++ /dev/null
@@ -1,159 +0,0 @@
-# SOME DESCRIPTIVE TITLE.
-# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
-# This file is distributed under the same license as the RcGcDw package.
-# FIRST AUTHOR , YEAR.
-#
-msgid ""
-msgstr ""
-"Project-Id-Version: RcGcDw\n"
-"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2020-11-18 14:13+0100\n"
-"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
-"Last-Translator: Automatically generated\n"
-"Language-Team: none\n"
-"Language: tr\n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=UTF-8\n"
-"Content-Transfer-Encoding: 8bit\n"
-
-#: src/discussion_formatters.py:25 src/discussion_formatters.py:81
-msgid "Unregistered user"
-msgstr ""
-
-#: src/discussion_formatters.py:34
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) created [{title}](<{url}f/p/{threadId}>) in "
-"{forumName}"
-msgstr ""
-
-#: src/discussion_formatters.py:36
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) created a poll [{title}](<{url}f/p/{threadId}>) in "
-"{forumName}"
-msgstr ""
-
-#: src/discussion_formatters.py:38
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) created a quiz [{title}](<{url}f/p/{threadId}>) in "
-"{forumName}"
-msgstr ""
-
-#: src/discussion_formatters.py:43
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) created a [reply](<{url}f/p/{threadId}/r/{postId}>) "
-"to [{title}](<{url}f/p/{threadId}>) in {forumName}"
-msgstr ""
-
-#: src/discussion_formatters.py:45 src/discussion_formatters.py:54
-#: src/discussion_formatters.py:137 src/discussion_formatters.py:150
-msgid "unknown"
-msgstr ""
-
-#: src/discussion_formatters.py:49
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) created [{title}](<{url}wiki/Message_Wall:"
-"{user_wall}?threadId={threadId}>) on [{user}'s Message Wall](<{url}wiki/"
-"Message_Wall:{user_wall}>)"
-msgstr ""
-
-#: src/discussion_formatters.py:51
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) created a [reply](<{url}wiki/Message_Wall:"
-"{user_wall}?threadId={threadId}#{replyId}>) to [{title}](<{url}wiki/"
-"Message_Wall:{user_wall}?threadId={threadId}>) on [{user}'s Message Wall]"
-"(<{url}wiki/Message_Wall:{user_wall}>)"
-msgstr ""
-
-#: src/discussion_formatters.py:57
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) created a [comment](<{url}?commentId={commentId}>) "
-"on [{article}](<{url}>)"
-msgstr ""
-
-#: src/discussion_formatters.py:62
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) created a [reply](<{url}?commentId={commentId}"
-"&replyId={replyId}>) to a [comment](<{url}?commentId={commentId}>) on "
-"[{article}](<{url}>)"
-msgstr ""
-
-#: src/discussion_formatters.py:70
-#, python-brace-format
-msgid ""
-"Unknown event `{event}` by [{author}]({author_url}), report it on the "
-"[support server](<{support}>)."
-msgstr ""
-
-#: src/discussion_formatters.py:98
-#, python-brace-format
-msgid "Created \"{title}\""
-msgstr ""
-
-#: src/discussion_formatters.py:102
-#, python-brace-format
-msgid "Created a poll \"{title}\""
-msgstr ""
-
-#: src/discussion_formatters.py:109
-msgid "Option {}"
-msgstr ""
-
-#: src/discussion_formatters.py:110
-#, python-brace-format
-msgid "__[View image]({image_url})__"
-msgstr ""
-
-#: src/discussion_formatters.py:114
-#, python-brace-format
-msgid "Created a quiz \"{title}\""
-msgstr ""
-
-#: src/discussion_formatters.py:129 src/discussion_formatters.py:131
-msgid "Tags"
-msgstr ""
-
-#: src/discussion_formatters.py:129
-msgid "{} tags"
-msgstr ""
-
-#: src/discussion_formatters.py:134
-#, python-brace-format
-msgid "Replied to \"{title}\""
-msgstr ""
-
-#: src/discussion_formatters.py:143
-#, python-brace-format
-msgid "Created \"{title}\" on {user}'s Message Wall"
-msgstr ""
-
-#: src/discussion_formatters.py:147
-#, python-brace-format
-msgid "Replied to \"{title}\" on {user}'s Message Wall"
-msgstr ""
-
-#: src/discussion_formatters.py:154
-#, python-brace-format
-msgid "Commented on {article}"
-msgstr ""
-
-#: src/discussion_formatters.py:158
-#, python-brace-format
-msgid "Replied to a comment on {article}"
-msgstr ""
-
-#: src/discussion_formatters.py:162
-#, python-brace-format
-msgid "Unknown event `{event}`"
-msgstr ""
-
-#: src/discussion_formatters.py:168 src/discussion_formatters.py:170
-msgid "Report this on the support server"
-msgstr ""
diff --git a/locale/tr/LC_MESSAGES/formatters.mo b/locale/tr/LC_MESSAGES/formatters.mo
new file mode 100644
index 0000000..958f7ff
Binary files /dev/null and b/locale/tr/LC_MESSAGES/formatters.mo differ
diff --git a/locale/tr/LC_MESSAGES/formatters.po b/locale/tr/LC_MESSAGES/formatters.po
new file mode 100644
index 0000000..aa80895
--- /dev/null
+++ b/locale/tr/LC_MESSAGES/formatters.po
@@ -0,0 +1,1620 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the RcGcDw package.
+# FIRST AUTHOR , YEAR.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: RcGcDw\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2021-05-22 18:48+0200\n"
+"PO-Revision-Date: 2021-07-11 12:33+0000\n"
+"Last-Translator: Doğukan Karakaş \n"
+"Language-Team: Turkish \n"
+"Language: tr\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+"X-Generator: Weblate 4.6.2\n"
+
+#: src/api/util.py:61 src/api/util.py:66
+msgid "__Only whitespace__"
+msgstr "__Sadece boş alan__"
+
+#: src/api/util.py:71
+msgid "Removed"
+msgstr "Kaldırıldı"
+
+#: src/api/util.py:73
+msgid "Added"
+msgstr "Eklendi"
+
+#: src/api/util.py:94 src/api/util.py:126 src/api/util.py:133
+#: src/api/util.py:141 extensions/base/discussions.py:247
+#: extensions/base/discussions.py:264 extensions/base/abusefilter.py:45
+msgid "Unregistered user"
+msgstr "Kayıtsız kullanıcı"
+
+#: src/api/util.py:160
+msgctxt "recent changes Tags"
+msgid "Tags"
+msgstr "Etiketler"
+
+#: src/api/util.py:162
+msgid "**Added**: "
+msgstr "**Eklendi**: "
+
+#: src/api/util.py:163
+msgid " and {} more\n"
+msgstr " ve {} fazlası\n"
+
+#: src/api/util.py:165
+msgid "**Removed**: "
+msgstr "**Kaldırıldı**: "
+
+#: src/api/util.py:166
+msgid " and {} more"
+msgstr " ve {} fazlası"
+
+#: src/api/util.py:168
+msgid "Changed categories"
+msgstr "Kategoriler değiştirildi"
+
+#: extensions/base/cargo.py:37
+#, python-brace-format
+msgid "Created the Cargo table \"{table}\""
+msgstr "Kargo tablosu \"{table}\" oluşturuldu"
+
+#: extensions/base/cargo.py:45
+#, python-brace-format
+msgid "[{author}]({author_url}) created the Cargo table \"{table}\""
+msgstr "[{author}]({author_url}), \"{table}\" Kargo tablosunu oluşturdu"
+
+#: extensions/base/cargo.py:60
+#, python-brace-format
+msgid "Recreated the Cargo table \"{table}\""
+msgstr "Kargo tablosu \"{table}\" tekrar oluşturuldu"
+
+#: extensions/base/cargo.py:68
+#, python-brace-format
+msgid "[{author}]({author_url}) recreated the Cargo table \"{table}\""
+msgstr ""
+"[{author}]({author_url}), \"{table}\" Kargo tablosunu tekrar oluşturuldu"
+
+#: extensions/base/cargo.py:83
+#, python-brace-format
+msgid "Replaced the Cargo table \"{table}\""
+msgstr "Kargo tablosu \"{table}\" değiştirildi"
+
+#: extensions/base/cargo.py:91
+#, python-brace-format
+msgid "[{author}]({author_url}) replaced the Cargo table \"{table}\""
+msgstr "[{author}]({author_url}), \"{table}\" Kargo tablosunu değiştirdi"
+
+#: extensions/base/cargo.py:105
+#, python-brace-format
+msgid "Deleted the Cargo table \"{table}\""
+msgstr "Kargo tablosu \"{table}\" silindi"
+
+#: extensions/base/cargo.py:112
+#, python-brace-format
+msgid "[{author}]({author_url}) deleted the Cargo table \"{table}\""
+msgstr "[{author}]({author_url}), \"{table}\" Kargo tablosunu sildi"
+
+#: extensions/base/translate.py:41
+#, python-brace-format
+msgid "Marked \"{article}\" for translation"
+msgstr "\"{article}\" çeviri için işaretlendi"
+
+#: extensions/base/translate.py:55
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) marked [{article}]({article_url}) for "
+"translation{comment}"
+msgstr ""
+"[{author}]({author_url}), [{article}]({article_url}) makalesini çeviri için "
+"işaretledi{comment}"
+
+#: extensions/base/translate.py:70
+#, python-brace-format
+msgid "Removed \"{article}\" from the translation system"
+msgstr "\"{article}\" çeviri sisteminden kaldırıldı"
+
+#: extensions/base/translate.py:80
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) removed [{article}]({article_url}) from the "
+"translation system{comment}"
+msgstr ""
+"[{author}]({author_url}), [{article}]({article_url}) makalesini çeviri "
+"sisteminden kaldırdı{comment}"
+
+#: extensions/base/translate.py:95
+#, python-brace-format
+msgid "Completed moving translation pages from \"{article}\" to \"{target}\""
+msgstr ""
+"\"{article}\" çeviri sayfasını \"{target}\" sayfasına taşıma başarıyla "
+"tamamlandı"
+
+#: extensions/base/translate.py:106
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) completed moving translation pages from *{article}* "
+"to [{target}]({target_url}){comment}"
+msgstr ""
+"[{author}]({author_url}), *{article}* çeviri sayfalarını başarıyla "
+"[{target}]({target_url}) sayfasına taşıdı{comment}"
+
+#: extensions/base/translate.py:121
+#, python-brace-format
+msgid "Encountered a problem while moving \"{article}\" to \"{target}\""
+msgstr ""
+"\"{article}\" makalesini \"{target}\" hedefine taşırken bir sıkıntı yaşandı"
+
+#: extensions/base/translate.py:133
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) encountered a problem while moving [{article}]"
+"({article_url}) to [{target}]({target_url}){comment}"
+msgstr ""
+"[{author}]({author_url}), [{article}]({article_url}) makalesini "
+"[{target}]({target_url}) hedefine taşırken bir sıkıntı yaşadı{comment}"
+
+#: extensions/base/translate.py:149
+#, python-brace-format
+msgid ""
+"Failed to delete \"{article}\" which belongs to translatable page "
+"\"{target}\""
+msgstr "Çevrilebilir \"{target}\" sayfasına ait olan \"{article}\" silinemedi"
+
+#: extensions/base/translate.py:161
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) failed to delete [{article}]({article_url}) which "
+"belongs to translatable page [{target}]({target_url}){comment}"
+msgstr ""
+"[{author}]({author_url}), [{target}]({target_url}) çeviri sayfasına ait olan "
+"[{article}]({article_url}) makalesini silemedi{comment}"
+
+#: extensions/base/translate.py:177
+#, python-brace-format
+msgid "Completed deletion of translation page \"{article}\""
+msgstr "Çeviri sayfası \"{article}\" başarıyla silindi"
+
+#: extensions/base/translate.py:188
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) completed deletion of translation page [{article}]"
+"({article_url}){comment}"
+msgstr ""
+
+#: extensions/base/translate.py:203
+#, python-brace-format
+msgid ""
+"Failed to delete \"{article}\" which belongs to translation page \"{target}\""
+msgstr ""
+
+#: extensions/base/translate.py:215
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) failed to delete [{article}]({article_url}) which "
+"belongs to translation page [{target}]({target_url}){comment}"
+msgstr ""
+
+#: extensions/base/translate.py:231
+#, python-brace-format
+msgid "Encouraged translation of \"{article}\""
+msgstr ""
+
+#: extensions/base/translate.py:240
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) encouraged translation of [{article}]({article_url})"
+"{comment}"
+msgstr ""
+
+#: extensions/base/translate.py:255
+#, python-brace-format
+msgid "Discouraged translation of \"{article}\""
+msgstr ""
+
+#: extensions/base/translate.py:264
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) discouraged translation of [{article}]"
+"({article_url}){comment}"
+msgstr ""
+
+#: extensions/base/translate.py:282
+#, python-brace-format
+msgid "Limited languages for \"{article}\" to `{languages}`"
+msgstr ""
+
+#: extensions/base/translate.py:285
+#, python-brace-format
+msgid "Priority languages for \"{article}\" set to `{languages}`"
+msgstr ""
+
+#: extensions/base/translate.py:288
+#, python-brace-format
+msgid "Removed priority languages from \"{article}\""
+msgstr ""
+
+#: extensions/base/translate.py:301
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) limited languages for [{article}]({article_url}) to "
+"`{languages}`{comment}"
+msgstr ""
+
+#: extensions/base/translate.py:308
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) set the priority languages for [{article}]"
+"({article_url}) to `{languages}`{comment}"
+msgstr ""
+
+#: extensions/base/translate.py:315
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) removed priority languages from [{article}]"
+"({article_url}){comment}"
+msgstr ""
+
+#: extensions/base/translate.py:331
+#, python-brace-format
+msgid "Added translatable page \"{article}\" to aggregate group \"{group}\""
+msgstr ""
+
+#: extensions/base/translate.py:342
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) added translatable page [{article}]({article_url}) "
+"to aggregate group \"{group}\"{comment}"
+msgstr ""
+
+#: extensions/base/translate.py:357
+#, python-brace-format
+msgid ""
+"Removed translatable page \"{article}\" from aggregate group \"{group}\""
+msgstr ""
+
+#: extensions/base/translate.py:368
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) removed translatable page [{article}]"
+"({article_url}) from aggregate group \"{group}\"{comment}"
+msgstr ""
+
+#: extensions/base/translate.py:387
+#, python-brace-format
+msgid "Reviewed translation \"{article}\""
+msgstr ""
+
+#: extensions/base/translate.py:401
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) reviewed translation [{article}]({article_url})"
+"{comment}"
+msgstr ""
+
+#: extensions/base/translate.py:416
+#, python-brace-format
+msgid "Changed the state of `{language}` translations of \"{article}\""
+msgstr ""
+
+#: extensions/base/translate.py:419
+msgid "Old state"
+msgstr ""
+
+#: extensions/base/translate.py:420
+msgid "New state"
+msgstr ""
+
+#: extensions/base/translate.py:431
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) changed the state of `{language}` translations of "
+"[{article}]({article_url}) from `{old_state}` to `{new_state}`{comment}"
+msgstr ""
+
+#: extensions/base/translate.py:439
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) changed the state of `{language}` translations of "
+"[{article}]({article_url}) to `{new_state}`{comment}"
+msgstr ""
+
+#: extensions/base/translate.py:452 extensions/base/translate.py:455
+msgid "(default)"
+msgstr ""
+
+#: extensions/base/translate.py:464
+#, python-brace-format
+msgid "Changed the language of \"{article}\""
+msgstr ""
+
+#: extensions/base/translate.py:465
+msgid "Old language"
+msgstr ""
+
+#: extensions/base/translate.py:466
+msgid "New language"
+msgstr ""
+
+#: extensions/base/translate.py:477
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) changed the language of [{article}]({article_url}) "
+"from {old_lang} to {new_lang}{comment}"
+msgstr ""
+
+#: extensions/base/discussions.py:148 extensions/base/discussions.py:207
+#: extensions/base/discussions.py:245 extensions/base/discussions.py:261
+#: extensions/base/discussions.py:284 extensions/base/discussions.py:306
+#: extensions/base/discussions.py:334 extensions/base/discussions.py:354
+msgid "unknown"
+msgstr ""
+
+#: extensions/base/discussions.py:157
+#, python-brace-format
+msgid "Created \"{title}\""
+msgstr ""
+
+#: extensions/base/discussions.py:161
+#, python-brace-format
+msgid "Created a poll \"{title}\""
+msgstr ""
+
+#: extensions/base/discussions.py:168
+msgid "Option {}"
+msgstr ""
+
+#: extensions/base/discussions.py:170
+#, python-brace-format
+msgid "__[View image]({image_url})__"
+msgstr ""
+
+#: extensions/base/discussions.py:174
+#, python-brace-format
+msgid "Created a quiz \"{title}\""
+msgstr ""
+
+#: extensions/base/discussions.py:193 extensions/base/discussions.py:195
+msgctxt "Fandom discussions Tags/Forums"
+msgid "Tags"
+msgstr ""
+
+#: extensions/base/discussions.py:193
+msgctxt "Fandom discussions amount of Tags/Forums"
+msgid "{} tags"
+msgstr ""
+
+#: extensions/base/discussions.py:198
+#, python-brace-format
+msgid "Replied to \"{title}\""
+msgstr ""
+
+#: extensions/base/discussions.py:214
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) created [{title}](<{url}f/p/{threadId}>) in "
+"{forumName}"
+msgstr ""
+
+#: extensions/base/discussions.py:217
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) created a poll [{title}](<{url}f/p/{threadId}>) in "
+"{forumName}"
+msgstr ""
+
+#: extensions/base/discussions.py:220
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) created a quiz [{title}](<{url}f/p/{threadId}>) in "
+"{forumName}"
+msgstr ""
+
+#: extensions/base/discussions.py:234
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) created a [reply](<{url}f/p/{threadId}/r/{postId}>) "
+"to [{title}](<{url}f/p/{threadId}>) in {forumName}"
+msgstr ""
+
+#: extensions/base/discussions.py:292
+#, python-brace-format
+msgid "Created \"{title}\" on {user}'s Message Wall"
+msgstr ""
+
+#: extensions/base/discussions.py:298
+#, python-brace-format
+msgid "Replied to \"{title}\" on {user}'s Message Wall"
+msgstr ""
+
+#: extensions/base/discussions.py:312
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) created [{title}](<{url}wiki/Message_Wall:"
+"{user_wall}?threadId={threadId}>) on [{user}'s Message Wall](<{url}wiki/"
+"Message_Wall:{user_wall}>)"
+msgstr ""
+
+#: extensions/base/discussions.py:318
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) created a [reply](<{url}wiki/Message_Wall:"
+"{user_wall}?threadId={threadId}#{replyId}>) to [{title}](<{url}wiki/"
+"Message_Wall:{user_wall}?threadId={threadId}>) on [{user}'s Message Wall]"
+"(<{url}wiki/Message_Wall:{user_wall}>)"
+msgstr ""
+
+#: extensions/base/discussions.py:338
+#, python-brace-format
+msgid "Commented on {article}"
+msgstr ""
+
+#: extensions/base/discussions.py:344
+#, python-brace-format
+msgid "Replied to a comment on {article}"
+msgstr ""
+
+#: extensions/base/discussions.py:359
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) created a [comment](<{url}?commentId={commentId}>) "
+"on [{article}](<{url}>)"
+msgstr ""
+
+#: extensions/base/discussions.py:365
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) created a [reply](<{url}?commentId={commentId}"
+"&replyId={replyId}>) to a [comment](<{url}?commentId={commentId}>) on "
+"[{article}](<{url}>)"
+msgstr ""
+
+#: extensions/base/managewiki.py:34
+msgid "Changed wiki settings"
+msgstr ""
+
+#: extensions/base/managewiki.py:44
+#, python-brace-format
+msgid "[{author}]({author_url}) changed wiki settings{reason}"
+msgstr ""
+
+#: extensions/base/managewiki.py:55
+#, python-brace-format
+msgid "Deleted a \"{wiki}\" wiki"
+msgstr ""
+
+#: extensions/base/managewiki.py:55 extensions/base/managewiki.py:67
+#: extensions/base/managewiki.py:103 extensions/base/managewiki.py:112
+#: extensions/base/managewiki.py:125 extensions/base/managewiki.py:126
+#: extensions/base/managewiki.py:135 extensions/base/managewiki.py:136
+#: extensions/base/managewiki.py:148 extensions/base/managewiki.py:149
+#: extensions/base/managewiki.py:160 extensions/base/managewiki.py:161
+#: extensions/base/managewiki.py:195 extensions/base/managewiki.py:204
+#: extensions/base/managewiki.py:217 extensions/base/managewiki.py:226
+#: extensions/base/abusefilter.py:55 extensions/base/abusefilter.py:56
+#: extensions/base/abusefilter.py:57 extensions/base/abusefilter.py:68
+#: extensions/base/abusefilter.py:69 extensions/base/abusefilter.py:70
+#: extensions/base/mediawiki.py:744
+msgid "Unknown"
+msgstr ""
+
+#: extensions/base/managewiki.py:63
+#, python-brace-format
+msgid "[{author}]({author_url}) deleted a wiki *{wiki_name}*{comment}"
+msgstr ""
+
+#: extensions/base/managewiki.py:80
+#, python-brace-format
+msgid "Deleted a \"{group}\" user group"
+msgstr ""
+
+#: extensions/base/managewiki.py:89
+#, python-brace-format
+msgid "[{author}]({author_url}) deleted a usergroup *{group}*{comment}"
+msgstr ""
+
+#: extensions/base/managewiki.py:103
+#, python-brace-format
+msgid "Locked a \"{wiki}\" wiki"
+msgstr ""
+
+#: extensions/base/managewiki.py:111
+#, python-brace-format
+msgid "[{author}]({author_url}) locked a wiki *{wiki_name}*{comment}"
+msgstr ""
+
+#: extensions/base/managewiki.py:124
+#, python-brace-format
+msgid "Modified \"{namespace_name}\" namespace"
+msgstr ""
+
+#: extensions/base/managewiki.py:126 extensions/base/managewiki.py:149
+msgid "Wiki"
+msgstr ""
+
+#: extensions/base/managewiki.py:134
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) modified namespace *{namespace_name}* on "
+"*{wiki_name}*{comment}"
+msgstr ""
+
+#: extensions/base/managewiki.py:147
+#, python-brace-format
+msgid "Deleted a \"{namespace_name}\" namespace"
+msgstr ""
+
+#: extensions/base/managewiki.py:158
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) deleted a namespace *{namespace_name}* on "
+"*{wiki_name}*{comment}"
+msgstr ""
+
+#: extensions/base/managewiki.py:173
+#, python-brace-format
+msgid "Modified \"{usergroup_name}\" usergroup"
+msgstr ""
+
+#: extensions/base/managewiki.py:182
+#, python-brace-format
+msgid "[{author}]({author_url}) modified user group *{group_name}*{comment}"
+msgstr ""
+
+#: extensions/base/managewiki.py:195
+#, python-brace-format
+msgid "Undeleted a \"{wiki}\" wiki"
+msgstr ""
+
+#: extensions/base/managewiki.py:203
+#, python-brace-format
+msgid "[{author}]({author_url}) undeleted a wiki *{wiki_name}*{comment}"
+msgstr ""
+
+#: extensions/base/managewiki.py:217
+#, python-brace-format
+msgid "Unlocked a \"{wiki}\" wiki"
+msgstr ""
+
+#: extensions/base/managewiki.py:225
+#, python-brace-format
+msgid "[{author}]({author_url}) unlocked a wiki *{wiki_name}*{comment}"
+msgstr ""
+
+#: extensions/base/datadump.py:36
+#, python-brace-format
+msgid "Generated {file} dump"
+msgstr ""
+
+#: extensions/base/datadump.py:45
+#, python-brace-format
+msgid "[{author}]({author_url}) generated *{file}* dump{comment}"
+msgstr ""
+
+#: extensions/base/datadump.py:58
+#, python-brace-format
+msgid "Deleted {file} dump"
+msgstr ""
+
+#: extensions/base/datadump.py:67
+#, python-brace-format
+msgid "[{author}]({author_url}) deleted *{file}* dump{comment}"
+msgstr ""
+
+#: extensions/base/curseprofile.py:40
+#, python-brace-format
+msgid "Edited {target}'s profile"
+msgstr ""
+
+#: extensions/base/curseprofile.py:42
+msgid "Edited their own profile"
+msgstr ""
+
+#: extensions/base/curseprofile.py:44
+#, python-brace-format
+msgid "Cleared the {field} field"
+msgstr ""
+
+#: extensions/base/curseprofile.py:46
+#, python-brace-format
+msgid "{field} field changed to: {desc}"
+msgstr ""
+
+#: extensions/base/curseprofile.py:58
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) cleared the {field} on [{target}]({target_url})'s "
+"profile."
+msgstr ""
+
+#: extensions/base/curseprofile.py:60
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) edited the {field} on [{target}]({target_url})'s "
+"profile. *({desc})*"
+msgstr ""
+
+#: extensions/base/curseprofile.py:65
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) cleared the {field} on [their own]({target_url}) "
+"profile."
+msgstr ""
+
+#: extensions/base/curseprofile.py:67
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) edited the {field} on [their own]({target_url}) "
+"profile. *({desc})*"
+msgstr ""
+
+#: extensions/base/curseprofile.py:82
+#, python-brace-format
+msgid "Left a comment on {target}'s profile"
+msgstr ""
+
+#: extensions/base/curseprofile.py:84
+msgid "Left a comment on their own profile"
+msgstr ""
+
+#: extensions/base/curseprofile.py:97
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) left a [comment]({comment}) on {target}'s profile."
+msgstr ""
+
+#: extensions/base/curseprofile.py:100
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) left a [comment]({comment}) on their own profile."
+msgstr ""
+
+#: extensions/base/curseprofile.py:113
+#, python-brace-format
+msgid "Edited a comment on {target}'s profile"
+msgstr ""
+
+#: extensions/base/curseprofile.py:115
+msgid "Edited a comment on their own profile"
+msgstr ""
+
+#: extensions/base/curseprofile.py:128
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) edited a [comment]({comment}) on {target}'s profile."
+msgstr ""
+
+#: extensions/base/curseprofile.py:131
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) edited a [comment]({comment}) on their own profile."
+msgstr ""
+
+#: extensions/base/curseprofile.py:144
+#, python-brace-format
+msgid "Replied to a comment on {target}'s profile"
+msgstr ""
+
+#: extensions/base/curseprofile.py:146
+msgid "Replied to a comment on their own profile"
+msgstr ""
+
+#: extensions/base/curseprofile.py:159
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) replied to a [comment]({comment}) on {target}'s "
+"profile."
+msgstr ""
+
+#: extensions/base/curseprofile.py:162
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) replied to a [comment]({comment}) on their own "
+"profile."
+msgstr ""
+
+#: extensions/base/curseprofile.py:175
+#, python-brace-format
+msgid "Deleted a comment on {target}'s profile"
+msgstr ""
+
+#: extensions/base/curseprofile.py:177
+msgid "Deleted a comment on their own profile"
+msgstr ""
+
+#: extensions/base/curseprofile.py:197
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) deleted a [comment]({comment}) on {target}'s "
+"profile.{reason}"
+msgstr ""
+
+#: extensions/base/curseprofile.py:200
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) deleted a [comment]({comment}) on their own profile."
+"{reason}"
+msgstr ""
+
+#: extensions/base/curseprofile.py:214
+#, python-brace-format
+msgid "Purged a comment on {target}'s profile"
+msgstr ""
+
+#: extensions/base/curseprofile.py:216
+msgid "Purged a comment on their own profile"
+msgstr ""
+
+#: extensions/base/curseprofile.py:230
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) purged a comment on [{target}]({link})'s profile."
+"{reason}"
+msgstr ""
+
+#: extensions/base/curseprofile.py:233
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) purged a comment on [their own]({link}) profile."
+"{reason}"
+msgstr ""
+
+#: extensions/base/renameuser.py:38
+#, python-brace-format
+msgid "Renamed user \"{old_name}\" with {edits} edit to \"{new_name}\""
+msgid_plural "Renamed user \"{old_name}\" with {edits} edits to \"{new_name}\""
+msgstr[0] ""
+msgstr[1] ""
+
+#: extensions/base/renameuser.py:43
+#, python-brace-format
+msgid "Renamed user \"{old_name}\" to \"{new_name}\""
+msgstr ""
+
+#: extensions/base/renameuser.py:58
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) renamed user *{old_name}* with {edits} edit to "
+"[{new_name}]({link}){comment}"
+msgid_plural ""
+"[{author}]({author_url}) renamed user *{old_name}* with {edits} edits to "
+"[{new_name}]({link}){comment}"
+msgstr[0] ""
+msgstr[1] ""
+
+#: extensions/base/renameuser.py:66
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) renamed user *{old_name}* to [{new_name}]({link})"
+"{comment}"
+msgstr ""
+
+#: extensions/base/interwiki.py:37
+msgid "Added an entry to the interwiki table"
+msgstr ""
+
+#: extensions/base/interwiki.py:38 extensions/base/interwiki.py:65
+#, python-brace-format
+msgid "Prefix: {prefix}, website: {website} | {desc}"
+msgstr ""
+
+#: extensions/base/interwiki.py:50
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) added an entry to the [interwiki table]"
+"({table_url}) pointing to {website} with {prefix} prefix"
+msgstr ""
+
+#: extensions/base/interwiki.py:64
+msgid "Edited an entry in interwiki table"
+msgstr ""
+
+#: extensions/base/interwiki.py:77
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) edited an entry in [interwiki table]({table_url}) "
+"pointing to {website} with {prefix} prefix"
+msgstr ""
+
+#: extensions/base/interwiki.py:91
+msgid "Deleted an entry in interwiki table"
+msgstr ""
+
+#: extensions/base/interwiki.py:92
+#, python-brace-format
+msgid "Prefix: {prefix} | {desc}"
+msgstr ""
+
+#: extensions/base/interwiki.py:102
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) deleted an entry in [interwiki table]({table_url})"
+"{desc}"
+msgstr ""
+
+#: extensions/base/abusefilter.py:29
+msgid "None"
+msgstr ""
+
+#: extensions/base/abusefilter.py:29
+msgid "Warning issued"
+msgstr ""
+
+#: extensions/base/abusefilter.py:29
+msgid "**Blocked user**"
+msgstr ""
+
+#: extensions/base/abusefilter.py:29
+msgid "Tagged the edit"
+msgstr ""
+
+#: extensions/base/abusefilter.py:29
+msgid "Disallowed the action"
+msgstr ""
+
+#: extensions/base/abusefilter.py:29
+msgid "**IP range blocked**"
+msgstr ""
+
+#: extensions/base/abusefilter.py:29
+msgid "Throttled actions"
+msgstr ""
+
+#: extensions/base/abusefilter.py:29
+msgid "Removed autoconfirmed group"
+msgstr ""
+
+#: extensions/base/abusefilter.py:29
+msgid "**Removed from privileged groups**"
+msgstr ""
+
+#: extensions/base/abusefilter.py:30
+msgid "Edit"
+msgstr ""
+
+#: extensions/base/abusefilter.py:30
+msgid "Upload"
+msgstr ""
+
+#: extensions/base/abusefilter.py:30
+msgid "Move"
+msgstr ""
+
+#: extensions/base/abusefilter.py:30
+msgid "Stash upload"
+msgstr ""
+
+#: extensions/base/abusefilter.py:30
+msgid "Deletion"
+msgstr ""
+
+#: extensions/base/abusefilter.py:30
+msgid "Account creation"
+msgstr ""
+
+#: extensions/base/abusefilter.py:30
+msgid "Auto account creation"
+msgstr ""
+
+#: extensions/base/abusefilter.py:54
+#, python-brace-format
+msgid "{user} triggered \"{abuse_filter}\""
+msgstr ""
+
+#: extensions/base/abusefilter.py:55
+msgid "Performed"
+msgstr ""
+
+#: extensions/base/abusefilter.py:56
+msgid "Action taken"
+msgstr ""
+
+#: extensions/base/abusefilter.py:57
+msgid "Title"
+msgstr ""
+
+#: extensions/base/abusefilter.py:66
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) triggered *{abuse_filter}*, performing the action "
+"\"{action}\" on *[{target}]({target_url})* - action taken: {result}."
+msgstr ""
+
+#: extensions/base/abusefilter.py:83
+#, python-brace-format
+msgid "Edited abuse filter number {number}"
+msgstr ""
+
+#: extensions/base/abusefilter.py:95
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) edited abuse filter [number {number}]({filter_url})"
+msgstr ""
+
+#: extensions/base/abusefilter.py:111
+#, python-brace-format
+msgid "Created abuse filter number {number}"
+msgstr ""
+
+#: extensions/base/abusefilter.py:119
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) created abuse filter [number {number}]({filter_url})"
+msgstr ""
+
+#: extensions/base/mediawiki.py:37
+msgid "director"
+msgstr ""
+
+#: extensions/base/mediawiki.py:37
+msgid "bot"
+msgstr ""
+
+#: extensions/base/mediawiki.py:37
+msgid "editor"
+msgstr ""
+
+#: extensions/base/mediawiki.py:37
+msgid "directors"
+msgstr ""
+
+#: extensions/base/mediawiki.py:37
+msgid "sysop"
+msgstr ""
+
+#: extensions/base/mediawiki.py:37
+msgid "bureaucrat"
+msgstr ""
+
+#: extensions/base/mediawiki.py:37
+msgid "reviewer"
+msgstr ""
+
+#: extensions/base/mediawiki.py:38
+msgid "autoreview"
+msgstr ""
+
+#: extensions/base/mediawiki.py:38
+msgid "autopatrol"
+msgstr ""
+
+#: extensions/base/mediawiki.py:38
+msgid "wiki_guardian"
+msgstr ""
+
+#: extensions/base/mediawiki.py:71
+msgid "(N!) "
+msgstr ""
+
+#: extensions/base/mediawiki.py:72
+msgid "m"
+msgstr ""
+
+#: extensions/base/mediawiki.py:73
+msgid "b"
+msgstr ""
+
+#: extensions/base/mediawiki.py:112
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) edited [{article}]({edit_link}){comment} {bold}"
+"({sign}{edit_size}){bold}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:117
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) created [{article}]({edit_link}){comment} {bold}"
+"({sign}{edit_size}){bold}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:190 extensions/base/mediawiki.py:223
+msgid "Options"
+msgstr ""
+
+#: extensions/base/mediawiki.py:190
+#, python-brace-format
+msgid "([preview]({link}) | [undo]({undolink}))"
+msgstr ""
+
+#: extensions/base/mediawiki.py:195
+#, python-brace-format
+msgid "Uploaded a new version of {name}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:197
+#, python-brace-format
+msgid "Reverted a version of {name}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:199
+#, python-brace-format
+msgid "Uploaded {name}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:208
+msgid "**No license!**"
+msgstr ""
+
+#: extensions/base/mediawiki.py:223
+#, python-brace-format
+msgid "([preview]({link}))"
+msgstr ""
+
+#: extensions/base/mediawiki.py:228
+msgid ""
+"\n"
+"License: {}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:237
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) reverted a version of [{file}]({file_link}){comment}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:248
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) uploaded a new version of [{file}]({file_link})"
+"{comment}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:259
+#, python-brace-format
+msgid "[{author}]({author_url}) uploaded [{file}]({file_link}){comment}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:274
+#, python-brace-format
+msgid "Deleted page {article}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:283
+#, python-brace-format
+msgid "[{author}]({author_url}) deleted [{page}]({page_link}){comment}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:298
+#, python-brace-format
+msgid "Deleted redirect {article} by overwriting"
+msgstr ""
+
+#: extensions/base/mediawiki.py:308
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) deleted redirect by overwriting [{page}]"
+"({page_link}){comment}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:322
+#, python-brace-format
+msgid "Restored {article}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:331
+#, python-brace-format
+msgid "[{author}]({author_url}) restored [{article}]({article_url}){comment}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:348
+msgid "Changed visibility of log events"
+msgstr ""
+
+#: extensions/base/mediawiki.py:356
+#, python-brace-format
+msgid "[{author}]({author_url}) changed visibility of log events{comment}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:370
+#, python-brace-format
+msgid "Changed visibility of revision on page {article} "
+msgid_plural "Changed visibility of {amount} revisions on page {article} "
+msgstr[0] ""
+msgstr[1] ""
+
+#: extensions/base/mediawiki.py:383
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) changed visibility of revision on page [{article}]"
+"({article_url}){comment}"
+msgid_plural ""
+"[{author}]({author_url}) changed visibility of {amount} revisions on page "
+"[{article}]({article_url}){comment}"
+msgstr[0] ""
+msgstr[1] ""
+
+#: extensions/base/mediawiki.py:399 extensions/base/mediawiki.py:432
+msgid "No redirect has been made"
+msgstr ""
+
+#: extensions/base/mediawiki.py:400 extensions/base/mediawiki.py:433
+msgid "A redirect has been made"
+msgstr ""
+
+#: extensions/base/mediawiki.py:401
+#, python-brace-format
+msgid "Moved {redirect}{article} to {target}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:412 extensions/base/mediawiki.py:444
+msgid "without making a redirect"
+msgstr ""
+
+#: extensions/base/mediawiki.py:413 extensions/base/mediawiki.py:445
+msgid "with a redirect"
+msgstr ""
+
+#: extensions/base/mediawiki.py:416
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) moved {redirect}*{article}* to [{target}]"
+"({target_url}) {made_a_redirect}{comment}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:434
+#, python-brace-format
+msgid "Moved {redirect}{article} to {title} over redirect"
+msgstr ""
+
+#: extensions/base/mediawiki.py:448
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) moved {redirect}*{article}* over redirect to "
+"[{target}]({target_url}) {made_a_redirect}{comment}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:464
+#, python-brace-format
+msgid "Moved protection settings from {redirect}{article} to {title}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:477
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) moved protection settings from {redirect}*{article}"
+"* to [{target}]({target_url}){comment}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:492
+#, python-brace-format
+msgid "Protected {target}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:495 extensions/base/mediawiki.py:510
+#: extensions/base/mediawiki.py:526 extensions/base/mediawiki.py:541
+msgid " [cascading]"
+msgstr ""
+
+#: extensions/base/mediawiki.py:506
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) protected [{article}]({article_url}) with the "
+"following settings: {settings}{comment}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:523
+#, python-brace-format
+msgid "Changed protection level for {article}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:537
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) modified protection settings of [{article}]"
+"({article_url}) to: {settings}{comment}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:554
+#, python-brace-format
+msgid "Removed protection from {article}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:563
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) removed protection from [{article}]({article_url})"
+"{comment}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:572
+msgid "for infinity and beyond"
+msgstr ""
+
+#: extensions/base/mediawiki.py:582
+msgid "for less than a minute"
+msgstr ""
+
+#: extensions/base/mediawiki.py:584
+msgid "year"
+msgid_plural "years"
+msgstr[0] ""
+msgstr[1] ""
+
+#: extensions/base/mediawiki.py:584
+msgid "day"
+msgid_plural "days"
+msgstr[0] ""
+msgstr[1] ""
+
+#: extensions/base/mediawiki.py:584
+msgid "hour"
+msgid_plural "hours"
+msgstr[0] ""
+msgstr[1] ""
+
+#: extensions/base/mediawiki.py:585
+msgid "minute"
+msgid_plural "minutes"
+msgstr[0] ""
+msgstr[1] ""
+
+#: extensions/base/mediawiki.py:590
+#, python-brace-format
+msgid "for {time_number} {time_unit}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:609
+msgid "Blocked from editing the following pages: "
+msgstr ""
+
+#: extensions/base/mediawiki.py:616 extensions/base/mediawiki.py:662
+msgid " and namespaces: "
+msgstr ""
+
+#: extensions/base/mediawiki.py:618
+msgid "Blocked from editing pages on following namespaces: "
+msgstr ""
+
+#: extensions/base/mediawiki.py:629
+msgid "Partial block details"
+msgstr ""
+
+#: extensions/base/mediawiki.py:632
+msgid "Block flags"
+msgstr ""
+
+#: extensions/base/mediawiki.py:634
+#, python-brace-format
+msgid "Blocked {blocked_user} {time}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:654
+msgid " on pages: "
+msgstr ""
+
+#: extensions/base/mediawiki.py:664
+msgid " on namespaces: "
+msgstr ""
+
+#: extensions/base/mediawiki.py:676
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) blocked [{user}]({user_url}) {time}"
+"{restriction_desc}{comment}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:694
+#, python-brace-format
+msgid "Changed block settings for {blocked_user}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:704
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) changed block settings for [{blocked_user}]"
+"({user_url}){comment}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:717
+#, python-brace-format
+msgid "Unblocked {blocked_user}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:727
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) unblocked [{blocked_user}]({user_url}){comment}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:743
+msgid "Action has been hidden by administration"
+msgstr ""
+
+#: extensions/base/mediawiki.py:750
+msgid "An action has been hidden by administration."
+msgstr ""
+
+#: extensions/base/mediawiki.py:761
+#, python-brace-format
+msgid "Imported {article} with {count} revision"
+msgid_plural "Imported {article} with {count} revisions"
+msgstr[0] ""
+msgstr[1] ""
+
+#: extensions/base/mediawiki.py:772
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) imported [{article}]({article_url}) with {count} "
+"revision{comment}"
+msgid_plural ""
+"[{author}]({author_url}) imported [{article}]({article_url}) with {count} "
+"revisions{comment}"
+msgstr[0] ""
+msgstr[1] ""
+
+#: extensions/base/mediawiki.py:788
+#, python-brace-format
+msgid "Imported {article} with {count} revision from \"{source}\""
+msgid_plural "Imported {article} with {count} revisions from \"{source}\""
+msgstr[0] ""
+msgstr[1] ""
+
+#: extensions/base/mediawiki.py:803
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) imported [{article}]({article_url}) with {count} "
+"revision from [{source}]({source_url}){comment}"
+msgid_plural ""
+"[{author}]({author_url}) imported [{article}]({article_url}) with {count} "
+"revisions from [{source}]({source_url}){comment}"
+msgstr[0] ""
+msgstr[1] ""
+
+#: extensions/base/mediawiki.py:818
+#, python-brace-format
+msgid " (until {date_and_time})"
+msgstr ""
+
+#: extensions/base/mediawiki.py:835
+#, python-brace-format
+msgid "Changed group membership for {target}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:837
+msgid "System"
+msgstr ""
+
+#: extensions/base/mediawiki.py:838
+#, python-brace-format
+msgid "{target} got autopromoted to a new usergroup"
+msgstr ""
+
+#: extensions/base/mediawiki.py:844
+msgid "Added group"
+msgid_plural "Added groups"
+msgstr[0] ""
+msgstr[1] ""
+
+#: extensions/base/mediawiki.py:846
+msgid "Removed group"
+msgid_plural "Removed groups"
+msgstr[0] ""
+msgstr[1] ""
+
+#: extensions/base/mediawiki.py:860
+#, python-brace-format
+msgid "Added to {added} and removed from {removed}."
+msgstr ""
+
+#: extensions/base/mediawiki.py:861 extensions/base/mediawiki.py:863
+#: extensions/base/mediawiki.py:865 extensions/base/mediawiki.py:872
+msgid ", "
+msgstr ""
+
+#: extensions/base/mediawiki.py:863
+#, python-brace-format
+msgid "Added to {added}."
+msgstr ""
+
+#: extensions/base/mediawiki.py:865
+#, python-brace-format
+msgid "Removed from {removed}."
+msgstr ""
+
+#: extensions/base/mediawiki.py:866
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) changed group membership for [{target}]"
+"({target_url}): {group_changes}{comment}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:870
+#, python-brace-format
+msgid "The system autopromoted [{target}]({target_url}) to {added}.{comment}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:883
+#, python-brace-format
+msgid "Merged revision histories of {article} into {dest}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:897
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) merged revision histories of [{article}]"
+"({article_url}) into [{dest}]({dest_url}){comment}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:911
+msgid "Created account automatically"
+msgstr ""
+
+#: extensions/base/mediawiki.py:918
+#, python-brace-format
+msgid "Account [{author}]({author_url}) was created automatically"
+msgstr ""
+
+#: extensions/base/mediawiki.py:931 extensions/base/mediawiki.py:996
+msgid "Created account"
+msgstr ""
+
+#: extensions/base/mediawiki.py:938 extensions/base/mediawiki.py:1003
+#, python-brace-format
+msgid "Account [{author}]({author_url}) was created"
+msgstr ""
+
+#: extensions/base/mediawiki.py:950
+#, python-brace-format
+msgid "Created account {article}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:959
+#, python-brace-format
+msgid ""
+"Account [{article}]({article_url}) was created by [{author}]({author_url})"
+"{comment}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:972
+#, python-brace-format
+msgid "Created account {article} and password was sent by email"
+msgstr ""
+
+#: extensions/base/mediawiki.py:983
+#, python-brace-format
+msgid ""
+"Account [{article}]({article_url}) was created by [{author}]({author_url}) "
+"and password was sent by email{comment}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:1015
+#, python-brace-format
+msgid "Changed the content model of the page {article}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:1017
+#, python-brace-format
+msgid "Model changed from {old} to {new}: {reason}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:1029
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) changed the content model of the page [{article}]"
+"({article_url}) from {old} to {new}{comment}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:1044
+#, python-brace-format
+msgid "Created the page {article} using a non-default content model"
+msgstr ""
+
+#: extensions/base/mediawiki.py:1046
+#, python-brace-format
+msgid "Created with model {new}: {reason}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:1057
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) created the page [{article}]({article_url}) using a "
+"non-default content model {new}{comment}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:1072
+#, python-brace-format
+msgid "Created the tag \"{tag}\""
+msgstr ""
+
+#: extensions/base/mediawiki.py:1082
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) created the [tag]({tag_url}) \"{tag}\"{comment}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:1103
+#, python-brace-format
+msgid "Deleted the tag \"{tag}\""
+msgstr ""
+
+#: extensions/base/mediawiki.py:1105
+msgid "Removed from"
+msgstr ""
+
+#: extensions/base/mediawiki.py:1105
+msgid "{} revision or log entry"
+msgid_plural "{} revisions and/or log entries"
+msgstr[0] ""
+msgstr[1] ""
+
+#: extensions/base/mediawiki.py:1118
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) deleted the [tag]({tag_url}) \"{tag}\"{comment}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:1128
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) deleted the [tag]({tag_url}) \"{tag}\" and removed "
+"it from {count} revision or log entry{comment}"
+msgid_plural ""
+"[{author}]({author_url}) deleted the [tag]({tag_url}) \"{tag}\" and removed "
+"it from {count} revisions and/or log entries{comment}"
+msgstr[0] ""
+msgstr[1] ""
+
+#: extensions/base/mediawiki.py:1145
+#, python-brace-format
+msgid "Activated the tag \"{tag}\""
+msgstr ""
+
+#: extensions/base/mediawiki.py:1154
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) activated the [tag]({tag_url}) \"{tag}\"{comment}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:1173
+#, python-brace-format
+msgid "Deactivated the tag \"{tag}\""
+msgstr ""
+
+#: extensions/base/mediawiki.py:1182
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) deactivated the [tag]({tag_url}) \"{tag}\"{comment}"
+msgstr ""
+
+#: extensions/base/sprite.py:37
+#, python-brace-format
+msgid "Edited the sprite for {article}"
+msgstr ""
+
+#: extensions/base/sprite.py:45
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) edited the sprite for [{article}]({article_url})"
+msgstr ""
+
+#: extensions/base/sprite.py:60
+#, python-brace-format
+msgid "Created the sprite sheet for {article}"
+msgstr ""
+
+#: extensions/base/sprite.py:68
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) created the sprite sheet for [{article}]"
+"({article_url})"
+msgstr ""
+
+#: extensions/base/sprite.py:79
+#, python-brace-format
+msgid "Edited the slice for {article}"
+msgstr ""
+
+#: extensions/base/sprite.py:86
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) edited the slice for [{article}]({article_url})"
+msgstr ""
diff --git a/locale/tr/LC_MESSAGES/misc.mo b/locale/tr/LC_MESSAGES/misc.mo
new file mode 100644
index 0000000..ea4766c
Binary files /dev/null and b/locale/tr/LC_MESSAGES/misc.mo differ
diff --git a/locale/tr/LC_MESSAGES/misc.po b/locale/tr/LC_MESSAGES/misc.po
index 9c5e2a3..f1dab71 100644
--- a/locale/tr/LC_MESSAGES/misc.po
+++ b/locale/tr/LC_MESSAGES/misc.po
@@ -8,76 +8,81 @@ msgstr ""
"Project-Id-Version: RcGcDw\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2020-11-18 14:13+0100\n"
-"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
-"Last-Translator: Automatically generated\n"
-"Language-Team: none\n"
+"PO-Revision-Date: 2021-07-11 12:33+0000\n"
+"Last-Translator: Doğukan Karakaş \n"
+"Language-Team: Turkish \n"
"Language: tr\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+"X-Generator: Weblate 4.6.2\n"
#: src/misc.py:45
msgid "Location"
-msgstr ""
+msgstr "Konum"
#: src/misc.py:45
msgid "About me"
-msgstr ""
+msgstr "Hakkımda"
#: src/misc.py:45
msgid "Google link"
-msgstr ""
+msgstr "Google bağlantısı"
#: src/misc.py:45
msgid "Facebook link"
-msgstr ""
+msgstr "Facebook bağlantısı"
#: src/misc.py:45
msgid "Twitter link"
-msgstr ""
+msgstr "Twitter bağlantısı"
#: src/misc.py:45
msgid "Reddit link"
-msgstr ""
+msgstr "Reddit bağlantısı"
#: src/misc.py:45
msgid "Twitch link"
-msgstr ""
+msgstr "Twitch bağlantısı"
#: src/misc.py:45
msgid "PSN link"
-msgstr ""
+msgstr "PSN bağlantısı"
#: src/misc.py:45
msgid "VK link"
-msgstr ""
+msgstr "VK bağlantısı"
#: src/misc.py:45
msgid "XBL link"
-msgstr ""
+msgstr "XBL bağlantısı"
#: src/misc.py:45
msgid "Steam link"
-msgstr ""
+msgstr "Steam bağlantısı"
#: src/misc.py:45
msgid "Discord handle"
-msgstr ""
+msgstr "Discord adı"
#: src/misc.py:45
msgid "Battle.net handle"
-msgstr ""
+msgstr "Battle.net adı"
#: src/misc.py:114
msgid ""
"\n"
"__And more__"
msgstr ""
+"\n"
+"__Ve dahası__"
#: src/misc.py:271
msgid "Unknown"
-msgstr ""
+msgstr "Bilinmiyor"
#: src/misc.py:273
msgid "unknown"
-msgstr ""
+msgstr "bilinmiyor"
diff --git a/locale/tr/LC_MESSAGES/rc_formatters.mo b/locale/tr/LC_MESSAGES/rc_formatters.mo
deleted file mode 100644
index f439e3f..0000000
Binary files a/locale/tr/LC_MESSAGES/rc_formatters.mo and /dev/null differ
diff --git a/locale/tr/LC_MESSAGES/rc_formatters.po b/locale/tr/LC_MESSAGES/rc_formatters.po
deleted file mode 100644
index 139850e..0000000
--- a/locale/tr/LC_MESSAGES/rc_formatters.po
+++ /dev/null
@@ -1,1024 +0,0 @@
-# SOME DESCRIPTIVE TITLE.
-# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
-# This file is distributed under the same license as the RcGcDw package.
-# FIRST AUTHOR , YEAR.
-#
-msgid ""
-msgstr ""
-"Project-Id-Version: RcGcDw\n"
-"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2020-11-18 14:13+0100\n"
-"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
-"Last-Translator: Automatically generated\n"
-"Language-Team: none\n"
-"Language: tr\n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=UTF-8\n"
-"Content-Transfer-Encoding: 8bit\n"
-"Plural-Forms: nplurals=2; plural=n != 1;\n"
-
-#: src/rc_formatters.py:28
-msgid "None"
-msgstr ""
-
-#: src/rc_formatters.py:28
-msgid "Warning issued"
-msgstr ""
-
-#: src/rc_formatters.py:28
-msgid "**Blocked user**"
-msgstr ""
-
-#: src/rc_formatters.py:28
-msgid "Tagged the edit"
-msgstr ""
-
-#: src/rc_formatters.py:28
-msgid "Disallowed the action"
-msgstr ""
-
-#: src/rc_formatters.py:28
-msgid "**IP range blocked**"
-msgstr ""
-
-#: src/rc_formatters.py:28
-msgid "Throttled actions"
-msgstr ""
-
-#: src/rc_formatters.py:28
-msgid "Removed autoconfirmed group"
-msgstr ""
-
-#: src/rc_formatters.py:28
-msgid "**Removed from privileged groups**"
-msgstr ""
-
-#: src/rc_formatters.py:29
-msgid "Edit"
-msgstr ""
-
-#: src/rc_formatters.py:29
-msgid "Upload"
-msgstr ""
-
-#: src/rc_formatters.py:29
-msgid "Move"
-msgstr ""
-
-#: src/rc_formatters.py:29
-msgid "Stash upload"
-msgstr ""
-
-#: src/rc_formatters.py:29
-msgid "Deletion"
-msgstr ""
-
-#: src/rc_formatters.py:29
-msgid "Account creation"
-msgstr ""
-
-#: src/rc_formatters.py:29
-msgid "Auto account creation"
-msgstr ""
-
-#: src/rc_formatters.py:46 src/rc_formatters.py:53 src/rc_formatters.py:60
-#: src/rc_formatters.py:75 src/rc_formatters.py:96
-msgid "Unregistered user"
-msgstr ""
-
-#: src/rc_formatters.py:83
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) triggered *{abuse_filter}*, performing the action "
-"\"{action}\" on *[{target}]({target_url})* - action taken: {result}."
-msgstr ""
-
-#: src/rc_formatters.py:85 src/rc_formatters.py:86 src/rc_formatters.py:87
-#: src/rc_formatters.py:445 src/rc_formatters.py:448 src/rc_formatters.py:451
-#: src/rc_formatters.py:452 src/rc_formatters.py:457 src/rc_formatters.py:458
-#: src/rc_formatters.py:465 src/rc_formatters.py:469 src/rc_formatters.py:489
-#: src/rc_formatters.py:490 src/rc_formatters.py:491 src/rc_formatters.py:921
-#: src/rc_formatters.py:924 src/rc_formatters.py:927 src/rc_formatters.py:929
-#: src/rc_formatters.py:932 src/rc_formatters.py:934 src/rc_formatters.py:939
-#: src/rc_formatters.py:942 src/rc_formatters.py:947
-msgid "Unknown"
-msgstr ""
-
-#: src/rc_formatters.py:117
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) edited [{article}]({edit_link}){comment} ({bold}"
-"{sign}{edit_size}{bold})"
-msgstr ""
-
-#: src/rc_formatters.py:119
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) created [{article}]({edit_link}){comment} ({bold}"
-"{sign}{edit_size}{bold})"
-msgstr ""
-
-#: src/rc_formatters.py:122
-#, python-brace-format
-msgid "[{author}]({author_url}) uploaded [{file}]({file_link}){comment}"
-msgstr ""
-
-#: src/rc_formatters.py:129
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) reverted a version of [{file}]({file_link}){comment}"
-msgstr ""
-
-#: src/rc_formatters.py:133
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) uploaded a new version of [{file}]({file_link})"
-"{comment}"
-msgstr ""
-
-#: src/rc_formatters.py:136
-#, python-brace-format
-msgid "[{author}]({author_url}) deleted [{page}]({page_link}){comment}"
-msgstr ""
-
-#: src/rc_formatters.py:142
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) deleted redirect by overwriting [{page}]"
-"({page_link}){comment}"
-msgstr ""
-
-#: src/rc_formatters.py:148 src/rc_formatters.py:153
-msgid "without making a redirect"
-msgstr ""
-
-#: src/rc_formatters.py:148 src/rc_formatters.py:154
-msgid "with a redirect"
-msgstr ""
-
-#: src/rc_formatters.py:149
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) moved {redirect}*{article}* to [{target}]"
-"({target_url}) {made_a_redirect}{comment}"
-msgstr ""
-
-#: src/rc_formatters.py:155
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) moved {redirect}*{article}* over redirect to "
-"[{target}]({target_url}) {made_a_redirect}{comment}"
-msgstr ""
-
-#: src/rc_formatters.py:160
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) moved protection settings from {redirect}*{article}"
-"* to [{target}]({target_url}){comment}"
-msgstr ""
-
-#: src/rc_formatters.py:171 src/rc_formatters.py:662
-msgid "for infinity and beyond"
-msgstr ""
-
-#: src/rc_formatters.py:180 src/rc_formatters.py:670
-#, python-brace-format
-msgid "for {num} {translated_length}"
-msgstr ""
-
-#: src/rc_formatters.py:186 src/rc_formatters.py:674
-msgid "until {}"
-msgstr ""
-
-#: src/rc_formatters.py:190
-msgid " on pages: "
-msgstr ""
-
-#: src/rc_formatters.py:197 src/rc_formatters.py:687
-msgid " and namespaces: "
-msgstr ""
-
-#: src/rc_formatters.py:199
-msgid " on namespaces: "
-msgstr ""
-
-#: src/rc_formatters.py:211
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) blocked [{user}]({user_url}) {time}"
-"{restriction_desc}{comment}"
-msgstr ""
-
-#: src/rc_formatters.py:215
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) changed block settings for [{blocked_user}]"
-"({user_url}){comment}"
-msgstr ""
-
-#: src/rc_formatters.py:219
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) unblocked [{blocked_user}]({user_url}){comment}"
-msgstr ""
-
-#: src/rc_formatters.py:224
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) left a [comment]({comment}) on {target}'s profile"
-msgstr ""
-
-#: src/rc_formatters.py:226
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) left a [comment]({comment}) on their own profile"
-msgstr ""
-
-#: src/rc_formatters.py:232
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) replied to a [comment]({comment}) on {target}'s "
-"profile"
-msgstr ""
-
-#: src/rc_formatters.py:238
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) replied to a [comment]({comment}) on their own "
-"profile"
-msgstr ""
-
-#: src/rc_formatters.py:246
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) edited a [comment]({comment}) on {target}'s profile"
-msgstr ""
-
-#: src/rc_formatters.py:252
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) edited a [comment]({comment}) on their own profile"
-msgstr ""
-
-#: src/rc_formatters.py:259
-#, python-brace-format
-msgid "[{author}]({author_url}) purged a comment on {target}'s profile"
-msgstr ""
-
-#: src/rc_formatters.py:261
-#, python-brace-format
-msgid "[{author}]({author_url}) purged a comment on their own profile"
-msgstr ""
-
-#: src/rc_formatters.py:265
-#, python-brace-format
-msgid "[{author}]({author_url}) deleted a comment on {target}'s profile"
-msgstr ""
-
-#: src/rc_formatters.py:267
-#, python-brace-format
-msgid "[{author}]({author_url}) deleted a comment on their own profile"
-msgstr ""
-
-#: src/rc_formatters.py:273
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) edited the {field} on {target}'s profile. *({desc})*"
-msgstr ""
-
-#: src/rc_formatters.py:279
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) edited the {field} on their own profile. *({desc})*"
-msgstr ""
-
-#: src/rc_formatters.py:293 src/rc_formatters.py:295 src/rc_formatters.py:765
-#: src/rc_formatters.py:767
-msgid "none"
-msgstr ""
-
-#: src/rc_formatters.py:298
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) changed group membership for [{target}]"
-"({target_url}) from {old_groups} to {new_groups}{comment}"
-msgstr ""
-
-#: src/rc_formatters.py:300
-#, python-brace-format
-msgid ""
-"{author} autopromoted [{target}]({target_url}) from {old_groups} to "
-"{new_groups}{comment}"
-msgstr ""
-
-#: src/rc_formatters.py:301 src/rc_formatters.py:752
-msgid "System"
-msgstr ""
-
-#: src/rc_formatters.py:306
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) protected [{article}]({article_url}) with the "
-"following settings: {settings}{comment}"
-msgstr ""
-
-#: src/rc_formatters.py:308 src/rc_formatters.py:316 src/rc_formatters.py:775
-#: src/rc_formatters.py:781
-msgid " [cascading]"
-msgstr ""
-
-#: src/rc_formatters.py:313
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) modified protection settings of [{article}]"
-"({article_url}) to: {settings}{comment}"
-msgstr ""
-
-#: src/rc_formatters.py:320
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) removed protection from [{article}]({article_url})"
-"{comment}"
-msgstr ""
-
-#: src/rc_formatters.py:324
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) changed visibility of revision on page [{article}]"
-"({article_url}){comment}"
-msgid_plural ""
-"[{author}]({author_url}) changed visibility of {amount} revisions on page "
-"[{article}]({article_url}){comment}"
-msgstr[0] ""
-msgstr[1] ""
-
-#: src/rc_formatters.py:337
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) imported [{article}]({article_url}) with {count} "
-"revision{comment}"
-msgid_plural ""
-"[{author}]({author_url}) imported [{article}]({article_url}) with {count} "
-"revisions{comment}"
-msgstr[0] ""
-msgstr[1] ""
-
-#: src/rc_formatters.py:342
-#, python-brace-format
-msgid "[{author}]({author_url}) restored [{article}]({article_url}){comment}"
-msgstr ""
-
-#: src/rc_formatters.py:344
-#, python-brace-format
-msgid "[{author}]({author_url}) changed visibility of log events{comment}"
-msgstr ""
-
-#: src/rc_formatters.py:354
-#, python-brace-format
-msgid "[{author}]({author_url}) imported interwiki{comment}"
-msgstr ""
-
-#: src/rc_formatters.py:357
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) edited abuse filter [number {number}]({filter_url})"
-msgstr ""
-
-#: src/rc_formatters.py:361
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) created abuse filter [number {number}]({filter_url})"
-msgstr ""
-
-#: src/rc_formatters.py:365
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) merged revision histories of [{article}]"
-"({article_url}) into [{dest}]({dest_url}){comment}"
-msgstr ""
-
-#: src/rc_formatters.py:369
-#, python-brace-format
-msgid "Account [{author}]({author_url}) was created automatically"
-msgstr ""
-
-#: src/rc_formatters.py:372 src/rc_formatters.py:381
-#, python-brace-format
-msgid "Account [{author}]({author_url}) was created"
-msgstr ""
-
-#: src/rc_formatters.py:375
-#, python-brace-format
-msgid ""
-"Account [{article}]({article_url}) was created by [{author}]({author_url})"
-"{comment}"
-msgstr ""
-
-#: src/rc_formatters.py:378
-#, python-brace-format
-msgid ""
-"Account [{article}]({article_url}) was created by [{author}]({author_url}) "
-"and password was sent by email{comment}"
-msgstr ""
-
-#: src/rc_formatters.py:384
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) added an entry to the [interwiki table]"
-"({table_url}) pointing to {website} with {prefix} prefix"
-msgstr ""
-
-#: src/rc_formatters.py:390
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) edited an entry in [interwiki table]({table_url}) "
-"pointing to {website} with {prefix} prefix"
-msgstr ""
-
-#: src/rc_formatters.py:396
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) deleted an entry in [interwiki table]({table_url})"
-msgstr ""
-
-#: src/rc_formatters.py:399
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) changed the content model of the page [{article}]"
-"({article_url}) from {old} to {new}{comment}"
-msgstr ""
-
-#: src/rc_formatters.py:403
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) edited the sprite for [{article}]({article_url})"
-msgstr ""
-
-#: src/rc_formatters.py:406
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) created the sprite sheet for [{article}]"
-"({article_url})"
-msgstr ""
-
-#: src/rc_formatters.py:409
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) edited the slice for [{article}]({article_url})"
-msgstr ""
-
-#: src/rc_formatters.py:414
-#, python-brace-format
-msgid "[{author}]({author_url}) created the Cargo table \"{table}\""
-msgstr ""
-
-#: src/rc_formatters.py:416
-#, python-brace-format
-msgid "[{author}]({author_url}) deleted the Cargo table \"{table}\""
-msgstr ""
-
-#: src/rc_formatters.py:421
-#, python-brace-format
-msgid "[{author}]({author_url}) recreated the Cargo table \"{table}\""
-msgstr ""
-
-#: src/rc_formatters.py:426
-#, python-brace-format
-msgid "[{author}]({author_url}) replaced the Cargo table \"{table}\""
-msgstr ""
-
-#: src/rc_formatters.py:429
-#, python-brace-format
-msgid "[{author}]({author_url}) created a [tag]({tag_url}) \"{tag}\""
-msgstr ""
-
-#: src/rc_formatters.py:433
-#, python-brace-format
-msgid "[{author}]({author_url}) deleted a [tag]({tag_url}) \"{tag}\""
-msgstr ""
-
-#: src/rc_formatters.py:437
-#, python-brace-format
-msgid "[{author}]({author_url}) activated a [tag]({tag_url}) \"{tag}\""
-msgstr ""
-
-#: src/rc_formatters.py:440
-#, python-brace-format
-msgid "[{author}]({author_url}) deactivated a [tag]({tag_url}) \"{tag}\""
-msgstr ""
-
-#: src/rc_formatters.py:442
-#, python-brace-format
-msgid "[{author}]({author_url}) changed wiki settings ({reason})"
-msgstr ""
-
-#: src/rc_formatters.py:444
-#, python-brace-format
-msgid "[{author}]({author_url}) deleted a wiki *{wiki_name}* ({comment})"
-msgstr ""
-
-#: src/rc_formatters.py:447
-#, python-brace-format
-msgid "[{author}]({author_url}) locked a wiki *{wiki_name}* ({comment})"
-msgstr ""
-
-#: src/rc_formatters.py:450
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) modified a namespace *{namespace_name}* on "
-"*{wiki_name}* ({comment})"
-msgstr ""
-
-#: src/rc_formatters.py:455
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) deleted a namespace *{namespace_name}* on "
-"*{wiki_name}* ({comment})"
-msgstr ""
-
-#: src/rc_formatters.py:460
-#, python-brace-format
-msgid "[{author}]({author_url}) modified user group *{group_name}* ({comment})"
-msgstr ""
-
-#: src/rc_formatters.py:464
-#, python-brace-format
-msgid "[{author}]({author_url}) restored a wiki *{wiki_name}* ({comment})"
-msgstr ""
-
-#: src/rc_formatters.py:468
-#, python-brace-format
-msgid "[{author}]({author_url}) unlocked a wiki *{wiki_name}* ({comment})"
-msgstr ""
-
-#: src/rc_formatters.py:473
-msgid "An action has been hidden by administration."
-msgstr ""
-
-#: src/rc_formatters.py:480
-#, python-brace-format
-msgid ""
-"Unknown event `{event}` by [{author}]({author_url}), report it on the "
-"[support server](<{support}>)."
-msgstr ""
-
-#: src/rc_formatters.py:488
-#, python-brace-format
-msgid "{user} triggered \"{abuse_filter}\""
-msgstr ""
-
-#: src/rc_formatters.py:489
-msgid "Performed"
-msgstr ""
-
-#: src/rc_formatters.py:490
-msgid "Action taken"
-msgstr ""
-
-#: src/rc_formatters.py:491
-msgid "Title"
-msgstr ""
-
-#: src/rc_formatters.py:500 src/rc_formatters.py:768
-msgid "No description provided"
-msgstr ""
-
-#: src/rc_formatters.py:524
-msgid "(N!) "
-msgstr ""
-
-#: src/rc_formatters.py:525
-msgid "m"
-msgstr ""
-
-#: src/rc_formatters.py:525
-msgid "b"
-msgstr ""
-
-#: src/rc_formatters.py:542 src/rc_formatters.py:547
-msgid "__Only whitespace__"
-msgstr ""
-
-#: src/rc_formatters.py:552
-msgid "Removed"
-msgstr ""
-
-#: src/rc_formatters.py:554
-msgid "Added"
-msgstr ""
-
-#: src/rc_formatters.py:588 src/rc_formatters.py:627
-msgid "Options"
-msgstr ""
-
-#: src/rc_formatters.py:588
-#, python-brace-format
-msgid "([preview]({link}) | [undo]({undolink}))"
-msgstr ""
-
-#: src/rc_formatters.py:593
-#, python-brace-format
-msgid "Uploaded a new version of {name}"
-msgstr ""
-
-#: src/rc_formatters.py:595
-#, python-brace-format
-msgid "Reverted a version of {name}"
-msgstr ""
-
-#: src/rc_formatters.py:597
-#, python-brace-format
-msgid "Uploaded {name}"
-msgstr ""
-
-#: src/rc_formatters.py:613
-msgid "**No license!**"
-msgstr ""
-
-#: src/rc_formatters.py:625
-msgid ""
-"\n"
-"License: {}"
-msgstr ""
-
-#: src/rc_formatters.py:627
-#, python-brace-format
-msgid "([preview]({link}))"
-msgstr ""
-
-#: src/rc_formatters.py:632
-#, python-brace-format
-msgid "Deleted page {article}"
-msgstr ""
-
-#: src/rc_formatters.py:637
-#, python-brace-format
-msgid "Deleted redirect {article} by overwriting"
-msgstr ""
-
-#: src/rc_formatters.py:643
-msgid "No redirect has been made"
-msgstr ""
-
-#: src/rc_formatters.py:644
-msgid "A redirect has been made"
-msgstr ""
-
-#: src/rc_formatters.py:645
-#, python-brace-format
-msgid "Moved {redirect}{article} to {target}"
-msgstr ""
-
-#: src/rc_formatters.py:648
-#, python-brace-format
-msgid "Moved {redirect}{article} to {title} over redirect"
-msgstr ""
-
-#: src/rc_formatters.py:652
-#, python-brace-format
-msgid "Moved protection settings from {redirect}{article} to {title}"
-msgstr ""
-
-#: src/rc_formatters.py:676
-msgid "unknown expiry time"
-msgstr ""
-
-#: src/rc_formatters.py:680
-msgid "Blocked from editing the following pages: "
-msgstr ""
-
-#: src/rc_formatters.py:689
-msgid "Blocked from editing pages on following namespaces: "
-msgstr ""
-
-#: src/rc_formatters.py:700
-msgid "Partial block details"
-msgstr ""
-
-#: src/rc_formatters.py:701
-#, python-brace-format
-msgid "Blocked {blocked_user} {time}"
-msgstr ""
-
-#: src/rc_formatters.py:705
-#, python-brace-format
-msgid "Changed block settings for {blocked_user}"
-msgstr ""
-
-#: src/rc_formatters.py:709
-#, python-brace-format
-msgid "Unblocked {blocked_user}"
-msgstr ""
-
-#: src/rc_formatters.py:714
-#, python-brace-format
-msgid "Left a comment on {target}'s profile"
-msgstr ""
-
-#: src/rc_formatters.py:716
-msgid "Left a comment on their own profile"
-msgstr ""
-
-#: src/rc_formatters.py:721
-#, python-brace-format
-msgid "Replied to a comment on {target}'s profile"
-msgstr ""
-
-#: src/rc_formatters.py:723
-msgid "Replied to a comment on their own profile"
-msgstr ""
-
-#: src/rc_formatters.py:728
-#, python-brace-format
-msgid "Edited a comment on {target}'s profile"
-msgstr ""
-
-#: src/rc_formatters.py:730
-msgid "Edited a comment on their own profile"
-msgstr ""
-
-#: src/rc_formatters.py:733
-#, python-brace-format
-msgid "Edited {target}'s profile"
-msgstr ""
-
-#: src/rc_formatters.py:733
-msgid "Edited their own profile"
-msgstr ""
-
-#: src/rc_formatters.py:735
-#, python-brace-format
-msgid "Cleared the {field} field"
-msgstr ""
-
-#: src/rc_formatters.py:737
-#, python-brace-format
-msgid "{field} field changed to: {desc}"
-msgstr ""
-
-#: src/rc_formatters.py:740
-#, python-brace-format
-msgid "Purged a comment on {target}'s profile"
-msgstr ""
-
-#: src/rc_formatters.py:746
-#, python-brace-format
-msgid "Deleted a comment on {target}'s profile"
-msgstr ""
-
-#: src/rc_formatters.py:750
-#, python-brace-format
-msgid "Changed group membership for {target}"
-msgstr ""
-
-#: src/rc_formatters.py:754
-#, python-brace-format
-msgid "{target} got autopromoted to a new usergroup"
-msgstr ""
-
-#: src/rc_formatters.py:769
-#, python-brace-format
-msgid "Groups changed from {old_groups} to {new_groups}{reason}"
-msgstr ""
-
-#: src/rc_formatters.py:773
-#, python-brace-format
-msgid "Protected {target}"
-msgstr ""
-
-#: src/rc_formatters.py:779
-#, python-brace-format
-msgid "Changed protection level for {article}"
-msgstr ""
-
-#: src/rc_formatters.py:785
-#, python-brace-format
-msgid "Removed protection from {article}"
-msgstr ""
-
-#: src/rc_formatters.py:789
-#, python-brace-format
-msgid "Changed visibility of revision on page {article} "
-msgid_plural "Changed visibility of {amount} revisions on page {article} "
-msgstr[0] ""
-msgstr[1] ""
-
-#: src/rc_formatters.py:801
-#, python-brace-format
-msgid "Imported {article} with {count} revision"
-msgid_plural "Imported {article} with {count} revisions"
-msgstr[0] ""
-msgstr[1] ""
-
-#: src/rc_formatters.py:806
-#, python-brace-format
-msgid "Restored {article}"
-msgstr ""
-
-#: src/rc_formatters.py:809
-msgid "Changed visibility of log events"
-msgstr ""
-
-#: src/rc_formatters.py:819
-msgid "Imported interwiki"
-msgstr ""
-
-#: src/rc_formatters.py:822
-#, python-brace-format
-msgid "Edited abuse filter number {number}"
-msgstr ""
-
-#: src/rc_formatters.py:825
-#, python-brace-format
-msgid "Created abuse filter number {number}"
-msgstr ""
-
-#: src/rc_formatters.py:828
-#, python-brace-format
-msgid "Merged revision histories of {article} into {dest}"
-msgstr ""
-
-#: src/rc_formatters.py:832
-msgid "Created account automatically"
-msgstr ""
-
-#: src/rc_formatters.py:835 src/rc_formatters.py:844
-msgid "Created account"
-msgstr ""
-
-#: src/rc_formatters.py:838
-#, python-brace-format
-msgid "Created account {article}"
-msgstr ""
-
-#: src/rc_formatters.py:841
-#, python-brace-format
-msgid "Created account {article} and password was sent by email"
-msgstr ""
-
-#: src/rc_formatters.py:847
-msgid "Added an entry to the interwiki table"
-msgstr ""
-
-#: src/rc_formatters.py:848 src/rc_formatters.py:854
-#, python-brace-format
-msgid "Prefix: {prefix}, website: {website} | {desc}"
-msgstr ""
-
-#: src/rc_formatters.py:853
-msgid "Edited an entry in interwiki table"
-msgstr ""
-
-#: src/rc_formatters.py:859
-msgid "Deleted an entry in interwiki table"
-msgstr ""
-
-#: src/rc_formatters.py:860
-#, python-brace-format
-msgid "Prefix: {prefix} | {desc}"
-msgstr ""
-
-#: src/rc_formatters.py:863
-#, python-brace-format
-msgid "Changed the content model of the page {article}"
-msgstr ""
-
-#: src/rc_formatters.py:864
-#, python-brace-format
-msgid "Model changed from {old} to {new}: {reason}"
-msgstr ""
-
-#: src/rc_formatters.py:869
-#, python-brace-format
-msgid "Edited the sprite for {article}"
-msgstr ""
-
-#: src/rc_formatters.py:872
-#, python-brace-format
-msgid "Created the sprite sheet for {article}"
-msgstr ""
-
-#: src/rc_formatters.py:875
-#, python-brace-format
-msgid "Edited the slice for {article}"
-msgstr ""
-
-#: src/rc_formatters.py:881
-#, python-brace-format
-msgid "Created the Cargo table \"{table}\""
-msgstr ""
-
-#: src/rc_formatters.py:885
-#, python-brace-format
-msgid "Deleted the Cargo table \"{table}\""
-msgstr ""
-
-#: src/rc_formatters.py:892
-#, python-brace-format
-msgid "Recreated the Cargo table \"{table}\""
-msgstr ""
-
-#: src/rc_formatters.py:899
-#, python-brace-format
-msgid "Replaced the Cargo table \"{table}\""
-msgstr ""
-
-#: src/rc_formatters.py:903
-#, python-brace-format
-msgid "Created a tag \"{tag}\""
-msgstr ""
-
-#: src/rc_formatters.py:907
-#, python-brace-format
-msgid "Deleted a tag \"{tag}\""
-msgstr ""
-
-#: src/rc_formatters.py:911
-#, python-brace-format
-msgid "Activated a tag \"{tag}\""
-msgstr ""
-
-#: src/rc_formatters.py:914
-#, python-brace-format
-msgid "Deactivated a tag \"{tag}\""
-msgstr ""
-
-#: src/rc_formatters.py:917
-msgid "Changed wiki settings"
-msgstr ""
-
-#: src/rc_formatters.py:921
-#, python-brace-format
-msgid "Deleted a \"{wiki}\" wiki"
-msgstr ""
-
-#: src/rc_formatters.py:924
-#, python-brace-format
-msgid "Locked a \"{wiki}\" wiki"
-msgstr ""
-
-#: src/rc_formatters.py:927
-#, python-brace-format
-msgid "Modified a \"{namespace_name}\" namespace"
-msgstr ""
-
-#: src/rc_formatters.py:929 src/rc_formatters.py:934
-msgid "Wiki"
-msgstr ""
-
-#: src/rc_formatters.py:931
-#, python-brace-format
-msgid "Deleted a \"{namespace_name}\" namespace"
-msgstr ""
-
-#: src/rc_formatters.py:936
-#, python-brace-format
-msgid "Modified \"{usergroup_name}\" usergroup"
-msgstr ""
-
-#: src/rc_formatters.py:939
-#, python-brace-format
-msgid "Restored a \"{wiki}\" wiki"
-msgstr ""
-
-#: src/rc_formatters.py:942
-#, python-brace-format
-msgid "Unlocked a \"{wiki}\" wiki"
-msgstr ""
-
-#: src/rc_formatters.py:946
-msgid "Action has been hidden by administration"
-msgstr ""
-
-#: src/rc_formatters.py:951
-#, python-brace-format
-msgid "Unknown event `{event}`"
-msgstr ""
-
-#: src/rc_formatters.py:957 src/rc_formatters.py:959
-msgid "Report this on the support server"
-msgstr ""
-
-#: src/rc_formatters.py:976
-msgid "Tags"
-msgstr ""
-
-#: src/rc_formatters.py:979
-msgid "**Added**: "
-msgstr ""
-
-#: src/rc_formatters.py:979
-msgid " and {} more\n"
-msgstr ""
-
-#: src/rc_formatters.py:980
-msgid "**Removed**: "
-msgstr ""
-
-#: src/rc_formatters.py:980
-msgid " and {} more"
-msgstr ""
-
-#: src/rc_formatters.py:981
-msgid "Changed categories"
-msgstr ""
diff --git a/locale/tr/LC_MESSAGES/rcgcdw.mo b/locale/tr/LC_MESSAGES/rcgcdw.mo
index 42d30c5..0532ad9 100644
Binary files a/locale/tr/LC_MESSAGES/rcgcdw.mo and b/locale/tr/LC_MESSAGES/rcgcdw.mo differ
diff --git a/locale/tr/LC_MESSAGES/rcgcdw.po b/locale/tr/LC_MESSAGES/rcgcdw.po
index 691f0dc..a728c17 100644
--- a/locale/tr/LC_MESSAGES/rcgcdw.po
+++ b/locale/tr/LC_MESSAGES/rcgcdw.po
@@ -8,8 +8,8 @@ msgstr ""
"Project-Id-Version: RcGcDw\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2020-11-18 14:13+0100\n"
-"PO-Revision-Date: 2021-04-14 14:22+0000\n"
-"Last-Translator: Deveb \n"
+"PO-Revision-Date: 2021-07-11 12:33+0000\n"
+"Last-Translator: Doğukan Karakaş \n"
"Language-Team: Turkish \n"
"Language: tr\n"
@@ -17,7 +17,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
-"X-Generator: Weblate 4.4.2\n"
+"X-Generator: Weblate 4.6.2\n"
#: src/rc_formatters.py:28
msgid "None"
@@ -598,7 +598,7 @@ msgstr ""
#: src/rc_formatters.py:500 src/rc_formatters.py:768
msgid "No description provided"
-msgstr ""
+msgstr "Açıklama sağlanmamış"
#: src/rc_formatters.py:524
msgid "(N!) "
diff --git a/locale/tr/LC_MESSAGES/redaction.mo b/locale/tr/LC_MESSAGES/redaction.mo
index b709ff1..b5fb7c1 100644
Binary files a/locale/tr/LC_MESSAGES/redaction.mo and b/locale/tr/LC_MESSAGES/redaction.mo differ
diff --git a/locale/tr/LC_MESSAGES/redaction.po b/locale/tr/LC_MESSAGES/redaction.po
index 2bd0db8..e63040f 100644
--- a/locale/tr/LC_MESSAGES/redaction.po
+++ b/locale/tr/LC_MESSAGES/redaction.po
@@ -8,16 +8,18 @@ msgstr ""
"Project-Id-Version: RcGcDw\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2020-11-18 15:17+0100\n"
-"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
-"Last-Translator: Automatically generated\n"
-"Language-Team: none\n"
+"PO-Revision-Date: 2021-07-11 12:33+0000\n"
+"Last-Translator: Doğukan Karakaş \n"
+"Language-Team: Turkish \n"
"Language: tr\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Generator: Poedit 2.4.1\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+"X-Generator: Weblate 4.6.2\n"
#: src/discord/redaction.py:59 src/discord/redaction.py:62
#: src/discord/redaction.py:67
msgid "Removed"
-msgstr ""
+msgstr "Kaldırıldı"
diff --git a/locale/uk/LC_MESSAGES/discussion_formatters.mo b/locale/uk/LC_MESSAGES/discussion_formatters.mo
deleted file mode 100644
index 9536936..0000000
Binary files a/locale/uk/LC_MESSAGES/discussion_formatters.mo and /dev/null differ
diff --git a/locale/uk/LC_MESSAGES/discussion_formatters.po b/locale/uk/LC_MESSAGES/discussion_formatters.po
deleted file mode 100644
index c8e6a87..0000000
--- a/locale/uk/LC_MESSAGES/discussion_formatters.po
+++ /dev/null
@@ -1,161 +0,0 @@
-# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
-# This file is distributed under the same license as the PACKAGE package.
-#
-# Frisk <>, 2020.
-msgid ""
-msgstr ""
-"Project-Id-Version: \n"
-"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2020-12-23 00:28+0100\n"
-"PO-Revision-Date: 2020-04-23 23:32+0200\n"
-"Last-Translator: Frisk <>\n"
-"Language-Team: \n"
-"Language: en_US\n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=UTF-8\n"
-"Content-Transfer-Encoding: 8bit\n"
-"Plural-Forms: nplurals=2; plural=(n != 1);\n"
-"X-Generator: Lokalize 19.12.3\n"
-
-#: src/discussion_formatters.py:21 src/discussion_formatters.py:56
-#: src/discussion_formatters.py:67 src/discussion_formatters.py:95
-#: src/discussion_formatters.py:163 src/discussion_formatters.py:176
-msgid "unknown"
-msgstr ""
-
-#: src/discussion_formatters.py:27 src/discussion_formatters.py:102
-msgid "Unregistered user"
-msgstr ""
-
-#: src/discussion_formatters.py:39
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) created [{title}](<{url}f/p/{threadId}>) in "
-"{forumName}"
-msgstr ""
-
-#: src/discussion_formatters.py:42
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) created a poll [{title}](<{url}f/p/{threadId}>) in "
-"{forumName}"
-msgstr ""
-
-#: src/discussion_formatters.py:45
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) created a quiz [{title}](<{url}f/p/{threadId}>) in "
-"{forumName}"
-msgstr ""
-
-#: src/discussion_formatters.py:54
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) created a [reply](<{url}f/p/{threadId}/r/{postId}>) "
-"to [{title}](<{url}f/p/{threadId}>) in {forumName}"
-msgstr ""
-
-#: src/discussion_formatters.py:61
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) created [{title}](<{url}wiki/Message_Wall:"
-"{user_wall}?threadId={threadId}>) on [{user}'s Message Wall](<{url}wiki/"
-"Message_Wall:{user_wall}>)"
-msgstr ""
-
-#: src/discussion_formatters.py:64
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) created a [reply](<{url}wiki/Message_Wall:"
-"{user_wall}?threadId={threadId}#{replyId}>) to [{title}](<{url}wiki/"
-"Message_Wall:{user_wall}?threadId={threadId}>) on [{user}'s Message Wall]"
-"(<{url}wiki/Message_Wall:{user_wall}>)"
-msgstr ""
-
-#: src/discussion_formatters.py:72
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) created a [comment](<{url}?commentId={commentId}>) "
-"on [{article}](<{url}>)"
-msgstr ""
-
-#: src/discussion_formatters.py:78
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) created a [reply](<{url}?commentId={commentId}"
-"&replyId={replyId}>) to a [comment](<{url}?commentId={commentId}>) on "
-"[{article}](<{url}>)"
-msgstr ""
-
-#: src/discussion_formatters.py:86
-#, python-brace-format
-msgid ""
-"Unknown event `{event}` by [{author}]({author_url}), report it on the "
-"[support server](<{support}>)."
-msgstr ""
-
-#: src/discussion_formatters.py:123
-#, python-brace-format
-msgid "Created \"{title}\""
-msgstr ""
-
-#: src/discussion_formatters.py:127
-#, python-brace-format
-msgid "Created a poll \"{title}\""
-msgstr ""
-
-#: src/discussion_formatters.py:134
-msgid "Option {}"
-msgstr ""
-
-#: src/discussion_formatters.py:135
-#, python-brace-format
-msgid "__[View image]({image_url})__"
-msgstr ""
-
-#: src/discussion_formatters.py:139
-#, python-brace-format
-msgid "Created a quiz \"{title}\""
-msgstr ""
-
-#: src/discussion_formatters.py:155 src/discussion_formatters.py:157
-msgid "Tags"
-msgstr ""
-
-#: src/discussion_formatters.py:155
-msgid "{} tags"
-msgstr ""
-
-#: src/discussion_formatters.py:160
-#, python-brace-format
-msgid "Replied to \"{title}\""
-msgstr ""
-
-#: src/discussion_formatters.py:169
-#, python-brace-format
-msgid "Created \"{title}\" on {user}'s Message Wall"
-msgstr ""
-
-#: src/discussion_formatters.py:173
-#, python-brace-format
-msgid "Replied to \"{title}\" on {user}'s Message Wall"
-msgstr ""
-
-#: src/discussion_formatters.py:180
-#, python-brace-format
-msgid "Commented on {article}"
-msgstr ""
-
-#: src/discussion_formatters.py:184
-#, python-brace-format
-msgid "Replied to a comment on {article}"
-msgstr ""
-
-#: src/discussion_formatters.py:188
-#, python-brace-format
-msgid "Unknown event `{event}`"
-msgstr ""
-
-#: src/discussion_formatters.py:194 src/discussion_formatters.py:196
-msgid "Report this on the support server"
-msgstr ""
diff --git a/locale/uk/LC_MESSAGES/formatters.mo b/locale/uk/LC_MESSAGES/formatters.mo
new file mode 100644
index 0000000..07eef9d
Binary files /dev/null and b/locale/uk/LC_MESSAGES/formatters.mo differ
diff --git a/locale/uk/LC_MESSAGES/formatters.po b/locale/uk/LC_MESSAGES/formatters.po
new file mode 100644
index 0000000..de4186f
--- /dev/null
+++ b/locale/uk/LC_MESSAGES/formatters.po
@@ -0,0 +1,1937 @@
+# #-#-#-#-# rcgcdw.po #-#-#-#-#
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR , YEAR.
+#
+# #-#-#-#-# formatters.po #-#-#-#-#
+# #-#-#-#-# discussion_formatters.po #-#-#-#-#
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+#
+# Frisk <>, 2020.
+# #-#-#-#-# rc_formatters.po #-#-#-#-#
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR , YEAR.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: \n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2021-07-11 14:32+0200\n"
+"PO-Revision-Date: 2021-07-30 10:44+0000\n"
+"Last-Translator: MakandIv \n"
+"Language-Team: Ukrainian \n"
+"Language: uk\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n"
+"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
+"X-Generator: Weblate 4.6.2\n"
+
+#: src/api/util.py:61 src/api/util.py:66
+msgid "__Only whitespace__"
+msgstr "__Тільки пробіли__"
+
+#: src/api/util.py:71
+msgid "Removed"
+msgstr "Видалено"
+
+#: src/api/util.py:73
+msgid "Added"
+msgstr "Додано"
+
+#: src/api/util.py:94 src/api/util.py:126 src/api/util.py:133
+#: src/api/util.py:141 extensions/base/discussions.py:247
+#: extensions/base/discussions.py:264 extensions/base/abusefilter.py:45
+msgid "Unregistered user"
+msgstr "Незареєстрований користувач"
+
+#: src/api/util.py:160
+msgctxt "recent changes Tags"
+msgid "Tags"
+msgstr "Теги"
+
+#: src/api/util.py:162
+msgid "**Added**: "
+msgstr "**Додано**: "
+
+#: src/api/util.py:163
+msgid " and {} more\n"
+msgstr " та ще {}\n"
+
+#: src/api/util.py:165
+msgid "**Removed**: "
+msgstr "**Видалено**: "
+
+#: src/api/util.py:166
+msgid " and {} more"
+msgstr " та ще {}"
+
+#: src/api/util.py:168
+msgid "Changed categories"
+msgstr "Змінені категорії"
+
+#: extensions/base/cargo.py:37
+#, python-brace-format
+msgid "Created the Cargo table \"{table}\""
+msgstr "Створив таблицю Cargo \"{table}\""
+
+#: extensions/base/cargo.py:45
+#, python-brace-format
+msgid "[{author}]({author_url}) created the Cargo table \"{table}\""
+msgstr "[{author}]({author_url}) створив таблицю Cargo \"{table}\""
+
+#: extensions/base/cargo.py:60
+#, python-brace-format
+msgid "Recreated the Cargo table \"{table}\""
+msgstr "Відтворив таблицю Cargo \"{table}\""
+
+#: extensions/base/cargo.py:68
+#, python-brace-format
+msgid "[{author}]({author_url}) recreated the Cargo table \"{table}\""
+msgstr "[{author}]({author_url}) відтворив таблицю Cargo \"{table}\""
+
+#: extensions/base/cargo.py:83
+#, python-brace-format
+msgid "Replaced the Cargo table \"{table}\""
+msgstr "Замінив таблицю Cargo \"{table}\""
+
+#: extensions/base/cargo.py:91
+#, python-brace-format
+msgid "[{author}]({author_url}) replaced the Cargo table \"{table}\""
+msgstr "[{author}]({author_url}) замінив таблицю Cargo \"{table}\""
+
+#: extensions/base/cargo.py:105
+#, python-brace-format
+msgid "Deleted the Cargo table \"{table}\""
+msgstr "Видалив таблицю Cargo \"{table}\""
+
+#: extensions/base/cargo.py:112
+#, python-brace-format
+msgid "[{author}]({author_url}) deleted the Cargo table \"{table}\""
+msgstr "[{author}]({author_url}) видалив таблицю Cargo \"{table}\""
+
+#: extensions/base/translate.py:41
+#, python-brace-format
+msgid "Marked \"{article}\" for translation"
+msgstr "Зазначив сторінку «{article}» як доступну для перекладу"
+
+#: extensions/base/translate.py:55
+#, fuzzy, python-brace-format
+msgid ""
+"[{author}]({author_url}) marked [{article}]({article_url}) for "
+"translation{comment}"
+msgstr "[{author}]({author_url}) відновив [{article}]({article_url}){comment}"
+
+#: extensions/base/translate.py:70
+#, python-brace-format
+msgid "Removed \"{article}\" from the translation system"
+msgstr ""
+
+#: extensions/base/translate.py:80
+#, fuzzy, python-brace-format
+msgid ""
+"[{author}]({author_url}) removed [{article}]({article_url}) from the "
+"translation system{comment}"
+msgstr ""
+"[{author}]({author_url}) імпортував [{article}]({article_url}) з {count} "
+"версією{comment}"
+
+#: extensions/base/translate.py:95
+#, python-brace-format
+msgid "Completed moving translation pages from \"{article}\" to \"{target}\""
+msgstr ""
+
+#: extensions/base/translate.py:106
+#, fuzzy, python-brace-format
+msgid ""
+"[{author}]({author_url}) completed moving translation pages from *{article}* "
+"to [{target}]({target_url}){comment}"
+msgstr ""
+"[{author}]({author_url}) переніс налаштування захисту з {redirect}*{article}"
+"* на [{target}]({target_url}){comment}"
+
+#: extensions/base/translate.py:121
+#, python-brace-format
+msgid "Encountered a problem while moving \"{article}\" to \"{target}\""
+msgstr ""
+
+#: extensions/base/translate.py:133
+#, fuzzy, python-brace-format
+msgid ""
+"[{author}]({author_url}) encountered a problem while moving [{article}]"
+"({article_url}) to [{target}]({target_url}){comment}"
+msgstr ""
+"[{author}]({author_url}) об'єднав історії версій [{article}]({article_url}) "
+"з [{dest}]({dest_url}){comment}"
+
+#: extensions/base/translate.py:149
+#, python-brace-format
+msgid ""
+"Failed to delete \"{article}\" which belongs to translatable page "
+"\"{target}\""
+msgstr ""
+
+#: extensions/base/translate.py:161
+#, fuzzy, python-brace-format
+msgid ""
+"[{author}]({author_url}) failed to delete [{article}]({article_url}) which "
+"belongs to translatable page [{target}]({target_url}){comment}"
+msgstr ""
+"[{author}]({author_url}) імпортував [{article}]({article_url}) з {count} "
+"версією{comment}"
+
+#: extensions/base/translate.py:177
+#, fuzzy, python-brace-format
+msgid "Completed deletion of translation page \"{article}\""
+msgstr "Змінив видимість {amount} версії сторінки {article} "
+
+#: extensions/base/translate.py:188
+#, fuzzy, python-brace-format
+msgid ""
+"[{author}]({author_url}) completed deletion of translation page [{article}]"
+"({article_url}){comment}"
+msgstr ""
+"[{author}]({author_url}) змінив видимість {amount} версії сторінки "
+"[{article}]({article_url}){comment}"
+
+#: extensions/base/translate.py:203
+#, python-brace-format
+msgid ""
+"Failed to delete \"{article}\" which belongs to translation page \"{target}\""
+msgstr ""
+
+#: extensions/base/translate.py:215
+#, fuzzy, python-brace-format
+msgid ""
+"[{author}]({author_url}) failed to delete [{article}]({article_url}) which "
+"belongs to translation page [{target}]({target_url}){comment}"
+msgstr ""
+"[{author}]({author_url}) імпортував [{article}]({article_url}) з {count} "
+"версією{comment}"
+
+#: extensions/base/translate.py:231
+#, fuzzy, python-brace-format
+msgid "Encouraged translation of \"{article}\""
+msgstr "Зняв захист з {article}"
+
+#: extensions/base/translate.py:240
+#, fuzzy, python-brace-format
+msgid ""
+"[{author}]({author_url}) encouraged translation of [{article}]({article_url})"
+"{comment}"
+msgstr ""
+"[{author}]({author_url}) зняв захист з [{article}]({article_url}){comment}"
+
+#: extensions/base/translate.py:255
+#, python-brace-format
+msgid "Discouraged translation of \"{article}\""
+msgstr ""
+
+#: extensions/base/translate.py:264
+#, fuzzy, python-brace-format
+msgid ""
+"[{author}]({author_url}) discouraged translation of [{article}]"
+"({article_url}){comment}"
+msgstr "[{author}]({author_url}) відновив [{article}]({article_url}){comment}"
+
+#: extensions/base/translate.py:282
+#, python-brace-format
+msgid "Limited languages for \"{article}\" to `{languages}`"
+msgstr ""
+
+#: extensions/base/translate.py:285
+#, python-brace-format
+msgid "Priority languages for \"{article}\" set to `{languages}`"
+msgstr ""
+
+#: extensions/base/translate.py:288
+#, fuzzy, python-brace-format
+msgid "Removed priority languages from \"{article}\""
+msgstr "Зняв захист з {article}"
+
+#: extensions/base/translate.py:301
+#, fuzzy, python-brace-format
+msgid ""
+"[{author}]({author_url}) limited languages for [{article}]({article_url}) to "
+"`{languages}`{comment}"
+msgstr ""
+"[{author}]({author_url}) змінив налаштування захисту [{article}]"
+"({article_url}) на: {settings}{comment}"
+
+#: extensions/base/translate.py:308
+#, fuzzy, python-brace-format
+msgid ""
+"[{author}]({author_url}) set the priority languages for [{article}]"
+"({article_url}) to `{languages}`{comment}"
+msgstr ""
+"[{author}]({author_url}) змінив налаштування захисту [{article}]"
+"({article_url}) на: {settings}{comment}"
+
+#: extensions/base/translate.py:315
+#, fuzzy, python-brace-format
+msgid ""
+"[{author}]({author_url}) removed priority languages from [{article}]"
+"({article_url}){comment}"
+msgstr ""
+"[{author}]({author_url}) зняв захист з [{article}]({article_url}){comment}"
+
+#: extensions/base/translate.py:331
+#, python-brace-format
+msgid "Added translatable page \"{article}\" to aggregate group \"{group}\""
+msgstr ""
+
+#: extensions/base/translate.py:342
+#, fuzzy, python-brace-format
+msgid ""
+"[{author}]({author_url}) added translatable page [{article}]({article_url}) "
+"to aggregate group \"{group}\"{comment}"
+msgstr ""
+"[{author}]({author_url}) змінив модель вмісту сторінки [{article}]"
+"({article_url}) з {old} на {new}{comment}"
+
+#: extensions/base/translate.py:357
+#, python-brace-format
+msgid ""
+"Removed translatable page \"{article}\" from aggregate group \"{group}\""
+msgstr ""
+
+#: extensions/base/translate.py:368
+#, fuzzy, python-brace-format
+msgid ""
+"[{author}]({author_url}) removed translatable page [{article}]"
+"({article_url}) from aggregate group \"{group}\"{comment}"
+msgstr ""
+"[{author}]({author_url}) зняв захист з [{article}]({article_url}){comment}"
+
+#: extensions/base/translate.py:387
+#, fuzzy, python-brace-format
+msgid "Reviewed translation \"{article}\""
+msgstr "Зняв захист з {article}"
+
+#: extensions/base/translate.py:401
+#, fuzzy, python-brace-format
+msgid ""
+"[{author}]({author_url}) reviewed translation [{article}]({article_url})"
+"{comment}"
+msgstr "[{author}]({author_url}) відновив [{article}]({article_url}){comment}"
+
+#: extensions/base/translate.py:416
+#, python-brace-format
+msgid "Changed the state of `{language}` translations of \"{article}\""
+msgstr ""
+
+#: extensions/base/translate.py:419
+msgid "Old state"
+msgstr ""
+
+#: extensions/base/translate.py:420
+msgid "New state"
+msgstr ""
+
+#: extensions/base/translate.py:431
+#, fuzzy, python-brace-format
+msgid ""
+"[{author}]({author_url}) changed the state of `{language}` translations of "
+"[{article}]({article_url}) from `{old_state}` to `{new_state}`{comment}"
+msgstr ""
+"[{author}]({author_url}) змінив модель вмісту сторінки [{article}]"
+"({article_url}) з {old} на {new}{comment}"
+
+#: extensions/base/translate.py:439
+#, fuzzy, python-brace-format
+msgid ""
+"[{author}]({author_url}) changed the state of `{language}` translations of "
+"[{article}]({article_url}) to `{new_state}`{comment}"
+msgstr ""
+"[{author}]({author_url}) змінив модель вмісту сторінки [{article}]"
+"({article_url}) з {old} на {new}{comment}"
+
+#: extensions/base/translate.py:452 extensions/base/translate.py:455
+msgid "(default)"
+msgstr ""
+
+#: extensions/base/translate.py:464
+#, fuzzy, python-brace-format
+msgid "Changed the language of \"{article}\""
+msgstr "Зняв захист з {article}"
+
+#: extensions/base/translate.py:465
+msgid "Old language"
+msgstr ""
+
+#: extensions/base/translate.py:466
+msgid "New language"
+msgstr ""
+
+#: extensions/base/translate.py:477
+#, fuzzy, python-brace-format
+msgid ""
+"[{author}]({author_url}) changed the language of [{article}]({article_url}) "
+"from {old_lang} to {new_lang}{comment}"
+msgstr ""
+"[{author}]({author_url}) змінив модель вмісту сторінки [{article}]"
+"({article_url}) з {old} на {new}{comment}"
+
+#: extensions/base/discussions.py:148 extensions/base/discussions.py:207
+#: extensions/base/discussions.py:245 extensions/base/discussions.py:261
+#: extensions/base/discussions.py:284 extensions/base/discussions.py:306
+#: extensions/base/discussions.py:334 extensions/base/discussions.py:354
+msgid "unknown"
+msgstr ""
+
+#: extensions/base/discussions.py:157
+#, python-brace-format
+msgid "Created \"{title}\""
+msgstr ""
+
+#: extensions/base/discussions.py:161
+#, python-brace-format
+msgid "Created a poll \"{title}\""
+msgstr ""
+
+#: extensions/base/discussions.py:168
+msgid "Option {}"
+msgstr ""
+
+#: extensions/base/discussions.py:170
+#, python-brace-format
+msgid "__[View image]({image_url})__"
+msgstr ""
+
+#: extensions/base/discussions.py:174
+#, python-brace-format
+msgid "Created a quiz \"{title}\""
+msgstr ""
+
+#: extensions/base/discussions.py:193 extensions/base/discussions.py:195
+#, fuzzy
+msgctxt "Fandom discussions Tags/Forums"
+msgid "Tags"
+msgstr "Теги"
+
+#: extensions/base/discussions.py:193
+msgctxt "Fandom discussions amount of Tags/Forums"
+msgid "{} tags"
+msgstr ""
+
+#: extensions/base/discussions.py:198
+#, python-brace-format
+msgid "Replied to \"{title}\""
+msgstr ""
+
+#: extensions/base/discussions.py:214
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) created [{title}](<{url}f/p/{threadId}>) in "
+"{forumName}"
+msgstr ""
+
+#: extensions/base/discussions.py:217
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) created a poll [{title}](<{url}f/p/{threadId}>) in "
+"{forumName}"
+msgstr ""
+
+#: extensions/base/discussions.py:220
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) created a quiz [{title}](<{url}f/p/{threadId}>) in "
+"{forumName}"
+msgstr ""
+
+#: extensions/base/discussions.py:234
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) created a [reply](<{url}f/p/{threadId}/r/{postId}>) "
+"to [{title}](<{url}f/p/{threadId}>) in {forumName}"
+msgstr ""
+
+#: extensions/base/discussions.py:292
+#, python-brace-format
+msgid "Created \"{title}\" on {user}'s Message Wall"
+msgstr ""
+
+#: extensions/base/discussions.py:298
+#, python-brace-format
+msgid "Replied to \"{title}\" on {user}'s Message Wall"
+msgstr ""
+
+#: extensions/base/discussions.py:312
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) created [{title}](<{url}wiki/Message_Wall:"
+"{user_wall}?threadId={threadId}>) on [{user}'s Message Wall](<{url}wiki/"
+"Message_Wall:{user_wall}>)"
+msgstr ""
+
+#: extensions/base/discussions.py:318
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) created a [reply](<{url}wiki/Message_Wall:"
+"{user_wall}?threadId={threadId}#{replyId}>) to [{title}](<{url}wiki/"
+"Message_Wall:{user_wall}?threadId={threadId}>) on [{user}'s Message Wall]"
+"(<{url}wiki/Message_Wall:{user_wall}>)"
+msgstr ""
+
+#: extensions/base/discussions.py:338
+#, python-brace-format
+msgid "Commented on {article}"
+msgstr ""
+
+#: extensions/base/discussions.py:344
+#, python-brace-format
+msgid "Replied to a comment on {article}"
+msgstr ""
+
+#: extensions/base/discussions.py:359
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) created a [comment](<{url}?commentId={commentId}>) "
+"on [{article}](<{url}>)"
+msgstr ""
+
+#: extensions/base/discussions.py:365
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) created a [reply](<{url}?commentId={commentId}"
+"&replyId={replyId}>) to a [comment](<{url}?commentId={commentId}>) on "
+"[{article}](<{url}>)"
+msgstr ""
+
+#: extensions/base/managewiki.py:34
+msgid "Changed wiki settings"
+msgstr ""
+
+#: extensions/base/managewiki.py:44
+#, fuzzy, python-brace-format
+msgid "[{author}]({author_url}) changed wiki settings{reason}"
+msgstr "[{author}]({author_url}) змінив видимість подій журналу{comment}"
+
+#: extensions/base/managewiki.py:55
+#, fuzzy, python-brace-format
+msgid "Deleted a \"{wiki}\" wiki"
+msgstr "Вилучив тег \"{tag}\""
+
+#: extensions/base/managewiki.py:55 extensions/base/managewiki.py:67
+#: extensions/base/managewiki.py:103 extensions/base/managewiki.py:112
+#: extensions/base/managewiki.py:125 extensions/base/managewiki.py:126
+#: extensions/base/managewiki.py:135 extensions/base/managewiki.py:136
+#: extensions/base/managewiki.py:148 extensions/base/managewiki.py:149
+#: extensions/base/managewiki.py:160 extensions/base/managewiki.py:161
+#: extensions/base/managewiki.py:195 extensions/base/managewiki.py:204
+#: extensions/base/managewiki.py:217 extensions/base/managewiki.py:226
+#: extensions/base/abusefilter.py:55 extensions/base/abusefilter.py:56
+#: extensions/base/abusefilter.py:57 extensions/base/abusefilter.py:68
+#: extensions/base/abusefilter.py:69 extensions/base/abusefilter.py:70
+#: extensions/base/mediawiki.py:743
+msgid "Unknown"
+msgstr "Невідомо"
+
+#: extensions/base/managewiki.py:63
+#, fuzzy, python-brace-format
+msgid "[{author}]({author_url}) deleted a wiki *{wiki_name}*{comment}"
+msgstr "[{author}]({author_url}) імпортував інтервікі{comment}"
+
+#: extensions/base/managewiki.py:80
+#, python-brace-format
+msgid "Deleted a \"{group}\" user group"
+msgstr ""
+
+#: extensions/base/managewiki.py:89
+#, fuzzy, python-brace-format
+msgid "[{author}]({author_url}) deleted a usergroup *{group}*{comment}"
+msgstr "[{author}]({author_url}) імпортував інтервікі{comment}"
+
+#: extensions/base/managewiki.py:103
+#, python-brace-format
+msgid "Locked a \"{wiki}\" wiki"
+msgstr ""
+
+#: extensions/base/managewiki.py:111
+#, fuzzy, python-brace-format
+msgid "[{author}]({author_url}) locked a wiki *{wiki_name}*{comment}"
+msgstr "[{author}]({author_url}) імпортував інтервікі{comment}"
+
+#: extensions/base/managewiki.py:124
+#, python-brace-format
+msgid "Modified \"{namespace_name}\" namespace"
+msgstr ""
+
+#: extensions/base/managewiki.py:126 extensions/base/managewiki.py:149
+msgid "Wiki"
+msgstr ""
+
+#: extensions/base/managewiki.py:134
+#, fuzzy, python-brace-format
+msgid ""
+"[{author}]({author_url}) modified namespace *{namespace_name}* on "
+"*{wiki_name}*{comment}"
+msgstr ""
+"[{author}]({author_url}) завантажив нову версію [{file}]({file_link})"
+"{comment}"
+
+#: extensions/base/managewiki.py:147
+#, python-brace-format
+msgid "Deleted a \"{namespace_name}\" namespace"
+msgstr ""
+
+#: extensions/base/managewiki.py:158
+#, fuzzy, python-brace-format
+msgid ""
+"[{author}]({author_url}) deleted a namespace *{namespace_name}* on "
+"*{wiki_name}*{comment}"
+msgstr "[{author}]({author_url}) вилучив [{page}]({page_link}){comment}"
+
+#: extensions/base/managewiki.py:173
+#, python-brace-format
+msgid "Modified \"{usergroup_name}\" usergroup"
+msgstr ""
+
+#: extensions/base/managewiki.py:182
+#, fuzzy, python-brace-format
+msgid "[{author}]({author_url}) modified user group *{group_name}*{comment}"
+msgstr "[{author}]({author_url}) імпортував інтервікі{comment}"
+
+#: extensions/base/managewiki.py:195
+#, fuzzy, python-brace-format
+msgid "Undeleted a \"{wiki}\" wiki"
+msgstr "Вилучив тег \"{tag}\""
+
+#: extensions/base/managewiki.py:203
+#, fuzzy, python-brace-format
+msgid "[{author}]({author_url}) undeleted a wiki *{wiki_name}*{comment}"
+msgstr "[{author}]({author_url}) імпортував інтервікі{comment}"
+
+#: extensions/base/managewiki.py:217
+#, python-brace-format
+msgid "Unlocked a \"{wiki}\" wiki"
+msgstr ""
+
+#: extensions/base/managewiki.py:225
+#, fuzzy, python-brace-format
+msgid "[{author}]({author_url}) unlocked a wiki *{wiki_name}*{comment}"
+msgstr "[{author}]({author_url}) імпортував інтервікі{comment}"
+
+#: extensions/base/datadump.py:36
+#, python-brace-format
+msgid "Generated {file} dump"
+msgstr ""
+
+#: extensions/base/datadump.py:45
+#, fuzzy, python-brace-format
+msgid "[{author}]({author_url}) generated *{file}* dump{comment}"
+msgstr "[{author}]({author_url}) імпортував інтервікі{comment}"
+
+#: extensions/base/datadump.py:58
+#, fuzzy, python-brace-format
+msgid "Deleted {file} dump"
+msgstr "Вилучив сторінку {article}"
+
+#: extensions/base/datadump.py:67
+#, fuzzy, python-brace-format
+msgid "[{author}]({author_url}) deleted *{file}* dump{comment}"
+msgstr "[{author}]({author_url}) імпортував інтервікі{comment}"
+
+#: extensions/base/curseprofile.py:40
+#, python-brace-format
+msgid "Edited {target}'s profile"
+msgstr "Відредагував профіль {target}"
+
+#: extensions/base/curseprofile.py:42
+msgid "Edited their own profile"
+msgstr "Відредагував свій профіль"
+
+#: extensions/base/curseprofile.py:44
+#, python-brace-format
+msgid "Cleared the {field} field"
+msgstr "Очистив поле {field}"
+
+#: extensions/base/curseprofile.py:46
+#, python-brace-format
+msgid "{field} field changed to: {desc}"
+msgstr "Поле {field} змінено на: {desc}"
+
+#: extensions/base/curseprofile.py:58
+#, fuzzy, python-brace-format
+msgid ""
+"[{author}]({author_url}) cleared the {field} on [{target}]({target_url})'s "
+"profile."
+msgstr ""
+"[{author}]({author_url}) відредагував {field} на профілі {target}. *({desc})*"
+
+#: extensions/base/curseprofile.py:60
+#, fuzzy, python-brace-format
+msgid ""
+"[{author}]({author_url}) edited the {field} on [{target}]({target_url})'s "
+"profile. *({desc})*"
+msgstr ""
+"[{author}]({author_url}) відредагував {field} на профілі {target}. *({desc})*"
+
+#: extensions/base/curseprofile.py:65
+#, fuzzy, python-brace-format
+msgid ""
+"[{author}]({author_url}) cleared the {field} on [their own]({target_url}) "
+"profile."
+msgstr ""
+"[{author}]({author_url}) відредагував {field} на профілі {target}. *({desc})*"
+
+#: extensions/base/curseprofile.py:67
+#, fuzzy, python-brace-format
+msgid ""
+"[{author}]({author_url}) edited the {field} on [their own]({target_url}) "
+"profile. *({desc})*"
+msgstr ""
+"[{author}]({author_url}) відредагував {field} на профілі {target}. *({desc})*"
+
+#: extensions/base/curseprofile.py:82
+#, python-brace-format
+msgid "Left a comment on {target}'s profile"
+msgstr "Залишив коментар на профілі {target}"
+
+#: extensions/base/curseprofile.py:84
+msgid "Left a comment on their own profile"
+msgstr "Залишив коментар на своєму профілі"
+
+#: extensions/base/curseprofile.py:97
+#, fuzzy, python-brace-format
+msgid ""
+"[{author}]({author_url}) left a [comment]({comment}) on {target}'s profile."
+msgstr ""
+"[{author}]({author_url}) залишив [коментар]({comment}) на профілі {target}"
+
+#: extensions/base/curseprofile.py:100
+#, fuzzy, python-brace-format
+msgid ""
+"[{author}]({author_url}) left a [comment]({comment}) on their own profile."
+msgstr ""
+"[{author}]({author_url}) залишив [коментар]({comment}) на профілі {target}"
+
+#: extensions/base/curseprofile.py:113
+#, python-brace-format
+msgid "Edited a comment on {target}'s profile"
+msgstr "Відредагував коментар на профілі {target}"
+
+#: extensions/base/curseprofile.py:115
+msgid "Edited a comment on their own profile"
+msgstr "Відредагував коментар на своєму профілі"
+
+#: extensions/base/curseprofile.py:128
+#, fuzzy, python-brace-format
+msgid ""
+"[{author}]({author_url}) edited a [comment]({comment}) on {target}'s profile."
+msgstr ""
+"[{author}]({author_url}) відредагував [коментар]({comment}) на профілі "
+"{target}"
+
+#: extensions/base/curseprofile.py:131
+#, fuzzy, python-brace-format
+msgid ""
+"[{author}]({author_url}) edited a [comment]({comment}) on their own profile."
+msgstr ""
+"[{author}]({author_url}) відредагував [коментар]({comment}) на профілі "
+"{target}"
+
+#: extensions/base/curseprofile.py:144
+#, python-brace-format
+msgid "Replied to a comment on {target}'s profile"
+msgstr "Відповів на коментар на профілі {target}"
+
+#: extensions/base/curseprofile.py:146
+msgid "Replied to a comment on their own profile"
+msgstr "Відповів на коментар на своєму профілі"
+
+#: extensions/base/curseprofile.py:159
+#, fuzzy, python-brace-format
+msgid ""
+"[{author}]({author_url}) replied to a [comment]({comment}) on {target}'s "
+"profile."
+msgstr ""
+"[{author}]({author_url}) відповів на [коментар]({comment}) на профілі "
+"{target}"
+
+#: extensions/base/curseprofile.py:162
+#, fuzzy, python-brace-format
+msgid ""
+"[{author}]({author_url}) replied to a [comment]({comment}) on their own "
+"profile."
+msgstr ""
+"[{author}]({author_url}) відповів на [коментар]({comment}) на профілі "
+"{target}"
+
+#: extensions/base/curseprofile.py:175
+#, python-brace-format
+msgid "Deleted a comment on {target}'s profile"
+msgstr "Вилучив коментар на профілі {target}"
+
+#: extensions/base/curseprofile.py:177
+#, fuzzy
+msgid "Deleted a comment on their own profile"
+msgstr "Відредагував коментар на своєму профілі"
+
+#: extensions/base/curseprofile.py:197
+#, fuzzy, python-brace-format
+msgid ""
+"[{author}]({author_url}) deleted a [comment]({comment}) on {target}'s "
+"profile.{reason}"
+msgstr ""
+"[{author}]({author_url}) відредагував [коментар]({comment}) на профілі "
+"{target}"
+
+#: extensions/base/curseprofile.py:200
+#, fuzzy, python-brace-format
+msgid ""
+"[{author}]({author_url}) deleted a [comment]({comment}) on their own profile."
+"{reason}"
+msgstr ""
+"[{author}]({author_url}) відредагував [коментар]({comment}) на профілі "
+"{target}"
+
+#: extensions/base/curseprofile.py:214
+#, python-brace-format
+msgid "Purged a comment on {target}'s profile"
+msgstr "Вилучив коментар в профілі {target}"
+
+#: extensions/base/curseprofile.py:216
+#, fuzzy
+msgid "Purged a comment on their own profile"
+msgstr "Відредагував коментар на своєму профілі"
+
+#: extensions/base/curseprofile.py:230
+#, fuzzy, python-brace-format
+msgid ""
+"[{author}]({author_url}) purged a comment on [{target}]({link})'s profile."
+"{reason}"
+msgstr "[{author}] ({author_url}) вилучив коментар в профілі {target}"
+
+#: extensions/base/curseprofile.py:233
+#, fuzzy, python-brace-format
+msgid ""
+"[{author}]({author_url}) purged a comment on [their own]({link}) profile."
+"{reason}"
+msgstr "[{author}] ({author_url}) вилучив коментар в профілі {target}"
+
+#: extensions/base/renameuser.py:38
+#, python-brace-format
+msgid "Renamed user \"{old_name}\" with {edits} edit to \"{new_name}\""
+msgid_plural "Renamed user \"{old_name}\" with {edits} edits to \"{new_name}\""
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
+#: extensions/base/renameuser.py:43
+#, python-brace-format
+msgid "Renamed user \"{old_name}\" to \"{new_name}\""
+msgstr ""
+
+#: extensions/base/renameuser.py:58
+#, fuzzy, python-brace-format
+msgid ""
+"[{author}]({author_url}) renamed user *{old_name}* with {edits} edit to "
+"[{new_name}]({link}){comment}"
+msgid_plural ""
+"[{author}]({author_url}) renamed user *{old_name}* with {edits} edits to "
+"[{new_name}]({link}){comment}"
+msgstr[0] "[{author}]({author_url}) вилучив [{page}]({page_link}){comment}"
+msgstr[1] "[{author}]({author_url}) вилучив [{page}]({page_link}){comment}"
+msgstr[2] "[{author}]({author_url}) вилучив [{page}]({page_link}){comment}"
+
+#: extensions/base/renameuser.py:66
+#, fuzzy, python-brace-format
+msgid ""
+"[{author}]({author_url}) renamed user *{old_name}* to [{new_name}]({link})"
+"{comment}"
+msgstr "[{author}]({author_url}) вилучив [{page}]({page_link}){comment}"
+
+#: extensions/base/interwiki.py:37
+msgid "Added an entry to the interwiki table"
+msgstr "Додав запис в таблицю інтервікі"
+
+#: extensions/base/interwiki.py:38 extensions/base/interwiki.py:65
+#, python-brace-format
+msgid "Prefix: {prefix}, website: {website} | {desc}"
+msgstr "Префікс: {prefix}, веб-сайт: {website} | {desc}"
+
+#: extensions/base/interwiki.py:50
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) added an entry to the [interwiki table]"
+"({table_url}) pointing to {website} with {prefix} prefix"
+msgstr ""
+"[{author}]({author_url}) додав запис в [таблицю інтервікі]({table_url}), яка "
+"вказує на {website} з префіксом {prefix}"
+
+#: extensions/base/interwiki.py:64
+msgid "Edited an entry in interwiki table"
+msgstr "Відредагував запис в таблиці інтервікі"
+
+#: extensions/base/interwiki.py:77
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) edited an entry in [interwiki table]({table_url}) "
+"pointing to {website} with {prefix} prefix"
+msgstr ""
+"[{author}]({author_url}) відредагував запис в [таблиці інтервікі]"
+"({table_url}), яка вказує на {website} з префіксом {prefix}"
+
+#: extensions/base/interwiki.py:91
+msgid "Deleted an entry in interwiki table"
+msgstr "Вилучив запис в таблиці інтервікі"
+
+#: extensions/base/interwiki.py:92
+#, python-brace-format
+msgid "Prefix: {prefix} | {desc}"
+msgstr "Префікс: {prefix} | {desc}"
+
+#: extensions/base/interwiki.py:102
+#, fuzzy, python-brace-format
+msgid ""
+"[{author}]({author_url}) deleted an entry in [interwiki table]({table_url})"
+"{desc}"
+msgstr ""
+"[{author}]({author_url}) вилучив запис в [таблиці інтервікі]({table_url})"
+
+#: extensions/base/abusefilter.py:29
+msgid "None"
+msgstr ""
+
+#: extensions/base/abusefilter.py:29
+msgid "Warning issued"
+msgstr ""
+
+#: extensions/base/abusefilter.py:29
+msgid "**Blocked user**"
+msgstr ""
+
+#: extensions/base/abusefilter.py:29
+msgid "Tagged the edit"
+msgstr ""
+
+#: extensions/base/abusefilter.py:29
+msgid "Disallowed the action"
+msgstr ""
+
+#: extensions/base/abusefilter.py:29
+msgid "**IP range blocked**"
+msgstr ""
+
+#: extensions/base/abusefilter.py:29
+msgid "Throttled actions"
+msgstr ""
+
+#: extensions/base/abusefilter.py:29
+msgid "Removed autoconfirmed group"
+msgstr ""
+
+#: extensions/base/abusefilter.py:29
+msgid "**Removed from privileged groups**"
+msgstr ""
+
+#: extensions/base/abusefilter.py:30
+msgid "Edit"
+msgstr ""
+
+#: extensions/base/abusefilter.py:30
+msgid "Upload"
+msgstr ""
+
+#: extensions/base/abusefilter.py:30
+msgid "Move"
+msgstr ""
+
+#: extensions/base/abusefilter.py:30
+msgid "Stash upload"
+msgstr ""
+
+#: extensions/base/abusefilter.py:30
+msgid "Deletion"
+msgstr ""
+
+#: extensions/base/abusefilter.py:30
+msgid "Account creation"
+msgstr ""
+
+#: extensions/base/abusefilter.py:30
+msgid "Auto account creation"
+msgstr ""
+
+#: extensions/base/abusefilter.py:54
+#, python-brace-format
+msgid "{user} triggered \"{abuse_filter}\""
+msgstr ""
+
+#: extensions/base/abusefilter.py:55
+msgid "Performed"
+msgstr ""
+
+#: extensions/base/abusefilter.py:56
+msgid "Action taken"
+msgstr ""
+
+#: extensions/base/abusefilter.py:57
+msgid "Title"
+msgstr ""
+
+#: extensions/base/abusefilter.py:66
+#, fuzzy, python-brace-format
+msgid ""
+"[{author}]({author_url}) triggered *{abuse_filter}*, performing the action "
+"\"{action}\" on *[{target}]({target_url})* - action taken: {result}."
+msgstr ""
+"[{author}]({author_url}) перейменував {redirect}*{article}* поверх "
+"перенаправлення в [{target}]({target_url}) {made_a_redirect}{comment}"
+
+#: extensions/base/abusefilter.py:83
+#, python-brace-format
+msgid "Edited abuse filter number {number}"
+msgstr "Відредагував фільтр зловживань під номером {number}"
+
+#: extensions/base/abusefilter.py:95
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) edited abuse filter [number {number}]({filter_url})"
+msgstr ""
+"[{author}]({author_url}) відредагував фільтр зловживань [під номером "
+"{number}]({filter_url})"
+
+#: extensions/base/abusefilter.py:111
+#, python-brace-format
+msgid "Created abuse filter number {number}"
+msgstr "Створив фільтр зловживань під номером {number}"
+
+#: extensions/base/abusefilter.py:119
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) created abuse filter [number {number}]({filter_url})"
+msgstr ""
+"[{author}]({author_url}) створив фільтр зловживань [під номером {number}]"
+"({filter_url})"
+
+#: extensions/base/mediawiki.py:37
+msgid "director"
+msgstr "директор"
+
+#: extensions/base/mediawiki.py:37
+msgid "bot"
+msgstr "бот"
+
+#: extensions/base/mediawiki.py:37
+msgid "editor"
+msgstr "редактор"
+
+#: extensions/base/mediawiki.py:37
+msgid "directors"
+msgstr "директора"
+
+#: extensions/base/mediawiki.py:37
+msgid "sysop"
+msgstr "администратор"
+
+#: extensions/base/mediawiki.py:37
+msgid "bureaucrat"
+msgstr "бюрократ"
+
+#: extensions/base/mediawiki.py:37
+msgid "reviewer"
+msgstr "оглядач"
+
+#: extensions/base/mediawiki.py:38
+msgid "autoreview"
+msgstr "автоперегляд"
+
+#: extensions/base/mediawiki.py:38
+msgid "autopatrol"
+msgstr "автопатрульний"
+
+#: extensions/base/mediawiki.py:38
+msgid "wiki_guardian"
+msgstr "зберігач_вікі"
+
+#: extensions/base/mediawiki.py:70
+msgid "(N!) "
+msgstr "(Н!) "
+
+#: extensions/base/mediawiki.py:71
+msgid "m"
+msgstr "м"
+
+#: extensions/base/mediawiki.py:72
+msgid "b"
+msgstr "б"
+
+#: extensions/base/mediawiki.py:112
+#, fuzzy, python-brace-format
+msgid ""
+"[{author}]({author_url}) edited [{article}]({edit_link}){comment} {bold}"
+"({sign}{edit_size}){bold}"
+msgstr ""
+"[{author}]({author_url}) відредагував [{article}]({edit_link}){comment} "
+"({sign}{edit_size})"
+
+#: extensions/base/mediawiki.py:117
+#, fuzzy, python-brace-format
+msgid ""
+"[{author}]({author_url}) created [{article}]({edit_link}){comment} {bold}"
+"({sign}{edit_size}){bold}"
+msgstr ""
+"[{author}]({author_url}) створив [{article}]({edit_link}){comment} ({sign}"
+"{edit_size})"
+
+#: extensions/base/mediawiki.py:190 extensions/base/mediawiki.py:223
+msgid "Options"
+msgstr "Параметри"
+
+#: extensions/base/mediawiki.py:190
+#, python-brace-format
+msgid "([preview]({link}) | [undo]({undolink}))"
+msgstr "([перегляд]({link}) | [скасувати]({undolink}))"
+
+#: extensions/base/mediawiki.py:195
+#, python-brace-format
+msgid "Uploaded a new version of {name}"
+msgstr "Завантажив нову версію {name}"
+
+#: extensions/base/mediawiki.py:197
+#, python-brace-format
+msgid "Reverted a version of {name}"
+msgstr "Повернув версію {name}"
+
+#: extensions/base/mediawiki.py:199
+#, python-brace-format
+msgid "Uploaded {name}"
+msgstr "Загрузил {name}"
+
+#: extensions/base/mediawiki.py:208
+msgid "**No license!**"
+msgstr "**Немає ліцензії!**"
+
+#: extensions/base/mediawiki.py:223
+#, python-brace-format
+msgid "([preview]({link}))"
+msgstr "([перегляд]({link}))"
+
+#: extensions/base/mediawiki.py:228
+msgid ""
+"\n"
+"License: {}"
+msgstr ""
+"\n"
+"Ліцензія: {}"
+
+#: extensions/base/mediawiki.py:237
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) reverted a version of [{file}]({file_link}){comment}"
+msgstr ""
+"[{author}] ({author_url}) повернув версію [{file}] ({file_link}) {comment}"
+
+#: extensions/base/mediawiki.py:248
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) uploaded a new version of [{file}]({file_link})"
+"{comment}"
+msgstr ""
+"[{author}]({author_url}) завантажив нову версію [{file}]({file_link})"
+"{comment}"
+
+#: extensions/base/mediawiki.py:259
+#, python-brace-format
+msgid "[{author}]({author_url}) uploaded [{file}]({file_link}){comment}"
+msgstr "[{author}]({author_url}) завантажив [{file}]({file_link}){comment}"
+
+#: extensions/base/mediawiki.py:274
+#, python-brace-format
+msgid "Deleted page {article}"
+msgstr "Вилучив сторінку {article}"
+
+#: extensions/base/mediawiki.py:283
+#, python-brace-format
+msgid "[{author}]({author_url}) deleted [{page}]({page_link}){comment}"
+msgstr "[{author}]({author_url}) вилучив [{page}]({page_link}){comment}"
+
+#: extensions/base/mediawiki.py:298
+#, python-brace-format
+msgid "Deleted redirect {article} by overwriting"
+msgstr "Вилучив перенаправлення {article} by overwriting"
+
+#: extensions/base/mediawiki.py:308
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) deleted redirect by overwriting [{page}]"
+"({page_link}){comment}"
+msgstr ""
+"[{author}]({author_url}) вилучив перенаправлення за допомогою перезапису "
+"[{page}]({page_link}){comment}"
+
+#: extensions/base/mediawiki.py:322
+#, python-brace-format
+msgid "Restored {article}"
+msgstr "Відновив {article}"
+
+#: extensions/base/mediawiki.py:331
+#, python-brace-format
+msgid "[{author}]({author_url}) restored [{article}]({article_url}){comment}"
+msgstr "[{author}]({author_url}) відновив [{article}]({article_url}){comment}"
+
+#: extensions/base/mediawiki.py:348
+msgid "Changed visibility of log events"
+msgstr "Змінив видимість подій журналу"
+
+#: extensions/base/mediawiki.py:356
+#, python-brace-format
+msgid "[{author}]({author_url}) changed visibility of log events{comment}"
+msgstr "[{author}]({author_url}) змінив видимість подій журналу{comment}"
+
+#: extensions/base/mediawiki.py:370
+#, python-brace-format
+msgid "Changed visibility of revision on page {article} "
+msgid_plural "Changed visibility of {amount} revisions on page {article} "
+msgstr[0] "Змінив видимість {amount} версії сторінки {article} "
+msgstr[1] "Змінив видимість {amount} версій сторінки {article} "
+msgstr[2] "Змінив видимість {amount} версій сторінки {article} "
+
+#: extensions/base/mediawiki.py:383
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) changed visibility of revision on page [{article}]"
+"({article_url}){comment}"
+msgid_plural ""
+"[{author}]({author_url}) changed visibility of {amount} revisions on page "
+"[{article}]({article_url}){comment}"
+msgstr[0] ""
+"[{author}]({author_url}) змінив видимість {amount} версії сторінки "
+"[{article}]({article_url}){comment}"
+msgstr[1] ""
+"[{author}]({author_url}) змінив видимість {amount} версій сторінки "
+"[{article}]({article_url}){comment}"
+msgstr[2] ""
+"[{author}]({author_url}) змінив видимість {amount} версій сторінки "
+"[{article}]({article_url}){comment}"
+
+#: extensions/base/mediawiki.py:399 extensions/base/mediawiki.py:432
+msgid "No redirect has been made"
+msgstr "Перенаправлення не зроблено"
+
+#: extensions/base/mediawiki.py:400 extensions/base/mediawiki.py:433
+msgid "A redirect has been made"
+msgstr "Перенаправлення було зроблено"
+
+#: extensions/base/mediawiki.py:401
+#, python-brace-format
+msgid "Moved {redirect}{article} to {target}"
+msgstr "Перейменував сторінку {redirect}{article} to {target}"
+
+#: extensions/base/mediawiki.py:412 extensions/base/mediawiki.py:444
+msgid "without making a redirect"
+msgstr "не залишивши перенаправлення"
+
+#: extensions/base/mediawiki.py:413 extensions/base/mediawiki.py:445
+msgid "with a redirect"
+msgstr "з перенаправленням"
+
+#: extensions/base/mediawiki.py:416
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) moved {redirect}*{article}* to [{target}]"
+"({target_url}) {made_a_redirect}{comment}"
+msgstr ""
+"[{author}]({author_url}) перейменував {redirect}*{article}* в [{target}]"
+"({target_url}) {made_a_redirect}{comment}"
+
+#: extensions/base/mediawiki.py:434
+#, python-brace-format
+msgid "Moved {redirect}{article} to {title} over redirect"
+msgstr ""
+"Перейменував сторінку {redirect}{article} to {title} поверх перенаправлення"
+
+#: extensions/base/mediawiki.py:448
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) moved {redirect}*{article}* over redirect to "
+"[{target}]({target_url}) {made_a_redirect}{comment}"
+msgstr ""
+"[{author}]({author_url}) перейменував {redirect}*{article}* поверх "
+"перенаправлення в [{target}]({target_url}) {made_a_redirect}{comment}"
+
+#: extensions/base/mediawiki.py:464
+#, python-brace-format
+msgid "Moved protection settings from {redirect}{article} to {title}"
+msgstr "Переніс налаштування захисту з {redirect}{article} на {title}"
+
+#: extensions/base/mediawiki.py:477
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) moved protection settings from {redirect}*{article}"
+"* to [{target}]({target_url}){comment}"
+msgstr ""
+"[{author}]({author_url}) переніс налаштування захисту з {redirect}*{article}"
+"* на [{target}]({target_url}){comment}"
+
+#: extensions/base/mediawiki.py:492
+#, python-brace-format
+msgid "Protected {target}"
+msgstr "Захистив {target}"
+
+#: extensions/base/mediawiki.py:495 extensions/base/mediawiki.py:510
+#: extensions/base/mediawiki.py:526 extensions/base/mediawiki.py:541
+msgid " [cascading]"
+msgstr " [каскадний]"
+
+#: extensions/base/mediawiki.py:506
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) protected [{article}]({article_url}) with the "
+"following settings: {settings}{comment}"
+msgstr ""
+"[{author}]({author_url}) захистив [{article}]({article_url}) з наступними "
+"налаштуваннями: {settings}{comment}"
+
+#: extensions/base/mediawiki.py:523
+#, python-brace-format
+msgid "Changed protection level for {article}"
+msgstr "Змінив рівень захисту для {article}"
+
+#: extensions/base/mediawiki.py:537
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) modified protection settings of [{article}]"
+"({article_url}) to: {settings}{comment}"
+msgstr ""
+"[{author}]({author_url}) змінив налаштування захисту [{article}]"
+"({article_url}) на: {settings}{comment}"
+
+#: extensions/base/mediawiki.py:554
+#, python-brace-format
+msgid "Removed protection from {article}"
+msgstr "Зняв захист з {article}"
+
+#: extensions/base/mediawiki.py:563
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) removed protection from [{article}]({article_url})"
+"{comment}"
+msgstr ""
+"[{author}]({author_url}) зняв захист з [{article}]({article_url}){comment}"
+
+#: extensions/base/mediawiki.py:572
+#, fuzzy
+msgid "for infinity and beyond"
+msgstr "навіки і назавжди"
+
+#: extensions/base/mediawiki.py:581
+msgid "for less than a minute"
+msgstr ""
+
+#: extensions/base/mediawiki.py:583
+msgid "year"
+msgid_plural "years"
+msgstr[0] "рік"
+msgstr[1] "роки"
+msgstr[2] "років"
+
+#: extensions/base/mediawiki.py:583
+msgid "day"
+msgid_plural "days"
+msgstr[0] "день"
+msgstr[1] "дня"
+msgstr[2] "днів"
+
+#: extensions/base/mediawiki.py:583
+msgid "hour"
+msgid_plural "hours"
+msgstr[0] "година"
+msgstr[1] "години"
+msgstr[2] "годин"
+
+#: extensions/base/mediawiki.py:584
+msgid "minute"
+msgid_plural "minutes"
+msgstr[0] "хвилина"
+msgstr[1] "хвилини"
+msgstr[2] "хвилин"
+
+#: extensions/base/mediawiki.py:589
+#, python-brace-format
+msgid "for {time_number} {time_unit}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:608
+msgid "Blocked from editing the following pages: "
+msgstr "Заблокований від редагування в наступних сторінках: "
+
+#: extensions/base/mediawiki.py:615 extensions/base/mediawiki.py:661
+msgid " and namespaces: "
+msgstr " і в простору імен: "
+
+#: extensions/base/mediawiki.py:617
+msgid "Blocked from editing pages on following namespaces: "
+msgstr "Заблокований від редагування на сторінках в наступних просторах назв: "
+
+#: extensions/base/mediawiki.py:628
+msgid "Partial block details"
+msgstr "Часткові деталі блокування"
+
+#: extensions/base/mediawiki.py:631
+msgid "Block flags"
+msgstr ""
+
+#: extensions/base/mediawiki.py:633
+#, fuzzy, python-brace-format
+msgid "Blocked {blocked_user} {time}"
+msgstr "Заблокував {blocked_user} на {time}"
+
+#: extensions/base/mediawiki.py:653
+msgid " on pages: "
+msgstr " на сторінках: "
+
+#: extensions/base/mediawiki.py:663
+msgid " on namespaces: "
+msgstr " в просторах імен: "
+
+#: extensions/base/mediawiki.py:675
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) blocked [{user}]({user_url}) {time}"
+"{restriction_desc}{comment}"
+msgstr ""
+"[{author}]({author_url}) заблокував [{user}]({user_url}) на {time}"
+"{restriction_desc}{comment}"
+
+#: extensions/base/mediawiki.py:693
+#, python-brace-format
+msgid "Changed block settings for {blocked_user}"
+msgstr "Змінив блокування для {blocked_user}"
+
+#: extensions/base/mediawiki.py:703
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) changed block settings for [{blocked_user}]"
+"({user_url}){comment}"
+msgstr ""
+"[{author}]({author_url}) змінив блокування для [{blocked_user}]({user_url})"
+"{comment}"
+
+#: extensions/base/mediawiki.py:716
+#, python-brace-format
+msgid "Unblocked {blocked_user}"
+msgstr "Розблокував {blocked_user}"
+
+#: extensions/base/mediawiki.py:726
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) unblocked [{blocked_user}]({user_url}){comment}"
+msgstr ""
+"[{author}]({author_url}) розблокував [{blocked_user}]({user_url}){comment}"
+
+#: extensions/base/mediawiki.py:742
+#, fuzzy
+msgid "Action has been hidden by administration"
+msgstr "Дія була прихована адміністрацією."
+
+#: extensions/base/mediawiki.py:749
+msgid "An action has been hidden by administration."
+msgstr "Дія була прихована адміністрацією."
+
+#: extensions/base/mediawiki.py:760
+#, python-brace-format
+msgid "Imported {article} with {count} revision"
+msgid_plural "Imported {article} with {count} revisions"
+msgstr[0] "Імпортував {article} з {count} версією"
+msgstr[1] "Імпортував {article} з {count} версіями"
+msgstr[2] "Імпортував {article} з {count} версіями"
+
+#: extensions/base/mediawiki.py:771
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) imported [{article}]({article_url}) with {count} "
+"revision{comment}"
+msgid_plural ""
+"[{author}]({author_url}) imported [{article}]({article_url}) with {count} "
+"revisions{comment}"
+msgstr[0] ""
+"[{author}]({author_url}) імпортував [{article}]({article_url}) з {count} "
+"версією{comment}"
+msgstr[1] ""
+"[{author}]({author_url}) імпортував [{article}]({article_url}) з {count} "
+"версіями{comment}"
+msgstr[2] ""
+"[{author}]({author_url}) імпортував [{article}]({article_url}) з {count} "
+"версіями{comment}"
+
+#: extensions/base/mediawiki.py:787
+#, fuzzy, python-brace-format
+msgid "Imported {article} with {count} revision from \"{source}\""
+msgid_plural "Imported {article} with {count} revisions from \"{source}\""
+msgstr[0] "Імпортував {article} з {count} версією"
+msgstr[1] "Імпортував {article} з {count} версіями"
+msgstr[2] "Імпортував {article} з {count} версіями"
+
+#: extensions/base/mediawiki.py:802
+#, fuzzy, python-brace-format
+msgid ""
+"[{author}]({author_url}) imported [{article}]({article_url}) with {count} "
+"revision from [{source}]({source_url}){comment}"
+msgid_plural ""
+"[{author}]({author_url}) imported [{article}]({article_url}) with {count} "
+"revisions from [{source}]({source_url}){comment}"
+msgstr[0] ""
+"[{author}]({author_url}) імпортував [{article}]({article_url}) з {count} "
+"версією{comment}"
+msgstr[1] ""
+"[{author}]({author_url}) імпортував [{article}]({article_url}) з {count} "
+"версіями{comment}"
+msgstr[2] ""
+"[{author}]({author_url}) імпортував [{article}]({article_url}) з {count} "
+"версіями{comment}"
+
+#: extensions/base/mediawiki.py:817
+#, python-brace-format
+msgid " (until {date_and_time})"
+msgstr ""
+
+#: extensions/base/mediawiki.py:834
+#, python-brace-format
+msgid "Changed group membership for {target}"
+msgstr "Змінено членство в групі для {target}"
+
+#: extensions/base/mediawiki.py:836
+msgid "System"
+msgstr "Система"
+
+#: extensions/base/mediawiki.py:837
+#, python-brace-format
+msgid "{target} got autopromoted to a new usergroup"
+msgstr "{target} автоматично переведений в нову групу користувачів"
+
+#: extensions/base/mediawiki.py:843
+#, fuzzy
+msgid "Added group"
+msgid_plural "Added groups"
+msgstr[0] "Видалено"
+msgstr[1] "Видалено"
+msgstr[2] "Видалено"
+
+#: extensions/base/mediawiki.py:845
+#, fuzzy
+msgid "Removed group"
+msgid_plural "Removed groups"
+msgstr[0] "Видалено"
+msgstr[1] "Видалено"
+msgstr[2] "Видалено"
+
+#: extensions/base/mediawiki.py:859
+#, python-brace-format
+msgid "Added to {added} and removed from {removed}."
+msgstr ""
+
+#: extensions/base/mediawiki.py:860 extensions/base/mediawiki.py:862
+#: extensions/base/mediawiki.py:864 extensions/base/mediawiki.py:871
+msgid ", "
+msgstr ""
+
+#: extensions/base/mediawiki.py:862
+#, python-brace-format
+msgid "Added to {added}."
+msgstr ""
+
+#: extensions/base/mediawiki.py:864
+#, fuzzy, python-brace-format
+msgid "Removed from {removed}."
+msgstr "Видалено"
+
+#: extensions/base/mediawiki.py:865
+#, fuzzy, python-brace-format
+msgid ""
+"[{author}]({author_url}) changed group membership for [{target}]"
+"({target_url}): {group_changes}{comment}"
+msgstr ""
+"[{author}]({author_url}) змінив модель вмісту сторінки [{article}]"
+"({article_url}) з {old} на {new}{comment}"
+
+#: extensions/base/mediawiki.py:869
+#, fuzzy, python-brace-format
+msgid "The system autopromoted [{target}]({target_url}) to {added}.{comment}"
+msgstr ""
+"[{author}]({author_url}) змінив модель вмісту сторінки [{article}]"
+"({article_url}) з {old} на {new}{comment}"
+
+#: extensions/base/mediawiki.py:882
+#, python-brace-format
+msgid "Merged revision histories of {article} into {dest}"
+msgstr "Об'єднав історії версій {article} з {dest}"
+
+#: extensions/base/mediawiki.py:896
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) merged revision histories of [{article}]"
+"({article_url}) into [{dest}]({dest_url}){comment}"
+msgstr ""
+"[{author}]({author_url}) об'єднав історії версій [{article}]({article_url}) "
+"з [{dest}]({dest_url}){comment}"
+
+#: extensions/base/mediawiki.py:910
+msgid "Created account automatically"
+msgstr "Обліковий запис був створений автоматично"
+
+#: extensions/base/mediawiki.py:917
+#, python-brace-format
+msgid "Account [{author}]({author_url}) was created automatically"
+msgstr "Обліковий запис [{author}]({author_url}) був автоматично створений"
+
+#: extensions/base/mediawiki.py:930 extensions/base/mediawiki.py:995
+msgid "Created account"
+msgstr "Створено обліковий запис"
+
+#: extensions/base/mediawiki.py:937 extensions/base/mediawiki.py:1002
+#, python-brace-format
+msgid "Account [{author}]({author_url}) was created"
+msgstr "Обліковий запис [{author}]({author_url}) був створений"
+
+#: extensions/base/mediawiki.py:949
+#, python-brace-format
+msgid "Created account {article}"
+msgstr "Створено обліковий запис {article}"
+
+#: extensions/base/mediawiki.py:958
+#, python-brace-format
+msgid ""
+"Account [{article}]({article_url}) was created by [{author}]({author_url})"
+"{comment}"
+msgstr ""
+"Обліковий запис [{article}]({article_url}) був створений [{author}]"
+"({author_url}){comment}"
+
+#: extensions/base/mediawiki.py:971
+#, python-brace-format
+msgid "Created account {article} and password was sent by email"
+msgstr ""
+"Створено обліковий запис {article} і і пароль був відправлений на електронну "
+"пошту"
+
+#: extensions/base/mediawiki.py:982
+#, python-brace-format
+msgid ""
+"Account [{article}]({article_url}) was created by [{author}]({author_url}) "
+"and password was sent by email{comment}"
+msgstr ""
+"Обліковий запис [{article}]({article_url}) був створений [{author}]"
+"({author_url}) і пароль був відправлений на електронну пошту{comment}"
+
+#: extensions/base/mediawiki.py:1014
+#, python-brace-format
+msgid "Changed the content model of the page {article}"
+msgstr "Змінив модель вмісту сторінки {article}"
+
+#: extensions/base/mediawiki.py:1016
+#, python-brace-format
+msgid "Model changed from {old} to {new}: {reason}"
+msgstr "Модель змінена з {old} на {new}: {reason}"
+
+#: extensions/base/mediawiki.py:1028
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) changed the content model of the page [{article}]"
+"({article_url}) from {old} to {new}{comment}"
+msgstr ""
+"[{author}]({author_url}) змінив модель вмісту сторінки [{article}]"
+"({article_url}) з {old} на {new}{comment}"
+
+#: extensions/base/mediawiki.py:1043
+#, python-brace-format
+msgid "Created the page {article} using a non-default content model"
+msgstr ""
+
+#: extensions/base/mediawiki.py:1045
+#, fuzzy, python-brace-format
+msgid "Created with model {new}: {reason}"
+msgstr "Модель змінена з {old} на {new}: {reason}"
+
+#: extensions/base/mediawiki.py:1056
+#, fuzzy, python-brace-format
+msgid ""
+"[{author}]({author_url}) created the page [{article}]({article_url}) using a "
+"non-default content model {new}{comment}"
+msgstr ""
+"[{author}]({author_url}) змінив модель вмісту сторінки [{article}]"
+"({article_url}) з {old} на {new}{comment}"
+
+#: extensions/base/mediawiki.py:1071
+#, fuzzy, python-brace-format
+msgid "Created the tag \"{tag}\""
+msgstr "Створив тег \"{tag}\""
+
+#: extensions/base/mediawiki.py:1081
+#, fuzzy, python-brace-format
+msgid ""
+"[{author}]({author_url}) created the [tag]({tag_url}) \"{tag}\"{comment}"
+msgstr "[{author}]({author_url}) створив [тег]({tag_url}) \"{tag}\""
+
+#: extensions/base/mediawiki.py:1102
+#, fuzzy, python-brace-format
+msgid "Deleted the tag \"{tag}\""
+msgstr "Вилучив тег \"{tag}\""
+
+#: extensions/base/mediawiki.py:1104
+#, fuzzy
+msgid "Removed from"
+msgstr "Видалено"
+
+#: extensions/base/mediawiki.py:1104
+msgid "{} revision or log entry"
+msgid_plural "{} revisions and/or log entries"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
+#: extensions/base/mediawiki.py:1117
+#, fuzzy, python-brace-format
+msgid ""
+"[{author}]({author_url}) deleted the [tag]({tag_url}) \"{tag}\"{comment}"
+msgstr "[{author}]({author_url}) вилучив [тег]({tag_url}) \"{tag}\""
+
+#: extensions/base/mediawiki.py:1127
+#, fuzzy, python-brace-format
+msgid ""
+"[{author}]({author_url}) deleted the [tag]({tag_url}) \"{tag}\" and removed "
+"it from {count} revision or log entry{comment}"
+msgid_plural ""
+"[{author}]({author_url}) deleted the [tag]({tag_url}) \"{tag}\" and removed "
+"it from {count} revisions and/or log entries{comment}"
+msgstr[0] ""
+"[{author}]({author_url}) імпортував [{article}]({article_url}) з {count} "
+"версією{comment}"
+msgstr[1] ""
+"[{author}]({author_url}) імпортував [{article}]({article_url}) з {count} "
+"версіями{comment}"
+msgstr[2] ""
+"[{author}]({author_url}) імпортував [{article}]({article_url}) з {count} "
+"версіями{comment}"
+
+#: extensions/base/mediawiki.py:1144
+#, fuzzy, python-brace-format
+msgid "Activated the tag \"{tag}\""
+msgstr "Активував тег \"{tag}\""
+
+#: extensions/base/mediawiki.py:1153
+#, fuzzy, python-brace-format
+msgid ""
+"[{author}]({author_url}) activated the [tag]({tag_url}) \"{tag}\"{comment}"
+msgstr "[{author}]({author_url}) активував [тег]({tag_url}) \"{tag}\""
+
+#: extensions/base/mediawiki.py:1172
+#, fuzzy, python-brace-format
+msgid "Deactivated the tag \"{tag}\""
+msgstr "Деактивував тег \"{tag}\""
+
+#: extensions/base/mediawiki.py:1181
+#, fuzzy, python-brace-format
+msgid ""
+"[{author}]({author_url}) deactivated the [tag]({tag_url}) \"{tag}\"{comment}"
+msgstr "[{author}]({author_url}) деактивував [тег]({tag_url}) \"{tag}\""
+
+#: extensions/base/sprite.py:37
+#, python-brace-format
+msgid "Edited the sprite for {article}"
+msgstr "Відредагував спрайт для {article}"
+
+#: extensions/base/sprite.py:45
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) edited the sprite for [{article}]({article_url})"
+msgstr ""
+"[{author}]({author_url}) відредагував спрайт для [{article}]({article_url})"
+
+#: extensions/base/sprite.py:60
+#, python-brace-format
+msgid "Created the sprite sheet for {article}"
+msgstr "Створив таблицю спрайтів для {article}"
+
+#: extensions/base/sprite.py:68
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) created the sprite sheet for [{article}]"
+"({article_url})"
+msgstr ""
+"[{author}]({author_url}) створив таблицю спрайтів для [{article}]"
+"({article_url})"
+
+#: extensions/base/sprite.py:79
+#, python-brace-format
+msgid "Edited the slice for {article}"
+msgstr "Відредагував фрагмент для {article}"
+
+#: extensions/base/sprite.py:86
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) edited the slice for [{article}]({article_url})"
+msgstr ""
+"[{author}]({author_url}) відредагував фрагмент для [{article}]({article_url})"
+
+#, python-brace-format
+#~ msgid "{value} (avg. {avg})"
+#~ msgstr "{value} (сер. {avg})"
+
+#~ msgid "Daily overview"
+#~ msgstr "Щоденний огляд"
+
+#~ msgid "No activity"
+#~ msgstr "Немає активності"
+
+#~ msgid " ({} action)"
+#~ msgid_plural " ({} actions)"
+#~ msgstr[0] " ({} дія)"
+#~ msgstr[1] " ({} дії)"
+#~ msgstr[2] " ({} дій)"
+
+#~ msgid " ({} edit)"
+#~ msgid_plural " ({} edits)"
+#~ msgstr[0] " ({} редагування)"
+#~ msgstr[1] " ({} редагування)"
+#~ msgstr[2] " ({} редагувань)"
+
+#~ msgid " UTC ({} action)"
+#~ msgid_plural " UTC ({} actions)"
+#~ msgstr[0] " UTC ({} дія)"
+#~ msgstr[1] " UTC ({} дії)"
+#~ msgstr[2] " UTC ({} дій)"
+
+#~ msgid "But nobody came"
+#~ msgstr "Але ніхто не прийшов"
+
+#~ msgid "Most active user"
+#~ msgid_plural "Most active users"
+#~ msgstr[0] "Найактивніший користувач"
+#~ msgstr[1] "Найактивніші користувачі"
+#~ msgstr[2] "Найактивніші користувачі"
+
+#~ msgid "Most edited article"
+#~ msgid_plural "Most edited articles"
+#~ msgstr[0] "Найредаговішана стаття"
+#~ msgstr[1] "Найредаговішані статті"
+#~ msgstr[2] "Найредаговішані статті"
+
+#~ msgid "Edits made"
+#~ msgstr "Зроблено редагувань"
+
+#~ msgid "New files"
+#~ msgstr "Нових файлів"
+
+#~ msgid "Admin actions"
+#~ msgstr "Адміністративних дій"
+
+#~ msgid "Bytes changed"
+#~ msgstr "Змінено байтів"
+
+#~ msgid "New articles"
+#~ msgstr "Нових статей"
+
+#~ msgid "Unique contributors"
+#~ msgstr "Унікальних редакторів"
+
+#~ msgid "Most active hour"
+#~ msgid_plural "Most active hours"
+#~ msgstr[0] "Найактивніша година"
+#~ msgstr[1] "Найактивніший час"
+#~ msgstr[2] "Найактивніший час"
+
+#~ msgid "Day score"
+#~ msgstr "Очок за день"
+
+#~ msgid "No description provided"
+#~ msgstr "Немає опису редагування"
+
+#~ msgid "second"
+#~ msgid_plural "seconds"
+#~ msgstr[0] "секунда"
+#~ msgstr[1] "секунди"
+#~ msgstr[2] "секунд"
+
+#~ msgid "week"
+#~ msgid_plural "weeks"
+#~ msgstr[0] "тиждень"
+#~ msgstr[1] "тижні"
+#~ msgstr[2] "тижнів"
+
+#~ msgid "month"
+#~ msgid_plural "months"
+#~ msgstr[0] "місяць"
+#~ msgstr[1] "місяці"
+#~ msgstr[2] "місяців"
+
+#~ msgid "millennium"
+#~ msgid_plural "millennia"
+#~ msgstr[0] "тисячоліття"
+#~ msgstr[1] "тисячоліття"
+#~ msgstr[2] "тисячоліть"
+
+#~ msgid "decade"
+#~ msgid_plural "decades"
+#~ msgstr[0] "десятиліття"
+#~ msgstr[1] "десятиліття"
+#~ msgstr[2] "десятиліть"
+
+#~ msgid "century"
+#~ msgid_plural "centuries"
+#~ msgstr[0] "століття"
+#~ msgstr[1] "століття"
+#~ msgstr[2] "століть"
+
+#~ msgid "Report this on the support server"
+#~ msgstr "Повідомити про це на сервер підтримки"
+
+#, python-brace-format
+#~ msgid "for {num} {translated_length}"
+#~ msgstr "на {num}{translated_length}"
+
+#~ msgid "none"
+#~ msgstr "нічого"
+
+#, fuzzy, python-brace-format
+#~ msgid ""
+#~ "[{author}]({author_url}) completed deletion of translatable page "
+#~ "[{article}]({article_url}){comment}"
+#~ msgstr ""
+#~ "[{author}]({author_url}) зняв захист з [{article}]({article_url}){comment}"
+
+#, python-brace-format
+#~ msgid "Groups changed from {old_groups} to {new_groups}{reason}"
+#~ msgstr "Групи змінені з {old_groups} на {new_groups}{reason}"
+
+#, fuzzy, python-brace-format
+#~ msgid "[{author}]({author_url}) restored a wiki *{wiki_name}*{comment}"
+#~ msgstr "[{author}]({author_url}) імпортував інтервікі{comment}"
+
+#, fuzzy, python-brace-format
+#~ msgid "[{author}]({author_url}) deleted a comment on {target}'s profile"
+#~ msgstr "[{author}]({author_url}) видалив коментар з профілю {target}"
+
+#, fuzzy, python-brace-format
+#~ msgid "[{author}]({author_url}) deleted a comment on their own profile"
+#~ msgstr "[{author}]({author_url}) видалив коментар з профілю {target}"
+
+#, python-brace-format
+#~ msgid "[{author}]({author_url}) imported interwiki{comment}"
+#~ msgstr "[{author}]({author_url}) імпортував інтервікі{comment}"
+
+#~ msgid "Imported interwiki"
+#~ msgstr "Імпортував інтервікі"
+
+#~ msgid "their own profile"
+#~ msgstr "на своєму профілі"
+
+#~ msgid "their own"
+#~ msgstr "на своєму"
+
+#, python-brace-format
+#~ msgid "[{target}]({target_url})'s"
+#~ msgstr "[{target}]({target_url})"
+
+#, python-brace-format
+#~ msgid "[their own]({target_url})"
+#~ msgstr "[на своєму]({target_url})"
diff --git a/locale/uk/LC_MESSAGES/misc.mo b/locale/uk/LC_MESSAGES/misc.mo
index 0b488bb..6abb579 100644
Binary files a/locale/uk/LC_MESSAGES/misc.mo and b/locale/uk/LC_MESSAGES/misc.mo differ
diff --git a/locale/uk/LC_MESSAGES/misc.po b/locale/uk/LC_MESSAGES/misc.po
index e586903..21fef15 100644
--- a/locale/uk/LC_MESSAGES/misc.po
+++ b/locale/uk/LC_MESSAGES/misc.po
@@ -7,17 +7,18 @@ msgid ""
msgstr ""
"Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2020-11-28 23:45+0100\n"
-"PO-Revision-Date: 2020-07-12 12:17+0200\n"
-"Last-Translator: \n"
-"Language-Team: \n"
+"POT-Creation-Date: 2021-07-11 14:32+0200\n"
+"PO-Revision-Date: 2021-05-22 12:08+0000\n"
+"Last-Translator: MakandIv \n"
+"Language-Team: Ukrainian \n"
"Language: uk\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n"
-"%10<=4 && (n%100<12 || n%100>14) ? 1 : 2);\n"
-"X-Generator: Poedit 2.3\n"
+"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n"
+"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
+"X-Generator: Weblate 4.6\n"
#: src/misc.py:45
msgid "Location"
@@ -56,9 +57,8 @@ msgid "VK link"
msgstr "Посилання на VK"
#: src/misc.py:45
-#, fuzzy
msgid "XBL link"
-msgstr "Посилання на XVL"
+msgstr "Посилання на обліковий запис XBL"
#: src/misc.py:45
msgid "Steam link"
@@ -72,7 +72,7 @@ msgstr "Посилання на Discord"
msgid "Battle.net handle"
msgstr "Посилання на Battle.net"
-#: src/misc.py:119
+#: src/misc.py:139
msgid ""
"\n"
"__And more__"
@@ -80,10 +80,10 @@ msgstr ""
"\n"
"__І більше__"
-#: src/misc.py:276
+#: src/misc.py:328
msgid "Unknown"
msgstr "Невідомо"
-#: src/misc.py:278
+#: src/misc.py:330
msgid "unknown"
msgstr "невідомо"
diff --git a/locale/uk/LC_MESSAGES/rc_formatters.mo b/locale/uk/LC_MESSAGES/rc_formatters.mo
deleted file mode 100644
index d050d5b..0000000
Binary files a/locale/uk/LC_MESSAGES/rc_formatters.mo and /dev/null differ
diff --git a/locale/uk/LC_MESSAGES/rc_formatters.po b/locale/uk/LC_MESSAGES/rc_formatters.po
index 8da9f74..4aa8eb9 100644
--- a/locale/uk/LC_MESSAGES/rc_formatters.po
+++ b/locale/uk/LC_MESSAGES/rc_formatters.po
@@ -8,9 +8,9 @@ msgstr ""
"Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2021-04-14 16:24+0200\n"
-"PO-Revision-Date: 2020-11-18 07:47+0000\n"
-"Last-Translator: MakandIv <>\n"
-"Language-Team: Ukrainian \n"
+"Language-Team: Ukrainian \n"
"Language: uk\n"
"MIME-Version: 1.0\n"
@@ -18,7 +18,7 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n"
"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
-"X-Generator: Weblate 4.2.1\n"
+"X-Generator: Weblate 4.6\n"
#: src/rc_formatters.py:28
msgid "None"
@@ -111,22 +111,22 @@ msgid "Unknown"
msgstr "Невідомо"
#: src/rc_formatters.py:116
-#, fuzzy, python-brace-format
+#, python-brace-format
msgid ""
"[{author}]({author_url}) edited [{article}]({edit_link}){comment} {bold}"
"({sign}{edit_size}){bold}"
msgstr ""
-"[{author}]({author_url}) відредагував [{article}]({edit_link}){comment} "
-"({sign}{edit_size})"
+"[{author}]({author_url}) відредагував "
+"[{article}]({edit_link}){comment}{bold}({sign}{edit_size}){bold}"
#: src/rc_formatters.py:118
-#, fuzzy, python-brace-format
+#, python-brace-format
msgid ""
"[{author}]({author_url}) created [{article}]({edit_link}){comment} {bold}"
"({sign}{edit_size}){bold}"
msgstr ""
-"[{author}]({author_url}) створив [{article}]({edit_link}){comment} ({sign}"
-"{edit_size})"
+"[{author}]({author_url}) створив "
+"[{article}]({edit_link}){comment}{bold}({sign}{edit_size}){bold}"
#: src/rc_formatters.py:121
#, python-brace-format
@@ -137,8 +137,7 @@ msgstr "[{author}]({author_url}) завантажив [{file}]({file_link}){comm
#, python-brace-format
msgid ""
"[{author}]({author_url}) reverted a version of [{file}]({file_link}){comment}"
-msgstr ""
-"[{author}] ({author_url}) повернув версію [{file}] ({file_link}) {comment}"
+msgstr "[{author}]({author_url}) повернув версію [{file}]({file_link}){comment}"
#: src/rc_formatters.py:132
#, python-brace-format
@@ -210,7 +209,7 @@ msgstr "на {num}{translated_length}"
#: src/rc_formatters.py:185 src/rc_formatters.py:867
msgid "until {}"
-msgstr ""
+msgstr "до {}"
#: src/rc_formatters.py:189
msgid " on pages: "
@@ -218,7 +217,7 @@ msgstr " на сторінках: "
#: src/rc_formatters.py:196 src/rc_formatters.py:881
msgid " and namespaces: "
-msgstr " і в простору імен: "
+msgstr " і в просторах імен: "
#: src/rc_formatters.py:198
msgid " on namespaces: "
@@ -250,94 +249,92 @@ msgstr ""
"[{author}]({author_url}) розблокував [{blocked_user}]({user_url}){comment}"
#: src/rc_formatters.py:223
-#, fuzzy, python-brace-format
+#, python-brace-format
msgid ""
"[{author}]({author_url}) left a [comment]({comment}) on {target}'s profile"
msgstr ""
-"[{author}]({author_url}) залишив [коментар]({comment}) на профілі {target}"
+"[{author}]({author_url}) залишив [коментар]({comment}) у профілі {target}"
#: src/rc_formatters.py:225
-#, fuzzy, python-brace-format
+#, python-brace-format
msgid ""
"[{author}]({author_url}) left a [comment]({comment}) on their own profile"
msgstr ""
-"[{author}]({author_url}) залишив [коментар]({comment}) на профілі {target}"
+"[{author}]({author_url}) залишив [коментар]({comment}) у власному профілі"
#: src/rc_formatters.py:231
-#, fuzzy, python-brace-format
+#, python-brace-format
msgid ""
"[{author}]({author_url}) replied to a [comment]({comment}) on {target}'s "
"profile"
msgstr ""
-"[{author}]({author_url}) відповів на [коментар]({comment}) на профілі "
-"{target}"
+"[{author}]({author_url}) відповів на [коментар]({comment}) у профілі {target}"
#: src/rc_formatters.py:237
-#, fuzzy, python-brace-format
+#, python-brace-format
msgid ""
"[{author}]({author_url}) replied to a [comment]({comment}) on their own "
"profile"
msgstr ""
-"[{author}]({author_url}) відповів на [коментар]({comment}) на профілі "
-"{target}"
+"[{author}]({author_url}) відповів на [коментар]({comment}) у власному профілі"
#: src/rc_formatters.py:245
-#, fuzzy, python-brace-format
+#, python-brace-format
msgid ""
"[{author}]({author_url}) edited a [comment]({comment}) on {target}'s profile"
msgstr ""
-"[{author}]({author_url}) відредагував [коментар]({comment}) на профілі "
+"[{author}]({author_url}) відредагував [коментар]({comment}) у профілі "
"{target}"
#: src/rc_formatters.py:251
-#, fuzzy, python-brace-format
+#, python-brace-format
msgid ""
"[{author}]({author_url}) edited a [comment]({comment}) on their own profile"
msgstr ""
-"[{author}]({author_url}) відредагував [коментар]({comment}) на профілі "
-"{target}"
+"[{author}]({author_url}) відредагував [коментар]({comment}) у власному "
+"профілі"
#: src/rc_formatters.py:257
-#, fuzzy, python-brace-format
+#, python-brace-format
msgid "[{author}]({author_url}) purged a comment on {target}'s profile"
-msgstr "[{author}] ({author_url}) вилучив коментар в профілі {target}"
+msgstr "[{author}]({author_url}) очистив коментар у профілі {target}"
#: src/rc_formatters.py:259
-#, fuzzy, python-brace-format
+#, python-brace-format
msgid "[{author}]({author_url}) purged a comment on their own profile"
-msgstr "[{author}] ({author_url}) вилучив коментар в профілі {target}"
+msgstr "[{author}]({author_url}) очистив коментар у власному профілі"
#: src/rc_formatters.py:267
-#, fuzzy, python-brace-format
+#, python-brace-format
msgid ""
"[{author}]({author_url}) deleted a [comment]({comment}) on {target}'s profile"
msgstr ""
-"[{author}]({author_url}) відредагував [коментар]({comment}) на профілі "
-"{target}"
+"[{author}]({author_url}) видалив [коментар]({comment}) у профілі {target}"
#: src/rc_formatters.py:269
-#, fuzzy, python-brace-format
+#, python-brace-format
msgid ""
"[{author}]({author_url}) deleted a [comment]({comment}) on their own profile"
msgstr ""
-"[{author}]({author_url}) відредагував [коментар]({comment}) на профілі "
-"{target}"
+"[{author}]({author_url}) видалив [коментар]({comment}) у власному профілі"
#: src/rc_formatters.py:274
-#, fuzzy, python-brace-format
+#, python-brace-format
msgid ""
"[{author}]({author_url}) edited the {field} on [{target}]({target_url})'s "
"profile. *({desc})*"
msgstr ""
-"[{author}]({author_url}) відредагував {field} на профілі {target}. *({desc})*"
+"[{author}]({author_url}) відредагував {field} у профілі "
+"[{target}]({target_url}). *({desc})*"
#: src/rc_formatters.py:281
-#, fuzzy, python-brace-format
+#, python-brace-format
msgid ""
"[{author}]({author_url}) edited the {field} on [their own]({target_url}) "
"profile. *({desc})*"
msgstr ""
-"[{author}]({author_url}) відредагував {field} на профілі {target}. *({desc})*"
+"[{author}]({author_url}) відредагував {field} у [власному]({target_url}) "
+"профілі. *({desc})*"
#: src/rc_formatters.py:296 src/rc_formatters.py:298 src/rc_formatters.py:977
#: src/rc_formatters.py:979
@@ -345,13 +342,13 @@ msgid "none"
msgstr "нічого"
#: src/rc_formatters.py:301
-#, fuzzy, python-brace-format
+#, python-brace-format
msgid ""
"[{author}]({author_url}) changed group membership for [{target}]"
"({target_url}) from {old_groups} to {new_groups}{comment}"
msgstr ""
-"[{author}]({author_url}) змінив модель вмісту сторінки [{article}]"
-"({article_url}) з {old} на {new}{comment}"
+"[{author}]({author_url}) змінив членство групи для [{target}]({target_url}) "
+"з {old_groups} на {new_groups}{comment}"
#: src/rc_formatters.py:303
#, fuzzy, python-brace-format
@@ -406,7 +403,7 @@ msgid_plural ""
"[{author}]({author_url}) changed visibility of {amount} revisions on page "
"[{article}]({article_url}){comment}"
msgstr[0] ""
-"[{author}]({author_url}) змінив видимість {amount} версії сторінки "
+"[{author}]({author_url}) змінив видимість версії сторінки "
"[{article}]({article_url}){comment}"
msgstr[1] ""
"[{author}]({author_url}) змінив видимість {amount} версій сторінки "
@@ -444,7 +441,7 @@ msgid "[{author}]({author_url}) changed visibility of log events{comment}"
msgstr "[{author}]({author_url}) змінив видимість подій журналу{comment}"
#: src/rc_formatters.py:359
-#, fuzzy, python-brace-format
+#, python-brace-format
msgid ""
"[{author}]({author_url}) imported [{article}]({article_url}) with {count} "
"revision from [{source}]({source_url}){comment}"
@@ -453,13 +450,13 @@ msgid_plural ""
"revisions from [{source}]({source_url}){comment}"
msgstr[0] ""
"[{author}]({author_url}) імпортував [{article}]({article_url}) з {count} "
-"версією{comment}"
+"версією від [{source}]({source_url}){comment}"
msgstr[1] ""
"[{author}]({author_url}) імпортував [{article}]({article_url}) з {count} "
-"версіями{comment}"
+"версіями від [{source}]({source_url}){comment}"
msgstr[2] ""
"[{author}]({author_url}) імпортував [{article}]({article_url}) з {count} "
-"версіями{comment}"
+"версіями від [{source}]({source_url}){comment}"
#: src/rc_formatters.py:364
#, python-brace-format
@@ -549,13 +546,13 @@ msgstr ""
"({article_url}) з {old} на {new}{comment}"
#: src/rc_formatters.py:407
-#, fuzzy, python-brace-format
+#, python-brace-format
msgid ""
"[{author}]({author_url}) created the page [{article}]({article_url}) using a "
"non-default content model {new}{comment}"
msgstr ""
-"[{author}]({author_url}) змінив модель вмісту сторінки [{article}]"
-"({article_url}) з {old} на {new}{comment}"
+"[{author}]({author_url}) створив сторінку [{article}]({article_url}) з "
+"використанням нестандартної моделі вмісту {new}{comment}"
#: src/rc_formatters.py:410
#, python-brace-format
@@ -581,39 +578,39 @@ msgstr ""
"[{author}]({author_url}) відредагував фрагмент для [{article}]({article_url})"
#: src/rc_formatters.py:421
-#, fuzzy, python-brace-format
+#, python-brace-format
msgid "[{author}]({author_url}) created the Cargo table \"{table}\""
-msgstr "[{author}]({author_url}) створив [тег]({tag_url}) \"{tag}\""
+msgstr "[{author}]({author_url}) створив таблицю Cargo \"{table}\""
#: src/rc_formatters.py:423
-#, fuzzy, python-brace-format
+#, python-brace-format
msgid "[{author}]({author_url}) deleted the Cargo table \"{table}\""
-msgstr "[{author}]({author_url}) вилучив [тег]({tag_url}) \"{tag}\""
+msgstr "[{author}]({author_url}) видалив таблицю Cargo \"{table}\""
#: src/rc_formatters.py:428
-#, fuzzy, python-brace-format
+#, python-brace-format
msgid "[{author}]({author_url}) recreated the Cargo table \"{table}\""
-msgstr "[{author}]({author_url}) створив [тег]({tag_url}) \"{tag}\""
+msgstr "[{author}]({author_url}) відтворив таблицю Cargo \"{table}\""
#: src/rc_formatters.py:433
-#, fuzzy, python-brace-format
+#, python-brace-format
msgid "[{author}]({author_url}) replaced the Cargo table \"{table}\""
-msgstr "[{author}]({author_url}) створив [тег]({tag_url}) \"{tag}\""
+msgstr "[{author}]({author_url}) замінив таблицю Cargo \"{table}\""
#: src/rc_formatters.py:436
-#, fuzzy, python-brace-format
+#, python-brace-format
msgid ""
"[{author}]({author_url}) created the [tag]({tag_url}) \"{tag}\"{comment}"
-msgstr "[{author}]({author_url}) створив [тег]({tag_url}) \"{tag}\""
+msgstr "[{author}]({author_url}) створив [тег]({tag_url}) \"{tag}\"{comment}"
#: src/rc_formatters.py:441
-#, fuzzy, python-brace-format
+#, python-brace-format
msgid ""
"[{author}]({author_url}) deleted the [tag]({tag_url}) \"{tag}\"{comment}"
-msgstr "[{author}]({author_url}) вилучив [тег]({tag_url}) \"{tag}\""
+msgstr "[{author}]({author_url}) вилучив [тег]({tag_url}) \"{tag}\"{comment}"
#: src/rc_formatters.py:443
-#, fuzzy, python-brace-format
+#, python-brace-format
msgid ""
"[{author}]({author_url}) deleted the [tag]({tag_url}) \"{tag}\" and removed "
"it from {count} revision or log entry{comment}"
@@ -621,192 +618,204 @@ msgid_plural ""
"[{author}]({author_url}) deleted the [tag]({tag_url}) \"{tag}\" and removed "
"it from {count} revisions and/or log entries{comment}"
msgstr[0] ""
-"[{author}]({author_url}) імпортував [{article}]({article_url}) з {count} "
-"версією{comment}"
+"[{author}]({author_url}) видалив [тег]({tag_url}) \"{tag}\" і прибрав її з "
+"{count} редагування або запису журналу{comment}"
msgstr[1] ""
-"[{author}]({author_url}) імпортував [{article}]({article_url}) з {count} "
-"версіями{comment}"
+"[{author}]({author_url}) видалив [тег]({tag_url}) \"{tag}\" і прибрав її з "
+"{count} редагувань та/або записів журналу{comment}"
msgstr[2] ""
-"[{author}]({author_url}) імпортував [{article}]({article_url}) з {count} "
-"версіями{comment}"
+"[{author}]({author_url}) видалив [тег]({tag_url}) \"{tag}\" і прибрав її з "
+"{count} редагувань та/або записів журналу{comment}"
#: src/rc_formatters.py:449
-#, fuzzy, python-brace-format
+#, python-brace-format
msgid ""
"[{author}]({author_url}) activated the [tag]({tag_url}) \"{tag}\"{comment}"
-msgstr "[{author}]({author_url}) активував [тег]({tag_url}) \"{tag}\""
+msgstr "[{author}]({author_url}) активував [тег]({tag_url}) \"{tag}\"{comment}"
#: src/rc_formatters.py:452
-#, fuzzy, python-brace-format
+#, python-brace-format
msgid ""
"[{author}]({author_url}) deactivated the [tag]({tag_url}) \"{tag}\"{comment}"
-msgstr "[{author}]({author_url}) деактивував [тег]({tag_url}) \"{tag}\""
+msgstr ""
+"[{author}]({author_url}) деактивував [тег]({tag_url}) \"{tag}\"{comment}"
#: src/rc_formatters.py:454
-#, fuzzy, python-brace-format
+#, python-brace-format
msgid "[{author}]({author_url}) changed wiki settings{reason}"
-msgstr "[{author}]({author_url}) змінив видимість подій журналу{comment}"
+msgstr "[{author}]({author_url}) змінив налаштування вікі{reason}"
#: src/rc_formatters.py:456
-#, fuzzy, python-brace-format
+#, python-brace-format
msgid "[{author}]({author_url}) deleted a wiki *{wiki_name}*{comment}"
-msgstr "[{author}]({author_url}) імпортував інтервікі{comment}"
+msgstr "[{author}]({author_url}) видалив вікі *{wiki_name}*{comment}"
#: src/rc_formatters.py:459
-#, fuzzy, python-brace-format
+#, python-brace-format
msgid "[{author}]({author_url}) locked a wiki *{wiki_name}*{comment}"
-msgstr "[{author}]({author_url}) імпортував інтервікі{comment}"
+msgstr "[{author}]({author_url}) заблокував вікі *{wiki_name}*{comment}"
#: src/rc_formatters.py:462
-#, fuzzy, python-brace-format
+#, python-brace-format
msgid ""
"[{author}]({author_url}) modified namespace *{namespace_name}* on "
"*{wiki_name}*{comment}"
msgstr ""
-"[{author}]({author_url}) завантажив нову версію [{file}]({file_link})"
-"{comment}"
+"[{author}]({author_url}) змінив простір імен *{namespace_name}* на "
+"*{wiki_name}*{comment}"
#: src/rc_formatters.py:467
-#, fuzzy, python-brace-format
+#, python-brace-format
msgid ""
"[{author}]({author_url}) deleted a namespace *{namespace_name}* on "
"*{wiki_name}*{comment}"
-msgstr "[{author}]({author_url}) вилучив [{page}]({page_link}){comment}"
+msgstr ""
+"[{author}]({author_url}) вилучив простір імен *{namespace_name}* на "
+"*{wiki_name}*{comment}"
#: src/rc_formatters.py:473
-#, fuzzy, python-brace-format
+#, python-brace-format
msgid "[{author}]({author_url}) modified user group *{group_name}*{comment}"
-msgstr "[{author}]({author_url}) імпортував інтервікі{comment}"
+msgstr ""
+"[{author}]({author_url}) змінив групу користувачів *{group_name}*{comment}"
#: src/rc_formatters.py:477
-#, fuzzy, python-brace-format
+#, python-brace-format
msgid "[{author}]({author_url}) undeleted a wiki *{wiki_name}*{comment}"
-msgstr "[{author}]({author_url}) імпортував інтервікі{comment}"
+msgstr "[{author}]({author_url}) відновив вікі *{wiki_name}*{comment}"
#: src/rc_formatters.py:481
-#, fuzzy, python-brace-format
+#, python-brace-format
msgid "[{author}]({author_url}) unlocked a wiki *{wiki_name}*{comment}"
-msgstr "[{author}]({author_url}) імпортував інтервікі{comment}"
+msgstr "[{author}]({author_url}) розблокував вікі *{wiki_name}*{comment}"
#: src/rc_formatters.py:486
-#, fuzzy, python-brace-format
+#, python-brace-format
msgid "[{author}]({author_url}) generated *{file}* dump{comment}"
-msgstr "[{author}]({author_url}) імпортував інтервікі{comment}"
+msgstr "[{author}]({author_url}) згенерував дамп *{file}*{comment}"
#: src/rc_formatters.py:491
-#, fuzzy, python-brace-format
+#, python-brace-format
msgid "[{author}]({author_url}) deleted *{file}* dump{comment}"
-msgstr "[{author}]({author_url}) імпортував інтервікі{comment}"
+msgstr "[{author}]({author_url}) видалив дамп *{file}*{comment}"
#: src/rc_formatters.py:502
-#, fuzzy, python-brace-format
+#, python-brace-format
msgid ""
"[{author}]({author_url}) marked [{article}]({article_url}) for "
"translation{comment}"
-msgstr "[{author}]({author_url}) відновив [{article}]({article_url}){comment}"
+msgstr ""
+"[{author}]({author_url}) позначив сторінку [{article}]({article_url}) як "
+"доступну для перекладу{comment}"
#: src/rc_formatters.py:509
-#, fuzzy, python-brace-format
+#, python-brace-format
msgid ""
"[{author}]({author_url}) removed [{article}]({article_url}) from the "
"translation system{comment}"
msgstr ""
-"[{author}]({author_url}) імпортував [{article}]({article_url}) з {count} "
-"версією{comment}"
+"[{author}]({author_url}) видалив [{article}]({article_url}) з системи "
+"перекладу{comment}"
#: src/rc_formatters.py:516
-#, fuzzy, python-brace-format
+#, python-brace-format
msgid ""
"[{author}]({author_url}) completed moving translation pages from *{article}* "
"to [{target}]({target_url}){comment}"
msgstr ""
-"[{author}]({author_url}) переніс налаштування захисту з {redirect}*{article}"
-"* на [{target}]({target_url}){comment}"
+"[{author}]({author_url}) перейменував доступну для перекладу сторінку "
+"*{article}* в [{target}]({target_url}){comment}"
#: src/rc_formatters.py:524
-#, fuzzy, python-brace-format
+#, python-brace-format
msgid ""
"[{author}]({author_url}) encountered a problem while moving [{article}]"
"({article_url}) to [{target}]({target_url}){comment}"
msgstr ""
-"[{author}]({author_url}) об'єднав історії версій [{article}]({article_url}) "
-"з [{dest}]({dest_url}){comment}"
+"[{author}]({author_url}) зіткнувся з проблемою при спробі перейменування "
+"[{article}]({article_url}) в [{target}]({target_url}){comment}"
#: src/rc_formatters.py:532
-#, fuzzy, python-brace-format
+#, python-brace-format
msgid ""
"[{author}]({author_url}) completed deletion of translatable page [{article}]"
"({article_url}){comment}"
msgstr ""
-"[{author}]({author_url}) зняв захист з [{article}]({article_url}){comment}"
+"[{author}]({author_url}) видалив доступну для перекладу сторінку "
+"[{article}]({article_url}){comment}"
#: src/rc_formatters.py:540
-#, fuzzy, python-brace-format
+#, python-brace-format
msgid ""
"[{author}]({author_url}) failed to delete [{article}]({article_url}) which "
"belongs to translatable page [{target}]({target_url}){comment}"
msgstr ""
-"[{author}]({author_url}) імпортував [{article}]({article_url}) з {count} "
-"версією{comment}"
+"[{author}]({author_url}) не зміг видалити [{article}]({article_url}), яка "
+"відноситься до доступної для перекладу сторінці "
+"[{target}]({target_url}){comment}"
#: src/rc_formatters.py:548
-#, fuzzy, python-brace-format
+#, python-brace-format
msgid ""
"[{author}]({author_url}) completed deletion of translation page [{article}]"
"({article_url}){comment}"
msgstr ""
-"[{author}]({author_url}) змінив видимість {amount} версії сторінки "
+"[{author}]({author_url}) видалив сторінку перекладу "
"[{article}]({article_url}){comment}"
#: src/rc_formatters.py:556
-#, fuzzy, python-brace-format
+#, python-brace-format
msgid ""
"[{author}]({author_url}) failed to delete [{article}]({article_url}) which "
"belongs to translation page [{target}]({target_url}){comment}"
msgstr ""
-"[{author}]({author_url}) імпортував [{article}]({article_url}) з {count} "
-"версією{comment}"
+"[{author}]({author_url}) не зміг видалити [{article}]({article_url}), яка "
+"відноситься до сторінці перекладу [{target}]({target_url}){comment}"
#: src/rc_formatters.py:564
-#, fuzzy, python-brace-format
+#, python-brace-format
msgid ""
"[{author}]({author_url}) encouraged translation of [{article}]({article_url})"
"{comment}"
msgstr ""
-"[{author}]({author_url}) зняв захист з [{article}]({article_url}){comment}"
+"[{author}]({author_url}) підвищив пріоритет перекладу сторінки "
+"[{article}]({article_url}){comment}"
#: src/rc_formatters.py:571
-#, fuzzy, python-brace-format
+#, python-brace-format
msgid ""
"[{author}]({author_url}) discouraged translation of [{article}]"
"({article_url}){comment}"
-msgstr "[{author}]({author_url}) відновив [{article}]({article_url}){comment}"
+msgstr ""
+"[{author}]({author_url}) знизив пріоритет перекладу сторінки "
+"[{article}]({article_url}){comment}"
#: src/rc_formatters.py:581
-#, fuzzy, python-brace-format
+#, python-brace-format
msgid ""
"[{author}]({author_url}) limited languages for [{article}]({article_url}) to "
"`{languages}`{comment}"
msgstr ""
-"[{author}]({author_url}) змінив налаштування захисту [{article}]"
-"({article_url}) на: {settings}{comment}"
+"[{author}]({author_url}) обмежив для сторінки [{article}]({article_url}) "
+"список мов: `{languages}`{comment}"
#: src/rc_formatters.py:587
-#, fuzzy, python-brace-format
+#, python-brace-format
msgid ""
"[{author}]({author_url}) set the priority languages for [{article}]"
"({article_url}) to `{languages}`{comment}"
msgstr ""
-"[{author}]({author_url}) змінив налаштування захисту [{article}]"
-"({article_url}) на: {settings}{comment}"
+"[{author}]({author_url}) задав для сторінки [{article}]({article_url}) "
+"наступний список пріоритетних мов: `{languages}`{comment}"
#: src/rc_formatters.py:593
-#, fuzzy, python-brace-format
+#, python-brace-format
msgid ""
"[{author}]({author_url}) removed priority languages from [{article}]"
"({article_url}){comment}"
msgstr ""
-"[{author}]({author_url}) зняв захист з [{article}]({article_url}){comment}"
+"[{author}]({author_url}) видалив пріоритетні мови зі сторінки "
+"[{article}]({article_url}){comment}"
#: src/rc_formatters.py:600
#, fuzzy, python-brace-format
@@ -853,7 +862,7 @@ msgstr ""
#: src/rc_formatters.py:643 src/rc_formatters.py:646 src/rc_formatters.py:1238
#: src/rc_formatters.py:1241
msgid "(default)"
-msgstr ""
+msgstr "(за замовчуванням)"
#: src/rc_formatters.py:647
#, fuzzy, python-brace-format
@@ -901,15 +910,15 @@ msgstr ""
#: src/rc_formatters.py:682
msgid "Performed"
-msgstr ""
+msgstr "Виконав"
#: src/rc_formatters.py:683
msgid "Action taken"
-msgstr ""
+msgstr "Вжиті заходи"
#: src/rc_formatters.py:684
msgid "Title"
-msgstr ""
+msgstr "Заголовок"
#: src/rc_formatters.py:693 src/rc_formatters.py:980
msgid "No description provided"
@@ -1016,7 +1025,7 @@ msgstr "Переніс налаштування захисту з {redirect}{art
#: src/rc_formatters.py:869
msgid "unknown expiry time"
-msgstr ""
+msgstr "невідомий період"
#: src/rc_formatters.py:874
msgid "Blocked from editing the following pages: "
@@ -1145,7 +1154,7 @@ msgstr "Зняв захист з {article}"
#, python-brace-format
msgid "Changed visibility of revision on page {article} "
msgid_plural "Changed visibility of {amount} revisions on page {article} "
-msgstr[0] "Змінив видимість {amount} версії сторінки {article} "
+msgstr[0] "Змінив видимість версії сторінки {article} "
msgstr[1] "Змінив видимість {amount} версій сторінки {article} "
msgstr[2] "Змінив видимість {amount} версій сторінки {article} "
@@ -1167,12 +1176,12 @@ msgid "Changed visibility of log events"
msgstr "Змінив видимість подій журналу"
#: src/rc_formatters.py:1031
-#, fuzzy, python-brace-format
+#, python-brace-format
msgid "Imported {article} with {count} revision from \"{source}\""
msgid_plural "Imported {article} with {count} revisions from \"{source}\""
-msgstr[0] "Імпортував {article} з {count} версією"
-msgstr[1] "Імпортував {article} з {count} версіями"
-msgstr[2] "Імпортував {article} з {count} версіями"
+msgstr[0] "Імпортував {article} з {count} версією від \"{source}\""
+msgstr[1] "Імпортував {article} з {count} версіями від \"{source}\""
+msgstr[2] "Імпортував {article} з {count} версіями від \"{source}\""
#: src/rc_formatters.py:1036
#, python-brace-format
@@ -1247,9 +1256,9 @@ msgid "Created the page {article} using a non-default content model"
msgstr ""
#: src/rc_formatters.py:1084
-#, fuzzy, python-brace-format
+#, python-brace-format
msgid "Created with model {new}: {reason}"
-msgstr "Модель змінена з {old} на {new}: {reason}"
+msgstr "Створив з використанням моделі вмісту {new}: {reason}"
#: src/rc_formatters.py:1087
#, python-brace-format
@@ -1267,24 +1276,24 @@ msgid "Edited the slice for {article}"
msgstr "Відредагував фрагмент для {article}"
#: src/rc_formatters.py:1099
-#, fuzzy, python-brace-format
+#, python-brace-format
msgid "Created the Cargo table \"{table}\""
-msgstr "Створив тег \"{tag}\""
+msgstr "Створив таблицю Cargo \"{table}\""
#: src/rc_formatters.py:1103
-#, fuzzy, python-brace-format
+#, python-brace-format
msgid "Deleted the Cargo table \"{table}\""
-msgstr "Вилучив тег \"{tag}\""
+msgstr "Видалив таблицю Cargo \"{table}\""
#: src/rc_formatters.py:1110
-#, fuzzy, python-brace-format
+#, python-brace-format
msgid "Recreated the Cargo table \"{table}\""
-msgstr "Створив тег \"{tag}\""
+msgstr "Відтворив таблицю Cargo \"{table}\""
#: src/rc_formatters.py:1117
-#, fuzzy, python-brace-format
+#, python-brace-format
msgid "Replaced the Cargo table \"{table}\""
-msgstr "Вилучив тег \"{tag}\""
+msgstr "Замінив таблицю Cargo \"{table}\""
#: src/rc_formatters.py:1121
#, fuzzy, python-brace-format
@@ -1304,9 +1313,9 @@ msgstr "Видалено"
#: src/rc_formatters.py:1127
msgid "{} revision or log entry"
msgid_plural "{} revisions and/or log entries"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
+msgstr[0] "{} редагування або запис в журналі"
+msgstr[1] "{} редагування та/або записи в журналі"
+msgstr[2] "{} редагувань та/або записів в журналі"
#: src/rc_formatters.py:1131
#, fuzzy, python-brace-format
@@ -1320,71 +1329,71 @@ msgstr "Деактивував тег \"{tag}\""
#: src/rc_formatters.py:1137
msgid "Changed wiki settings"
-msgstr ""
+msgstr "Змінив налаштування вікі"
#: src/rc_formatters.py:1141
-#, fuzzy, python-brace-format
+#, python-brace-format
msgid "Deleted a \"{wiki}\" wiki"
-msgstr "Вилучив тег \"{tag}\""
+msgstr "Видалив вікі \"{wiki}\""
#: src/rc_formatters.py:1144
#, python-brace-format
msgid "Locked a \"{wiki}\" wiki"
-msgstr ""
+msgstr "Заблокував вікі \"{wiki}\""
#: src/rc_formatters.py:1147
#, python-brace-format
msgid "Modified \"{namespace_name}\" namespace"
-msgstr ""
+msgstr "Змінив простір імен \"{namespace_name}\""
#: src/rc_formatters.py:1149 src/rc_formatters.py:1154
msgid "Wiki"
-msgstr ""
+msgstr "Вікі"
#: src/rc_formatters.py:1151
#, python-brace-format
msgid "Deleted a \"{namespace_name}\" namespace"
-msgstr ""
+msgstr "Видалив простір імен \"{namespace_name}\""
#: src/rc_formatters.py:1157
#, python-brace-format
msgid "Modified \"{usergroup_name}\" usergroup"
-msgstr ""
+msgstr "Змінив групу \"{usergroup_name}\""
#: src/rc_formatters.py:1160
-#, fuzzy, python-brace-format
+#, python-brace-format
msgid "Undeleted a \"{wiki}\" wiki"
-msgstr "Вилучив тег \"{tag}\""
+msgstr "Відновив вікі \"{wiki}\""
#: src/rc_formatters.py:1163
#, python-brace-format
msgid "Unlocked a \"{wiki}\" wiki"
-msgstr ""
+msgstr "Розблокував вікі \"{wiki}\""
#: src/rc_formatters.py:1166
#, python-brace-format
msgid "Generated {file} dump"
-msgstr ""
+msgstr "Згенерував дамп {file}"
#: src/rc_formatters.py:1169
-#, fuzzy, python-brace-format
+#, python-brace-format
msgid "Deleted {file} dump"
-msgstr "Вилучив сторінку {article}"
+msgstr "Видалив дамп {file}"
#: src/rc_formatters.py:1177
#, python-brace-format
msgid "Marked \"{article}\" for translation"
-msgstr ""
+msgstr "Позначив \"{article}\" для перекладу"
#: src/rc_formatters.py:1180
#, python-brace-format
msgid "Removed \"{article}\" from the translation system"
-msgstr ""
+msgstr "Видалив \"{article}\" з системи перекладу"
#: src/rc_formatters.py:1183
#, python-brace-format
msgid "Completed moving translation pages from \"{article}\" to \"{target}\""
-msgstr ""
+msgstr "Завершив переміщення сторінок перекладу з \"{article}\" на \"{target}\""
#: src/rc_formatters.py:1186
#, python-brace-format
@@ -1404,9 +1413,9 @@ msgid ""
msgstr ""
#: src/rc_formatters.py:1195
-#, fuzzy, python-brace-format
+#, python-brace-format
msgid "Completed deletion of translation page \"{article}\""
-msgstr "Змінив видимість {amount} версії сторінки {article} "
+msgstr "Завершив видалення сторінок перекладу \"{article}\""
#: src/rc_formatters.py:1198
#, python-brace-format
@@ -1462,11 +1471,11 @@ msgstr ""
#: src/rc_formatters.py:1232
msgid "Old state"
-msgstr ""
+msgstr "Старий стан"
#: src/rc_formatters.py:1233
msgid "New state"
-msgstr ""
+msgstr "Новий стан"
#: src/rc_formatters.py:1242
#, fuzzy, python-brace-format
@@ -1475,11 +1484,11 @@ msgstr "Зняв захист з {article}"
#: src/rc_formatters.py:1243
msgid "Old language"
-msgstr ""
+msgstr "Стара мова"
#: src/rc_formatters.py:1244
msgid "New language"
-msgstr ""
+msgstr "Нова мова"
#: src/rc_formatters.py:1248
#, python-brace-format
@@ -1495,9 +1504,8 @@ msgid "Renamed user \"{old_name}\" to \"{new_name}\""
msgstr ""
#: src/rc_formatters.py:1254
-#, fuzzy
msgid "Action has been hidden by administration"
-msgstr "Дія була прихована адміністрацією."
+msgstr "Дія була прихована адміністрацією"
#: src/rc_formatters.py:1259
#, python-brace-format
diff --git a/locale/uk/LC_MESSAGES/rcgcdw.mo b/locale/uk/LC_MESSAGES/rcgcdw.mo
index fe9660b..ef2edc1 100644
Binary files a/locale/uk/LC_MESSAGES/rcgcdw.mo and b/locale/uk/LC_MESSAGES/rcgcdw.mo differ
diff --git a/locale/uk/LC_MESSAGES/rcgcdw.po b/locale/uk/LC_MESSAGES/rcgcdw.po
index 64d4932..a423ded 100644
--- a/locale/uk/LC_MESSAGES/rcgcdw.po
+++ b/locale/uk/LC_MESSAGES/rcgcdw.po
@@ -7,212 +7,204 @@ msgid ""
msgstr ""
"Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2020-12-23 00:28+0100\n"
-"PO-Revision-Date: 2020-09-03 13:14+0200\n"
-"Last-Translator: \n"
-"Language-Team: \n"
+"POT-Creation-Date: 2021-07-11 14:32+0200\n"
+"PO-Revision-Date: 2021-05-22 12:08+0000\n"
+"Last-Translator: MakandIv \n"
+"Language-Team: Ukrainian \n"
"Language: uk\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n"
-"%10<=4 && (n%100<12 || n%100>14) ? 1 : 2);\n"
-"X-Generator: Poedit 2.4.1\n"
+"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n"
+"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
+"X-Generator: Weblate 4.6\n"
-#: src/rcgcdw.py:115 src/rcgcdw.py:117 src/rcgcdw.py:119 src/rcgcdw.py:121
-#: src/rcgcdw.py:123 src/rcgcdw.py:125 src/rcgcdw.py:127
+#: src/rcgcdw.py:117
#, python-brace-format
msgid "{value} (avg. {avg})"
msgstr "{value} (сер. {avg})"
-#: src/rcgcdw.py:147
+#: src/rcgcdw.py:136
msgid "Daily overview"
msgstr "Щоденний огляд"
-#: src/rcgcdw.py:154
+#: src/rcgcdw.py:143
msgid "No activity"
msgstr "Немає активності"
-#: src/rcgcdw.py:178
+#: src/rcgcdw.py:167
msgid " ({} action)"
msgid_plural " ({} actions)"
msgstr[0] " ({} дія)"
msgstr[1] " ({} дії)"
msgstr[2] " ({} дій)"
-#: src/rcgcdw.py:180
+#: src/rcgcdw.py:169
msgid " ({} edit)"
msgid_plural " ({} edits)"
msgstr[0] " ({} редагування)"
msgstr[1] " ({} редагування)"
msgstr[2] " ({} редагувань)"
-#: src/rcgcdw.py:185
+#: src/rcgcdw.py:174
msgid " UTC ({} action)"
msgid_plural " UTC ({} actions)"
msgstr[0] " UTC ({} дія)"
msgstr[1] " UTC ({} дії)"
msgstr[2] " UTC ({} дій)"
-#: src/rcgcdw.py:187 src/rcgcdw.py:188 src/rcgcdw.py:192
+#: src/rcgcdw.py:176 src/rcgcdw.py:179
msgid "But nobody came"
msgstr "Але ніхто не прийшов"
-#: src/rcgcdw.py:195
+#: src/rcgcdw.py:183
msgid "Most active user"
msgid_plural "Most active users"
msgstr[0] "Найактивніший користувач"
msgstr[1] "Найактивніші користувачі"
msgstr[2] "Найактивніші користувачі"
-#: src/rcgcdw.py:196
+#: src/rcgcdw.py:184
msgid "Most edited article"
msgid_plural "Most edited articles"
msgstr[0] "Найредаговішана стаття"
msgstr[1] "Найредаговішані статті"
msgstr[2] "Найредаговішані статті"
-#: src/rcgcdw.py:197
+#: src/rcgcdw.py:185
msgid "Edits made"
msgstr "Зроблено редагувань"
-#: src/rcgcdw.py:197
+#: src/rcgcdw.py:185
msgid "New files"
msgstr "Нових файлів"
-#: src/rcgcdw.py:197
+#: src/rcgcdw.py:186
msgid "Admin actions"
msgstr "Адміністративних дій"
-#: src/rcgcdw.py:198
+#: src/rcgcdw.py:186
msgid "Bytes changed"
msgstr "Змінено байтів"
-#: src/rcgcdw.py:198
+#: src/rcgcdw.py:187
msgid "New articles"
msgstr "Нових статей"
-#: src/rcgcdw.py:199
+#: src/rcgcdw.py:187
msgid "Unique contributors"
msgstr "Унікальних редакторів"
-#: src/rcgcdw.py:200
+#: src/rcgcdw.py:188
msgid "Most active hour"
msgid_plural "Most active hours"
msgstr[0] "Найактивніша година"
msgstr[1] "Найактивніший час"
msgstr[2] "Найактивніший час"
-#: src/rcgcdw.py:201
+#: src/rcgcdw.py:189
msgid "Day score"
msgstr "Очок за день"
-#: src/rcgcdw.py:243
-msgid "director"
-msgstr "директор"
+#: src/rcgcdw.py:223
+msgid "~~hidden~~"
+msgstr "~~приховано~~"
-#: src/rcgcdw.py:243
-msgid "bot"
-msgstr "бот"
+#: src/rcgcdw.py:225
+msgid "No description provided"
+msgstr "Опис не надано"
-#: src/rcgcdw.py:243
-msgid "editor"
-msgstr "редактор"
+#: src/rcgcdw.py:228
+msgid "hidden"
+msgstr "приховано"
-#: src/rcgcdw.py:243
-msgid "directors"
-msgstr "директора"
+#~ msgid "director"
+#~ msgstr "директор"
-#: src/rcgcdw.py:243
-msgid "sysop"
-msgstr "администратор"
+#~ msgid "bot"
+#~ msgstr "бот"
-#: src/rcgcdw.py:243
-msgid "bureaucrat"
-msgstr "бюрократ"
+#~ msgid "editor"
+#~ msgstr "редактор"
-#: src/rcgcdw.py:243
-msgid "reviewer"
-msgstr "оглядач"
+#~ msgid "directors"
+#~ msgstr "директора"
-#: src/rcgcdw.py:244
-msgid "autoreview"
-msgstr "автоперегляд"
+#~ msgid "sysop"
+#~ msgstr "администратор"
-#: src/rcgcdw.py:244
-msgid "autopatrol"
-msgstr "автопатрульний"
+#~ msgid "bureaucrat"
+#~ msgstr "бюрократ"
-#: src/rcgcdw.py:244
-msgid "wiki_guardian"
-msgstr "зберігач_вікі"
+#~ msgid "reviewer"
+#~ msgstr "оглядач"
-#: src/rcgcdw.py:244
-msgid "second"
-msgid_plural "seconds"
-msgstr[0] "секунда"
-msgstr[1] "секунди"
-msgstr[2] "секунд"
+#~ msgid "autoreview"
+#~ msgstr "автоперегляд"
-#: src/rcgcdw.py:244
-msgid "minute"
-msgid_plural "minutes"
-msgstr[0] "хвилина"
-msgstr[1] "хвилини"
-msgstr[2] "хвилин"
+#~ msgid "autopatrol"
+#~ msgstr "автопатрульний"
-#: src/rcgcdw.py:244
-msgid "hour"
-msgid_plural "hours"
-msgstr[0] "година"
-msgstr[1] "години"
-msgstr[2] "годин"
+#~ msgid "wiki_guardian"
+#~ msgstr "зберігач_вікі"
-#: src/rcgcdw.py:244
-msgid "day"
-msgid_plural "days"
-msgstr[0] "день"
-msgstr[1] "дня"
-msgstr[2] "днів"
+#~ msgid "second"
+#~ msgid_plural "seconds"
+#~ msgstr[0] "секунда"
+#~ msgstr[1] "секунди"
+#~ msgstr[2] "секунд"
-#: src/rcgcdw.py:244
-msgid "week"
-msgid_plural "weeks"
-msgstr[0] "тиждень"
-msgstr[1] "тижні"
-msgstr[2] "тижнів"
+#~ msgid "minute"
+#~ msgid_plural "minutes"
+#~ msgstr[0] "хвилина"
+#~ msgstr[1] "хвилини"
+#~ msgstr[2] "хвилин"
-#: src/rcgcdw.py:244
-msgid "month"
-msgid_plural "months"
-msgstr[0] "місяць"
-msgstr[1] "місяці"
-msgstr[2] "місяців"
+#~ msgid "hour"
+#~ msgid_plural "hours"
+#~ msgstr[0] "година"
+#~ msgstr[1] "години"
+#~ msgstr[2] "годин"
-#: src/rcgcdw.py:244
-msgid "year"
-msgid_plural "years"
-msgstr[0] "рік"
-msgstr[1] "роки"
-msgstr[2] "років"
+#~ msgid "day"
+#~ msgid_plural "days"
+#~ msgstr[0] "день"
+#~ msgstr[1] "дня"
+#~ msgstr[2] "днів"
-#: src/rcgcdw.py:244
-msgid "millennium"
-msgid_plural "millennia"
-msgstr[0] "тисячоліття"
-msgstr[1] "тисячоліття"
-msgstr[2] "тисячоліть"
+#~ msgid "week"
+#~ msgid_plural "weeks"
+#~ msgstr[0] "тиждень"
+#~ msgstr[1] "тижні"
+#~ msgstr[2] "тижнів"
-#: src/rcgcdw.py:244
-msgid "decade"
-msgid_plural "decades"
-msgstr[0] "десятиліття"
-msgstr[1] "десятиліття"
-msgstr[2] "десятиліть"
+#~ msgid "month"
+#~ msgid_plural "months"
+#~ msgstr[0] "місяць"
+#~ msgstr[1] "місяці"
+#~ msgstr[2] "місяців"
-#: src/rcgcdw.py:244
-msgid "century"
-msgid_plural "centuries"
-msgstr[0] "століття"
-msgstr[1] "століття"
-msgstr[2] "століть"
+#~ msgid "year"
+#~ msgid_plural "years"
+#~ msgstr[0] "рік"
+#~ msgstr[1] "роки"
+#~ msgstr[2] "років"
+
+#~ msgid "millennium"
+#~ msgid_plural "millennia"
+#~ msgstr[0] "тисячоліття"
+#~ msgstr[1] "тисячоліття"
+#~ msgstr[2] "тисячоліть"
+
+#~ msgid "decade"
+#~ msgid_plural "decades"
+#~ msgstr[0] "десятиліття"
+#~ msgstr[1] "десятиліття"
+#~ msgstr[2] "десятиліть"
+
+#~ msgid "century"
+#~ msgid_plural "centuries"
+#~ msgstr[0] "століття"
+#~ msgstr[1] "століття"
+#~ msgstr[2] "століть"
diff --git a/locale/uk/LC_MESSAGES/redaction.mo b/locale/uk/LC_MESSAGES/redaction.mo
index 71699c7..0ce9c61 100644
Binary files a/locale/uk/LC_MESSAGES/redaction.mo and b/locale/uk/LC_MESSAGES/redaction.mo differ
diff --git a/locale/uk/LC_MESSAGES/redaction.po b/locale/uk/LC_MESSAGES/redaction.po
index 95f2d42..9c44750 100644
--- a/locale/uk/LC_MESSAGES/redaction.po
+++ b/locale/uk/LC_MESSAGES/redaction.po
@@ -7,19 +7,26 @@ msgid ""
msgstr ""
"Project-Id-Version: RcGcDw\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2020-12-23 00:28+0100\n"
-"PO-Revision-Date: 2020-11-18 15:19+0100\n"
-"Last-Translator: \n"
-"Language-Team: \n"
+"POT-Creation-Date: 2021-07-11 14:32+0200\n"
+"PO-Revision-Date: 2021-07-30 10:44+0000\n"
+"Last-Translator: MakandIv \n"
+"Language-Team: Ukrainian \n"
"Language: uk\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Generator: Poedit 2.4.1\n"
-"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n"
-"%10<=4 && (n%100<12 || n%100>14) ? 1 : 2);\n"
+"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n"
+"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
+"X-Generator: Weblate 4.6.2\n"
-#: src/discord/redaction.py:62 src/discord/redaction.py:65
-#: src/discord/redaction.py:70
-msgid "Removed"
-msgstr ""
+#: src/discord/redaction.py:77
+msgid "hidden"
+msgstr "приховано"
+
+#: src/discord/redaction.py:80 src/discord/redaction.py:85
+msgid "~~hidden~~"
+msgstr "~~приховано~~"
+
+#~ msgid "Removed"
+#~ msgstr "Видалено"
diff --git a/locale/zh-hans/LC_MESSAGES/discussion_formatters.mo b/locale/zh-hans/LC_MESSAGES/discussion_formatters.mo
deleted file mode 100644
index 96017a2..0000000
Binary files a/locale/zh-hans/LC_MESSAGES/discussion_formatters.mo and /dev/null differ
diff --git a/locale/zh-hans/LC_MESSAGES/discussion_formatters.po b/locale/zh-hans/LC_MESSAGES/discussion_formatters.po
deleted file mode 100644
index 0f0c5c0..0000000
--- a/locale/zh-hans/LC_MESSAGES/discussion_formatters.po
+++ /dev/null
@@ -1,185 +0,0 @@
-# SOME DESCRIPTIVE TITLE.
-# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
-# This file is distributed under the same license as the RcGcDw package.
-# FIRST AUTHOR , YEAR.
-#
-msgid ""
-msgstr ""
-"Project-Id-Version: RcGcDw\n"
-"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2020-12-23 00:28+0100\n"
-"PO-Revision-Date: 2020-12-22 00:13+0000\n"
-"Last-Translator: lakejason0 \n"
-"Language-Team: Chinese (Simplified) \n"
-"Language: zh-hans\n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=UTF-8\n"
-"Content-Transfer-Encoding: 8bit\n"
-"Plural-Forms: nplurals=1; plural=0;\n"
-"X-Generator: Weblate 4.2.1\n"
-
-#: src/discussion_formatters.py:21 src/discussion_formatters.py:56
-#: src/discussion_formatters.py:67 src/discussion_formatters.py:95
-#: src/discussion_formatters.py:163 src/discussion_formatters.py:176
-msgid "unknown"
-msgstr "未知"
-
-#: src/discussion_formatters.py:27 src/discussion_formatters.py:102
-msgid "Unregistered user"
-msgstr "未注册用户"
-
-#: src/discussion_formatters.py:39
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) created [{title}](<{url}f/p/{threadId}>) in "
-"{forumName}"
-msgstr ""
-"[{author}]({author_url}) 创建了 [{title}](<{url}f/p/{threadId}>) 于 "
-"{forumName}"
-
-#: src/discussion_formatters.py:42
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) created a poll [{title}](<{url}f/p/{threadId}>) in "
-"{forumName}"
-msgstr ""
-"[{author}]({author_url}) 创建了一个投票 [{title}](<{url}f/p/{threadId}>) 于 "
-"{forumName}"
-
-#: src/discussion_formatters.py:45
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) created a quiz [{title}](<{url}f/p/{threadId}>) in "
-"{forumName}"
-msgstr ""
-"[{author}]({author_url}) 创建了一份问卷 [{title}](<{url}f/p/{threadId}>) 于 "
-"{forumName}"
-
-#: src/discussion_formatters.py:54
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) created a [reply](<{url}f/p/{threadId}/r/{postId}>) "
-"to [{title}](<{url}f/p/{threadId}>) in {forumName}"
-msgstr ""
-"[{author}]({author_url}) 创建了一条[回复](<{url}f/p/{threadId}/r/{postId}>) "
-"至 [{title}](<{url}f/p/{threadId}>) 于 {forumName}"
-
-#: src/discussion_formatters.py:61
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) created [{title}](<{url}wiki/Message_Wall:"
-"{user_wall}?threadId={threadId}>) on [{user}'s Message Wall](<{url}wiki/"
-"Message_Wall:{user_wall}>)"
-msgstr ""
-"[{author}]({author_url}) 创建了 [{title}](<{url}wiki/Message_Wall:"
-"{user_wall}?threadId={threadId}>) 于 [{user}的信息墙](<{url}wiki/"
-"Message_Wall:{user_wall}>)"
-
-#: src/discussion_formatters.py:64
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) created a [reply](<{url}wiki/Message_Wall:"
-"{user_wall}?threadId={threadId}#{replyId}>) to [{title}](<{url}wiki/"
-"Message_Wall:{user_wall}?threadId={threadId}>) on [{user}'s Message Wall]"
-"(<{url}wiki/Message_Wall:{user_wall}>)"
-msgstr ""
-"[{author}]({author_url}) 创建了一条[回复](<{url}wiki/Message_Wall:"
-"{user_wall}?threadId={threadId}#{replyId}>) 至 [{title}](<{url}wiki/"
-"Message_Wall:{user_wall}?threadId={threadId}>) 于 [{user}的信息墙](<{url}"
-"wiki/Message_Wall:{user_wall}>)"
-
-#: src/discussion_formatters.py:72
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) created a [comment](<{url}?commentId={commentId}>) "
-"on [{article}](<{url}>)"
-msgstr ""
-"[{author}]({author_url}) 创建了一条[评论](<{url}?commentId={commentId}>) 于 "
-"[{article}](<{url}>)"
-
-#: src/discussion_formatters.py:78
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) created a [reply](<{url}?commentId={commentId}"
-"&replyId={replyId}>) to a [comment](<{url}?commentId={commentId}>) on "
-"[{article}](<{url}>)"
-msgstr ""
-"[{author}]({author_url}) 创建了一条[回复](<{url}?commentId={commentId}"
-"&replyId={replyId}>) to a [comment](<{url}?commentId={commentId}>) 于 "
-"[{article}](<{url}>)"
-
-#: src/discussion_formatters.py:86
-#, python-brace-format
-msgid ""
-"Unknown event `{event}` by [{author}]({author_url}), report it on the "
-"[support server](<{support}>)."
-msgstr ""
-"未知事件 `{event}` 由 [{author}]({author_url}) 发出,请在[支持服务器]"
-"(<{support}>)中报告。"
-
-#: src/discussion_formatters.py:123
-#, python-brace-format
-msgid "Created \"{title}\""
-msgstr "创建了 \"{title}\""
-
-#: src/discussion_formatters.py:127
-#, python-brace-format
-msgid "Created a poll \"{title}\""
-msgstr "创建了投票 \"{title}\""
-
-#: src/discussion_formatters.py:134
-msgid "Option {}"
-msgstr "选项 {}"
-
-#: src/discussion_formatters.py:135
-#, python-brace-format
-msgid "__[View image]({image_url})__"
-msgstr "__[查看图片]({image_url})__"
-
-#: src/discussion_formatters.py:139
-#, python-brace-format
-msgid "Created a quiz \"{title}\""
-msgstr "创建了问卷 \"{title}\""
-
-#: src/discussion_formatters.py:155 src/discussion_formatters.py:157
-msgid "Tags"
-msgstr "标签"
-
-#: src/discussion_formatters.py:155
-msgid "{} tags"
-msgstr "{} 个标签"
-
-#: src/discussion_formatters.py:160
-#, python-brace-format
-msgid "Replied to \"{title}\""
-msgstr "回复至 \"{title}\""
-
-#: src/discussion_formatters.py:169
-#, python-brace-format
-msgid "Created \"{title}\" on {user}'s Message Wall"
-msgstr "创建了 \"{title}\" 于 {user} 的信息墙"
-
-#: src/discussion_formatters.py:173
-#, python-brace-format
-msgid "Replied to \"{title}\" on {user}'s Message Wall"
-msgstr "回复至 \"{title}\" 于 {user} 的信息墙"
-
-#: src/discussion_formatters.py:180
-#, python-brace-format
-msgid "Commented on {article}"
-msgstr "评论于 {article}"
-
-#: src/discussion_formatters.py:184
-#, python-brace-format
-msgid "Replied to a comment on {article}"
-msgstr "回复至一条评论于 {article}"
-
-#: src/discussion_formatters.py:188
-#, python-brace-format
-msgid "Unknown event `{event}`"
-msgstr "未知事件 `{event}`"
-
-#: src/discussion_formatters.py:194 src/discussion_formatters.py:196
-msgid "Report this on the support server"
-msgstr "在支持服务器上报告"
diff --git a/locale/zh-hans/LC_MESSAGES/formatters.mo b/locale/zh-hans/LC_MESSAGES/formatters.mo
new file mode 100644
index 0000000..4c502bf
Binary files /dev/null and b/locale/zh-hans/LC_MESSAGES/formatters.mo differ
diff --git a/locale/zh-hans/LC_MESSAGES/formatters.po b/locale/zh-hans/LC_MESSAGES/formatters.po
new file mode 100644
index 0000000..c7beeba
--- /dev/null
+++ b/locale/zh-hans/LC_MESSAGES/formatters.po
@@ -0,0 +1,1900 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the RcGcDw package.
+# FIRST AUTHOR , YEAR.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: RcGcDw\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2021-07-11 14:32+0200\n"
+"PO-Revision-Date: 2021-07-30 10:44+0000\n"
+"Last-Translator: lakejason0 \n"
+"Language-Team: Chinese (Simplified) \n"
+"Language: zh-hans\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+"X-Generator: Weblate 4.6.2\n"
+
+#: src/api/util.py:61 src/api/util.py:66
+msgid "__Only whitespace__"
+msgstr "__仅空格__"
+
+#: src/api/util.py:71
+msgid "Removed"
+msgstr "移除了"
+
+#: src/api/util.py:73
+msgid "Added"
+msgstr "添加了"
+
+#: src/api/util.py:94 src/api/util.py:126 src/api/util.py:133
+#: src/api/util.py:141 extensions/base/discussions.py:247
+#: extensions/base/discussions.py:264 extensions/base/abusefilter.py:45
+msgid "Unregistered user"
+msgstr "未注册用户"
+
+#: src/api/util.py:160
+msgctxt "recent changes Tags"
+msgid "Tags"
+msgstr "标签"
+
+#: src/api/util.py:162
+msgid "**Added**: "
+msgstr "**添加了**: "
+
+#: src/api/util.py:163
+msgid " and {} more\n"
+msgstr " 还有{}更多\n"
+
+#: src/api/util.py:165
+msgid "**Removed**: "
+msgstr "**移除了**: "
+
+#: src/api/util.py:166
+msgid " and {} more"
+msgstr " 还有{}更多"
+
+#: src/api/util.py:168
+msgid "Changed categories"
+msgstr "更改了分类"
+
+#: extensions/base/cargo.py:37
+#, python-brace-format
+msgid "Created the Cargo table \"{table}\""
+msgstr "创建了 Cargo 表 \"{table}\""
+
+#: extensions/base/cargo.py:45
+#, python-brace-format
+msgid "[{author}]({author_url}) created the Cargo table \"{table}\""
+msgstr "[{author}]({author_url}) 创建了 Cargo 表 \"{table}\""
+
+#: extensions/base/cargo.py:60
+#, python-brace-format
+msgid "Recreated the Cargo table \"{table}\""
+msgstr "重新创建了 Cargo 表 \"{table}\""
+
+#: extensions/base/cargo.py:68
+#, python-brace-format
+msgid "[{author}]({author_url}) recreated the Cargo table \"{table}\""
+msgstr "[{author}]({author_url}) 重新创建了 Cargo 表 \"{table}\""
+
+#: extensions/base/cargo.py:83
+#, python-brace-format
+msgid "Replaced the Cargo table \"{table}\""
+msgstr "替换了 Cargo 表 \"{table}\""
+
+#: extensions/base/cargo.py:91
+#, python-brace-format
+msgid "[{author}]({author_url}) replaced the Cargo table \"{table}\""
+msgstr "[{author}]({author_url}) 替换了 Cargo 表 \"{table}\""
+
+#: extensions/base/cargo.py:105
+#, python-brace-format
+msgid "Deleted the Cargo table \"{table}\""
+msgstr "删除了 Cargo 表 \"{table}\""
+
+#: extensions/base/cargo.py:112
+#, python-brace-format
+msgid "[{author}]({author_url}) deleted the Cargo table \"{table}\""
+msgstr "[{author}]({author_url}) 删除了 Cargo 表 \"{table}\""
+
+#: extensions/base/translate.py:41
+#, python-brace-format
+msgid "Marked \"{article}\" for translation"
+msgstr "将 \"{article}\" 标记为进行翻译"
+
+#: extensions/base/translate.py:55
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) marked [{article}]({article_url}) for "
+"translation{comment}"
+msgstr ""
+"[{author}]({author_url}) 标记了 [{article}]({article_url}) 进行翻译 {comment}"
+
+#: extensions/base/translate.py:70
+#, python-brace-format
+msgid "Removed \"{article}\" from the translation system"
+msgstr "将 \"{article}\" 从翻译系统中移除"
+
+#: extensions/base/translate.py:80
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) removed [{article}]({article_url}) from the "
+"translation system{comment}"
+msgstr ""
+"[{author}]({author_url}) 从翻译系统中移除了 [{article}]({article_url})"
+"{comment}"
+
+#: extensions/base/translate.py:95
+#, python-brace-format
+msgid "Completed moving translation pages from \"{article}\" to \"{target}\""
+msgstr "已完成将翻译页面从 \"{article}\" 移动到 \"{target}\""
+
+#: extensions/base/translate.py:106
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) completed moving translation pages from *{article}* "
+"to [{target}]({target_url}){comment}"
+msgstr ""
+"[{author}]({author_url}) 已完成将翻译页面 *{article}* 移动到 [{target}]"
+"({target_url}){comment}"
+
+#: extensions/base/translate.py:121
+#, python-brace-format
+msgid "Encountered a problem while moving \"{article}\" to \"{target}\""
+msgstr "在移动 \"{article}\" 到 \"{target}\" 时遇到问题"
+
+#: extensions/base/translate.py:133
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) encountered a problem while moving [{article}]"
+"({article_url}) to [{target}]({target_url}){comment}"
+msgstr ""
+"[{author}]({author_url}) 在移动 [{article}]({article_url}) 至 [{target}]"
+"({target_url}) 时遇到了问题{comment}"
+
+#: extensions/base/translate.py:149
+#, python-brace-format
+msgid ""
+"Failed to delete \"{article}\" which belongs to translatable page "
+"\"{target}\""
+msgstr "无法删除 \"{article}\",其属于可翻译页面 \"{target}\""
+
+#: extensions/base/translate.py:161
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) failed to delete [{article}]({article_url}) which "
+"belongs to translatable page [{target}]({target_url}){comment}"
+msgstr ""
+"[{author}]({author_url}) 无法删除 [{article}]({article_url}),其属于可翻译页"
+"面 [{target}]({target_url}){comment}"
+
+#: extensions/base/translate.py:177
+#, python-brace-format
+msgid "Completed deletion of translation page \"{article}\""
+msgstr "已完成删除翻译页面 \"{article}\""
+
+#: extensions/base/translate.py:188
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) completed deletion of translation page [{article}]"
+"({article_url}){comment}"
+msgstr ""
+"[{author}]({author_url}) 已完成删除翻译页面 [{article}]({article_url})"
+"{comment}"
+
+#: extensions/base/translate.py:203
+#, python-brace-format
+msgid ""
+"Failed to delete \"{article}\" which belongs to translation page \"{target}\""
+msgstr "无法删除 \"{article}\",其属于翻译页面 \"{target}\""
+
+#: extensions/base/translate.py:215
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) failed to delete [{article}]({article_url}) which "
+"belongs to translation page [{target}]({target_url}){comment}"
+msgstr ""
+"[{author}]({author_url}) 无法删除 [{article}]({article_url}),其属于翻译页面 "
+"[{target}]({target_url}){comment}"
+
+#: extensions/base/translate.py:231
+#, python-brace-format
+msgid "Encouraged translation of \"{article}\""
+msgstr "支持了 \"{article}\" 的翻译"
+
+#: extensions/base/translate.py:240
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) encouraged translation of [{article}]({article_url})"
+"{comment}"
+msgstr ""
+"[{author}]({author_url}) 支持了 [{article}]({article_url}) 的翻译 {comment}"
+
+#: extensions/base/translate.py:255
+#, python-brace-format
+msgid "Discouraged translation of \"{article}\""
+msgstr "不支持了 \"{article}\" 的翻译"
+
+#: extensions/base/translate.py:264
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) discouraged translation of [{article}]"
+"({article_url}){comment}"
+msgstr ""
+"[{author}]({author_url}) 不支持 [{article}]({article_url}) 的翻译{comment}"
+
+#: extensions/base/translate.py:282
+#, python-brace-format
+msgid "Limited languages for \"{article}\" to `{languages}`"
+msgstr "将 \"{article}\" 的语言限制为 `{languages}`"
+
+#: extensions/base/translate.py:285
+#, python-brace-format
+msgid "Priority languages for \"{article}\" set to `{languages}`"
+msgstr "将 \"{article}\" 的优先语言设为 `{languages}`"
+
+#: extensions/base/translate.py:288
+#, python-brace-format
+msgid "Removed priority languages from \"{article}\""
+msgstr "从 \"{article}\" 移除了优先语言"
+
+#: extensions/base/translate.py:301
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) limited languages for [{article}]({article_url}) to "
+"`{languages}`{comment}"
+msgstr ""
+"[{author}]({author_url}) 将 [{article}]({article_url}) 的语言限制为 "
+"`{languages}`{comment}"
+
+#: extensions/base/translate.py:308
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) set the priority languages for [{article}]"
+"({article_url}) to `{languages}`{comment}"
+msgstr ""
+"[{author}]({author_url}) 将 [{article}]({article_url}) 的优先语言设置为 "
+"`{languages}`{comment}"
+
+#: extensions/base/translate.py:315
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) removed priority languages from [{article}]"
+"({article_url}){comment}"
+msgstr ""
+"[{author}]({author_url}) 移除了 [{article}]({article_url}) 的优先语言 "
+"{comment}"
+
+#: extensions/base/translate.py:331
+#, python-brace-format
+msgid "Added translatable page \"{article}\" to aggregate group \"{group}\""
+msgstr "将可翻译页面 \"{article}\" 加入聚合信息组 \"{group}\""
+
+#: extensions/base/translate.py:342
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) added translatable page [{article}]({article_url}) "
+"to aggregate group \"{group}\"{comment}"
+msgstr ""
+"[{author}]({author_url}) 将可翻译页面 [{article}]({article_url}) 加入了聚合消"
+"息组 \"{group}\"{comment}"
+
+#: extensions/base/translate.py:357
+#, python-brace-format
+msgid ""
+"Removed translatable page \"{article}\" from aggregate group \"{group}\""
+msgstr "将可翻译页面 \"{article}\" 从聚合信息组 \"{group}\" 中移除"
+
+#: extensions/base/translate.py:368
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) removed translatable page [{article}]"
+"({article_url}) from aggregate group \"{group}\"{comment}"
+msgstr ""
+"[{author}]({author_url}) 将可翻译页面 [{article}]({article_url}) 从聚合消息"
+"组 \"{group}\" 中移除{comment}"
+
+#: extensions/base/translate.py:387
+#, python-brace-format
+msgid "Reviewed translation \"{article}\""
+msgstr "复核了翻译 \"{article}\""
+
+#: extensions/base/translate.py:401
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) reviewed translation [{article}]({article_url})"
+"{comment}"
+msgstr ""
+"[{author}]({author_url}) 复核了翻译 [{article}]({article_url}){comment}"
+
+#: extensions/base/translate.py:416
+#, python-brace-format
+msgid "Changed the state of `{language}` translations of \"{article}\""
+msgstr "更改了 \"{article}\" 的 `{language}` 翻译的状态"
+
+#: extensions/base/translate.py:419
+msgid "Old state"
+msgstr "旧状态"
+
+#: extensions/base/translate.py:420
+msgid "New state"
+msgstr "新状态"
+
+#: extensions/base/translate.py:431
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) changed the state of `{language}` translations of "
+"[{article}]({article_url}) from `{old_state}` to `{new_state}`{comment}"
+msgstr ""
+"[{author}]({author_url}) 将 [{article}]({article_url}) 的 `{language}` 翻译的"
+"状态从 `{old_state}` 更改为 `{new_state}`{comment}"
+
+#: extensions/base/translate.py:439
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) changed the state of `{language}` translations of "
+"[{article}]({article_url}) to `{new_state}`{comment}"
+msgstr ""
+"[{author}]({author_url}) 更改了 [{article}]({article_url}) 的 `{language}` 翻"
+"译的状态为 `{new_state}`{comment}"
+
+#: extensions/base/translate.py:452 extensions/base/translate.py:455
+msgid "(default)"
+msgstr "(默认)"
+
+#: extensions/base/translate.py:464
+#, python-brace-format
+msgid "Changed the language of \"{article}\""
+msgstr "更改了 \"{article}\" 的语言"
+
+#: extensions/base/translate.py:465
+msgid "Old language"
+msgstr "旧语言"
+
+#: extensions/base/translate.py:466
+msgid "New language"
+msgstr "新语言"
+
+#: extensions/base/translate.py:477
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) changed the language of [{article}]({article_url}) "
+"from {old_lang} to {new_lang}{comment}"
+msgstr ""
+"[{author}]({author_url}) 更改了 [{article}]({article_url}) 的语言,从 "
+"{old_lang} 更改为 {new_lang}{comment}"
+
+#: extensions/base/discussions.py:148 extensions/base/discussions.py:207
+#: extensions/base/discussions.py:245 extensions/base/discussions.py:261
+#: extensions/base/discussions.py:284 extensions/base/discussions.py:306
+#: extensions/base/discussions.py:334 extensions/base/discussions.py:354
+msgid "unknown"
+msgstr "未知"
+
+#: extensions/base/discussions.py:157
+#, python-brace-format
+msgid "Created \"{title}\""
+msgstr "创建了 \"{title}\""
+
+#: extensions/base/discussions.py:161
+#, python-brace-format
+msgid "Created a poll \"{title}\""
+msgstr "创建了投票 \"{title}\""
+
+#: extensions/base/discussions.py:168
+msgid "Option {}"
+msgstr "选项 {}"
+
+#: extensions/base/discussions.py:170
+#, python-brace-format
+msgid "__[View image]({image_url})__"
+msgstr "__[查看图片]({image_url})__"
+
+#: extensions/base/discussions.py:174
+#, python-brace-format
+msgid "Created a quiz \"{title}\""
+msgstr "创建了问卷 \"{title}\""
+
+#: extensions/base/discussions.py:193 extensions/base/discussions.py:195
+msgctxt "Fandom discussions Tags/Forums"
+msgid "Tags"
+msgstr "标签"
+
+#: extensions/base/discussions.py:193
+msgctxt "Fandom discussions amount of Tags/Forums"
+msgid "{} tags"
+msgstr "{} 个标签"
+
+#: extensions/base/discussions.py:198
+#, python-brace-format
+msgid "Replied to \"{title}\""
+msgstr "回复至 \"{title}\""
+
+#: extensions/base/discussions.py:214
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) created [{title}](<{url}f/p/{threadId}>) in "
+"{forumName}"
+msgstr ""
+"[{author}]({author_url}) 创建了 [{title}](<{url}f/p/{threadId}>) 于 "
+"{forumName}"
+
+#: extensions/base/discussions.py:217
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) created a poll [{title}](<{url}f/p/{threadId}>) in "
+"{forumName}"
+msgstr ""
+"[{author}]({author_url}) 创建了一个投票 [{title}](<{url}f/p/{threadId}>) 于 "
+"{forumName}"
+
+#: extensions/base/discussions.py:220
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) created a quiz [{title}](<{url}f/p/{threadId}>) in "
+"{forumName}"
+msgstr ""
+"[{author}]({author_url}) 创建了一份问卷 [{title}](<{url}f/p/{threadId}>) 于 "
+"{forumName}"
+
+#: extensions/base/discussions.py:234
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) created a [reply](<{url}f/p/{threadId}/r/{postId}>) "
+"to [{title}](<{url}f/p/{threadId}>) in {forumName}"
+msgstr ""
+"[{author}]({author_url}) 创建了一条[回复](<{url}f/p/{threadId}/r/{postId}>) "
+"至 [{title}](<{url}f/p/{threadId}>) 于 {forumName}"
+
+#: extensions/base/discussions.py:292
+#, python-brace-format
+msgid "Created \"{title}\" on {user}'s Message Wall"
+msgstr "创建了 \"{title}\" 于 {user} 的信息墙"
+
+#: extensions/base/discussions.py:298
+#, python-brace-format
+msgid "Replied to \"{title}\" on {user}'s Message Wall"
+msgstr "回复至 \"{title}\" 于 {user} 的信息墙"
+
+#: extensions/base/discussions.py:312
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) created [{title}](<{url}wiki/Message_Wall:"
+"{user_wall}?threadId={threadId}>) on [{user}'s Message Wall](<{url}wiki/"
+"Message_Wall:{user_wall}>)"
+msgstr ""
+"[{author}]({author_url}) 创建了 [{title}](<{url}wiki/Message_Wall:"
+"{user_wall}?threadId={threadId}>) 于 [{user}的信息墙](<{url}wiki/"
+"Message_Wall:{user_wall}>)"
+
+#: extensions/base/discussions.py:318
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) created a [reply](<{url}wiki/Message_Wall:"
+"{user_wall}?threadId={threadId}#{replyId}>) to [{title}](<{url}wiki/"
+"Message_Wall:{user_wall}?threadId={threadId}>) on [{user}'s Message Wall]"
+"(<{url}wiki/Message_Wall:{user_wall}>)"
+msgstr ""
+"[{author}]({author_url}) 创建了一条[回复](<{url}wiki/Message_Wall:"
+"{user_wall}?threadId={threadId}#{replyId}>) 至 [{title}](<{url}wiki/"
+"Message_Wall:{user_wall}?threadId={threadId}>) 于 [{user}的信息墙](<{url}"
+"wiki/Message_Wall:{user_wall}>)"
+
+#: extensions/base/discussions.py:338
+#, python-brace-format
+msgid "Commented on {article}"
+msgstr "评论于 {article}"
+
+#: extensions/base/discussions.py:344
+#, python-brace-format
+msgid "Replied to a comment on {article}"
+msgstr "回复至一条评论于 {article}"
+
+#: extensions/base/discussions.py:359
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) created a [comment](<{url}?commentId={commentId}>) "
+"on [{article}](<{url}>)"
+msgstr ""
+"[{author}]({author_url}) 创建了一条[评论](<{url}?commentId={commentId}>) 于 "
+"[{article}](<{url}>)"
+
+#: extensions/base/discussions.py:365
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) created a [reply](<{url}?commentId={commentId}"
+"&replyId={replyId}>) to a [comment](<{url}?commentId={commentId}>) on "
+"[{article}](<{url}>)"
+msgstr ""
+"[{author}]({author_url}) 创建了一条[回复](<{url}?commentId={commentId}"
+"&replyId={replyId}>) to a [comment](<{url}?commentId={commentId}>) 于 "
+"[{article}](<{url}>)"
+
+#: extensions/base/managewiki.py:34
+msgid "Changed wiki settings"
+msgstr "更改了wiki设置"
+
+#: extensions/base/managewiki.py:44
+#, python-brace-format
+msgid "[{author}]({author_url}) changed wiki settings{reason}"
+msgstr "[{author}]({author_url}) 更改了wiki设置{reason}"
+
+#: extensions/base/managewiki.py:55
+#, python-brace-format
+msgid "Deleted a \"{wiki}\" wiki"
+msgstr "删除了wiki \"{wiki}\""
+
+#: extensions/base/managewiki.py:55 extensions/base/managewiki.py:67
+#: extensions/base/managewiki.py:103 extensions/base/managewiki.py:112
+#: extensions/base/managewiki.py:125 extensions/base/managewiki.py:126
+#: extensions/base/managewiki.py:135 extensions/base/managewiki.py:136
+#: extensions/base/managewiki.py:148 extensions/base/managewiki.py:149
+#: extensions/base/managewiki.py:160 extensions/base/managewiki.py:161
+#: extensions/base/managewiki.py:195 extensions/base/managewiki.py:204
+#: extensions/base/managewiki.py:217 extensions/base/managewiki.py:226
+#: extensions/base/abusefilter.py:55 extensions/base/abusefilter.py:56
+#: extensions/base/abusefilter.py:57 extensions/base/abusefilter.py:68
+#: extensions/base/abusefilter.py:69 extensions/base/abusefilter.py:70
+#: extensions/base/mediawiki.py:743
+msgid "Unknown"
+msgstr "未知"
+
+#: extensions/base/managewiki.py:63
+#, python-brace-format
+msgid "[{author}]({author_url}) deleted a wiki *{wiki_name}*{comment}"
+msgstr "[{author}]({author_url}) 删除了wiki *{wiki_name}* {comment}"
+
+#: extensions/base/managewiki.py:80
+#, python-brace-format
+msgid "Deleted a \"{group}\" user group"
+msgstr "删除了用户组“{group}”"
+
+#: extensions/base/managewiki.py:89
+#, python-brace-format
+msgid "[{author}]({author_url}) deleted a usergroup *{group}*{comment}"
+msgstr "[{author}]({author_url}) 删除了用户组 *{group}*{comment}"
+
+#: extensions/base/managewiki.py:103
+#, python-brace-format
+msgid "Locked a \"{wiki}\" wiki"
+msgstr "锁定了wiki \"{wiki}\""
+
+#: extensions/base/managewiki.py:111
+#, python-brace-format
+msgid "[{author}]({author_url}) locked a wiki *{wiki_name}*{comment}"
+msgstr "[{author}]({author_url}) 锁定了wiki *{wiki_name}* {comment}"
+
+#: extensions/base/managewiki.py:124
+#, python-brace-format
+msgid "Modified \"{namespace_name}\" namespace"
+msgstr "修改了命名空间 \"{namespace_name}\""
+
+#: extensions/base/managewiki.py:126 extensions/base/managewiki.py:149
+msgid "Wiki"
+msgstr "Wiki"
+
+#: extensions/base/managewiki.py:134
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) modified namespace *{namespace_name}* on "
+"*{wiki_name}*{comment}"
+msgstr ""
+"[{author}]({author_url}) 修改了命名空间 *{namespace_name}* 于 *{wiki_name}"
+"*{comment}"
+
+#: extensions/base/managewiki.py:147
+#, python-brace-format
+msgid "Deleted a \"{namespace_name}\" namespace"
+msgstr "删除了命名空间 \"{namespace_name}\""
+
+#: extensions/base/managewiki.py:158
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) deleted a namespace *{namespace_name}* on "
+"*{wiki_name}*{comment}"
+msgstr ""
+"[{author}]({author_url}) 删除了命名空间 *{namespace_name}* 于 *{wiki_name}* "
+"{comment}"
+
+#: extensions/base/managewiki.py:173
+#, python-brace-format
+msgid "Modified \"{usergroup_name}\" usergroup"
+msgstr "修改了用户组 \"{usergroup_name}\""
+
+#: extensions/base/managewiki.py:182
+#, python-brace-format
+msgid "[{author}]({author_url}) modified user group *{group_name}*{comment}"
+msgstr "[{author}]({author_url}) 修改了用户组 *{group_name}*{comment}"
+
+#: extensions/base/managewiki.py:195
+#, python-brace-format
+msgid "Undeleted a \"{wiki}\" wiki"
+msgstr "取消删除了wiki \"{wiki}\""
+
+#: extensions/base/managewiki.py:203
+#, python-brace-format
+msgid "[{author}]({author_url}) undeleted a wiki *{wiki_name}*{comment}"
+msgstr "[{author}]({author_url}) 取消删除了wiki *{wiki_name}*{comment}"
+
+#: extensions/base/managewiki.py:217
+#, python-brace-format
+msgid "Unlocked a \"{wiki}\" wiki"
+msgstr "解锁了wiki \"{wiki}\""
+
+#: extensions/base/managewiki.py:225
+#, python-brace-format
+msgid "[{author}]({author_url}) unlocked a wiki *{wiki_name}*{comment}"
+msgstr "[{author}]({author_url}) 解锁了wiki *{wiki_name}* {comment}"
+
+#: extensions/base/datadump.py:36
+#, python-brace-format
+msgid "Generated {file} dump"
+msgstr "生成了转储 {file}"
+
+#: extensions/base/datadump.py:45
+#, python-brace-format
+msgid "[{author}]({author_url}) generated *{file}* dump{comment}"
+msgstr "[{author}]({author_url}) 生成了 *{file}* 转储{comment}"
+
+#: extensions/base/datadump.py:58
+#, python-brace-format
+msgid "Deleted {file} dump"
+msgstr "删除了转储 {file}"
+
+#: extensions/base/datadump.py:67
+#, python-brace-format
+msgid "[{author}]({author_url}) deleted *{file}* dump{comment}"
+msgstr "[{author}]({author_url}) 删除了 *{file}* 转储{comment}"
+
+#: extensions/base/curseprofile.py:40
+#, python-brace-format
+msgid "Edited {target}'s profile"
+msgstr "编辑了 {target} 的资料页"
+
+#: extensions/base/curseprofile.py:42
+msgid "Edited their own profile"
+msgstr "编辑了自己的资料页"
+
+#: extensions/base/curseprofile.py:44
+#, python-brace-format
+msgid "Cleared the {field} field"
+msgstr "清空了 {field} 栏位"
+
+#: extensions/base/curseprofile.py:46
+#, python-brace-format
+msgid "{field} field changed to: {desc}"
+msgstr "{field} 栏位改为:{desc}"
+
+#: extensions/base/curseprofile.py:58
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) cleared the {field} on [{target}]({target_url})'s "
+"profile."
+msgstr ""
+"[{author}]({author_url}) 在 [{target}]({target_url}) 的资料页上清除了 "
+"{field} 栏位。"
+
+#: extensions/base/curseprofile.py:60
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) edited the {field} on [{target}]({target_url})'s "
+"profile. *({desc})*"
+msgstr ""
+"[{author}]({author_url}) 在 [{target}]({target_url}) 的资料页上编辑了 "
+"{field} 栏位。*({desc})*"
+
+#: extensions/base/curseprofile.py:65
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) cleared the {field} on [their own]({target_url}) "
+"profile."
+msgstr ""
+"[{author}]({author_url}) 在[自己]({target_url})的资料页上编辑了 {field} 栏"
+"位。"
+
+#: extensions/base/curseprofile.py:67
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) edited the {field} on [their own]({target_url}) "
+"profile. *({desc})*"
+msgstr ""
+"[{author}]({author_url}) 在[自己]({target_url})的资料页上编辑了 {field} 栏"
+"位。*({desc})*"
+
+#: extensions/base/curseprofile.py:82
+#, python-brace-format
+msgid "Left a comment on {target}'s profile"
+msgstr "在 {target} 的资料页上留下留言"
+
+#: extensions/base/curseprofile.py:84
+msgid "Left a comment on their own profile"
+msgstr "在自己的资料页上留下留言"
+
+#: extensions/base/curseprofile.py:97
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) left a [comment]({comment}) on {target}'s profile."
+msgstr ""
+"[{author}]({author_url}) 在 {target} 的资料页上留下了一条[评论]({comment})。"
+
+#: extensions/base/curseprofile.py:100
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) left a [comment]({comment}) on their own profile."
+msgstr "[{author}]({author_url}) 在自己的资料页上留下了一条[评论]({comment})。"
+
+#: extensions/base/curseprofile.py:113
+#, python-brace-format
+msgid "Edited a comment on {target}'s profile"
+msgstr "编辑了 {target} 的资料页上的一条留言"
+
+#: extensions/base/curseprofile.py:115
+msgid "Edited a comment on their own profile"
+msgstr "编辑了自己的资料页上的一条留言"
+
+#: extensions/base/curseprofile.py:128
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) edited a [comment]({comment}) on {target}'s profile."
+msgstr ""
+"[{author}]({author_url}) 在 {target} 的资料页上编辑了一条[评论]({comment})。"
+
+#: extensions/base/curseprofile.py:131
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) edited a [comment]({comment}) on their own profile."
+msgstr "[{author}]({author_url}) 在自己的资料页上编辑了一条[评论]({comment})。"
+
+#: extensions/base/curseprofile.py:144
+#, python-brace-format
+msgid "Replied to a comment on {target}'s profile"
+msgstr "在 {target} 的资料页上回复留言"
+
+#: extensions/base/curseprofile.py:146
+msgid "Replied to a comment on their own profile"
+msgstr "在自己的资料页上回复留言"
+
+#: extensions/base/curseprofile.py:159
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) replied to a [comment]({comment}) on {target}'s "
+"profile."
+msgstr ""
+"[{author}]({author_url}) 在 {target} 的资料页上回复了一条[评论]({comment})。"
+
+#: extensions/base/curseprofile.py:162
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) replied to a [comment]({comment}) on their own "
+"profile."
+msgstr "[{author}]({author_url}) 在自己的资料页上回复了一条[评论]({comment})。"
+
+#: extensions/base/curseprofile.py:175
+#, python-brace-format
+msgid "Deleted a comment on {target}'s profile"
+msgstr "删除了 {target} 的资料页上的一条留言"
+
+#: extensions/base/curseprofile.py:177
+msgid "Deleted a comment on their own profile"
+msgstr "删除了自己的资料页上的一条评论"
+
+#: extensions/base/curseprofile.py:197
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) deleted a [comment]({comment}) on {target}'s "
+"profile.{reason}"
+msgstr ""
+"[{author}]({author_url}) 在 {target} 的资料页上删除了一条[评论]({comment})。"
+"{reason}"
+
+#: extensions/base/curseprofile.py:200
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) deleted a [comment]({comment}) on their own profile."
+"{reason}"
+msgstr ""
+"[{author}]({author_url}) 在自己的资料页上删除了一条[评论]({comment})。"
+"{reason}"
+
+#: extensions/base/curseprofile.py:214
+#, python-brace-format
+msgid "Purged a comment on {target}'s profile"
+msgstr "永久删除了 {target} 的资料页上的一条留言"
+
+#: extensions/base/curseprofile.py:216
+msgid "Purged a comment on their own profile"
+msgstr "永久删除了自己的资料页上的一条评论"
+
+#: extensions/base/curseprofile.py:230
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) purged a comment on [{target}]({link})'s profile."
+"{reason}"
+msgstr ""
+"[{author}]({author_url}) 在 [{target}]({link}) 的资料页上永久删除了一条评论。"
+"{reason}"
+
+#: extensions/base/curseprofile.py:233
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) purged a comment on [their own]({link}) profile."
+"{reason}"
+msgstr ""
+"[{author}]({author_url}) 在[自己]({link})的资料页上永久删除了一条评论。"
+"{reason}"
+
+#: extensions/base/renameuser.py:38
+#, python-brace-format
+msgid "Renamed user \"{old_name}\" with {edits} edit to \"{new_name}\""
+msgid_plural "Renamed user \"{old_name}\" with {edits} edits to \"{new_name}\""
+msgstr[0] "将有 {edits} 次编辑的用户 \"{old_name}\" 重命名为 \"{new_name}\""
+
+#: extensions/base/renameuser.py:43
+#, python-brace-format
+msgid "Renamed user \"{old_name}\" to \"{new_name}\""
+msgstr "将用户 \"{old_name}\" 重命名为 \"{new_name}\""
+
+#: extensions/base/renameuser.py:58
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) renamed user *{old_name}* with {edits} edit to "
+"[{new_name}]({link}){comment}"
+msgid_plural ""
+"[{author}]({author_url}) renamed user *{old_name}* with {edits} edits to "
+"[{new_name}]({link}){comment}"
+msgstr[0] ""
+"[{author}]({author_url}) 将编辑数为 {edits} 的用户 *{old_name}* 重命名为 "
+"[{new_name}]({link}) {comment}"
+
+#: extensions/base/renameuser.py:66
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) renamed user *{old_name}* to [{new_name}]({link})"
+"{comment}"
+msgstr ""
+"[{author}]({author_url}) 将用户 *{old_name}* 重命名为 [{new_name}]({link})"
+"{comment}"
+
+#: extensions/base/interwiki.py:37
+msgid "Added an entry to the interwiki table"
+msgstr "向跨wiki表添加了跨wiki前缀"
+
+#: extensions/base/interwiki.py:38 extensions/base/interwiki.py:65
+#, python-brace-format
+msgid "Prefix: {prefix}, website: {website} | {desc}"
+msgstr "前缀:{prefix},网站:{website} | {desc}"
+
+#: extensions/base/interwiki.py:50
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) added an entry to the [interwiki table]"
+"({table_url}) pointing to {website} with {prefix} prefix"
+msgstr ""
+"[{author}]({author_url}) 向[跨wiki表]({table_url})中加入了指向 {website} 的,"
+"前缀为 {prefix} 的跨wiki前缀"
+
+#: extensions/base/interwiki.py:64
+msgid "Edited an entry in interwiki table"
+msgstr "编辑了跨wiki表的跨wiki前缀"
+
+#: extensions/base/interwiki.py:77
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) edited an entry in [interwiki table]({table_url}) "
+"pointing to {website} with {prefix} prefix"
+msgstr ""
+"[{author}]({author_url})修改了[跨wiki表]({table_url}) 中指向 {website} 的,前"
+"缀为 {prefix} 的跨wiki前缀"
+
+#: extensions/base/interwiki.py:91
+msgid "Deleted an entry in interwiki table"
+msgstr "删除了跨wiki表的跨wiki前缀"
+
+#: extensions/base/interwiki.py:92
+#, python-brace-format
+msgid "Prefix: {prefix} | {desc}"
+msgstr "前缀:{prefix} | {desc}"
+
+#: extensions/base/interwiki.py:102
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) deleted an entry in [interwiki table]({table_url})"
+"{desc}"
+msgstr ""
+"[{author}]({author_url}) 删除了[跨wiki表]({table_url})中的一个跨wiki前缀"
+"{desc}"
+
+#: extensions/base/abusefilter.py:29
+msgid "None"
+msgstr "无"
+
+#: extensions/base/abusefilter.py:29
+msgid "Warning issued"
+msgstr "已发出警告"
+
+#: extensions/base/abusefilter.py:29
+msgid "**Blocked user**"
+msgstr "**已封禁用户**"
+
+#: extensions/base/abusefilter.py:29
+msgid "Tagged the edit"
+msgstr "已标记编辑"
+
+#: extensions/base/abusefilter.py:29
+msgid "Disallowed the action"
+msgstr "已阻止操作"
+
+#: extensions/base/abusefilter.py:29
+msgid "**IP range blocked**"
+msgstr "**已封禁IP区段**"
+
+#: extensions/base/abusefilter.py:29
+msgid "Throttled actions"
+msgstr "已对操作进行频率控制"
+
+#: extensions/base/abusefilter.py:29
+msgid "Removed autoconfirmed group"
+msgstr "已撤销自动确认用户组"
+
+#: extensions/base/abusefilter.py:29
+msgid "**Removed from privileged groups**"
+msgstr "**已移除用户组**"
+
+#: extensions/base/abusefilter.py:30
+msgid "Edit"
+msgstr "编辑"
+
+#: extensions/base/abusefilter.py:30
+msgid "Upload"
+msgstr "上传"
+
+#: extensions/base/abusefilter.py:30
+msgid "Move"
+msgstr "移动"
+
+#: extensions/base/abusefilter.py:30
+msgid "Stash upload"
+msgstr "隐藏上传"
+
+#: extensions/base/abusefilter.py:30
+msgid "Deletion"
+msgstr "删除"
+
+#: extensions/base/abusefilter.py:30
+msgid "Account creation"
+msgstr "账户创建"
+
+#: extensions/base/abusefilter.py:30
+msgid "Auto account creation"
+msgstr "自动账户创建"
+
+#: extensions/base/abusefilter.py:54
+#, python-brace-format
+msgid "{user} triggered \"{abuse_filter}\""
+msgstr "{user} 触发了 \"{abuse_filter}\""
+
+#: extensions/base/abusefilter.py:55
+msgid "Performed"
+msgstr "执行了"
+
+#: extensions/base/abusefilter.py:56
+msgid "Action taken"
+msgstr "采取的操作"
+
+#: extensions/base/abusefilter.py:57
+msgid "Title"
+msgstr "标题"
+
+#: extensions/base/abusefilter.py:66
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) triggered *{abuse_filter}*, performing the action "
+"\"{action}\" on *[{target}]({target_url})* - action taken: {result}."
+msgstr ""
+"[{author}]({author_url}) 触发了 *{abuse_filter}*,执行操作 \"{action}\" 于 "
+"*[{target}]({target_url})* - 已采取的行动: {result}。"
+
+#: extensions/base/abusefilter.py:83
+#, python-brace-format
+msgid "Edited abuse filter number {number}"
+msgstr "编辑了滥用过滤器{number}"
+
+#: extensions/base/abusefilter.py:95
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) edited abuse filter [number {number}]({filter_url})"
+msgstr ""
+"[{author}]({author_url}) 更改了滥用过滤器[number {number}]({filter_url})"
+
+#: extensions/base/abusefilter.py:111
+#, python-brace-format
+msgid "Created abuse filter number {number}"
+msgstr "创建了滥用过滤器{number}"
+
+#: extensions/base/abusefilter.py:119
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) created abuse filter [number {number}]({filter_url})"
+msgstr ""
+"[{author}]({author_url}) 创建了滥用过滤器[number {number}]({filter_url})"
+
+#: extensions/base/mediawiki.py:37
+msgid "director"
+msgstr "向导"
+
+#: extensions/base/mediawiki.py:37
+msgid "bot"
+msgstr "机器人"
+
+#: extensions/base/mediawiki.py:37
+msgid "editor"
+msgstr "编者"
+
+#: extensions/base/mediawiki.py:37
+msgid "directors"
+msgstr "向导"
+
+#: extensions/base/mediawiki.py:37
+msgid "sysop"
+msgstr "管理员"
+
+#: extensions/base/mediawiki.py:37
+msgid "bureaucrat"
+msgstr "行政员"
+
+#: extensions/base/mediawiki.py:37
+msgid "reviewer"
+msgstr "复核员"
+
+#: extensions/base/mediawiki.py:38
+msgid "autoreview"
+msgstr "自动复核用户"
+
+#: extensions/base/mediawiki.py:38
+msgid "autopatrol"
+msgstr "巡查豁免者"
+
+#: extensions/base/mediawiki.py:38
+msgid "wiki_guardian"
+msgstr "Wiki守卫"
+
+#: extensions/base/mediawiki.py:70
+msgid "(N!) "
+msgstr "(新!) "
+
+#: extensions/base/mediawiki.py:71
+msgid "m"
+msgstr "小"
+
+#: extensions/base/mediawiki.py:72
+msgid "b"
+msgstr "机"
+
+#: extensions/base/mediawiki.py:112
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) edited [{article}]({edit_link}){comment} {bold}"
+"({sign}{edit_size}){bold}"
+msgstr ""
+"[{author}]({author_url}) 编辑了 [{article}]({edit_link}){comment}{bold}"
+"({sign}{edit_size}){bold}"
+
+#: extensions/base/mediawiki.py:117
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) created [{article}]({edit_link}){comment} {bold}"
+"({sign}{edit_size}){bold}"
+msgstr ""
+"[{author}]({author_url}) 创建了 [{article}]({edit_link}){comment}{bold}"
+"({sign}{edit_size}){bold}"
+
+#: extensions/base/mediawiki.py:190 extensions/base/mediawiki.py:223
+msgid "Options"
+msgstr "选项"
+
+#: extensions/base/mediawiki.py:190
+#, python-brace-format
+msgid "([preview]({link}) | [undo]({undolink}))"
+msgstr "([预览]({link}) | [撤销]({undolink}))"
+
+#: extensions/base/mediawiki.py:195
+#, python-brace-format
+msgid "Uploaded a new version of {name}"
+msgstr "上传了 {name} 的新版本"
+
+#: extensions/base/mediawiki.py:197
+#, python-brace-format
+msgid "Reverted a version of {name}"
+msgstr "回退了 {name} 的一个版本"
+
+#: extensions/base/mediawiki.py:199
+#, python-brace-format
+msgid "Uploaded {name}"
+msgstr "上传了 {name}"
+
+#: extensions/base/mediawiki.py:208
+msgid "**No license!**"
+msgstr "**没有许可协议!**"
+
+#: extensions/base/mediawiki.py:223
+#, python-brace-format
+msgid "([preview]({link}))"
+msgstr "([预览]({link}))"
+
+#: extensions/base/mediawiki.py:228
+msgid ""
+"\n"
+"License: {}"
+msgstr ""
+"\n"
+"许可协议:{}"
+
+#: extensions/base/mediawiki.py:237
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) reverted a version of [{file}]({file_link}){comment}"
+msgstr ""
+"[{author}]({author_url}) 回退了 [{file}]({file_link}) 的一个版本 {comment}"
+
+#: extensions/base/mediawiki.py:248
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) uploaded a new version of [{file}]({file_link})"
+"{comment}"
+msgstr ""
+"[{author}]({author_url}) 上传了 [{file}]({file_link}) 的一个新版本 {comment}"
+
+#: extensions/base/mediawiki.py:259
+#, python-brace-format
+msgid "[{author}]({author_url}) uploaded [{file}]({file_link}){comment}"
+msgstr "[{author}]({author_url}) 上传了 [{file}]({file_link}){comment}"
+
+#: extensions/base/mediawiki.py:274
+#, python-brace-format
+msgid "Deleted page {article}"
+msgstr "删除了页面 {article}"
+
+#: extensions/base/mediawiki.py:283
+#, python-brace-format
+msgid "[{author}]({author_url}) deleted [{page}]({page_link}){comment}"
+msgstr "[{author}]({author_url}) 删除了 [{page}]({page_link}){comment}"
+
+#: extensions/base/mediawiki.py:298
+#, python-brace-format
+msgid "Deleted redirect {article} by overwriting"
+msgstr "通过覆盖删除了重定向 {article}"
+
+#: extensions/base/mediawiki.py:308
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) deleted redirect by overwriting [{page}]"
+"({page_link}){comment}"
+msgstr ""
+"[{author}]({author_url}) 通过覆盖 [{page}]({page_link}) 删除重定向 {comment}"
+
+#: extensions/base/mediawiki.py:322
+#, python-brace-format
+msgid "Restored {article}"
+msgstr "还原了 {article}"
+
+#: extensions/base/mediawiki.py:331
+#, python-brace-format
+msgid "[{author}]({author_url}) restored [{article}]({article_url}){comment}"
+msgstr "[{author}]({author_url}) 还原了 [{article}]({article_url}){comment}"
+
+#: extensions/base/mediawiki.py:348
+msgid "Changed visibility of log events"
+msgstr "更改了日志事件的可见性"
+
+#: extensions/base/mediawiki.py:356
+#, python-brace-format
+msgid "[{author}]({author_url}) changed visibility of log events{comment}"
+msgstr "[{author}]({author_url}) 更改了日志事件的可视性{comment}"
+
+#: extensions/base/mediawiki.py:370
+#, python-brace-format
+msgid "Changed visibility of revision on page {article} "
+msgid_plural "Changed visibility of {amount} revisions on page {article} "
+msgstr[0] "更改了页面 {article} 的 {amount} 个修订版本的可见性 "
+
+#: extensions/base/mediawiki.py:383
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) changed visibility of revision on page [{article}]"
+"({article_url}){comment}"
+msgid_plural ""
+"[{author}]({author_url}) changed visibility of {amount} revisions on page "
+"[{article}]({article_url}){comment}"
+msgstr[0] ""
+"[{author}]({author_url}) 更改了[{article}]({article_url}) 的 {amount} 个版本"
+"的可见性{comment}"
+
+#: extensions/base/mediawiki.py:399 extensions/base/mediawiki.py:432
+msgid "No redirect has been made"
+msgstr "未创建重定向"
+
+#: extensions/base/mediawiki.py:400 extensions/base/mediawiki.py:433
+msgid "A redirect has been made"
+msgstr "创建了重定向"
+
+#: extensions/base/mediawiki.py:401
+#, python-brace-format
+msgid "Moved {redirect}{article} to {target}"
+msgstr "将 {redirect}{article} 移动到了 {target}"
+
+#: extensions/base/mediawiki.py:412 extensions/base/mediawiki.py:444
+msgid "without making a redirect"
+msgstr "不留重定向"
+
+#: extensions/base/mediawiki.py:413 extensions/base/mediawiki.py:445
+msgid "with a redirect"
+msgstr "创建重定向"
+
+#: extensions/base/mediawiki.py:416
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) moved {redirect}*{article}* to [{target}]"
+"({target_url}) {made_a_redirect}{comment}"
+msgstr ""
+"[{author}]({author_url}) 移动 {redirect}*{article}* 至 [{target}]"
+"({target_url}),{made_a_redirect}{comment}"
+
+#: extensions/base/mediawiki.py:434
+#, python-brace-format
+msgid "Moved {redirect}{article} to {title} over redirect"
+msgstr "将 {redirect}{article} 移动到了 {title},不留重定向"
+
+#: extensions/base/mediawiki.py:448
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) moved {redirect}*{article}* over redirect to "
+"[{target}]({target_url}) {made_a_redirect}{comment}"
+msgstr ""
+"[{author}]({author_url}) 移动 {redirect}*{article}* 至 [{target}]"
+"({target_url}) 覆盖重定向,{made_a_redirect}{comment}"
+
+#: extensions/base/mediawiki.py:464
+#, python-brace-format
+msgid "Moved protection settings from {redirect}{article} to {title}"
+msgstr "将保护设置从 {redirect}{article} 移动到了 {title}"
+
+#: extensions/base/mediawiki.py:477
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) moved protection settings from {redirect}*{article}"
+"* to [{target}]({target_url}){comment}"
+msgstr ""
+"[{author}]({author_url}) 将保护设置从 {redirect}*{article}* 移动到了 "
+"[{target}]({target_url}){comment}"
+
+#: extensions/base/mediawiki.py:492
+#, python-brace-format
+msgid "Protected {target}"
+msgstr "保护了 {target}"
+
+#: extensions/base/mediawiki.py:495 extensions/base/mediawiki.py:510
+#: extensions/base/mediawiki.py:526 extensions/base/mediawiki.py:541
+msgid " [cascading]"
+msgstr " [级联]"
+
+#: extensions/base/mediawiki.py:506
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) protected [{article}]({article_url}) with the "
+"following settings: {settings}{comment}"
+msgstr ""
+"[{author}]({author_url}) 保护了 [{article}]({article_url}),设置为:"
+"{settings}{comment}"
+
+#: extensions/base/mediawiki.py:523
+#, python-brace-format
+msgid "Changed protection level for {article}"
+msgstr "更改了 {article} 的保护等级"
+
+#: extensions/base/mediawiki.py:537
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) modified protection settings of [{article}]"
+"({article_url}) to: {settings}{comment}"
+msgstr ""
+"[{author}]({author_url}) 将 [{article}]({article_url}) 的保护设置更改为:"
+"{settings}{comment}"
+
+#: extensions/base/mediawiki.py:554
+#, python-brace-format
+msgid "Removed protection from {article}"
+msgstr "移除了 {article} 的保护"
+
+#: extensions/base/mediawiki.py:563
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) removed protection from [{article}]({article_url})"
+"{comment}"
+msgstr ""
+"[{author}]({author_url}) 移除了 [{article}]({article_url}) 的保护 {comment}"
+
+#: extensions/base/mediawiki.py:572
+msgid "for infinity and beyond"
+msgstr "时长为无限期"
+
+#: extensions/base/mediawiki.py:581
+msgid "for less than a minute"
+msgstr "时长小于一分钟"
+
+#: extensions/base/mediawiki.py:583
+msgid "year"
+msgid_plural "years"
+msgstr[0] "年"
+
+#: extensions/base/mediawiki.py:583
+msgid "day"
+msgid_plural "days"
+msgstr[0] "天"
+
+#: extensions/base/mediawiki.py:583
+msgid "hour"
+msgid_plural "hours"
+msgstr[0] "时"
+
+#: extensions/base/mediawiki.py:584
+msgid "minute"
+msgid_plural "minutes"
+msgstr[0] "分"
+
+#: extensions/base/mediawiki.py:589
+#, python-brace-format
+msgid "for {time_number} {time_unit}"
+msgstr "时长为 {time_number} {time_unit}"
+
+#: extensions/base/mediawiki.py:608
+msgid "Blocked from editing the following pages: "
+msgstr "被阻止编辑下列页面: "
+
+#: extensions/base/mediawiki.py:615 extensions/base/mediawiki.py:661
+msgid " and namespaces: "
+msgstr " 和命名空间: "
+
+#: extensions/base/mediawiki.py:617
+msgid "Blocked from editing pages on following namespaces: "
+msgstr "被阻止编辑下列命名空间的页面: "
+
+#: extensions/base/mediawiki.py:628
+msgid "Partial block details"
+msgstr "部分封禁详情"
+
+#: extensions/base/mediawiki.py:631
+msgid "Block flags"
+msgstr "封禁标记"
+
+#: extensions/base/mediawiki.py:633
+#, python-brace-format
+msgid "Blocked {blocked_user} {time}"
+msgstr "封禁 {blocked_user} {time}"
+
+#: extensions/base/mediawiki.py:653
+msgid " on pages: "
+msgstr " 于页面: "
+
+#: extensions/base/mediawiki.py:663
+msgid " on namespaces: "
+msgstr " 于命名空间: "
+
+#: extensions/base/mediawiki.py:675
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) blocked [{user}]({user_url}) {time}"
+"{restriction_desc}{comment}"
+msgstr ""
+"[{author}]({author_url}) 封禁了 [{user}]({user_url}),{time}"
+"{restriction_desc}{comment}"
+
+#: extensions/base/mediawiki.py:693
+#, python-brace-format
+msgid "Changed block settings for {blocked_user}"
+msgstr "更改了 {blocked_user} 的封禁设置"
+
+#: extensions/base/mediawiki.py:703
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) changed block settings for [{blocked_user}]"
+"({user_url}){comment}"
+msgstr ""
+"[{author}]({author_url}) 更改了 [{blocked_user}]({user_url}) 的封禁设置 "
+"{comment}"
+
+#: extensions/base/mediawiki.py:716
+#, python-brace-format
+msgid "Unblocked {blocked_user}"
+msgstr "解封 {blocked_user}"
+
+#: extensions/base/mediawiki.py:726
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) unblocked [{blocked_user}]({user_url}){comment}"
+msgstr "[{author}]({author_url}) 解封了 [{blocked_user}]({user_url}){comment}"
+
+#: extensions/base/mediawiki.py:742
+msgid "Action has been hidden by administration"
+msgstr "操作已被管理员隐藏"
+
+#: extensions/base/mediawiki.py:749
+msgid "An action has been hidden by administration."
+msgstr "一项操作已被管理员隐藏。"
+
+#: extensions/base/mediawiki.py:760
+#, python-brace-format
+msgid "Imported {article} with {count} revision"
+msgid_plural "Imported {article} with {count} revisions"
+msgstr[0] "导入了含有 {count} 个修订版本的 {article}"
+
+#: extensions/base/mediawiki.py:771
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) imported [{article}]({article_url}) with {count} "
+"revision{comment}"
+msgid_plural ""
+"[{author}]({author_url}) imported [{article}]({article_url}) with {count} "
+"revisions{comment}"
+msgstr[0] ""
+"[{author}]({author_url}) 导入了 [{article}]({article_url}) 的 {count} 个修订"
+"版本{comment}"
+
+#: extensions/base/mediawiki.py:787
+#, python-brace-format
+msgid "Imported {article} with {count} revision from \"{source}\""
+msgid_plural "Imported {article} with {count} revisions from \"{source}\""
+msgstr[0] "导入了来自 \"{source}\" 的含有 {count} 个修订版本的 {article}"
+
+#: extensions/base/mediawiki.py:802
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) imported [{article}]({article_url}) with {count} "
+"revision from [{source}]({source_url}){comment}"
+msgid_plural ""
+"[{author}]({author_url}) imported [{article}]({article_url}) with {count} "
+"revisions from [{source}]({source_url}){comment}"
+msgstr[0] ""
+"[{author}]({author_url}) 从 [{source}]({source_url}) 导入了 [{article}]"
+"({article_url}) 的 {count} 个修订版本{comment}"
+
+#: extensions/base/mediawiki.py:817
+#, python-brace-format
+msgid " (until {date_and_time})"
+msgstr " (直到 {date_and_time})"
+
+#: extensions/base/mediawiki.py:834
+#, python-brace-format
+msgid "Changed group membership for {target}"
+msgstr "更改了 {target} 的用户组"
+
+#: extensions/base/mediawiki.py:836
+msgid "System"
+msgstr "系统"
+
+#: extensions/base/mediawiki.py:837
+#, python-brace-format
+msgid "{target} got autopromoted to a new usergroup"
+msgstr "{target} 被自动地提升到新用户组"
+
+#: extensions/base/mediawiki.py:843
+msgid "Added group"
+msgid_plural "Added groups"
+msgstr[0] "添加用户组"
+
+#: extensions/base/mediawiki.py:845
+msgid "Removed group"
+msgid_plural "Removed groups"
+msgstr[0] "移除用户组"
+
+#: extensions/base/mediawiki.py:859
+#, python-brace-format
+msgid "Added to {added} and removed from {removed}."
+msgstr "添加到{added}中,从{removed}中移除。"
+
+#: extensions/base/mediawiki.py:860 extensions/base/mediawiki.py:862
+#: extensions/base/mediawiki.py:864 extensions/base/mediawiki.py:871
+msgid ", "
+msgstr "、"
+
+#: extensions/base/mediawiki.py:862
+#, python-brace-format
+msgid "Added to {added}."
+msgstr "添加到{added}。"
+
+#: extensions/base/mediawiki.py:864
+#, python-brace-format
+msgid "Removed from {removed}."
+msgstr "从{removed}中移除。"
+
+#: extensions/base/mediawiki.py:865
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) changed group membership for [{target}]"
+"({target_url}): {group_changes}{comment}"
+msgstr ""
+"[{author}]({author_url}) 更改了 [{target}]({target_url}) 的用户组:"
+"{group_changes}{comment}"
+
+#: extensions/base/mediawiki.py:869
+#, python-brace-format
+msgid "The system autopromoted [{target}]({target_url}) to {added}.{comment}"
+msgstr "系统自动提升了 [{target}]({target_url}) 的用户组到{added}。{comment}"
+
+#: extensions/base/mediawiki.py:882
+#, python-brace-format
+msgid "Merged revision histories of {article} into {dest}"
+msgstr "将 {article} 的修订版本历史合并到了 {dest}"
+
+#: extensions/base/mediawiki.py:896
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) merged revision histories of [{article}]"
+"({article_url}) into [{dest}]({dest_url}){comment}"
+msgstr ""
+"[{author}]({author_url}) 将 [{article}]({article_url}) 的修订版本历史合并到 "
+"[{dest}]({dest_url}){comment}"
+
+#: extensions/base/mediawiki.py:910
+msgid "Created account automatically"
+msgstr "自动创建账户"
+
+#: extensions/base/mediawiki.py:917
+#, python-brace-format
+msgid "Account [{author}]({author_url}) was created automatically"
+msgstr "用户账户 [{author}]({author_url}) 被自动创建"
+
+#: extensions/base/mediawiki.py:930 extensions/base/mediawiki.py:995
+msgid "Created account"
+msgstr "创建了账户"
+
+#: extensions/base/mediawiki.py:937 extensions/base/mediawiki.py:1002
+#, python-brace-format
+msgid "Account [{author}]({author_url}) was created"
+msgstr "用户账户 [{author}]({author_url}) 被创建"
+
+#: extensions/base/mediawiki.py:949
+#, python-brace-format
+msgid "Created account {article}"
+msgstr "创建了账户 {article}"
+
+#: extensions/base/mediawiki.py:958
+#, python-brace-format
+msgid ""
+"Account [{article}]({article_url}) was created by [{author}]({author_url})"
+"{comment}"
+msgstr ""
+"用户账户 [{article}]({article_url}) 被 [{author}]({author_url}) 创建{comment}"
+
+#: extensions/base/mediawiki.py:971
+#, python-brace-format
+msgid "Created account {article} and password was sent by email"
+msgstr "创建了账户 {article} 且密码已通过电子邮件发送"
+
+#: extensions/base/mediawiki.py:982
+#, python-brace-format
+msgid ""
+"Account [{article}]({article_url}) was created by [{author}]({author_url}) "
+"and password was sent by email{comment}"
+msgstr ""
+"用户账户 [{article}]({article_url}) 被 [{author}]({author_url}) 创建,密码已"
+"通过电子邮件发送{comment}"
+
+#: extensions/base/mediawiki.py:1014
+#, python-brace-format
+msgid "Changed the content model of the page {article}"
+msgstr "更改了页面 {article} 的内容模型"
+
+#: extensions/base/mediawiki.py:1016
+#, python-brace-format
+msgid "Model changed from {old} to {new}: {reason}"
+msgstr "内容模型从 {old} 更改为 {new}:{reason}"
+
+#: extensions/base/mediawiki.py:1028
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) changed the content model of the page [{article}]"
+"({article_url}) from {old} to {new}{comment}"
+msgstr ""
+"[{author}]({author_url}) 将页面 [{article}]({article_url}) 的内容模型从 "
+"{old} 更改为 {new}{comment}"
+
+#: extensions/base/mediawiki.py:1043
+#, python-brace-format
+msgid "Created the page {article} using a non-default content model"
+msgstr "使用非默认内容模型创建了页面 {article}"
+
+#: extensions/base/mediawiki.py:1045
+#, python-brace-format
+msgid "Created with model {new}: {reason}"
+msgstr "使用内容模型 {new} 创建:{reason}"
+
+#: extensions/base/mediawiki.py:1056
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) created the page [{article}]({article_url}) using a "
+"non-default content model {new}{comment}"
+msgstr ""
+"[{author}]({author_url}) 创建了页面 [{article}]({article_url}),使用了非默认"
+"的内容模型 {new}{comment}"
+
+#: extensions/base/mediawiki.py:1071
+#, python-brace-format
+msgid "Created the tag \"{tag}\""
+msgstr "创建了标签 \"{tag}\""
+
+#: extensions/base/mediawiki.py:1081
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) created the [tag]({tag_url}) \"{tag}\"{comment}"
+msgstr "[{author}]({author_url}) 创建了[标签]({tag_url}) \"{tag}\"{comment}"
+
+#: extensions/base/mediawiki.py:1102
+#, python-brace-format
+msgid "Deleted the tag \"{tag}\""
+msgstr "删除了标签 \"{tag}\""
+
+#: extensions/base/mediawiki.py:1104
+msgid "Removed from"
+msgstr "移除从"
+
+#: extensions/base/mediawiki.py:1104
+msgid "{} revision or log entry"
+msgid_plural "{} revisions and/or log entries"
+msgstr[0] "{} 个修订版本和/或日志条目"
+
+#: extensions/base/mediawiki.py:1117
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) deleted the [tag]({tag_url}) \"{tag}\"{comment}"
+msgstr "[{author}]({author_url}) 删除了[标签]({tag_url}) \"{tag}\"{comment}"
+
+#: extensions/base/mediawiki.py:1127
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) deleted the [tag]({tag_url}) \"{tag}\" and removed "
+"it from {count} revision or log entry{comment}"
+msgid_plural ""
+"[{author}]({author_url}) deleted the [tag]({tag_url}) \"{tag}\" and removed "
+"it from {count} revisions and/or log entries{comment}"
+msgstr[0] ""
+"[{author}]({author_url}) 删除了[标签]({tag_url}) \"{tag}\" 并从 {count} 个修"
+"订版本和/或日志条目中移除该标签{comment}"
+
+#: extensions/base/mediawiki.py:1144
+#, python-brace-format
+msgid "Activated the tag \"{tag}\""
+msgstr "激活了标签 \"{tag}\""
+
+#: extensions/base/mediawiki.py:1153
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) activated the [tag]({tag_url}) \"{tag}\"{comment}"
+msgstr "[{author}]({author_url}) 激活了[标签]({tag_url}) \"{tag}\"{comment}"
+
+#: extensions/base/mediawiki.py:1172
+#, python-brace-format
+msgid "Deactivated the tag \"{tag}\""
+msgstr "取消激活了标签 \"{tag}\""
+
+#: extensions/base/mediawiki.py:1181
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) deactivated the [tag]({tag_url}) \"{tag}\"{comment}"
+msgstr ""
+"[{author}]({author_url}) 取消激活了[标签]({tag_url}) \"{tag}\"{comment}"
+
+#: extensions/base/sprite.py:37
+#, python-brace-format
+msgid "Edited the sprite for {article}"
+msgstr "编辑了 {article} 的 Sprite 图"
+
+#: extensions/base/sprite.py:45
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) edited the sprite for [{article}]({article_url})"
+msgstr ""
+"[{author}]({author_url}) 编辑了 [{article}]({article_url}) 的 Sprite 图"
+
+#: extensions/base/sprite.py:60
+#, python-brace-format
+msgid "Created the sprite sheet for {article}"
+msgstr "创建了 {article} 的 Sprite 表"
+
+#: extensions/base/sprite.py:68
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) created the sprite sheet for [{article}]"
+"({article_url})"
+msgstr ""
+"[{author}]({author_url}) 创建了 [{article}]({article_url}) 的 Sprite 表"
+
+#: extensions/base/sprite.py:79
+#, python-brace-format
+msgid "Edited the slice for {article}"
+msgstr "编辑了 {article} 的 Slice"
+
+#: extensions/base/sprite.py:86
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) edited the slice for [{article}]({article_url})"
+msgstr "[{author}]({author_url}) 编辑了 [{article}]({article_url}) 的 Slice"
+
+#, python-brace-format
+#~ msgid ""
+#~ "{reason}\n"
+#~ "{added}{linebreak}{removed}"
+#~ msgstr ""
+#~ "{reason}\n"
+#~ "{added}{linebreak}{removed}"
+
+#, python-brace-format
+#~ msgid "{value} (avg. {avg})"
+#~ msgstr "{value}(平均 {avg})"
+
+#~ msgid "Daily overview"
+#~ msgstr "每日总览"
+
+#~ msgid "No activity"
+#~ msgstr "无活动"
+
+#~ msgid " ({} action)"
+#~ msgid_plural " ({} actions)"
+#~ msgstr[0] " ({} 项活动)"
+
+#~ msgid " ({} edit)"
+#~ msgid_plural " ({} edits)"
+#~ msgstr[0] " ({} 次编辑)"
+
+#~ msgid " UTC ({} action)"
+#~ msgid_plural " UTC ({} actions)"
+#~ msgstr[0] " UTC({} 项操作)"
+
+#~ msgid "But nobody came"
+#~ msgstr "但是并没有人"
+
+#~ msgid "Most active user"
+#~ msgid_plural "Most active users"
+#~ msgstr[0] "最活跃的用户"
+
+#~ msgid "Most edited article"
+#~ msgid_plural "Most edited articles"
+#~ msgstr[0] "编辑次数最多的文章"
+
+#~ msgid "Edits made"
+#~ msgstr "做出的编辑"
+
+#~ msgid "New files"
+#~ msgstr "新文件"
+
+#~ msgid "Admin actions"
+#~ msgstr "管理员操作"
+
+#~ msgid "Bytes changed"
+#~ msgstr "字节更改"
+
+#~ msgid "New articles"
+#~ msgstr "新文章"
+
+#~ msgid "Unique contributors"
+#~ msgstr "编辑者(去重)"
+
+#~ msgid "Most active hour"
+#~ msgid_plural "Most active hours"
+#~ msgstr[0] "最活跃时段"
+
+#~ msgid "Day score"
+#~ msgstr "每日分数"
+
+#~ msgid "No description provided"
+#~ msgstr "没有提供描述"
+
+#~ msgid "second"
+#~ msgid_plural "seconds"
+#~ msgstr[0] "秒"
+
+#~ msgid "week"
+#~ msgid_plural "weeks"
+#~ msgstr[0] "周"
+
+#~ msgid "month"
+#~ msgid_plural "months"
+#~ msgstr[0] "月"
+
+#~ msgid "millennium"
+#~ msgid_plural "millennia"
+#~ msgstr[0] "千年"
+
+#~ msgid "decade"
+#~ msgid_plural "decades"
+#~ msgstr[0] "十年"
+
+#~ msgid "century"
+#~ msgid_plural "centuries"
+#~ msgstr[0] "世纪"
+
+#, fuzzy, python-brace-format
+#~ msgid ""
+#~ "Unknown event `{event}` by [{author}]({author_url}), report it on the "
+#~ "[support server](<{support}>)."
+#~ msgstr ""
+#~ "#-#-#-#-# discussion_formatters.po (RcGcDw) #-#-#-#-#\n"
+#~ "未知事件 `{event}` 由 [{author}]({author_url}) 发出,请在[支持服务器]"
+#~ "(<{support}>)中报告。\n"
+#~ "#-#-#-#-# rc_formatters.po (RcGcDw) #-#-#-#-#\n"
+#~ "未知事件 `{event}`,作者为 [{author}]({author_url}),请在[支持服务器]"
+#~ "(<{support}>)上报告。"
+
+#, python-brace-format
+#~ msgid "Unknown event `{event}`"
+#~ msgstr "未知事件 `{event}`"
+
+#, fuzzy
+#~ msgid "Report this on the support server"
+#~ msgstr ""
+#~ "#-#-#-#-# discussion_formatters.po (RcGcDw) #-#-#-#-#\n"
+#~ "在支持服务器上报告\n"
+#~ "#-#-#-#-# rc_formatters.po (RcGcDw) #-#-#-#-#\n"
+#~ "在支持服务器上报告此错误"
+
+#, python-brace-format
+#~ msgid "for {num} {translated_length}"
+#~ msgstr "时长为{num}{translated_length}"
+
+#~ msgid "until {}"
+#~ msgstr "直到{}"
+
+#~ msgid "none"
+#~ msgstr "无"
+
+#, python-brace-format
+#~ msgid ""
+#~ "[{author}]({author_url}) completed deletion of translatable page "
+#~ "[{article}]({article_url}){comment}"
+#~ msgstr ""
+#~ "[{author}]({author_url}) 完成了对可翻译页面 [{article}]({article_url}) 的"
+#~ "删除{comment}"
+
+#~ msgid "unknown expiry time"
+#~ msgstr "未知的过期时间"
+
+#, python-brace-format
+#~ msgid "Groups changed from {old_groups} to {new_groups}{reason}"
+#~ msgstr "用户组从 {old_groups} 更改为 {new_groups}{reason}"
+
+#, python-brace-format
+#~ msgid "Completed deletion of translatable page \"{article}\""
+#~ msgstr "已完成删除可翻译页面 \"{article}\""
+
+#, python-brace-format
+#~ msgid "[{author}]({author_url}) restored a wiki *{wiki_name}*{comment}"
+#~ msgstr "[{author}]({author_url}) 恢复了wiki *{wiki_name}* {comment}"
+
+#, python-brace-format
+#~ msgid "Restored a \"{wiki}\" wiki"
+#~ msgstr "还原了wiki \"{wiki}\""
+
+#~ msgid "their own profile"
+#~ msgstr "自己"
+
+#~ msgid "their own"
+#~ msgstr "自己"
+
+#, python-brace-format
+#~ msgid "[{author}]({author_url}) deleted a comment on {target} profile"
+#~ msgstr "[{author}]({author_url}) 在 {target} 的资料页上删除了一条评论"
+
+#, python-brace-format
+#~ msgid "[{target}]({target_url})'s"
+#~ msgstr "[{target}]({target_url})的"
+
+#, python-brace-format
+#~ msgid "[their own]({target_url})"
+#~ msgstr "[Ta自己的]({target_url})"
+
+#~ msgid "Imported interwiki"
+#~ msgstr "导入了跨wiki表"
diff --git a/locale/zh-hans/LC_MESSAGES/misc.po b/locale/zh-hans/LC_MESSAGES/misc.po
index 7b0e507..09da1bd 100644
--- a/locale/zh-hans/LC_MESSAGES/misc.po
+++ b/locale/zh-hans/LC_MESSAGES/misc.po
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: RcGcDw\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2020-11-28 23:45+0100\n"
+"POT-Creation-Date: 2021-07-11 14:32+0200\n"
"PO-Revision-Date: 2020-12-06 14:17+0000\n"
"Last-Translator: lakejason0 \n"
"Language-Team: Chinese (Simplified) \n"
"Language-Team: Chinese (Simplified) \n"
@@ -17,7 +17,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=1; plural=0;\n"
-"X-Generator: Weblate 4.2.1\n"
+"X-Generator: Weblate 4.6\n"
#: src/rc_formatters.py:28
msgid "None"
@@ -565,19 +565,19 @@ msgid "[{author}]({author_url}) replaced the Cargo table \"{table}\""
msgstr "[{author}]({author_url}) 替换了 Cargo 表 \"{table}\""
#: src/rc_formatters.py:436
-#, fuzzy, python-brace-format
+#, python-brace-format
msgid ""
"[{author}]({author_url}) created the [tag]({tag_url}) \"{tag}\"{comment}"
-msgstr "[{author}]({author_url}) 创建了一个[标签]({tag_url}) \"{tag}\""
+msgstr "[{author}]({author_url}) 创建了[标签]({tag_url}) \"{tag}\"{comment}"
#: src/rc_formatters.py:441
-#, fuzzy, python-brace-format
+#, python-brace-format
msgid ""
"[{author}]({author_url}) deleted the [tag]({tag_url}) \"{tag}\"{comment}"
-msgstr "[{author}]({author_url}) 删除了一个[标签]({tag_url}) \"{tag}\""
+msgstr "[{author}]({author_url}) 删除了[标签]({tag_url}) \"{tag}\"{comment}"
#: src/rc_formatters.py:443
-#, fuzzy, python-brace-format
+#, python-brace-format
msgid ""
"[{author}]({author_url}) deleted the [tag]({tag_url}) \"{tag}\" and removed "
"it from {count} revision or log entry{comment}"
@@ -585,20 +585,20 @@ msgid_plural ""
"[{author}]({author_url}) deleted the [tag]({tag_url}) \"{tag}\" and removed "
"it from {count} revisions and/or log entries{comment}"
msgstr[0] ""
-"[{author}]({author_url}) 导入了 [{article}]({article_url}) 的 {count} 个修订"
-"版本{comment}"
+"[{author}]({author_url}) 删除了 [标签]({tag_url}) \"{tag}\" 并将其从 {count} "
+"个修订版本/日志项中移除{comment}"
#: src/rc_formatters.py:449
-#, fuzzy, python-brace-format
+#, python-brace-format
msgid ""
"[{author}]({author_url}) activated the [tag]({tag_url}) \"{tag}\"{comment}"
-msgstr "[{author}]({author_url}) 激活了一个[标签]({tag_url}) \"{tag}\""
+msgstr "[{author}]({author_url}) 激活了[标签]({tag_url}) \"{tag}\"{comment}"
#: src/rc_formatters.py:452
-#, fuzzy, python-brace-format
+#, python-brace-format
msgid ""
"[{author}]({author_url}) deactivated the [tag]({tag_url}) \"{tag}\"{comment}"
-msgstr "[{author}]({author_url}) 取消激活了一个[标签]({tag_url}) \"{tag}\""
+msgstr "[{author}]({author_url}) 取消激活了[标签]({tag_url}) \"{tag}\"{comment}"
#: src/rc_formatters.py:454
#, python-brace-format
@@ -616,13 +616,12 @@ msgid "[{author}]({author_url}) locked a wiki *{wiki_name}*{comment}"
msgstr "[{author}]({author_url}) 锁定了wiki *{wiki_name}* {comment}"
#: src/rc_formatters.py:462
-#, fuzzy, python-brace-format
+#, python-brace-format
msgid ""
"[{author}]({author_url}) modified namespace *{namespace_name}* on "
"*{wiki_name}*{comment}"
msgstr ""
-"[{author}]({author_url}) 修改了命名空间 *{namespace_name}* 于 *{wiki_name}* "
-"{comment}"
+"[{author}]({author_url}) 修改了命名空间 *{namespace_name}* 于 *{wiki_name}*{comment}"
#: src/rc_formatters.py:467
#, python-brace-format
@@ -639,9 +638,9 @@ msgid "[{author}]({author_url}) modified user group *{group_name}*{comment}"
msgstr "[{author}]({author_url}) 修改了用户组 *{group_name}*{comment}"
#: src/rc_formatters.py:477
-#, fuzzy, python-brace-format
+#, python-brace-format
msgid "[{author}]({author_url}) undeleted a wiki *{wiki_name}*{comment}"
-msgstr "[{author}]({author_url}) 删除了wiki *{wiki_name}* {comment}"
+msgstr "[{author}]({author_url}) 删除了wiki *{wiki_name}*{comment}"
#: src/rc_formatters.py:481
#, python-brace-format
@@ -1246,32 +1245,31 @@ msgid "Replaced the Cargo table \"{table}\""
msgstr "替换了 Cargo 表 \"{table}\""
#: src/rc_formatters.py:1121
-#, fuzzy, python-brace-format
+#, python-brace-format
msgid "Created the tag \"{tag}\""
msgstr "创建了标签 \"{tag}\""
#: src/rc_formatters.py:1125
-#, fuzzy, python-brace-format
+#, python-brace-format
msgid "Deleted the tag \"{tag}\""
msgstr "删除了标签 \"{tag}\""
#: src/rc_formatters.py:1127
-#, fuzzy
msgid "Removed from"
-msgstr "移除了"
+msgstr "移除范围"
#: src/rc_formatters.py:1127
msgid "{} revision or log entry"
msgid_plural "{} revisions and/or log entries"
-msgstr[0] ""
+msgstr[0] "{} 个修订版本/日志项"
#: src/rc_formatters.py:1131
-#, fuzzy, python-brace-format
+#, python-brace-format
msgid "Activated the tag \"{tag}\""
msgstr "激活了标签 \"{tag}\""
#: src/rc_formatters.py:1134
-#, fuzzy, python-brace-format
+#, python-brace-format
msgid "Deactivated the tag \"{tag}\""
msgstr "取消激活了标签 \"{tag}\""
@@ -1290,7 +1288,7 @@ msgid "Locked a \"{wiki}\" wiki"
msgstr "锁定了wiki \"{wiki}\""
#: src/rc_formatters.py:1147
-#, fuzzy, python-brace-format
+#, python-brace-format
msgid "Modified \"{namespace_name}\" namespace"
msgstr "修改了命名空间 \"{namespace_name}\""
@@ -1309,9 +1307,9 @@ msgid "Modified \"{usergroup_name}\" usergroup"
msgstr "修改了用户组 \"{usergroup_name}\""
#: src/rc_formatters.py:1160
-#, fuzzy, python-brace-format
+#, python-brace-format
msgid "Undeleted a \"{wiki}\" wiki"
-msgstr "删除了wiki \"{wiki}\""
+msgstr "取消删除了wiki \"{wiki}\""
#: src/rc_formatters.py:1163
#, python-brace-format
diff --git a/locale/zh-hans/LC_MESSAGES/rcgcdw.mo b/locale/zh-hans/LC_MESSAGES/rcgcdw.mo
index 2bdec79..ee0972a 100644
Binary files a/locale/zh-hans/LC_MESSAGES/rcgcdw.mo and b/locale/zh-hans/LC_MESSAGES/rcgcdw.mo differ
diff --git a/locale/zh-hans/LC_MESSAGES/rcgcdw.po b/locale/zh-hans/LC_MESSAGES/rcgcdw.po
index 9383175..9c25aed 100644
--- a/locale/zh-hans/LC_MESSAGES/rcgcdw.po
+++ b/locale/zh-hans/LC_MESSAGES/rcgcdw.po
@@ -7,8 +7,8 @@ msgid ""
msgstr ""
"Project-Id-Version: RcGcDw\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2020-12-23 00:28+0100\n"
-"PO-Revision-Date: 2020-12-22 00:13+0000\n"
+"POT-Creation-Date: 2021-07-11 14:32+0200\n"
+"PO-Revision-Date: 2021-05-21 18:18+0000\n"
"Last-Translator: lakejason0 \n"
"Language-Team: Chinese (Simplified) \n"
@@ -17,170 +17,161 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=1; plural=0;\n"
-"X-Generator: Weblate 4.2.1\n"
+"X-Generator: Weblate 4.6\n"
-#: src/rcgcdw.py:115 src/rcgcdw.py:117 src/rcgcdw.py:119 src/rcgcdw.py:121
-#: src/rcgcdw.py:123 src/rcgcdw.py:125 src/rcgcdw.py:127
+#: src/rcgcdw.py:117
#, python-brace-format
msgid "{value} (avg. {avg})"
msgstr "{value}(平均 {avg})"
-#: src/rcgcdw.py:147
+#: src/rcgcdw.py:136
msgid "Daily overview"
msgstr "每日总览"
-#: src/rcgcdw.py:154
+#: src/rcgcdw.py:143
msgid "No activity"
msgstr "无活动"
-#: src/rcgcdw.py:178
+#: src/rcgcdw.py:167
msgid " ({} action)"
msgid_plural " ({} actions)"
msgstr[0] " ({} 项活动)"
-#: src/rcgcdw.py:180
+#: src/rcgcdw.py:169
msgid " ({} edit)"
msgid_plural " ({} edits)"
msgstr[0] " ({} 次编辑)"
-#: src/rcgcdw.py:185
+#: src/rcgcdw.py:174
msgid " UTC ({} action)"
msgid_plural " UTC ({} actions)"
msgstr[0] " UTC({} 项操作)"
-#: src/rcgcdw.py:187 src/rcgcdw.py:188 src/rcgcdw.py:192
+#: src/rcgcdw.py:176 src/rcgcdw.py:179
msgid "But nobody came"
msgstr "但是并没有人"
-#: src/rcgcdw.py:195
+#: src/rcgcdw.py:183
msgid "Most active user"
msgid_plural "Most active users"
msgstr[0] "最活跃的用户"
-#: src/rcgcdw.py:196
+#: src/rcgcdw.py:184
msgid "Most edited article"
msgid_plural "Most edited articles"
msgstr[0] "编辑次数最多的文章"
-#: src/rcgcdw.py:197
+#: src/rcgcdw.py:185
msgid "Edits made"
msgstr "做出的编辑"
-#: src/rcgcdw.py:197
+#: src/rcgcdw.py:185
msgid "New files"
msgstr "新文件"
-#: src/rcgcdw.py:197
+#: src/rcgcdw.py:186
msgid "Admin actions"
msgstr "管理员操作"
-#: src/rcgcdw.py:198
+#: src/rcgcdw.py:186
msgid "Bytes changed"
msgstr "字节更改"
-#: src/rcgcdw.py:198
+#: src/rcgcdw.py:187
msgid "New articles"
msgstr "新文章"
-#: src/rcgcdw.py:199
+#: src/rcgcdw.py:187
msgid "Unique contributors"
msgstr "编辑者(去重)"
-#: src/rcgcdw.py:200
+#: src/rcgcdw.py:188
msgid "Most active hour"
msgid_plural "Most active hours"
msgstr[0] "最活跃时段"
-#: src/rcgcdw.py:201
+#: src/rcgcdw.py:189
msgid "Day score"
msgstr "每日分数"
-#: src/rcgcdw.py:243
-msgid "director"
-msgstr "向导"
+#: src/rcgcdw.py:223
+msgid "~~hidden~~"
+msgstr "~~隐藏~~"
-#: src/rcgcdw.py:243
-msgid "bot"
-msgstr "机器人"
+#: src/rcgcdw.py:225
+msgid "No description provided"
+msgstr "没有提供描述"
-#: src/rcgcdw.py:243
-msgid "editor"
-msgstr "编者"
+#: src/rcgcdw.py:228
+msgid "hidden"
+msgstr "隐藏"
-#: src/rcgcdw.py:243
-msgid "directors"
-msgstr "向导"
+#~ msgid "director"
+#~ msgstr "向导"
-#: src/rcgcdw.py:243
-msgid "sysop"
-msgstr "管理员"
+#~ msgid "bot"
+#~ msgstr "机器人"
-#: src/rcgcdw.py:243
-msgid "bureaucrat"
-msgstr "行政员"
+#~ msgid "editor"
+#~ msgstr "编者"
-#: src/rcgcdw.py:243
-msgid "reviewer"
-msgstr "复核员"
+#~ msgid "directors"
+#~ msgstr "向导"
-#: src/rcgcdw.py:244
-msgid "autoreview"
-msgstr "自动复核用户"
+#~ msgid "sysop"
+#~ msgstr "管理员"
-#: src/rcgcdw.py:244
-msgid "autopatrol"
-msgstr "巡查豁免者"
+#~ msgid "bureaucrat"
+#~ msgstr "行政员"
-#: src/rcgcdw.py:244
-msgid "wiki_guardian"
-msgstr "Wiki守卫"
+#~ msgid "reviewer"
+#~ msgstr "复核员"
-#: src/rcgcdw.py:244
-msgid "second"
-msgid_plural "seconds"
-msgstr[0] "秒"
+#~ msgid "autoreview"
+#~ msgstr "自动复核用户"
-#: src/rcgcdw.py:244
-msgid "minute"
-msgid_plural "minutes"
-msgstr[0] "分"
+#~ msgid "autopatrol"
+#~ msgstr "巡查豁免者"
-#: src/rcgcdw.py:244
-msgid "hour"
-msgid_plural "hours"
-msgstr[0] "时"
+#~ msgid "wiki_guardian"
+#~ msgstr "Wiki守卫"
-#: src/rcgcdw.py:244
-msgid "day"
-msgid_plural "days"
-msgstr[0] "天"
+#~ msgid "second"
+#~ msgid_plural "seconds"
+#~ msgstr[0] "秒"
-#: src/rcgcdw.py:244
-msgid "week"
-msgid_plural "weeks"
-msgstr[0] "周"
+#~ msgid "minute"
+#~ msgid_plural "minutes"
+#~ msgstr[0] "分"
-#: src/rcgcdw.py:244
-msgid "month"
-msgid_plural "months"
-msgstr[0] "月"
+#~ msgid "hour"
+#~ msgid_plural "hours"
+#~ msgstr[0] "时"
-#: src/rcgcdw.py:244
-msgid "year"
-msgid_plural "years"
-msgstr[0] "年"
+#~ msgid "day"
+#~ msgid_plural "days"
+#~ msgstr[0] "天"
-#: src/rcgcdw.py:244
-msgid "millennium"
-msgid_plural "millennia"
-msgstr[0] "千年"
+#~ msgid "week"
+#~ msgid_plural "weeks"
+#~ msgstr[0] "周"
-#: src/rcgcdw.py:244
-msgid "decade"
-msgid_plural "decades"
-msgstr[0] "十年"
+#~ msgid "month"
+#~ msgid_plural "months"
+#~ msgstr[0] "月"
-#: src/rcgcdw.py:244
-msgid "century"
-msgid_plural "centuries"
-msgstr[0] "世纪"
+#~ msgid "year"
+#~ msgid_plural "years"
+#~ msgstr[0] "年"
+
+#~ msgid "millennium"
+#~ msgid_plural "millennia"
+#~ msgstr[0] "千年"
+
+#~ msgid "decade"
+#~ msgid_plural "decades"
+#~ msgstr[0] "十年"
+
+#~ msgid "century"
+#~ msgid_plural "centuries"
+#~ msgstr[0] "世纪"
diff --git a/locale/zh-hans/LC_MESSAGES/redaction.mo b/locale/zh-hans/LC_MESSAGES/redaction.mo
index 0ff0ab9..814888b 100644
Binary files a/locale/zh-hans/LC_MESSAGES/redaction.mo and b/locale/zh-hans/LC_MESSAGES/redaction.mo differ
diff --git a/locale/zh-hans/LC_MESSAGES/redaction.po b/locale/zh-hans/LC_MESSAGES/redaction.po
index 346cfcf..ba4b0fe 100644
--- a/locale/zh-hans/LC_MESSAGES/redaction.po
+++ b/locale/zh-hans/LC_MESSAGES/redaction.po
@@ -7,8 +7,8 @@ msgid ""
msgstr ""
"Project-Id-Version: RcGcDw\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2020-12-23 00:28+0100\n"
-"PO-Revision-Date: 2020-12-13 14:30+0000\n"
+"POT-Creation-Date: 2021-07-11 14:32+0200\n"
+"PO-Revision-Date: 2021-07-30 10:44+0000\n"
"Last-Translator: lakejason0 \n"
"Language-Team: Chinese (Simplified) \n"
@@ -17,9 +17,15 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=1; plural=0;\n"
-"X-Generator: Weblate 4.2.1\n"
+"X-Generator: Weblate 4.6.2\n"
-#: src/discord/redaction.py:62 src/discord/redaction.py:65
-#: src/discord/redaction.py:70
-msgid "Removed"
-msgstr "移除了"
+#: src/discord/redaction.py:77
+msgid "hidden"
+msgstr "已隐藏"
+
+#: src/discord/redaction.py:80 src/discord/redaction.py:85
+msgid "~~hidden~~"
+msgstr "~~已隐藏~~"
+
+#~ msgid "Removed"
+#~ msgstr "移除了"
diff --git a/locale/zh-hant/LC_MESSAGES/discussion_formatters.mo b/locale/zh-hant/LC_MESSAGES/discussion_formatters.mo
deleted file mode 100644
index f7a2c1b..0000000
Binary files a/locale/zh-hant/LC_MESSAGES/discussion_formatters.mo and /dev/null differ
diff --git a/locale/zh-hant/LC_MESSAGES/discussion_formatters.po b/locale/zh-hant/LC_MESSAGES/discussion_formatters.po
deleted file mode 100644
index 13ccd7f..0000000
--- a/locale/zh-hant/LC_MESSAGES/discussion_formatters.po
+++ /dev/null
@@ -1,160 +0,0 @@
-# SOME DESCRIPTIVE TITLE.
-# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
-# This file is distributed under the same license as the RcGcDw package.
-# FIRST AUTHOR , YEAR.
-#
-msgid ""
-msgstr ""
-"Project-Id-Version: RcGcDw\n"
-"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2020-12-23 00:28+0100\n"
-"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
-"Last-Translator: Automatically generated\n"
-"Language-Team: none\n"
-"Language: zh_Hant\n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=UTF-8\n"
-"Content-Transfer-Encoding: 8bit\n"
-
-#: src/discussion_formatters.py:21 src/discussion_formatters.py:56
-#: src/discussion_formatters.py:67 src/discussion_formatters.py:95
-#: src/discussion_formatters.py:163 src/discussion_formatters.py:176
-msgid "unknown"
-msgstr ""
-
-#: src/discussion_formatters.py:27 src/discussion_formatters.py:102
-msgid "Unregistered user"
-msgstr ""
-
-#: src/discussion_formatters.py:39
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) created [{title}](<{url}f/p/{threadId}>) in "
-"{forumName}"
-msgstr ""
-
-#: src/discussion_formatters.py:42
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) created a poll [{title}](<{url}f/p/{threadId}>) in "
-"{forumName}"
-msgstr ""
-
-#: src/discussion_formatters.py:45
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) created a quiz [{title}](<{url}f/p/{threadId}>) in "
-"{forumName}"
-msgstr ""
-
-#: src/discussion_formatters.py:54
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) created a [reply](<{url}f/p/{threadId}/r/{postId}>) "
-"to [{title}](<{url}f/p/{threadId}>) in {forumName}"
-msgstr ""
-
-#: src/discussion_formatters.py:61
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) created [{title}](<{url}wiki/Message_Wall:"
-"{user_wall}?threadId={threadId}>) on [{user}'s Message Wall](<{url}wiki/"
-"Message_Wall:{user_wall}>)"
-msgstr ""
-
-#: src/discussion_formatters.py:64
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) created a [reply](<{url}wiki/Message_Wall:"
-"{user_wall}?threadId={threadId}#{replyId}>) to [{title}](<{url}wiki/"
-"Message_Wall:{user_wall}?threadId={threadId}>) on [{user}'s Message Wall]"
-"(<{url}wiki/Message_Wall:{user_wall}>)"
-msgstr ""
-
-#: src/discussion_formatters.py:72
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) created a [comment](<{url}?commentId={commentId}>) "
-"on [{article}](<{url}>)"
-msgstr ""
-
-#: src/discussion_formatters.py:78
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) created a [reply](<{url}?commentId={commentId}"
-"&replyId={replyId}>) to a [comment](<{url}?commentId={commentId}>) on "
-"[{article}](<{url}>)"
-msgstr ""
-
-#: src/discussion_formatters.py:86
-#, python-brace-format
-msgid ""
-"Unknown event `{event}` by [{author}]({author_url}), report it on the "
-"[support server](<{support}>)."
-msgstr ""
-
-#: src/discussion_formatters.py:123
-#, python-brace-format
-msgid "Created \"{title}\""
-msgstr ""
-
-#: src/discussion_formatters.py:127
-#, python-brace-format
-msgid "Created a poll \"{title}\""
-msgstr ""
-
-#: src/discussion_formatters.py:134
-msgid "Option {}"
-msgstr ""
-
-#: src/discussion_formatters.py:135
-#, python-brace-format
-msgid "__[View image]({image_url})__"
-msgstr ""
-
-#: src/discussion_formatters.py:139
-#, python-brace-format
-msgid "Created a quiz \"{title}\""
-msgstr ""
-
-#: src/discussion_formatters.py:155 src/discussion_formatters.py:157
-msgid "Tags"
-msgstr ""
-
-#: src/discussion_formatters.py:155
-msgid "{} tags"
-msgstr ""
-
-#: src/discussion_formatters.py:160
-#, python-brace-format
-msgid "Replied to \"{title}\""
-msgstr ""
-
-#: src/discussion_formatters.py:169
-#, python-brace-format
-msgid "Created \"{title}\" on {user}'s Message Wall"
-msgstr ""
-
-#: src/discussion_formatters.py:173
-#, python-brace-format
-msgid "Replied to \"{title}\" on {user}'s Message Wall"
-msgstr ""
-
-#: src/discussion_formatters.py:180
-#, python-brace-format
-msgid "Commented on {article}"
-msgstr ""
-
-#: src/discussion_formatters.py:184
-#, python-brace-format
-msgid "Replied to a comment on {article}"
-msgstr ""
-
-#: src/discussion_formatters.py:188
-#, python-brace-format
-msgid "Unknown event `{event}`"
-msgstr ""
-
-#: src/discussion_formatters.py:194 src/discussion_formatters.py:196
-msgid "Report this on the support server"
-msgstr ""
diff --git a/locale/zh-hant/LC_MESSAGES/formatters.po b/locale/zh-hant/LC_MESSAGES/formatters.po
new file mode 100644
index 0000000..87252d8
--- /dev/null
+++ b/locale/zh-hant/LC_MESSAGES/formatters.po
@@ -0,0 +1,1715 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the RcGcDw package.
+# FIRST AUTHOR , YEAR.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: RcGcDw\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2021-07-11 14:32+0200\n"
+"PO-Revision-Date: 2021-04-14 14:22+0000\n"
+"Last-Translator: Winston Sung \n"
+"Language-Team: Chinese (Traditional) \n"
+"Language: zh-hant\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"#-#-#-#-# rcgcdw.po (RcGcDw) #-#-#-#-#\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+"X-Generator: Weblate 4.2.1\n"
+"#-#-#-#-# formatters.po (RcGcDw) #-#-#-#-#\n"
+"#-#-#-#-# discussion_formatters.po (RcGcDw) #-#-#-#-#\n"
+"#-#-#-#-# rc_formatters.po (RcGcDw) #-#-#-#-#\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+"X-Generator: Weblate 4.4.2\n"
+
+#: src/api/util.py:61 src/api/util.py:66
+msgid "__Only whitespace__"
+msgstr ""
+
+#: src/api/util.py:71
+msgid "Removed"
+msgstr ""
+
+#: src/api/util.py:73
+msgid "Added"
+msgstr ""
+
+#: src/api/util.py:94 src/api/util.py:126 src/api/util.py:133
+#: src/api/util.py:141 extensions/base/discussions.py:247
+#: extensions/base/discussions.py:264 extensions/base/abusefilter.py:45
+msgid "Unregistered user"
+msgstr "未註冊使用者"
+
+#: src/api/util.py:160
+msgctxt "recent changes Tags"
+msgid "Tags"
+msgstr ""
+
+#: src/api/util.py:162
+msgid "**Added**: "
+msgstr ""
+
+#: src/api/util.py:163
+msgid " and {} more\n"
+msgstr ""
+
+#: src/api/util.py:165
+msgid "**Removed**: "
+msgstr ""
+
+#: src/api/util.py:166
+msgid " and {} more"
+msgstr ""
+
+#: src/api/util.py:168
+msgid "Changed categories"
+msgstr ""
+
+#: extensions/base/cargo.py:37
+#, python-brace-format
+msgid "Created the Cargo table \"{table}\""
+msgstr ""
+
+#: extensions/base/cargo.py:45
+#, python-brace-format
+msgid "[{author}]({author_url}) created the Cargo table \"{table}\""
+msgstr ""
+
+#: extensions/base/cargo.py:60
+#, python-brace-format
+msgid "Recreated the Cargo table \"{table}\""
+msgstr ""
+
+#: extensions/base/cargo.py:68
+#, python-brace-format
+msgid "[{author}]({author_url}) recreated the Cargo table \"{table}\""
+msgstr ""
+
+#: extensions/base/cargo.py:83
+#, python-brace-format
+msgid "Replaced the Cargo table \"{table}\""
+msgstr ""
+
+#: extensions/base/cargo.py:91
+#, python-brace-format
+msgid "[{author}]({author_url}) replaced the Cargo table \"{table}\""
+msgstr ""
+
+#: extensions/base/cargo.py:105
+#, python-brace-format
+msgid "Deleted the Cargo table \"{table}\""
+msgstr ""
+
+#: extensions/base/cargo.py:112
+#, python-brace-format
+msgid "[{author}]({author_url}) deleted the Cargo table \"{table}\""
+msgstr ""
+
+#: extensions/base/translate.py:41
+#, python-brace-format
+msgid "Marked \"{article}\" for translation"
+msgstr ""
+
+#: extensions/base/translate.py:55
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) marked [{article}]({article_url}) for "
+"translation{comment}"
+msgstr ""
+
+#: extensions/base/translate.py:70
+#, python-brace-format
+msgid "Removed \"{article}\" from the translation system"
+msgstr ""
+
+#: extensions/base/translate.py:80
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) removed [{article}]({article_url}) from the "
+"translation system{comment}"
+msgstr ""
+
+#: extensions/base/translate.py:95
+#, python-brace-format
+msgid "Completed moving translation pages from \"{article}\" to \"{target}\""
+msgstr ""
+
+#: extensions/base/translate.py:106
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) completed moving translation pages from *{article}* "
+"to [{target}]({target_url}){comment}"
+msgstr ""
+
+#: extensions/base/translate.py:121
+#, python-brace-format
+msgid "Encountered a problem while moving \"{article}\" to \"{target}\""
+msgstr ""
+
+#: extensions/base/translate.py:133
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) encountered a problem while moving [{article}]"
+"({article_url}) to [{target}]({target_url}){comment}"
+msgstr ""
+
+#: extensions/base/translate.py:149
+#, python-brace-format
+msgid ""
+"Failed to delete \"{article}\" which belongs to translatable page "
+"\"{target}\""
+msgstr ""
+
+#: extensions/base/translate.py:161
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) failed to delete [{article}]({article_url}) which "
+"belongs to translatable page [{target}]({target_url}){comment}"
+msgstr ""
+
+#: extensions/base/translate.py:177
+#, python-brace-format
+msgid "Completed deletion of translation page \"{article}\""
+msgstr ""
+
+#: extensions/base/translate.py:188
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) completed deletion of translation page [{article}]"
+"({article_url}){comment}"
+msgstr ""
+
+#: extensions/base/translate.py:203
+#, python-brace-format
+msgid ""
+"Failed to delete \"{article}\" which belongs to translation page \"{target}\""
+msgstr ""
+
+#: extensions/base/translate.py:215
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) failed to delete [{article}]({article_url}) which "
+"belongs to translation page [{target}]({target_url}){comment}"
+msgstr ""
+
+#: extensions/base/translate.py:231
+#, python-brace-format
+msgid "Encouraged translation of \"{article}\""
+msgstr ""
+
+#: extensions/base/translate.py:240
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) encouraged translation of [{article}]({article_url})"
+"{comment}"
+msgstr ""
+
+#: extensions/base/translate.py:255
+#, python-brace-format
+msgid "Discouraged translation of \"{article}\""
+msgstr ""
+
+#: extensions/base/translate.py:264
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) discouraged translation of [{article}]"
+"({article_url}){comment}"
+msgstr ""
+
+#: extensions/base/translate.py:282
+#, python-brace-format
+msgid "Limited languages for \"{article}\" to `{languages}`"
+msgstr ""
+
+#: extensions/base/translate.py:285
+#, python-brace-format
+msgid "Priority languages for \"{article}\" set to `{languages}`"
+msgstr ""
+
+#: extensions/base/translate.py:288
+#, python-brace-format
+msgid "Removed priority languages from \"{article}\""
+msgstr ""
+
+#: extensions/base/translate.py:301
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) limited languages for [{article}]({article_url}) to "
+"`{languages}`{comment}"
+msgstr ""
+
+#: extensions/base/translate.py:308
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) set the priority languages for [{article}]"
+"({article_url}) to `{languages}`{comment}"
+msgstr ""
+
+#: extensions/base/translate.py:315
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) removed priority languages from [{article}]"
+"({article_url}){comment}"
+msgstr ""
+
+#: extensions/base/translate.py:331
+#, python-brace-format
+msgid "Added translatable page \"{article}\" to aggregate group \"{group}\""
+msgstr ""
+
+#: extensions/base/translate.py:342
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) added translatable page [{article}]({article_url}) "
+"to aggregate group \"{group}\"{comment}"
+msgstr ""
+
+#: extensions/base/translate.py:357
+#, python-brace-format
+msgid ""
+"Removed translatable page \"{article}\" from aggregate group \"{group}\""
+msgstr ""
+
+#: extensions/base/translate.py:368
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) removed translatable page [{article}]"
+"({article_url}) from aggregate group \"{group}\"{comment}"
+msgstr ""
+
+#: extensions/base/translate.py:387
+#, python-brace-format
+msgid "Reviewed translation \"{article}\""
+msgstr ""
+
+#: extensions/base/translate.py:401
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) reviewed translation [{article}]({article_url})"
+"{comment}"
+msgstr ""
+
+#: extensions/base/translate.py:416
+#, python-brace-format
+msgid "Changed the state of `{language}` translations of \"{article}\""
+msgstr ""
+
+#: extensions/base/translate.py:419
+msgid "Old state"
+msgstr ""
+
+#: extensions/base/translate.py:420
+msgid "New state"
+msgstr ""
+
+#: extensions/base/translate.py:431
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) changed the state of `{language}` translations of "
+"[{article}]({article_url}) from `{old_state}` to `{new_state}`{comment}"
+msgstr ""
+
+#: extensions/base/translate.py:439
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) changed the state of `{language}` translations of "
+"[{article}]({article_url}) to `{new_state}`{comment}"
+msgstr ""
+
+#: extensions/base/translate.py:452 extensions/base/translate.py:455
+msgid "(default)"
+msgstr ""
+
+#: extensions/base/translate.py:464
+#, python-brace-format
+msgid "Changed the language of \"{article}\""
+msgstr ""
+
+#: extensions/base/translate.py:465
+msgid "Old language"
+msgstr ""
+
+#: extensions/base/translate.py:466
+msgid "New language"
+msgstr ""
+
+#: extensions/base/translate.py:477
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) changed the language of [{article}]({article_url}) "
+"from {old_lang} to {new_lang}{comment}"
+msgstr ""
+
+#: extensions/base/discussions.py:148 extensions/base/discussions.py:207
+#: extensions/base/discussions.py:245 extensions/base/discussions.py:261
+#: extensions/base/discussions.py:284 extensions/base/discussions.py:306
+#: extensions/base/discussions.py:334 extensions/base/discussions.py:354
+msgid "unknown"
+msgstr ""
+
+#: extensions/base/discussions.py:157
+#, python-brace-format
+msgid "Created \"{title}\""
+msgstr ""
+
+#: extensions/base/discussions.py:161
+#, python-brace-format
+msgid "Created a poll \"{title}\""
+msgstr ""
+
+#: extensions/base/discussions.py:168
+msgid "Option {}"
+msgstr ""
+
+#: extensions/base/discussions.py:170
+#, python-brace-format
+msgid "__[View image]({image_url})__"
+msgstr ""
+
+#: extensions/base/discussions.py:174
+#, python-brace-format
+msgid "Created a quiz \"{title}\""
+msgstr ""
+
+#: extensions/base/discussions.py:193 extensions/base/discussions.py:195
+msgctxt "Fandom discussions Tags/Forums"
+msgid "Tags"
+msgstr ""
+
+#: extensions/base/discussions.py:193
+msgctxt "Fandom discussions amount of Tags/Forums"
+msgid "{} tags"
+msgstr ""
+
+#: extensions/base/discussions.py:198
+#, python-brace-format
+msgid "Replied to \"{title}\""
+msgstr ""
+
+#: extensions/base/discussions.py:214
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) created [{title}](<{url}f/p/{threadId}>) in "
+"{forumName}"
+msgstr ""
+
+#: extensions/base/discussions.py:217
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) created a poll [{title}](<{url}f/p/{threadId}>) in "
+"{forumName}"
+msgstr ""
+
+#: extensions/base/discussions.py:220
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) created a quiz [{title}](<{url}f/p/{threadId}>) in "
+"{forumName}"
+msgstr ""
+
+#: extensions/base/discussions.py:234
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) created a [reply](<{url}f/p/{threadId}/r/{postId}>) "
+"to [{title}](<{url}f/p/{threadId}>) in {forumName}"
+msgstr ""
+
+#: extensions/base/discussions.py:292
+#, python-brace-format
+msgid "Created \"{title}\" on {user}'s Message Wall"
+msgstr ""
+
+#: extensions/base/discussions.py:298
+#, python-brace-format
+msgid "Replied to \"{title}\" on {user}'s Message Wall"
+msgstr ""
+
+#: extensions/base/discussions.py:312
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) created [{title}](<{url}wiki/Message_Wall:"
+"{user_wall}?threadId={threadId}>) on [{user}'s Message Wall](<{url}wiki/"
+"Message_Wall:{user_wall}>)"
+msgstr ""
+
+#: extensions/base/discussions.py:318
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) created a [reply](<{url}wiki/Message_Wall:"
+"{user_wall}?threadId={threadId}#{replyId}>) to [{title}](<{url}wiki/"
+"Message_Wall:{user_wall}?threadId={threadId}>) on [{user}'s Message Wall]"
+"(<{url}wiki/Message_Wall:{user_wall}>)"
+msgstr ""
+
+#: extensions/base/discussions.py:338
+#, python-brace-format
+msgid "Commented on {article}"
+msgstr ""
+
+#: extensions/base/discussions.py:344
+#, python-brace-format
+msgid "Replied to a comment on {article}"
+msgstr ""
+
+#: extensions/base/discussions.py:359
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) created a [comment](<{url}?commentId={commentId}>) "
+"on [{article}](<{url}>)"
+msgstr ""
+
+#: extensions/base/discussions.py:365
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) created a [reply](<{url}?commentId={commentId}"
+"&replyId={replyId}>) to a [comment](<{url}?commentId={commentId}>) on "
+"[{article}](<{url}>)"
+msgstr ""
+
+#: extensions/base/managewiki.py:34
+msgid "Changed wiki settings"
+msgstr ""
+
+#: extensions/base/managewiki.py:44
+#, python-brace-format
+msgid "[{author}]({author_url}) changed wiki settings{reason}"
+msgstr ""
+
+#: extensions/base/managewiki.py:55
+#, python-brace-format
+msgid "Deleted a \"{wiki}\" wiki"
+msgstr ""
+
+#: extensions/base/managewiki.py:55 extensions/base/managewiki.py:67
+#: extensions/base/managewiki.py:103 extensions/base/managewiki.py:112
+#: extensions/base/managewiki.py:125 extensions/base/managewiki.py:126
+#: extensions/base/managewiki.py:135 extensions/base/managewiki.py:136
+#: extensions/base/managewiki.py:148 extensions/base/managewiki.py:149
+#: extensions/base/managewiki.py:160 extensions/base/managewiki.py:161
+#: extensions/base/managewiki.py:195 extensions/base/managewiki.py:204
+#: extensions/base/managewiki.py:217 extensions/base/managewiki.py:226
+#: extensions/base/abusefilter.py:55 extensions/base/abusefilter.py:56
+#: extensions/base/abusefilter.py:57 extensions/base/abusefilter.py:68
+#: extensions/base/abusefilter.py:69 extensions/base/abusefilter.py:70
+#: extensions/base/mediawiki.py:743
+msgid "Unknown"
+msgstr "未知"
+
+#: extensions/base/managewiki.py:63
+#, python-brace-format
+msgid "[{author}]({author_url}) deleted a wiki *{wiki_name}*{comment}"
+msgstr ""
+
+#: extensions/base/managewiki.py:80
+#, python-brace-format
+msgid "Deleted a \"{group}\" user group"
+msgstr ""
+
+#: extensions/base/managewiki.py:89
+#, fuzzy, python-brace-format
+msgid "[{author}]({author_url}) deleted a usergroup *{group}*{comment}"
+msgstr "[{author}]({author_url}) 刪除了 [{page}]({page_link}) {comment}"
+
+#: extensions/base/managewiki.py:103
+#, python-brace-format
+msgid "Locked a \"{wiki}\" wiki"
+msgstr ""
+
+#: extensions/base/managewiki.py:111
+#, python-brace-format
+msgid "[{author}]({author_url}) locked a wiki *{wiki_name}*{comment}"
+msgstr ""
+
+#: extensions/base/managewiki.py:124
+#, python-brace-format
+msgid "Modified \"{namespace_name}\" namespace"
+msgstr ""
+
+#: extensions/base/managewiki.py:126 extensions/base/managewiki.py:149
+msgid "Wiki"
+msgstr ""
+
+#: extensions/base/managewiki.py:134
+#, fuzzy, python-brace-format
+msgid ""
+"[{author}]({author_url}) modified namespace *{namespace_name}* on "
+"*{wiki_name}*{comment}"
+msgstr "[{author}]({author_url}) 刪除了 [{page}]({page_link}) {comment}"
+
+#: extensions/base/managewiki.py:147
+#, python-brace-format
+msgid "Deleted a \"{namespace_name}\" namespace"
+msgstr ""
+
+#: extensions/base/managewiki.py:158
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) deleted a namespace *{namespace_name}* on "
+"*{wiki_name}*{comment}"
+msgstr ""
+
+#: extensions/base/managewiki.py:173
+#, python-brace-format
+msgid "Modified \"{usergroup_name}\" usergroup"
+msgstr ""
+
+#: extensions/base/managewiki.py:182
+#, python-brace-format
+msgid "[{author}]({author_url}) modified user group *{group_name}*{comment}"
+msgstr ""
+
+#: extensions/base/managewiki.py:195
+#, python-brace-format
+msgid "Undeleted a \"{wiki}\" wiki"
+msgstr ""
+
+#: extensions/base/managewiki.py:203
+#, fuzzy, python-brace-format
+msgid "[{author}]({author_url}) undeleted a wiki *{wiki_name}*{comment}"
+msgstr "[{author}]({author_url}) 刪除了 [{page}]({page_link}) {comment}"
+
+#: extensions/base/managewiki.py:217
+#, python-brace-format
+msgid "Unlocked a \"{wiki}\" wiki"
+msgstr ""
+
+#: extensions/base/managewiki.py:225
+#, python-brace-format
+msgid "[{author}]({author_url}) unlocked a wiki *{wiki_name}*{comment}"
+msgstr ""
+
+#: extensions/base/datadump.py:36
+#, python-brace-format
+msgid "Generated {file} dump"
+msgstr ""
+
+#: extensions/base/datadump.py:45
+#, python-brace-format
+msgid "[{author}]({author_url}) generated *{file}* dump{comment}"
+msgstr ""
+
+#: extensions/base/datadump.py:58
+#, python-brace-format
+msgid "Deleted {file} dump"
+msgstr ""
+
+#: extensions/base/datadump.py:67
+#, python-brace-format
+msgid "[{author}]({author_url}) deleted *{file}* dump{comment}"
+msgstr ""
+
+#: extensions/base/curseprofile.py:40
+#, python-brace-format
+msgid "Edited {target}'s profile"
+msgstr ""
+
+#: extensions/base/curseprofile.py:42
+msgid "Edited their own profile"
+msgstr ""
+
+#: extensions/base/curseprofile.py:44
+#, python-brace-format
+msgid "Cleared the {field} field"
+msgstr ""
+
+#: extensions/base/curseprofile.py:46
+#, python-brace-format
+msgid "{field} field changed to: {desc}"
+msgstr ""
+
+#: extensions/base/curseprofile.py:58
+#, fuzzy, python-brace-format
+msgid ""
+"[{author}]({author_url}) cleared the {field} on [{target}]({target_url})'s "
+"profile."
+msgstr "[{author}]({author_url}) 刪除了 [{page}]({page_link}) {comment}"
+
+#: extensions/base/curseprofile.py:60
+#, fuzzy, python-brace-format
+msgid ""
+"[{author}]({author_url}) edited the {field} on [{target}]({target_url})'s "
+"profile. *({desc})*"
+msgstr ""
+"[{author}]({author_url}) 已將 {redirect}*{article}* 移動至 [{target}]"
+"({target_url}) {made_a_redirect} {comment}"
+
+#: extensions/base/curseprofile.py:65
+#, fuzzy, python-brace-format
+msgid ""
+"[{author}]({author_url}) cleared the {field} on [their own]({target_url}) "
+"profile."
+msgstr "[{author}]({author_url}) 刪除了 [{page}]({page_link}) {comment}"
+
+#: extensions/base/curseprofile.py:67
+#, fuzzy, python-brace-format
+msgid ""
+"[{author}]({author_url}) edited the {field} on [their own]({target_url}) "
+"profile. *({desc})*"
+msgstr "[{author}]({author_url}) 刪除了 [{page}]({page_link}) {comment}"
+
+#: extensions/base/curseprofile.py:82
+#, python-brace-format
+msgid "Left a comment on {target}'s profile"
+msgstr ""
+
+#: extensions/base/curseprofile.py:84
+msgid "Left a comment on their own profile"
+msgstr ""
+
+#: extensions/base/curseprofile.py:97
+#, fuzzy, python-brace-format
+msgid ""
+"[{author}]({author_url}) left a [comment]({comment}) on {target}'s profile."
+msgstr "[{author}]({author_url}) 刪除了 [{page}]({page_link}) {comment}"
+
+#: extensions/base/curseprofile.py:100
+#, fuzzy, python-brace-format
+msgid ""
+"[{author}]({author_url}) left a [comment]({comment}) on their own profile."
+msgstr "[{author}]({author_url}) 刪除了 [{page}]({page_link}) {comment}"
+
+#: extensions/base/curseprofile.py:113
+#, python-brace-format
+msgid "Edited a comment on {target}'s profile"
+msgstr ""
+
+#: extensions/base/curseprofile.py:115
+msgid "Edited a comment on their own profile"
+msgstr ""
+
+#: extensions/base/curseprofile.py:128
+#, fuzzy, python-brace-format
+msgid ""
+"[{author}]({author_url}) edited a [comment]({comment}) on {target}'s profile."
+msgstr "[{author}]({author_url}) 刪除了 [{page}]({page_link}) {comment}"
+
+#: extensions/base/curseprofile.py:131
+#, fuzzy, python-brace-format
+msgid ""
+"[{author}]({author_url}) edited a [comment]({comment}) on their own profile."
+msgstr "[{author}]({author_url}) 刪除了 [{page}]({page_link}) {comment}"
+
+#: extensions/base/curseprofile.py:144
+#, python-brace-format
+msgid "Replied to a comment on {target}'s profile"
+msgstr ""
+
+#: extensions/base/curseprofile.py:146
+msgid "Replied to a comment on their own profile"
+msgstr ""
+
+#: extensions/base/curseprofile.py:159
+#, fuzzy, python-brace-format
+msgid ""
+"[{author}]({author_url}) replied to a [comment]({comment}) on {target}'s "
+"profile."
+msgstr "[{author}]({author_url}) 刪除了 [{page}]({page_link}) {comment}"
+
+#: extensions/base/curseprofile.py:162
+#, fuzzy, python-brace-format
+msgid ""
+"[{author}]({author_url}) replied to a [comment]({comment}) on their own "
+"profile."
+msgstr "[{author}]({author_url}) 刪除了 [{page}]({page_link}) {comment}"
+
+#: extensions/base/curseprofile.py:175
+#, python-brace-format
+msgid "Deleted a comment on {target}'s profile"
+msgstr ""
+
+#: extensions/base/curseprofile.py:177
+msgid "Deleted a comment on their own profile"
+msgstr ""
+
+#: extensions/base/curseprofile.py:197
+#, fuzzy, python-brace-format
+msgid ""
+"[{author}]({author_url}) deleted a [comment]({comment}) on {target}'s "
+"profile.{reason}"
+msgstr "[{author}]({author_url}) 刪除了 [{page}]({page_link}) {comment}"
+
+#: extensions/base/curseprofile.py:200
+#, fuzzy, python-brace-format
+msgid ""
+"[{author}]({author_url}) deleted a [comment]({comment}) on their own profile."
+"{reason}"
+msgstr "[{author}]({author_url}) 刪除了 [{page}]({page_link}) {comment}"
+
+#: extensions/base/curseprofile.py:214
+#, python-brace-format
+msgid "Purged a comment on {target}'s profile"
+msgstr ""
+
+#: extensions/base/curseprofile.py:216
+msgid "Purged a comment on their own profile"
+msgstr ""
+
+#: extensions/base/curseprofile.py:230
+#, fuzzy, python-brace-format
+msgid ""
+"[{author}]({author_url}) purged a comment on [{target}]({link})'s profile."
+"{reason}"
+msgstr "[{author}]({author_url}) 回退了 [{file}]({file_link}) 的版本 {comment}"
+
+#: extensions/base/curseprofile.py:233
+#, fuzzy, python-brace-format
+msgid ""
+"[{author}]({author_url}) purged a comment on [their own]({link}) profile."
+"{reason}"
+msgstr "[{author}]({author_url}) 回退了 [{file}]({file_link}) 的版本 {comment}"
+
+#: extensions/base/renameuser.py:38
+#, python-brace-format
+msgid "Renamed user \"{old_name}\" with {edits} edit to \"{new_name}\""
+msgid_plural "Renamed user \"{old_name}\" with {edits} edits to \"{new_name}\""
+msgstr[0] ""
+
+#: extensions/base/renameuser.py:43
+#, python-brace-format
+msgid "Renamed user \"{old_name}\" to \"{new_name}\""
+msgstr ""
+
+#: extensions/base/renameuser.py:58
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) renamed user *{old_name}* with {edits} edit to "
+"[{new_name}]({link}){comment}"
+msgid_plural ""
+"[{author}]({author_url}) renamed user *{old_name}* with {edits} edits to "
+"[{new_name}]({link}){comment}"
+msgstr[0] ""
+
+#: extensions/base/renameuser.py:66
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) renamed user *{old_name}* to [{new_name}]({link})"
+"{comment}"
+msgstr ""
+
+#: extensions/base/interwiki.py:37
+msgid "Added an entry to the interwiki table"
+msgstr ""
+
+#: extensions/base/interwiki.py:38 extensions/base/interwiki.py:65
+#, python-brace-format
+msgid "Prefix: {prefix}, website: {website} | {desc}"
+msgstr ""
+
+#: extensions/base/interwiki.py:50
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) added an entry to the [interwiki table]"
+"({table_url}) pointing to {website} with {prefix} prefix"
+msgstr ""
+
+#: extensions/base/interwiki.py:64
+msgid "Edited an entry in interwiki table"
+msgstr ""
+
+#: extensions/base/interwiki.py:77
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) edited an entry in [interwiki table]({table_url}) "
+"pointing to {website} with {prefix} prefix"
+msgstr ""
+
+#: extensions/base/interwiki.py:91
+msgid "Deleted an entry in interwiki table"
+msgstr ""
+
+#: extensions/base/interwiki.py:92
+#, python-brace-format
+msgid "Prefix: {prefix} | {desc}"
+msgstr ""
+
+#: extensions/base/interwiki.py:102
+#, fuzzy, python-brace-format
+msgid ""
+"[{author}]({author_url}) deleted an entry in [interwiki table]({table_url})"
+"{desc}"
+msgstr "[{author}]({author_url}) 刪除了 [{page}]({page_link}) {comment}"
+
+#: extensions/base/abusefilter.py:29
+msgid "None"
+msgstr "無"
+
+#: extensions/base/abusefilter.py:29
+msgid "Warning issued"
+msgstr "已發出警告"
+
+#: extensions/base/abusefilter.py:29
+msgid "**Blocked user**"
+msgstr "**已封鎖使用者**"
+
+#: extensions/base/abusefilter.py:29
+msgid "Tagged the edit"
+msgstr "已標記編輯"
+
+#: extensions/base/abusefilter.py:29
+msgid "Disallowed the action"
+msgstr "已阻止操作"
+
+#: extensions/base/abusefilter.py:29
+msgid "**IP range blocked**"
+msgstr "**已封鎖IP段**"
+
+#: extensions/base/abusefilter.py:29
+msgid "Throttled actions"
+msgstr "已壓制操作"
+
+#: extensions/base/abusefilter.py:29
+msgid "Removed autoconfirmed group"
+msgstr "已移除自動確認使用者群組"
+
+#: extensions/base/abusefilter.py:29
+msgid "**Removed from privileged groups**"
+msgstr "**已移除特有使用者群組**"
+
+#: extensions/base/abusefilter.py:30
+msgid "Edit"
+msgstr "編輯"
+
+#: extensions/base/abusefilter.py:30
+msgid "Upload"
+msgstr "上傳"
+
+#: extensions/base/abusefilter.py:30
+msgid "Move"
+msgstr "移動"
+
+#: extensions/base/abusefilter.py:30
+msgid "Stash upload"
+msgstr "隱藏上傳"
+
+#: extensions/base/abusefilter.py:30
+msgid "Deletion"
+msgstr "刪除"
+
+#: extensions/base/abusefilter.py:30
+msgid "Account creation"
+msgstr "建立帳號"
+
+#: extensions/base/abusefilter.py:30
+msgid "Auto account creation"
+msgstr "自動建立帳號"
+
+#: extensions/base/abusefilter.py:54
+#, python-brace-format
+msgid "{user} triggered \"{abuse_filter}\""
+msgstr ""
+
+#: extensions/base/abusefilter.py:55
+msgid "Performed"
+msgstr ""
+
+#: extensions/base/abusefilter.py:56
+msgid "Action taken"
+msgstr ""
+
+#: extensions/base/abusefilter.py:57
+msgid "Title"
+msgstr ""
+
+#: extensions/base/abusefilter.py:66
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) triggered *{abuse_filter}*, performing the action "
+"\"{action}\" on *[{target}]({target_url})* - action taken: {result}."
+msgstr ""
+"[{author}]({author_url}) 觸發了 *{abuse_filter}* ,於 *[{target}]"
+"({target_url})* 執行操作「{action}」 - 已採取的操作:{result}。"
+
+#: extensions/base/abusefilter.py:83
+#, python-brace-format
+msgid "Edited abuse filter number {number}"
+msgstr ""
+
+#: extensions/base/abusefilter.py:95
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) edited abuse filter [number {number}]({filter_url})"
+msgstr ""
+
+#: extensions/base/abusefilter.py:111
+#, python-brace-format
+msgid "Created abuse filter number {number}"
+msgstr ""
+
+#: extensions/base/abusefilter.py:119
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) created abuse filter [number {number}]({filter_url})"
+msgstr ""
+
+#: extensions/base/mediawiki.py:37
+msgid "director"
+msgstr "嚮導"
+
+#: extensions/base/mediawiki.py:37
+msgid "bot"
+msgstr "機器人"
+
+#: extensions/base/mediawiki.py:37
+msgid "editor"
+msgstr "編輯者"
+
+#: extensions/base/mediawiki.py:37
+msgid "directors"
+msgstr "嚮導"
+
+#: extensions/base/mediawiki.py:37
+msgid "sysop"
+msgstr "管理員"
+
+#: extensions/base/mediawiki.py:37
+msgid "bureaucrat"
+msgstr "行政員"
+
+#: extensions/base/mediawiki.py:37
+msgid "reviewer"
+msgstr "覆核員"
+
+#: extensions/base/mediawiki.py:38
+msgid "autoreview"
+msgstr "自動覆核使用者"
+
+#: extensions/base/mediawiki.py:38
+msgid "autopatrol"
+msgstr "自動巡查使用者"
+
+#: extensions/base/mediawiki.py:38
+msgid "wiki_guardian"
+msgstr "Wiki守衛"
+
+#: extensions/base/mediawiki.py:70
+msgid "(N!) "
+msgstr ""
+
+#: extensions/base/mediawiki.py:71
+msgid "m"
+msgstr ""
+
+#: extensions/base/mediawiki.py:72
+msgid "b"
+msgstr ""
+
+#: extensions/base/mediawiki.py:112
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) edited [{article}]({edit_link}){comment} {bold}"
+"({sign}{edit_size}){bold}"
+msgstr ""
+"[{author}]({author_url}) 編輯了 [{article}]({edit_link}) {comment} {bold}"
+"({sign}{edit_size}){bold}"
+
+#: extensions/base/mediawiki.py:117
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) created [{article}]({edit_link}){comment} {bold}"
+"({sign}{edit_size}){bold}"
+msgstr ""
+"[{author}]({author_url}) 建立了 [{article}]({edit_link}) {comment} {bold}"
+"({sign}{edit_size}){bold}"
+
+#: extensions/base/mediawiki.py:190 extensions/base/mediawiki.py:223
+msgid "Options"
+msgstr ""
+
+#: extensions/base/mediawiki.py:190
+#, python-brace-format
+msgid "([preview]({link}) | [undo]({undolink}))"
+msgstr ""
+
+#: extensions/base/mediawiki.py:195
+#, python-brace-format
+msgid "Uploaded a new version of {name}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:197
+#, python-brace-format
+msgid "Reverted a version of {name}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:199
+#, python-brace-format
+msgid "Uploaded {name}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:208
+msgid "**No license!**"
+msgstr ""
+
+#: extensions/base/mediawiki.py:223
+#, python-brace-format
+msgid "([preview]({link}))"
+msgstr ""
+
+#: extensions/base/mediawiki.py:228
+msgid ""
+"\n"
+"License: {}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:237
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) reverted a version of [{file}]({file_link}){comment}"
+msgstr "[{author}]({author_url}) 回退了 [{file}]({file_link}) 的版本 {comment}"
+
+#: extensions/base/mediawiki.py:248
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) uploaded a new version of [{file}]({file_link})"
+"{comment}"
+msgstr ""
+"[{author}]({author_url}) 上傳了 [{file}]({file_link}) 的新版本 {comment}"
+
+#: extensions/base/mediawiki.py:259
+#, python-brace-format
+msgid "[{author}]({author_url}) uploaded [{file}]({file_link}){comment}"
+msgstr "[{author}]({author_url}) 上傳了 [{file}]({file_link}) {comment}"
+
+#: extensions/base/mediawiki.py:274
+#, python-brace-format
+msgid "Deleted page {article}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:283
+#, python-brace-format
+msgid "[{author}]({author_url}) deleted [{page}]({page_link}){comment}"
+msgstr "[{author}]({author_url}) 刪除了 [{page}]({page_link}) {comment}"
+
+#: extensions/base/mediawiki.py:298
+#, python-brace-format
+msgid "Deleted redirect {article} by overwriting"
+msgstr ""
+
+#: extensions/base/mediawiki.py:308
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) deleted redirect by overwriting [{page}]"
+"({page_link}){comment}"
+msgstr ""
+"[{author}]({author_url}) 透過覆蓋 [{page}]({page_link}) 刪除了重新導向 "
+"{comment}"
+
+#: extensions/base/mediawiki.py:322
+#, python-brace-format
+msgid "Restored {article}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:331
+#, python-brace-format
+msgid "[{author}]({author_url}) restored [{article}]({article_url}){comment}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:348
+msgid "Changed visibility of log events"
+msgstr ""
+
+#: extensions/base/mediawiki.py:356
+#, python-brace-format
+msgid "[{author}]({author_url}) changed visibility of log events{comment}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:370
+#, python-brace-format
+msgid "Changed visibility of revision on page {article} "
+msgid_plural "Changed visibility of {amount} revisions on page {article} "
+msgstr[0] ""
+
+#: extensions/base/mediawiki.py:383
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) changed visibility of revision on page [{article}]"
+"({article_url}){comment}"
+msgid_plural ""
+"[{author}]({author_url}) changed visibility of {amount} revisions on page "
+"[{article}]({article_url}){comment}"
+msgstr[0] ""
+
+#: extensions/base/mediawiki.py:399 extensions/base/mediawiki.py:432
+msgid "No redirect has been made"
+msgstr ""
+
+#: extensions/base/mediawiki.py:400 extensions/base/mediawiki.py:433
+msgid "A redirect has been made"
+msgstr ""
+
+#: extensions/base/mediawiki.py:401
+#, python-brace-format
+msgid "Moved {redirect}{article} to {target}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:412 extensions/base/mediawiki.py:444
+msgid "without making a redirect"
+msgstr "不留重新導向"
+
+#: extensions/base/mediawiki.py:413 extensions/base/mediawiki.py:445
+msgid "with a redirect"
+msgstr "保留重新導向"
+
+#: extensions/base/mediawiki.py:416
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) moved {redirect}*{article}* to [{target}]"
+"({target_url}) {made_a_redirect}{comment}"
+msgstr ""
+"[{author}]({author_url}) 已將 {redirect}*{article}* 移動至 [{target}]"
+"({target_url}) {made_a_redirect} {comment}"
+
+#: extensions/base/mediawiki.py:434
+#, python-brace-format
+msgid "Moved {redirect}{article} to {title} over redirect"
+msgstr ""
+
+#: extensions/base/mediawiki.py:448
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) moved {redirect}*{article}* over redirect to "
+"[{target}]({target_url}) {made_a_redirect}{comment}"
+msgstr ""
+"[{author}]({author_url}) 已透過重新導向將 {redirect}*{article}* 移動至 "
+"[{target}]({target_url}) {made_a_redirect} {comment}"
+
+#: extensions/base/mediawiki.py:464
+#, python-brace-format
+msgid "Moved protection settings from {redirect}{article} to {title}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:477
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) moved protection settings from {redirect}*{article}"
+"* to [{target}]({target_url}){comment}"
+msgstr ""
+"[{author}]({author_url}) 已將 {redirect}*{article}* 的保護設定移動至 "
+"[{target}]({target_url}) {comment}"
+
+#: extensions/base/mediawiki.py:492
+#, python-brace-format
+msgid "Protected {target}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:495 extensions/base/mediawiki.py:510
+#: extensions/base/mediawiki.py:526 extensions/base/mediawiki.py:541
+msgid " [cascading]"
+msgstr ""
+
+#: extensions/base/mediawiki.py:506
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) protected [{article}]({article_url}) with the "
+"following settings: {settings}{comment}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:523
+#, python-brace-format
+msgid "Changed protection level for {article}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:537
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) modified protection settings of [{article}]"
+"({article_url}) to: {settings}{comment}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:554
+#, python-brace-format
+msgid "Removed protection from {article}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:563
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) removed protection from [{article}]({article_url})"
+"{comment}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:572
+msgid "for infinity and beyond"
+msgstr "時長為無線期"
+
+#: extensions/base/mediawiki.py:581
+msgid "for less than a minute"
+msgstr ""
+
+#: extensions/base/mediawiki.py:583
+msgid "year"
+msgid_plural "years"
+msgstr[0] "年"
+
+#: extensions/base/mediawiki.py:583
+msgid "day"
+msgid_plural "days"
+msgstr[0] "日"
+
+#: extensions/base/mediawiki.py:583
+msgid "hour"
+msgid_plural "hours"
+msgstr[0] "時"
+
+#: extensions/base/mediawiki.py:584
+msgid "minute"
+msgid_plural "minutes"
+msgstr[0] "分"
+
+#: extensions/base/mediawiki.py:589
+#, python-brace-format
+msgid "for {time_number} {time_unit}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:608
+msgid "Blocked from editing the following pages: "
+msgstr ""
+
+#: extensions/base/mediawiki.py:615 extensions/base/mediawiki.py:661
+msgid " and namespaces: "
+msgstr " 及命名空間: "
+
+#: extensions/base/mediawiki.py:617
+msgid "Blocked from editing pages on following namespaces: "
+msgstr ""
+
+#: extensions/base/mediawiki.py:628
+msgid "Partial block details"
+msgstr ""
+
+#: extensions/base/mediawiki.py:631
+msgid "Block flags"
+msgstr ""
+
+#: extensions/base/mediawiki.py:633
+#, python-brace-format
+msgid "Blocked {blocked_user} {time}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:653
+msgid " on pages: "
+msgstr " 於頁面: "
+
+#: extensions/base/mediawiki.py:663
+msgid " on namespaces: "
+msgstr " 於命名空間: "
+
+#: extensions/base/mediawiki.py:675
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) blocked [{user}]({user_url}) {time}"
+"{restriction_desc}{comment}"
+msgstr ""
+"[{author}]({author_url}) 封鎖了 [{user}]({user_url}) {time}{restriction_desc}"
+"{comment}"
+
+#: extensions/base/mediawiki.py:693
+#, python-brace-format
+msgid "Changed block settings for {blocked_user}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:703
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) changed block settings for [{blocked_user}]"
+"({user_url}){comment}"
+msgstr ""
+"[{author}]({author_url}) 變更了 [{blocked_user}]({user_url}) 的封鎖設定 "
+"{comment}"
+
+#: extensions/base/mediawiki.py:716
+#, python-brace-format
+msgid "Unblocked {blocked_user}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:726
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) unblocked [{blocked_user}]({user_url}){comment}"
+msgstr "[{author}]({author_url}) 解封了 [{blocked_user}]({user_url}) {comment}"
+
+#: extensions/base/mediawiki.py:742
+msgid "Action has been hidden by administration"
+msgstr ""
+
+#: extensions/base/mediawiki.py:749
+msgid "An action has been hidden by administration."
+msgstr ""
+
+#: extensions/base/mediawiki.py:760
+#, python-brace-format
+msgid "Imported {article} with {count} revision"
+msgid_plural "Imported {article} with {count} revisions"
+msgstr[0] ""
+
+#: extensions/base/mediawiki.py:771
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) imported [{article}]({article_url}) with {count} "
+"revision{comment}"
+msgid_plural ""
+"[{author}]({author_url}) imported [{article}]({article_url}) with {count} "
+"revisions{comment}"
+msgstr[0] ""
+
+#: extensions/base/mediawiki.py:787
+#, python-brace-format
+msgid "Imported {article} with {count} revision from \"{source}\""
+msgid_plural "Imported {article} with {count} revisions from \"{source}\""
+msgstr[0] ""
+
+#: extensions/base/mediawiki.py:802
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) imported [{article}]({article_url}) with {count} "
+"revision from [{source}]({source_url}){comment}"
+msgid_plural ""
+"[{author}]({author_url}) imported [{article}]({article_url}) with {count} "
+"revisions from [{source}]({source_url}){comment}"
+msgstr[0] ""
+
+#: extensions/base/mediawiki.py:817
+#, python-brace-format
+msgid " (until {date_and_time})"
+msgstr ""
+
+#: extensions/base/mediawiki.py:834
+#, python-brace-format
+msgid "Changed group membership for {target}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:836
+msgid "System"
+msgstr ""
+
+#: extensions/base/mediawiki.py:837
+#, python-brace-format
+msgid "{target} got autopromoted to a new usergroup"
+msgstr ""
+
+#: extensions/base/mediawiki.py:843
+#, fuzzy
+msgid "Added group"
+msgid_plural "Added groups"
+msgstr[0] "已移除自動確認使用者群組"
+
+#: extensions/base/mediawiki.py:845
+#, fuzzy
+msgid "Removed group"
+msgid_plural "Removed groups"
+msgstr[0] "已移除自動確認使用者群組"
+
+#: extensions/base/mediawiki.py:859
+#, python-brace-format
+msgid "Added to {added} and removed from {removed}."
+msgstr ""
+
+#: extensions/base/mediawiki.py:860 extensions/base/mediawiki.py:862
+#: extensions/base/mediawiki.py:864 extensions/base/mediawiki.py:871
+msgid ", "
+msgstr ""
+
+#: extensions/base/mediawiki.py:862
+#, python-brace-format
+msgid "Added to {added}."
+msgstr ""
+
+#: extensions/base/mediawiki.py:864
+#, python-brace-format
+msgid "Removed from {removed}."
+msgstr ""
+
+#: extensions/base/mediawiki.py:865
+#, fuzzy, python-brace-format
+msgid ""
+"[{author}]({author_url}) changed group membership for [{target}]"
+"({target_url}): {group_changes}{comment}"
+msgstr ""
+"[{author}]({author_url}) 已將 {redirect}*{article}* 移動至 [{target}]"
+"({target_url}) {made_a_redirect} {comment}"
+
+#: extensions/base/mediawiki.py:869
+#, fuzzy, python-brace-format
+msgid "The system autopromoted [{target}]({target_url}) to {added}.{comment}"
+msgstr ""
+"[{author}]({author_url}) 已將 {redirect}*{article}* 移動至 [{target}]"
+"({target_url}) {made_a_redirect} {comment}"
+
+#: extensions/base/mediawiki.py:882
+#, python-brace-format
+msgid "Merged revision histories of {article} into {dest}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:896
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) merged revision histories of [{article}]"
+"({article_url}) into [{dest}]({dest_url}){comment}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:910
+msgid "Created account automatically"
+msgstr ""
+
+#: extensions/base/mediawiki.py:917
+#, python-brace-format
+msgid "Account [{author}]({author_url}) was created automatically"
+msgstr ""
+
+#: extensions/base/mediawiki.py:930 extensions/base/mediawiki.py:995
+msgid "Created account"
+msgstr ""
+
+#: extensions/base/mediawiki.py:937 extensions/base/mediawiki.py:1002
+#, python-brace-format
+msgid "Account [{author}]({author_url}) was created"
+msgstr ""
+
+#: extensions/base/mediawiki.py:949
+#, python-brace-format
+msgid "Created account {article}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:958
+#, python-brace-format
+msgid ""
+"Account [{article}]({article_url}) was created by [{author}]({author_url})"
+"{comment}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:971
+#, python-brace-format
+msgid "Created account {article} and password was sent by email"
+msgstr ""
+
+#: extensions/base/mediawiki.py:982
+#, python-brace-format
+msgid ""
+"Account [{article}]({article_url}) was created by [{author}]({author_url}) "
+"and password was sent by email{comment}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:1014
+#, python-brace-format
+msgid "Changed the content model of the page {article}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:1016
+#, python-brace-format
+msgid "Model changed from {old} to {new}: {reason}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:1028
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) changed the content model of the page [{article}]"
+"({article_url}) from {old} to {new}{comment}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:1043
+#, python-brace-format
+msgid "Created the page {article} using a non-default content model"
+msgstr ""
+
+#: extensions/base/mediawiki.py:1045
+#, python-brace-format
+msgid "Created with model {new}: {reason}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:1056
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) created the page [{article}]({article_url}) using a "
+"non-default content model {new}{comment}"
+msgstr ""
+
+#: extensions/base/mediawiki.py:1071
+#, python-brace-format
+msgid "Created the tag \"{tag}\""
+msgstr ""
+
+#: extensions/base/mediawiki.py:1081
+#, fuzzy, python-brace-format
+msgid ""
+"[{author}]({author_url}) created the [tag]({tag_url}) \"{tag}\"{comment}"
+msgstr "[{author}]({author_url}) 刪除了 [{page}]({page_link}) {comment}"
+
+#: extensions/base/mediawiki.py:1102
+#, python-brace-format
+msgid "Deleted the tag \"{tag}\""
+msgstr ""
+
+#: extensions/base/mediawiki.py:1104
+msgid "Removed from"
+msgstr ""
+
+#: extensions/base/mediawiki.py:1104
+msgid "{} revision or log entry"
+msgid_plural "{} revisions and/or log entries"
+msgstr[0] ""
+
+#: extensions/base/mediawiki.py:1117
+#, fuzzy, python-brace-format
+msgid ""
+"[{author}]({author_url}) deleted the [tag]({tag_url}) \"{tag}\"{comment}"
+msgstr "[{author}]({author_url}) 刪除了 [{page}]({page_link}) {comment}"
+
+#: extensions/base/mediawiki.py:1127
+#, fuzzy, python-brace-format
+msgid ""
+"[{author}]({author_url}) deleted the [tag]({tag_url}) \"{tag}\" and removed "
+"it from {count} revision or log entry{comment}"
+msgid_plural ""
+"[{author}]({author_url}) deleted the [tag]({tag_url}) \"{tag}\" and removed "
+"it from {count} revisions and/or log entries{comment}"
+msgstr[0] ""
+"[{author}]({author_url}) 已將 {redirect}*{article}* 移動至 [{target}]"
+"({target_url}) {made_a_redirect} {comment}"
+
+#: extensions/base/mediawiki.py:1144
+#, python-brace-format
+msgid "Activated the tag \"{tag}\""
+msgstr ""
+
+#: extensions/base/mediawiki.py:1153
+#, fuzzy, python-brace-format
+msgid ""
+"[{author}]({author_url}) activated the [tag]({tag_url}) \"{tag}\"{comment}"
+msgstr "[{author}]({author_url}) 刪除了 [{page}]({page_link}) {comment}"
+
+#: extensions/base/mediawiki.py:1172
+#, python-brace-format
+msgid "Deactivated the tag \"{tag}\""
+msgstr ""
+
+#: extensions/base/mediawiki.py:1181
+#, fuzzy, python-brace-format
+msgid ""
+"[{author}]({author_url}) deactivated the [tag]({tag_url}) \"{tag}\"{comment}"
+msgstr "[{author}]({author_url}) 刪除了 [{page}]({page_link}) {comment}"
+
+#: extensions/base/sprite.py:37
+#, python-brace-format
+msgid "Edited the sprite for {article}"
+msgstr ""
+
+#: extensions/base/sprite.py:45
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) edited the sprite for [{article}]({article_url})"
+msgstr ""
+
+#: extensions/base/sprite.py:60
+#, python-brace-format
+msgid "Created the sprite sheet for {article}"
+msgstr ""
+
+#: extensions/base/sprite.py:68
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) created the sprite sheet for [{article}]"
+"({article_url})"
+msgstr ""
+
+#: extensions/base/sprite.py:79
+#, python-brace-format
+msgid "Edited the slice for {article}"
+msgstr ""
+
+#: extensions/base/sprite.py:86
+#, python-brace-format
+msgid ""
+"[{author}]({author_url}) edited the slice for [{article}]({article_url})"
+msgstr ""
+
+#, python-brace-format
+#~ msgid "{value} (avg. {avg})"
+#~ msgstr "{value}(平均 {avg})"
+
+#~ msgid "Daily overview"
+#~ msgstr "每日總覽"
+
+#~ msgid "No activity"
+#~ msgstr "無動態"
+
+#~ msgid " ({} action)"
+#~ msgid_plural " ({} actions)"
+#~ msgstr[0] " ({} 次操作)"
+
+#~ msgid " ({} edit)"
+#~ msgid_plural " ({} edits)"
+#~ msgstr[0] " ({} 次編輯)"
+
+#~ msgid " UTC ({} action)"
+#~ msgid_plural " UTC ({} actions)"
+#~ msgstr[0] " UTC({} 次操作)"
+
+#~ msgid "But nobody came"
+#~ msgstr "無人"
+
+#~ msgid "Most active user"
+#~ msgid_plural "Most active users"
+#~ msgstr[0] "最活躍的使用者"
+
+#~ msgid "Most edited article"
+#~ msgid_plural "Most edited articles"
+#~ msgstr[0] "編輯次數最多的頁面"
+
+#~ msgid "Edits made"
+#~ msgstr "作出的編輯"
+
+#~ msgid "New files"
+#~ msgstr "新建檔案"
+
+#~ msgid "Admin actions"
+#~ msgstr "管理員操作"
+
+#~ msgid "Bytes changed"
+#~ msgstr "變更位元組"
+
+#~ msgid "New articles"
+#~ msgstr "新建頁面"
+
+#~ msgid "Unique contributors"
+#~ msgstr "編輯者數"
+
+#~ msgid "Most active hour"
+#~ msgid_plural "Most active hours"
+#~ msgstr[0] "最活躍時段"
+
+#~ msgid "Day score"
+#~ msgstr "每日分數"
+
+#~ msgid "second"
+#~ msgid_plural "seconds"
+#~ msgstr[0] "秒"
+
+#~ msgid "week"
+#~ msgid_plural "weeks"
+#~ msgstr[0] "週"
+
+#~ msgid "month"
+#~ msgid_plural "months"
+#~ msgstr[0] "月"
+
+#~ msgid "millennium"
+#~ msgid_plural "millennia"
+#~ msgstr[0] "千年"
+
+#~ msgid "decade"
+#~ msgid_plural "decades"
+#~ msgstr[0] "十年"
+
+#~ msgid "century"
+#~ msgid_plural "centuries"
+#~ msgstr[0] "世紀"
+
+#, python-brace-format
+#~ msgid "for {num} {translated_length}"
+#~ msgstr "時長為{num} {translated_length}"
+
+#~ msgid "until {}"
+#~ msgstr "直到{}"
diff --git a/locale/zh-hant/LC_MESSAGES/misc.po b/locale/zh-hant/LC_MESSAGES/misc.po
index 21dcb90..bdbe597 100644
--- a/locale/zh-hant/LC_MESSAGES/misc.po
+++ b/locale/zh-hant/LC_MESSAGES/misc.po
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: RcGcDw\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2020-11-28 23:45+0100\n"
+"POT-Creation-Date: 2021-07-11 14:32+0200\n"
"PO-Revision-Date: 2020-08-16 19:13+0000\n"
"Last-Translator: Winston Sung <>\n"
"Language-Team: Chinese (Traditional) \n"
"Language-Team: Chinese (Traditional) \n"
@@ -17,170 +17,161 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=1; plural=0;\n"
-"X-Generator: Weblate 4.2.1\n"
+"X-Generator: Weblate 4.6\n"
-#: src/rcgcdw.py:115 src/rcgcdw.py:117 src/rcgcdw.py:119 src/rcgcdw.py:121
-#: src/rcgcdw.py:123 src/rcgcdw.py:125 src/rcgcdw.py:127
+#: src/rcgcdw.py:117
#, python-brace-format
msgid "{value} (avg. {avg})"
msgstr "{value}(平均 {avg})"
-#: src/rcgcdw.py:147
+#: src/rcgcdw.py:136
msgid "Daily overview"
msgstr "每日總覽"
-#: src/rcgcdw.py:154
+#: src/rcgcdw.py:143
msgid "No activity"
msgstr "無動態"
-#: src/rcgcdw.py:178
+#: src/rcgcdw.py:167
msgid " ({} action)"
msgid_plural " ({} actions)"
msgstr[0] " ({} 次操作)"
-#: src/rcgcdw.py:180
+#: src/rcgcdw.py:169
msgid " ({} edit)"
msgid_plural " ({} edits)"
msgstr[0] " ({} 次編輯)"
-#: src/rcgcdw.py:185
+#: src/rcgcdw.py:174
msgid " UTC ({} action)"
msgid_plural " UTC ({} actions)"
msgstr[0] " UTC({} 次操作)"
-#: src/rcgcdw.py:187 src/rcgcdw.py:188 src/rcgcdw.py:192
+#: src/rcgcdw.py:176 src/rcgcdw.py:179
msgid "But nobody came"
msgstr "無人"
-#: src/rcgcdw.py:195
+#: src/rcgcdw.py:183
msgid "Most active user"
msgid_plural "Most active users"
msgstr[0] "最活躍的使用者"
-#: src/rcgcdw.py:196
+#: src/rcgcdw.py:184
msgid "Most edited article"
msgid_plural "Most edited articles"
msgstr[0] "編輯次數最多的頁面"
-#: src/rcgcdw.py:197
+#: src/rcgcdw.py:185
msgid "Edits made"
msgstr "作出的編輯"
-#: src/rcgcdw.py:197
+#: src/rcgcdw.py:185
msgid "New files"
msgstr "新建檔案"
-#: src/rcgcdw.py:197
+#: src/rcgcdw.py:186
msgid "Admin actions"
msgstr "管理員操作"
-#: src/rcgcdw.py:198
+#: src/rcgcdw.py:186
msgid "Bytes changed"
msgstr "變更位元組"
-#: src/rcgcdw.py:198
+#: src/rcgcdw.py:187
msgid "New articles"
msgstr "新建頁面"
-#: src/rcgcdw.py:199
+#: src/rcgcdw.py:187
msgid "Unique contributors"
msgstr "編輯者數"
-#: src/rcgcdw.py:200
+#: src/rcgcdw.py:188
msgid "Most active hour"
msgid_plural "Most active hours"
msgstr[0] "最活躍時段"
-#: src/rcgcdw.py:201
+#: src/rcgcdw.py:189
msgid "Day score"
msgstr "每日分數"
-#: src/rcgcdw.py:243
-msgid "director"
-msgstr "嚮導"
+#: src/rcgcdw.py:223
+msgid "~~hidden~~"
+msgstr "~~隱藏~~"
-#: src/rcgcdw.py:243
-msgid "bot"
-msgstr "機器人"
+#: src/rcgcdw.py:225
+msgid "No description provided"
+msgstr "沒有提供描述"
-#: src/rcgcdw.py:243
-msgid "editor"
-msgstr "編輯者"
+#: src/rcgcdw.py:228
+msgid "hidden"
+msgstr "隱藏"
-#: src/rcgcdw.py:243
-msgid "directors"
-msgstr "嚮導"
+#~ msgid "director"
+#~ msgstr "嚮導"
-#: src/rcgcdw.py:243
-msgid "sysop"
-msgstr "管理員"
+#~ msgid "bot"
+#~ msgstr "機器人"
-#: src/rcgcdw.py:243
-msgid "bureaucrat"
-msgstr "行政員"
+#~ msgid "editor"
+#~ msgstr "編輯者"
-#: src/rcgcdw.py:243
-msgid "reviewer"
-msgstr "覆核員"
+#~ msgid "directors"
+#~ msgstr "嚮導"
-#: src/rcgcdw.py:244
-msgid "autoreview"
-msgstr "自動覆核使用者"
+#~ msgid "sysop"
+#~ msgstr "管理員"
-#: src/rcgcdw.py:244
-msgid "autopatrol"
-msgstr "自動巡查使用者"
+#~ msgid "bureaucrat"
+#~ msgstr "行政員"
-#: src/rcgcdw.py:244
-msgid "wiki_guardian"
-msgstr "Wiki守衛"
+#~ msgid "reviewer"
+#~ msgstr "覆核員"
-#: src/rcgcdw.py:244
-msgid "second"
-msgid_plural "seconds"
-msgstr[0] "秒"
+#~ msgid "autoreview"
+#~ msgstr "自動覆核使用者"
-#: src/rcgcdw.py:244
-msgid "minute"
-msgid_plural "minutes"
-msgstr[0] "分"
+#~ msgid "autopatrol"
+#~ msgstr "自動巡查使用者"
-#: src/rcgcdw.py:244
-msgid "hour"
-msgid_plural "hours"
-msgstr[0] "時"
+#~ msgid "wiki_guardian"
+#~ msgstr "Wiki守衛"
-#: src/rcgcdw.py:244
-msgid "day"
-msgid_plural "days"
-msgstr[0] "日"
+#~ msgid "second"
+#~ msgid_plural "seconds"
+#~ msgstr[0] "秒"
-#: src/rcgcdw.py:244
-msgid "week"
-msgid_plural "weeks"
-msgstr[0] "週"
+#~ msgid "minute"
+#~ msgid_plural "minutes"
+#~ msgstr[0] "分"
-#: src/rcgcdw.py:244
-msgid "month"
-msgid_plural "months"
-msgstr[0] "月"
+#~ msgid "hour"
+#~ msgid_plural "hours"
+#~ msgstr[0] "時"
-#: src/rcgcdw.py:244
-msgid "year"
-msgid_plural "years"
-msgstr[0] "年"
+#~ msgid "day"
+#~ msgid_plural "days"
+#~ msgstr[0] "日"
-#: src/rcgcdw.py:244
-msgid "millennium"
-msgid_plural "millennia"
-msgstr[0] "千年"
+#~ msgid "week"
+#~ msgid_plural "weeks"
+#~ msgstr[0] "週"
-#: src/rcgcdw.py:244
-msgid "decade"
-msgid_plural "decades"
-msgstr[0] "十年"
+#~ msgid "month"
+#~ msgid_plural "months"
+#~ msgstr[0] "月"
-#: src/rcgcdw.py:244
-msgid "century"
-msgid_plural "centuries"
-msgstr[0] "世紀"
+#~ msgid "year"
+#~ msgid_plural "years"
+#~ msgstr[0] "年"
+
+#~ msgid "millennium"
+#~ msgid_plural "millennia"
+#~ msgstr[0] "千年"
+
+#~ msgid "decade"
+#~ msgid_plural "decades"
+#~ msgstr[0] "十年"
+
+#~ msgid "century"
+#~ msgid_plural "centuries"
+#~ msgstr[0] "世紀"
diff --git a/locale/zh-hant/LC_MESSAGES/redaction.mo b/locale/zh-hant/LC_MESSAGES/redaction.mo
index d6b721a..0e4fa39 100644
Binary files a/locale/zh-hant/LC_MESSAGES/redaction.mo and b/locale/zh-hant/LC_MESSAGES/redaction.mo differ
diff --git a/locale/zh-hant/LC_MESSAGES/redaction.po b/locale/zh-hant/LC_MESSAGES/redaction.po
index dee62ba..73b8104 100644
--- a/locale/zh-hant/LC_MESSAGES/redaction.po
+++ b/locale/zh-hant/LC_MESSAGES/redaction.po
@@ -7,8 +7,8 @@ msgid ""
msgstr ""
"Project-Id-Version: RcGcDw\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2020-12-23 00:28+0100\n"
-"PO-Revision-Date: 2020-12-13 14:30+0000\n"
+"POT-Creation-Date: 2021-07-11 14:32+0200\n"
+"PO-Revision-Date: 2021-07-30 10:44+0000\n"
"Last-Translator: lakejason0 \n"
"Language-Team: Chinese (Traditional) \n"
@@ -17,9 +17,15 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=1; plural=0;\n"
-"X-Generator: Weblate 4.2.1\n"
+"X-Generator: Weblate 4.6.2\n"
-#: src/discord/redaction.py:62 src/discord/redaction.py:65
-#: src/discord/redaction.py:70
-msgid "Removed"
-msgstr "移除了"
+#: src/discord/redaction.py:77
+msgid "hidden"
+msgstr "已隱藏"
+
+#: src/discord/redaction.py:80 src/discord/redaction.py:85
+msgid "~~hidden~~"
+msgstr "~~已隱藏~~"
+
+#~ msgid "Removed"
+#~ msgstr "移除了"
diff --git a/requirements.txt b/requirements.txt
index b540ae3..dd33b8e 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -1,4 +1,5 @@
-beautifulsoup4 >= 4.6.0; python_version >= '3.6'
+beautifulsoup4 >= 4.6.0;
+python_version >= '3.7'
requests >= 2.18.4
schedule >= 0.5.0
lxml >= 4.2.1
\ No newline at end of file
diff --git a/scripts/configbuilder.py b/scripts/configbuilder.py
index 9c02d73..8677506 100644
--- a/scripts/configbuilder.py
+++ b/scripts/configbuilder.py
@@ -196,7 +196,7 @@ def yes_no(answer):
print("Welcome in RcGcDw config builder! This script is still work in progress so beware! You can accept the default value if provided in the question by using Enter key without providing any other input.\nWARNING! Your current settings.json will be overwritten if you continue!")
try: # load settings
- with open("../settings.json.example") as sfile:
+ with open("../settings.json.example", encoding="utf-8") as sfile:
settings = json.load(sfile)
except FileNotFoundError:
if yes_no(default_or_custom(input("Template config (settings.json.example) could not be found. Download the most recent stable one from master branch? (https://gitlab.com/piotrex43/RcGcDw/raw/master/settings.json.example)? (Y/n)"), "y")):
@@ -468,7 +468,7 @@ class AdvancedSettings:
try:
BasicSettings()
shutil.copy("settings.json", "settings.json.bak")
- with open("settings.json", "w") as settings_file:
+ with open("settings.json", "w", encoding="utf-8") as settings_file:
settings_file.write(json.dumps(settings, indent=4))
if "--advanced" in sys.argv:
print("Basic part of the config has been completed. Starting the advanced part...")
@@ -478,5 +478,5 @@ except KeyboardInterrupt:
if not yes_no(default_or_custom(input("\nSave the config before exiting? (y/N)"),"n")):
sys.exit(0)
else:
- with open("settings.json", "w") as settings_file:
- settings_file.write(json.dumps(settings, indent=4))
\ No newline at end of file
+ with open("settings.json", "w", encoding="utf-8") as settings_file:
+ settings_file.write(json.dumps(settings, indent=4))
diff --git a/scripts/generate-translations.sh b/scripts/generate-translations.sh
index c5cd0e4..8788af3 100644
--- a/scripts/generate-translations.sh
+++ b/scripts/generate-translations.sh
@@ -1,17 +1,20 @@
cd ..
-declare -a StringArray=("discussion_formatters" "rc_formatters" "rcgcdw" "rc" "misc")
+declare -a StringArray=("rcgcdw" "misc")
for file in ${StringArray[@]}; do
- xgettext -L Python --package-name=RcGcDw -o "locale/templates/$file.pot" src/$file.py
+ xgettext -L Python --package-name=RcGcDw -L Python --keyword=pgettext:1c,2 --keyword=npgettext:1c,2,3 -o "locale/templates/$file.pot" src/$file.py
done
-for language in de fr lol pl pt-br ru uk zh-hans zh-hant hi
+# Get all translatable files for formatters
+find extensions/ -name '*.py' -print | xargs xgettext -L Python --package-name=RcGcDw --keyword=pgettext:1c,2 --keyword=npgettext:1c,2,3 -o "locale/templates/formatters.pot" src/api/util.py
+for language in de fr lol pl pt-br ru uk zh-hans zh-hant hi es
do
for file in ${StringArray[@]}; do
msgmerge -U locale/$language/LC_MESSAGES/$file.po locale/templates/$file.pot
done
done
# Exceptions
-xgettext -L Python --package-name=RcGcDw -o "locale/templates/redaction.pot" src/discord/redaction.py
-for language in de fr lol pl pt-br ru uk zh-hans zh-hant hi
+xgettext -L Python --package-name=RcGcDw --keyword=pgettext:1c,2 --keyword=npgettext:1c,2,3 -o "locale/templates/redaction.pot" src/discord/redaction.py
+for language in de fr lol pl pt-br ru uk zh-hans zh-hant hi es
do
msgmerge -U locale/$language/LC_MESSAGES/redaction.po locale/templates/redaction.pot
-done
\ No newline at end of file
+ msgmerge -U locale/$language/LC_MESSAGES/formatters.po locale/templates/formatters.pot
+done
diff --git a/settings.json.example b/settings.json.example
index ab27c7c..bf945d3 100644
--- a/settings.json.example
+++ b/settings.json.example
@@ -20,6 +20,8 @@
"ignored": ["external", "newusers/create", "newusers/autocreate", "newusers/create2", "newusers/byemail", "newusers/newusers"],
"show_updown_messages": true,
"ignored_namespaces": [],
+ "extensions_dir": "extensions",
+ "error_tolerance": 1,
"overview": false,
"overview_time": "00:00",
"send_empty_overview": false,
@@ -43,7 +45,7 @@
"disable_existing_loggers": false,
"formatters": {
"standard": {
- "format": "%(name)s - %(levelname)s: %(message)s"
+ "format": "%(name)s - %(asctime)s - %(levelname)s: %(message)s"
}
},
"handlers": {
diff --git a/setup.py b/setup.py
index 21ff978..31a5301 100644
--- a/setup.py
+++ b/setup.py
@@ -2,7 +2,7 @@ from setuptools import setup
setup(
name='RcGcDw',
- version='1.12',
+ version='1.14',
packages=[''],
url='https://gitlab.com/piotrex43/RcGcDw/',
license='GNU GPLv3',
@@ -12,5 +12,5 @@ setup(
keywords=['MediaWiki', 'recent changes', 'Discord', 'webhook'],
package_dir={"": "src"},
install_requires=["beautifulsoup4 >= 4.6.0", "requests >= 2.18.4", "schedule >= 0.5.0", "lxml >= 4.2.1"],
- python_requires="3.6"
+ python_requires="3.7"
)
diff --git a/src/api/__init__.py b/src/api/__init__.py
new file mode 100644
index 0000000..360afcf
--- /dev/null
+++ b/src/api/__init__.py
@@ -0,0 +1 @@
+from .formatter import *
diff --git a/src/api/client.py b/src/api/client.py
new file mode 100644
index 0000000..caf5723
--- /dev/null
+++ b/src/api/client.py
@@ -0,0 +1,96 @@
+# This file is part of Recent changes Goat compatible Discord webhook (RcGcDw).
+#
+# RcGcDw is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# RcGcDw is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with RcGcDw. If not, see .
+
+
+from __future__ import annotations
+import src.misc
+from typing import Union
+from collections import OrderedDict
+from typing import TYPE_CHECKING, Optional
+
+if TYPE_CHECKING:
+ from src.wiki import Wiki
+
+class Client:
+ """
+ A client for interacting with RcGcDw when creating formatters or hooks.
+ """
+ def __init__(self, hooks, wiki):
+ self._formatters = hooks
+ self.__recent_changes: Wiki = wiki
+ self.WIKI_API_PATH: str = src.misc.WIKI_API_PATH
+ self.WIKI_ARTICLE_PATH: str = src.misc.WIKI_ARTICLE_PATH
+ self.WIKI_SCRIPT_PATH: str = src.misc.WIKI_SCRIPT_PATH
+ self.WIKI_JUST_DOMAIN: str = src.misc.WIKI_JUST_DOMAIN
+ self.content_parser = src.misc.ContentParser
+ self.tags = self.__recent_changes.tags
+ self.LinkParser: type(src.misc.LinkParser) = src.misc.LinkParser
+ #self.make_api_request: src.rc.wiki.__recent_changes.api_request = self.__recent_changes.api_request
+
+ def refresh_internal_data(self):
+ """Refreshes internal storage data for wiki tags and MediaWiki messages."""
+ self.__recent_changes.init_info()
+
+ @property
+ def namespaces(self) -> dict:
+ """Return a dict of namespaces, if None return empty dict"""
+ if self.__recent_changes.namespaces is not None:
+ return self.__recent_changes.namespaces
+ else:
+ return dict()
+
+ def parse_links(self, summary: str):
+ link_parser = self.LinkParser()
+ link_parser.feed(summary)
+ return link_parser.new_string
+
+ def pull_curseprofile_comment(self, comment_id) -> Optional[str]:
+ """Pulls a CurseProfile comment for current wiki set in the settings and with comment_id passed as an argument.
+
+ Returns:
+ String if comment was possible to be fetched
+ None if not
+ """
+ return self.__recent_changes.pull_comment(comment_id)
+
+ def make_api_request(self, params: Union[str, OrderedDict], *json_path: str, timeout: int = 10, allow_redirects: bool = False):
+ """Method to GET request data from the wiki's API with error handling including recognition of MediaWiki errors.
+
+ Parameters:
+
+ params (str, OrderedDict): a string or collections.OrderedDict object containing query parameters
+ json_path (str): *args taking strings as values. After request is parsed as json it will extract data from given json path
+ timeout (int, float) (default=10): int or float limiting time required for receiving a full response from a server before returning TimeoutError
+ allow_redirects (bool) (default=False): switches whether the request should follow redirects or not
+
+ Returns:
+
+ request_content (dict): a dict resulting from json extraction of HTTP GET request with given json_path
+ OR
+ One of the following exceptions:
+ ServerError: When connection with the wiki failed due to server error
+ ClientError: When connection with the wiki failed due to client error
+ KeyError: When json_path contained keys that weren't found in response JSON response
+ BadRequest: When params argument is of wrong type
+ MediaWikiError: When MediaWiki returns an error
+ """
+ return self.__recent_changes.api_request(params, *json_path, timeout=timeout, allow_redirects=allow_redirects)
+
+ def get_formatters(self):
+ return self._formatters
+
+ def get_ipmapper(self) -> dict:
+ """Returns a dict mapping IPs with amount of their edits"""
+ return self.__recent_changes.map_ips
diff --git a/src/api/context.py b/src/api/context.py
new file mode 100644
index 0000000..5c8bb66
--- /dev/null
+++ b/src/api/context.py
@@ -0,0 +1,40 @@
+# This file is part of Recent changes Goat compatible Discord webhook (RcGcDw).
+#
+# RcGcDw is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# RcGcDw is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with RcGcDw. If not, see .
+from __future__ import annotations
+from typing import TYPE_CHECKING
+
+if TYPE_CHECKING:
+ from src.api.client import Client
+
+
+class Context:
+ """Context object containing client and some metadata regarding specific formatter call"""
+ def __init__(self, message_type: str, webhook_url: str, client: Client):
+ self.client = client
+ self.webhook_url = webhook_url
+ self.message_type = message_type
+ self.categories = None
+ self.parsedcomment = None
+ self.event = None
+ self.comment_page = None
+
+ def set_categories(self, cats):
+ self.categories = cats
+
+ def set_parsedcomment(self, parsedcomment: str):
+ self.parsedcomment = parsedcomment
+
+ def set_comment_page(self, page):
+ self.comment_page = page
diff --git a/src/api/formatter.py b/src/api/formatter.py
new file mode 100644
index 0000000..c9946a1
--- /dev/null
+++ b/src/api/formatter.py
@@ -0,0 +1,77 @@
+# This file is part of Recent changes Goat compatible Discord webhook (RcGcDw).
+
+# RcGcDw is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+
+# RcGcDw is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with RcGcDw. If not, see .
+import src.api.hooks
+import logging
+from src.configloader import settings
+from src.exceptions import FormatterBreaksAPISpec
+from src.discord.message import DiscordMessage
+from typing import Optional, Callable
+
+logger = logging.getLogger("src.api.formatter")
+
+def _register_formatter(func, kwargs, formatter_type: str, action_type=None):
+ """
+ Registers a formatter inside of src.rcgcdw.formatter_hooks
+ """
+ try:
+ _, action = func.__name__.split("_", 1)
+ etype = func.__module__
+ action_type = f"{etype}/{action}"
+ except ValueError:
+ raise
+ action_type = kwargs.get("event", action_type)
+ if action_type is None:
+ raise FormatterBreaksAPISpec("event type")
+ if settings["appearance"]["mode"] == formatter_type:
+ for act in [action_type] + kwargs.get("aliases", []): # Make action_type string a list and merge with aliases
+ if act in src.api.hooks.formatter_hooks:
+ logger.warning(f"Action {act} is already defined inside of "
+ f"{src.api.hooks.formatter_hooks[act].__module__}! "
+ f"Overwriting it with one from {func.__module__}")
+ src.api.hooks.formatter_hooks[act] = func
+
+
+def embed(**kwargs):
+ """
+ Decorator to register a formatter are return a function
+
+ :key event: Event string
+ :key mode: Discord Message mode
+ :key aliases: Allows to register multiple events under same function
+ :return:
+ """
+
+ def decorator_cont(func: Callable[[dict], DiscordMessage]):
+ _register_formatter(func, kwargs, "embed")
+ return func
+
+ return decorator_cont
+
+
+def compact(**kwargs):
+ """
+ Decorator to register a formatter are return a function
+
+ :key event: Event string
+ :key mode: Discord Message mode
+ :key aliases: Allows to register multiple events under same function
+ :return:
+ """
+
+ def decorator_cont(func: Callable[[dict], DiscordMessage]):
+ _register_formatter(func, kwargs, "compact")
+ return func
+
+ return decorator_cont
diff --git a/src/api/hook.py b/src/api/hook.py
new file mode 100644
index 0000000..4f5d12b
--- /dev/null
+++ b/src/api/hook.py
@@ -0,0 +1,36 @@
+# This file is part of Recent changes Goat compatible Discord webhook (RcGcDw).
+#
+# RcGcDw is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# RcGcDw is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with RcGcDw. If not, see .
+
+import src.api.hooks
+
+
+def pre_hook(func):
+ """
+ Decorator to register a pre hook and return a function
+
+ :return: func
+ """
+ src.api.hooks.pre_hooks.append(func)
+ return func
+
+
+def post_hook(func):
+ """
+ Decorator to register a post hook and return a function
+
+ :return: func
+ """
+ src.api.hooks.post_hooks.append(func)
+ return func
diff --git a/src/api/hooks.py b/src/api/hooks.py
new file mode 100644
index 0000000..87699ca
--- /dev/null
+++ b/src/api/hooks.py
@@ -0,0 +1,19 @@
+# This file is part of Recent changes Goat compatible Discord webhook (RcGcDw).
+#
+# RcGcDw is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# RcGcDw is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with RcGcDw. If not, see .
+
+# Made just to avoid circular imports
+formatter_hooks = {}
+pre_hooks = []
+post_hooks = []
\ No newline at end of file
diff --git a/src/api/util.py b/src/api/util.py
new file mode 100644
index 0000000..e87f4f9
--- /dev/null
+++ b/src/api/util.py
@@ -0,0 +1,170 @@
+# This file is part of Recent changes Goat compatible Discord webhook (RcGcDw).
+#
+# RcGcDw is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# RcGcDw is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with RcGcDw. If not, see .
+from __future__ import annotations
+import re
+from urllib.parse import quote
+from typing import Optional, Callable, TYPE_CHECKING
+
+from src.exceptions import ServerError, MediaWikiError
+from src.discord.message import DiscordMessage
+from src.configloader import settings
+import src.misc
+import logging
+from src.i18n import formatters_i18n
+
+_ = formatters_i18n.gettext
+
+if TYPE_CHECKING:
+ from src.api.context import Context
+
+logger = logging.getLogger("src.api.util")
+
+
+def default_message(event: str, formatter_hooks: dict) -> Callable:
+ """Returns a method of a formatter responsible for the event or None if such does not exist."""
+ return formatter_hooks.get(event, formatter_hooks.get("generic", formatter_hooks["no_formatter"]))
+
+
+def clean_link(link: str) -> str:
+ """Adds <> around the link to prevent its embedding"""
+ return "<" + link.replace(" ", "_") + ">"
+
+
+def sanitize_to_markdown(text: str) -> str:
+ """Sanitizes given text to escape markdown formatting. It is used in values that will be visible on Discord in messages"""
+ return re.sub(r"([`_*~:<>{}@|\\])", "\\\\\\1", text).replace('//', "/\\/").replace('](', "]\\(")
+
+
+def sanitize_to_url(text: str) -> str: # TODO ) replaces needed?
+ """Formats a string in a way where it can be safely added to a URL without breaking MediaWiki URL schema"""
+ return quote(text, " /:").replace(' ', "_").replace(")", "%29")
+
+
+def parse_mediawiki_changes(ctx: Context, content: str, embed: DiscordMessage) -> None:
+ """Parses MediaWiki changes and adds them to embed as fields "Added" and "Removed" """
+ edit_diff = ctx.client.content_parser()
+ edit_diff.feed(content)
+ if edit_diff.small_prev_del:
+ if edit_diff.small_prev_del.replace("~~", "").replace("__", "").isspace():
+ edit_diff.small_prev_del = _('__Only whitespace__')
+ else:
+ edit_diff.small_prev_del = edit_diff.small_prev_del.replace("~~~~", "").replace("____", "")
+ if edit_diff.small_prev_ins:
+ if edit_diff.small_prev_ins.replace("**", "").replace("__", "").isspace():
+ edit_diff.small_prev_ins = _('__Only whitespace__')
+ else:
+ edit_diff.small_prev_ins = edit_diff.small_prev_ins.replace("****", "").replace("____", "")
+ logger.debug("Changed content: {}".format(edit_diff.small_prev_ins))
+ if edit_diff.small_prev_del and not ctx.event == "new":
+ embed.add_field(_("Removed"), "{data}".format(data=edit_diff.small_prev_del), inline=True)
+ if edit_diff.small_prev_ins:
+ embed.add_field(_("Added"), "{data}".format(data=edit_diff.small_prev_ins), inline=True)
+
+
+def create_article_path(article: str) -> str:
+ """Takes the string and creates an URL with it as the article name"""
+ return src.misc.WIKI_ARTICLE_PATH.replace("$1", article)
+
+
+def compact_summary(ctx: Context) -> str:
+ """Creates a comment for compact formatters"""
+ if ctx.parsedcomment:
+ return " *({})*".format(ctx.parsedcomment)
+ return ""
+
+def compact_author(ctx: Context, change: dict) -> (Optional[str], Optional[str]):
+ """Returns link to the author and the author itself respecting the settings"""
+ author, author_url = None, None
+ if ctx.event != "suppressed":
+ author_url = clean_link(create_article_path("User:{user}".format(user=sanitize_to_url(change["user"]))))
+ if "anon" in change:
+ if settings.get("hide_ips", False):
+ author = _("Unregistered user")
+ else:
+ author = change["user"]
+ else:
+ author = change["user"]
+ return author, author_url
+
+
+def embed_helper(ctx: Context, message: DiscordMessage, change: dict, set_user=True, set_edit_meta=True, set_desc=True) -> None:
+ """Helps in preparing common edit/log fields for events. Passed arguments automatically become saturated with needed data.
+ All automatic setups can be disabled by setting relevant variable to False
+
+ Currently handles:
+ setting usernames (handles according to settings, specific options set in the settings: hide_ips)
+ adding category fields (if there are any specified categories in the edit)
+ adding tags (if the log is tagged anyhow)
+ setting default description (to ctx.parsedcomment)"""
+ if set_user:
+ author = None
+ if "anon" in change:
+ author_url = create_article_path("Special:Contributions/{user}".format(user=sanitize_to_url(change["user"])))
+ ip_mapper = ctx.client.get_ipmapper()
+ logger.debug("current user: {} with cache of IPs: {}".format(change["user"], ip_mapper.keys()))
+ if change["user"] not in list(ip_mapper.keys()):
+ try:
+ contibs = ctx.client.make_api_request(
+ "?action=query&format=json&list=usercontribs&uclimit=max&ucuser={user}&ucstart={timestamp}&ucprop=".format(
+ user=sanitize_to_url(change["user"]), timestamp=change["timestamp"]), "query",
+ "usercontribs")
+ except (ServerError, MediaWikiError):
+ logger.warning("WARNING: Something went wrong when checking amount of contributions for given IP address")
+ if settings.get("hide_ips", False):
+ author = _("Unregistered user")
+ else:
+ author = change["user"] + "(?)"
+ else:
+ ip_mapper[change["user"]] = len(contibs)
+ logger.debug("Current params user {} and state of map_ips {}".format(change["user"], ip_mapper))
+ if settings.get("hide_ips", False):
+ author = _("Unregistered user")
+ else:
+ author = "{author} ({contribs})".format(author=change["user"], contribs=len(contibs))
+ else:
+ logger.debug("Current params user {} and state of map_ips {}".format(change["user"], ip_mapper))
+ if ctx.event in ("edit", "new"):
+ ip_mapper[change["user"]] += 1
+ author = "{author} ({amount})".format(
+ author=change["user"] if settings.get("hide_ips", False) is False else _("Unregistered user"),
+ amount=ip_mapper[change["user"]])
+ else:
+ author_url = create_article_path("User:{}".format(sanitize_to_url(change["user"])))
+ author = change["user"]
+ message.set_author(author, author_url)
+ if set_edit_meta:
+ if settings["appearance"]["embed"]["show_footer"]:
+ message["timestamp"] = change["timestamp"]
+ if "tags" in change and change["tags"]:
+ tag_displayname = []
+ for tag in change["tags"]:
+ if tag in ctx.client.tags:
+ if ctx.client.tags[tag] is None:
+ continue # Ignore hidden tags
+ else:
+ tag_displayname.append(ctx.client.tags[tag])
+ else:
+ tag_displayname.append(tag)
+ message.add_field(formatters_i18n.pgettext("recent changes Tags", "Tags"), ", ".join(tag_displayname))
+ if ctx.categories is not None and not (len(ctx.categories["new"]) == 0 and len(ctx.categories["removed"]) == 0):
+ new_cat = (_("**Added**: ") + ", ".join(list(ctx.categories["new"])[0:16]) + (
+ "\n" if len(ctx.categories["new"]) <= 15 else _(" and {} more\n").format(
+ len(ctx.categories["new"]) - 15))) if ctx.categories["new"] else ""
+ del_cat = (_("**Removed**: ") + ", ".join(list(ctx.categories["removed"])[0:16]) + (
+ "" if len(ctx.categories["removed"]) <= 15 else _(" and {} more").format(
+ len(ctx.categories["removed"]) - 15))) if ctx.categories["removed"] else ""
+ message.add_field(_("Changed categories"), new_cat + del_cat)
+ if set_desc:
+ message["description"] = ctx.parsedcomment
diff --git a/src/configloader.py b/src/configloader.py
index 9ca412a..002c890 100644
--- a/src/configloader.py
+++ b/src/configloader.py
@@ -1,3 +1,18 @@
+# This file is part of Recent changes Goat compatible Discord webhook (RcGcDw).
+
+# RcGcDw is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+
+# RcGcDw is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with RcGcDw. If not, see .
+
import json
import logging
import sys
@@ -13,7 +28,7 @@ def load_settings():
if settings["limitrefetch"] < settings["limit"] and settings["limitrefetch"] != -1:
settings["limitrefetch"] = settings["limit"]
if "user-agent" in settings["header"]:
- settings["header"]["user-agent"] = settings["header"]["user-agent"].format(version="1.13.1.2") # set the version in the useragent
+ settings["header"]["user-agent"] = settings["header"]["user-agent"].format(version="1.14") # set the version in the useragent
except FileNotFoundError:
logging.critical("No config file could be found. Please make sure settings.json is in the directory.")
sys.exit(1)
diff --git a/src/discord/message.py b/src/discord/message.py
index dac9cae..8f4fb16 100644
--- a/src/discord/message.py
+++ b/src/discord/message.py
@@ -1,3 +1,18 @@
+# This file is part of Recent changes Goat compatible Discord webhook (RcGcDw).
+
+# RcGcDw is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+
+# RcGcDw is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with RcGcDw. If not, see .
+
import json
import math
import random
@@ -19,6 +34,7 @@ class DiscordMessage:
content = settings["event_appearance"][event_type]["emoji"] + " " + content
self.webhook_object["content"] = content
+ self.message_type = message_type
self.event_type = event_type
def __setitem__(self, key, value):
@@ -48,6 +64,8 @@ class DiscordMessage:
self.__setup_embed()
def finish_embed(self):
+ if self.message_type != "embed":
+ return
if self.embed["color"] is None:
if settings["event_appearance"].get(self.event_type, {"color": None})["color"] is None:
self.embed["color"] = random.randrange(1, 16777215)
@@ -55,8 +73,10 @@ class DiscordMessage:
self.embed["color"] = settings["event_appearance"][self.event_type]["color"]
else:
self.embed["color"] = math.floor(self.embed["color"])
- if not self.embed["author"]["icon_url"] and settings["event_appearance"].get(self.event_type, {"icon": None})["icon"]:
+ if not self.embed["author"].get("icon_url", None) and settings["event_appearance"].get(self.event_type, {"icon": None})["icon"]:
self.embed["author"]["icon_url"] = settings["event_appearance"][self.event_type]["icon"]
+ if len(self.embed["title"]) > 254:
+ self.embed["title"] = self.embed["title"][0:253] + "…"
def set_author(self, name, url, icon_url=""):
self.embed["author"]["name"] = name
@@ -74,6 +94,9 @@ class DiscordMessage:
def set_name(self, name):
self.webhook_object["username"] = name
+ def set_link(self, link):
+ self.embed["link"] = link
+
class DiscordMessageRaw(DiscordMessage):
def __init__(self, content: dict, webhook_url: str):
@@ -90,4 +113,4 @@ class DiscordMessageMetadata:
self.new_data = new_data
def dump_ids(self) -> (int, int, int):
- return self.page_id, self.rev_id, self.log_id
\ No newline at end of file
+ return self.page_id, self.rev_id, self.log_id
diff --git a/src/discord/queue.py b/src/discord/queue.py
index 07f28af..9777287 100644
--- a/src/discord/queue.py
+++ b/src/discord/queue.py
@@ -1,3 +1,18 @@
+# This file is part of Recent changes Goat compatible Discord webhook (RcGcDw).
+
+# RcGcDw is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+
+# RcGcDw is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with RcGcDw. If not, see .
+
import re
import sys
import time
diff --git a/src/discord/redaction.py b/src/discord/redaction.py
index ffe2f69..b7aac13 100644
--- a/src/discord/redaction.py
+++ b/src/discord/redaction.py
@@ -1,3 +1,18 @@
+# This file is part of Recent changes Goat compatible Discord webhook (RcGcDw).
+
+# RcGcDw is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+
+# RcGcDw is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with RcGcDw. If not, see .
+
import logging
import json
from src.configloader import settings
@@ -59,15 +74,15 @@ def redact_messages(ids: list, entry_type: int, to_censor: dict):
logger.error("Couldn't find entry in the database for RevDel to censor information. This is probably because the script has been recently restarted or cache cleared.")
return
if "user" in to_censor and "url" in new_embed["author"]:
- new_embed["author"]["name"] = _("Removed")
+ new_embed["author"]["name"] = _("hidden")
new_embed["author"].pop("url")
if "action" in to_censor and "url" in new_embed:
- new_embed["title"] = _("Removed")
+ new_embed["title"] = _("~~hidden~~")
new_embed.pop("url")
if "content" in to_censor and "fields" in new_embed:
new_embed.pop("fields")
if "comment" in to_censor:
- new_embed["description"] = _("Removed")
+ new_embed["description"] = _("~~hidden~~")
message["embeds"][0] = new_embed
db_cursor.execute("UPDATE messages SET content = ? WHERE message_id = ?;", (json.dumps(message), row[1],))
db_connection.commit()
diff --git a/src/discussion_formatters.py b/src/discussion_formatters.py
deleted file mode 100644
index 6b8b624..0000000
--- a/src/discussion_formatters.py
+++ /dev/null
@@ -1,282 +0,0 @@
-import datetime, logging
-import json
-import gettext
-from urllib.parse import quote_plus
-
-from src.configloader import settings
-from src.misc import link_formatter, create_article_path, escape_formatting
-from src.discord.queue import send_to_discord
-from src.discord.message import DiscordMessage, DiscordMessageMetadata
-from src.i18n import discussion_formatters
-
-_ = discussion_formatters.gettext
-
-
-discussion_logger = logging.getLogger("rcgcdw.discussion_formatter")
-
-
-def compact_formatter(post_type, post, article_paths):
- """Compact formatter for Fandom discussions."""
- message = None
- author = _("unknown") # Fail safe
- if post_type == "FORUM":
- if post["createdBy"]["name"]:
- author = post["createdBy"]["name"]
- author_url = "<{url}f/u/{creatorId}>".format(url=settings["fandom_discussions"]["wiki_url"], creatorId=post["creatorId"])
- elif post["creatorIp"]:
- author = post["creatorIp"][1:] if settings.get("hide_ips", False) is False else _("Unregistered user")
- author_url = "<{url}wiki/Special:Contributions{creatorIp}>".format(url=settings["fandom_discussions"]["wiki_url"], creatorIp=post["creatorIp"])
- else:
- if post["createdBy"]["name"]:
- author = post["createdBy"]["name"]
- author_url = link_formatter(create_article_path("User:{user}".format(user=author)))
- else:
- author_url = "<{url}f/u/{creatorId}>".format(url=settings["fandom_discussions"]["wiki_url"], creatorId=post["creatorId"])
- event_type = "discussion"
- if post_type == "FORUM":
- if not post["isReply"]:
- thread_funnel = post.get("funnel")
- msg_text = _("[{author}]({author_url}) created [{title}](<{url}f/p/{threadId}>) in {forumName}")
- if thread_funnel == "POLL":
- event_type = "discussion/forum/poll"
- msg_text = _("[{author}]({author_url}) created a poll [{title}](<{url}f/p/{threadId}>) in {forumName}")
- elif thread_funnel == "QUIZ":
- event_type = "discussion/forum/quiz"
- msg_text = _("[{author}]({author_url}) created a quiz [{title}](<{url}f/p/{threadId}>) in {forumName}")
- elif thread_funnel == "TEXT":
- event_type = "discussion/forum/post"
- else:
- discussion_logger.warning("The type of {} is an unknown discussion post type. Please post an issue on the project page to have it added https://gitlab.com/piotrex43/RcGcDw/-/issues.".format(thread_funnel))
- event_type = "unknown"
- message = msg_text.format(author=author, author_url=author_url, title=post["title"], url=settings["fandom_discussions"]["wiki_url"], threadId=post["threadId"], forumName=post["forumName"])
- else:
- event_type = "discussion/forum/reply"
- message = _("[{author}]({author_url}) created a [reply](<{url}f/p/{threadId}/r/{postId}>) to [{title}](<{url}f/p/{threadId}>) in {forumName}").format(author=author, author_url=author_url, url=settings["fandom_discussions"]["wiki_url"], threadId=post["threadId"], postId=post["id"], title=post["_embedded"]["thread"][0]["title"], forumName=post["forumName"])
- elif post_type == "WALL":
- user_wall = _("unknown") # Fail safe
- if post["forumName"].endswith(' Message Wall'):
- user_wall = post["forumName"][:-13]
- if not post["isReply"]:
- event_type = "discussion/wall/post"
- message = _("[{author}]({author_url}) created [{title}](<{url}wiki/Message_Wall:{user_wall}?threadId={threadId}>) on [{user}'s Message Wall](<{url}wiki/Message_Wall:{user_wall}>)").format(author=author, author_url=author_url, title=post["title"], url=settings["fandom_discussions"]["wiki_url"], user=user_wall, user_wall=quote_plus(user_wall.replace(" ", "_")), threadId=post["threadId"])
- else:
- event_type = "discussion/wall/reply"
- message = _("[{author}]({author_url}) created a [reply](<{url}wiki/Message_Wall:{user_wall}?threadId={threadId}#{replyId}>) to [{title}](<{url}wiki/Message_Wall:{user_wall}?threadId={threadId}>) on [{user}'s Message Wall](<{url}wiki/Message_Wall:{user_wall}>)").format(author=author, author_url=author_url, url=settings["fandom_discussions"]["wiki_url"], title=post["_embedded"]["thread"][0]["title"], user=user_wall, user_wall=quote_plus(user_wall.replace(" ", "_")), threadId=post["threadId"], replyId=post["id"])
- elif post_type == "ARTICLE_COMMENT":
- if article_paths is None:
- article_paths = {"title": _("unknown"), "fullUrl": settings["fandom_discussions"]["wiki_url"]} # No page known
- article_paths["fullUrl"] = article_paths["fullUrl"].replace(")", "\)").replace("()", "\(")
- if not post["isReply"]:
- event_type = "discussion/comment/post"
- message = _(
- "[{author}]({author_url}) created a [comment](<{url}?commentId={commentId}>) on [{article}](<{url}>)").format(
- author=author, author_url=author_url, url=article_paths["fullUrl"], article=article_paths["title"],
- commentId=post["threadId"])
- else:
- event_type = "discussion/comment/reply"
- message = _(
- "[{author}]({author_url}) created a [reply](<{url}?commentId={commentId}&replyId={replyId}>) to a [comment](<{url}?commentId={commentId}>) on [{article}](<{url}>)").format(
- author=author, author_url=author_url, url=article_paths["fullUrl"], article=article_paths["title"],
- commentId=post["threadId"], replyId=post["id"])
- else:
- discussion_logger.warning("No entry for {event} with params: {params}".format(event=post_type, params=post))
- if not settings["support"]:
- return
- else:
- message = _("Unknown event `{event}` by [{author}]({author_url}), report it on the [support server](<{support}>).").format(
- event=post_type, author=author, author_url=author_url, support=settings["support"])
- event_type = "unknown"
- send_to_discord(DiscordMessage("compact", event_type, settings["fandom_discussions"]["webhookURL"], content=message), meta=DiscordMessageMetadata("POST"))
-
-
-def embed_formatter(post_type, post, article_paths):
- """Embed formatter for Fandom discussions."""
- embed = DiscordMessage("embed", "discussion", settings["fandom_discussions"]["webhookURL"])
- author = _("unknown") # Fail safe
- if post_type == "FORUM":
- if post["createdBy"]["name"]:
- author = post["createdBy"]["name"]
- embed.set_author(author, "{url}f/u/{creatorId}".format(url=settings["fandom_discussions"]["wiki_url"], creatorId=post["creatorId"]), icon_url=post["createdBy"]["avatarUrl"])
- elif post["creatorIp"]:
- author = post["creatorIp"][1:]
- embed.set_author(author if settings.get("hide_ips", False) is False else _("Unregistered user"), "{url}wiki/Special:Contributions{creatorIp}".format(url=settings["fandom_discussions"]["wiki_url"], creatorIp=post["creatorIp"]))
- else:
- if post["createdBy"]["name"]:
- author = post["createdBy"]["name"]
- embed.set_author(author, "{url}wiki/User:{creator}".format(url=settings["fandom_discussions"]["wiki_url"], creator=author.replace(" ", "_")), icon_url=post["createdBy"]["avatarUrl"])
- else:
- embed.set_author(author, "{url}f/u/{creatorId}".format(url=settings["fandom_discussions"]["wiki_url"], creatorId=post["creatorId"]), icon_url=post["createdBy"]["avatarUrl"])
- if settings["fandom_discussions"]["appearance"]["embed"]["show_content"]:
- if post.get("jsonModel") is not None:
- npost = DiscussionsFromHellParser(post)
- embed["description"] = npost.parse()
- if npost.image_last:
- embed["image"]["url"] = npost.image_last
- embed["description"] = embed["description"].replace(npost.image_last, "")
- else: # Fallback when model is not available
- embed["description"] = post.get("rawContent", "")
- embed["footer"]["text"] = post["forumName"]
- embed["timestamp"] = datetime.datetime.fromtimestamp(post["creationDate"]["epochSecond"], tz=datetime.timezone.utc).isoformat()
- if post_type == "FORUM":
- if not post["isReply"]:
- embed["url"] = "{url}f/p/{threadId}".format(url=settings["fandom_discussions"]["wiki_url"], threadId=post["threadId"])
- embed["title"] = _("Created \"{title}\"").format(title=post["title"])
- thread_funnel = post.get("funnel")
- if thread_funnel == "POLL":
- embed.event_type = "discussion/forum/poll"
- embed["title"] = _("Created a poll \"{title}\"").format(title=post["title"])
- if settings["fandom_discussions"]["appearance"]["embed"]["show_content"]:
- poll = post["poll"]
- image_type = False
- if poll["answers"][0]["image"] is not None:
- image_type = True
- for num, option in enumerate(poll["answers"]):
- embed.add_field(option["text"] if image_type is True else _("Option {}").format(num+1),
- option["text"] if image_type is False else _("__[View image]({image_url})__").format(image_url=option["image"]["url"]),
- inline=True)
- elif thread_funnel == "QUIZ":
- embed.event_type = "discussion/forum/quiz"
- embed["title"] = _("Created a quiz \"{title}\"").format(title=post["title"])
- if settings["fandom_discussions"]["appearance"]["embed"]["show_content"]:
- quiz = post["_embedded"]["quizzes"][0]
- embed["description"] = quiz["title"]
- if quiz["image"] is not None:
- embed["image"]["url"] = quiz["image"]
- elif thread_funnel == "TEXT":
- embed.event_type = "discussion/forum/post"
- else:
- discussion_logger.warning("The type of {} is an unknown discussion post type. Please post an issue on the project page to have it added https://gitlab.com/piotrex43/RcGcDw/-/issues.".format(thread_funnel))
- embed.event_type = "unknown"
- if post["_embedded"]["thread"][0]["tags"]:
- tag_displayname = []
- for tag in post["_embedded"]["thread"][0]["tags"]:
- tag_displayname.append("[{title}]({url})".format(title=tag["articleTitle"], url=create_article_path(quote_plus(tag["articleTitle"].replace(" ", "_"), "/:?=&"))))
- if len(", ".join(tag_displayname)) > 1000:
- embed.add_field(_("Tags"), _("{} tags").format(len(post["_embedded"]["thread"][0]["tags"])))
- else:
- embed.add_field(_("Tags"), ", ".join(tag_displayname))
- else:
- embed.event_type = "discussion/forum/reply"
- embed["title"] = _("Replied to \"{title}\"").format(title=post["_embedded"]["thread"][0]["title"])
- embed["url"] = "{url}f/p/{threadId}/r/{postId}".format(url=settings["fandom_discussions"]["wiki_url"], threadId=post["threadId"], postId=post["id"])
- elif post_type == "WALL":
- user_wall = _("unknown") # Fail safe
- if post["forumName"].endswith(' Message Wall'):
- user_wall = post["forumName"][:-13]
- if not post["isReply"]:
- embed.event_type = "discussion/wall/post"
- embed["url"] = "{url}wiki/Message_Wall:{user_wall}?threadId={threadId}".format(url=settings["fandom_discussions"]["wiki_url"], user_wall=quote_plus(user_wall.replace(" ", "_")), threadId=post["threadId"])
- embed["title"] = _("Created \"{title}\" on {user}'s Message Wall").format(title=post["title"], user=user_wall)
- else:
- embed.event_type = "discussion/wall/reply"
- embed["url"] = "{url}wiki/Message_Wall:{user_wall}?threadId={threadId}#{replyId}".format(url=settings["fandom_discussions"]["wiki_url"], user_wall=quote_plus(user_wall.replace(" ", "_")), threadId=post["threadId"], replyId=post["id"])
- embed["title"] = _("Replied to \"{title}\" on {user}'s Message Wall").format(title=post["_embedded"]["thread"][0]["title"], user=user_wall)
- elif post_type == "ARTICLE_COMMENT":
- if article_paths is None:
- article_page = {"title": _("unknown"), "fullUrl": settings["fandom_discussions"]["wiki_url"]} # No page known
- if not post["isReply"]:
- embed.event_type = "discussion/comment/post"
- embed["url"] = "{url}?commentId={commentId}".format(url=article_paths["fullUrl"], commentId=post["threadId"])
- embed["title"] = _("Commented on {article}").format(article=article_paths["title"])
- else:
- embed.event_type = "discussion/comment/reply"
- embed["url"] = "{url}?commentId={commentId}&replyId={replyId}".format(url=article_paths["fullUrl"], commentId=post["threadId"], replyId=post["id"])
- embed["title"] = _("Replied to a comment on {article}").format(article=article_paths["title"])
- embed["footer"]["text"] = article_paths["title"]
- else:
- discussion_logger.warning("No entry for {event} with params: {params}".format(event=post_type, params=post))
- embed["title"] = _("Unknown event `{event}`").format(event=post_type)
- embed.event_type = "unknown"
- if settings.get("support", None):
- change_params = "[```json\n{params}\n```]({support})".format(params=json.dumps(post, indent=2),
- support=settings["support"])
- if len(change_params) > 1000:
- embed.add_field(_("Report this on the support server"), settings["support"])
- else:
- embed.add_field(_("Report this on the support server"), change_params)
- embed.finish_embed()
- send_to_discord(embed, meta=DiscordMessageMetadata("POST"))
-
-
-class DiscussionsFromHellParser:
- """This class converts fairly convoluted Fandom jsonModal of a discussion post into Markdown formatted usable thing. Takes string, returns string.
- Kudos to MarkusRost for allowing me to implement this formatter based on his code in Wiki-Bot."""
- def __init__(self, post):
- self.post = post
- self.jsonModal = json.loads(post.get("jsonModel", "{}"))
- self.markdown_text = ""
- self.item_num = 1
- self.image_last = None
-
- def parse(self) -> str:
- """Main parsing logic"""
- self.parse_content(self.jsonModal["content"])
- if len(self.markdown_text) > 2000:
- self.markdown_text = self.markdown_text[0:2000] + "…"
- return self.markdown_text
-
- def parse_content(self, content, ctype=None):
- self.image_last = None
- for item in content:
- if ctype == "bulletList":
- self.markdown_text += "\t• "
- if ctype == "orderedList":
- self.markdown_text += "\t{num}. ".format(num=self.item_num)
- self.item_num += 1
- if item["type"] == "text":
- if "marks" in item:
- prefix, suffix = self.convert_marks(item["marks"])
- self.markdown_text = "{old}{pre}{text}{suf}".format(old=self.markdown_text, pre=prefix, text=escape_formatting(item["text"]), suf=suffix)
- else:
- if ctype == "code_block":
- self.markdown_text += item["text"] # ignore formatting on preformatted text which cannot have additional formatting anyways
- else:
- self.markdown_text += escape_formatting(item["text"])
- elif item["type"] == "paragraph":
- if "content" in item:
- self.parse_content(item["content"], item["type"])
- self.markdown_text += "\n"
- elif item["type"] == "openGraph":
- if not item["attrs"]["wasAddedWithInlineLink"]:
- self.markdown_text = "{old}{link}\n".format(old=self.markdown_text, link=item["attrs"]["url"])
- elif item["type"] == "image":
- try:
- discussion_logger.debug(item["attrs"]["id"])
- if item["attrs"]["id"] is not None:
- self.markdown_text = "{old}{img_url}\n".format(old=self.markdown_text, img_url=self.post["_embedded"]["contentImages"][int(item["attrs"]["id"])]["url"])
- self.image_last = self.post["_embedded"]["contentImages"][int(item["attrs"]["id"])]["url"]
- except (IndexError, ValueError):
- discussion_logger.warning("Image {} not found.".format(item["attrs"]["id"]))
- discussion_logger.debug(self.markdown_text)
- elif item["type"] == "code_block":
- self.markdown_text += "```\n"
- if "content" in item:
- self.parse_content(item["content"], item["type"])
- self.markdown_text += "\n```\n"
- elif item["type"] == "bulletList":
- if "content" in item:
- self.parse_content(item["content"], item["type"])
- elif item["type"] == "orderedList":
- self.item_num = 1
- if "content" in item:
- self.parse_content(item["content"], item["type"])
- elif item["type"] == "listItem":
- self.parse_content(item["content"], item["type"])
-
- def convert_marks(self, marks):
- prefix = ""
- suffix = ""
- for mark in marks:
- if mark["type"] == "mention":
- prefix += "["
- suffix = "]({wiki}f/u/{userid}){suffix}".format(wiki=settings["fandom_discussions"]["wiki_url"], userid=mark["attrs"]["userId"], suffix=suffix)
- elif mark["type"] == "strong":
- prefix += "**"
- suffix = "**{suffix}".format(suffix=suffix)
- elif mark["type"] == "link":
- prefix += "["
- suffix = "]({link}){suffix}".format(link=mark["attrs"]["href"], suffix=suffix)
- elif mark["type"] == "em":
- prefix += "_"
- suffix = "_" + suffix
- return prefix, suffix
\ No newline at end of file
diff --git a/src/discussions.py b/src/discussions.py
index 5793502..6ef5094 100644
--- a/src/discussions.py
+++ b/src/discussions.py
@@ -1,31 +1,35 @@
# -*- coding: utf-8 -*-
-# Recent changes Goat compatible Discord webhook is a project for using a webhook as recent changes page from MediaWiki.
-# Copyright (C) 2020 Frisk
+# This file is part of Recent changes Goat compatible Discord webhook (RcGcDw).
-# This program is free software: you can redistribute it and/or modify
+# RcGcDw is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
-# This program is distributed in the hope that it will be useful,
+# RcGcDw is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
# You should have received a copy of the GNU General Public License
-# along with this program. If not, see .
+# along with RcGcDw. If not, see .
import logging, schedule, requests
-from typing import Dict, Any
+from typing import Dict, Any, Optional
from src.configloader import settings
-from src.discussion_formatters import embed_formatter, compact_formatter
-from src.misc import datafile, prepare_paths
-from src.discord.queue import messagequeue
+#from src.discussion_formatters import embed_formatter, compact_formatter
+from src.misc import datafile, prepare_paths, run_hooks
+from src.discord.queue import messagequeue, send_to_discord
+from src.discord.message import DiscordMessageMetadata, DiscordMessage
from src.session import session
-from src.exceptions import ArticleCommentError
+from src.exceptions import ArticleCommentError, NoFormatter
+from src.api.util import default_message
+from src.api.context import Context
+from src.api.hooks import formatter_hooks, pre_hooks, post_hooks
+
# Create a custom logger
@@ -39,8 +43,20 @@ if "discussion_id" not in datafile.data:
storage = datafile
+global client
+
+# setup a few things first so we don't have to do expensive nested get operations every time
fetch_url = "{wiki}wikia.php?controller=DiscussionPost&method=getPosts&sortDirection=descending&sortKey=creation_date&limit={limit}&includeCounters=false".format(wiki=settings["fandom_discussions"]["wiki_url"], limit=settings["fandom_discussions"]["limit"])
domain = prepare_paths(settings["fandom_discussions"]["wiki_url"], dry=True) # Shutdown if the path for discussions is wrong
+display_mode = settings.get("fandom_discussions", {}).get("appearance", {}).get("mode", "embed")
+webhook_url = settings.get("fandom_discussions", {}).get("webhookURL", settings.get("webhookURL"))
+
+
+def inject_client(client_obj):
+ """Function to avoid circular import issues"""
+ global client
+ client = client_obj
+
def fetch_discussions():
messagequeue.resend_msgs()
@@ -78,6 +94,7 @@ def fetch_discussions():
for post in request_json:
if int(post["id"]) > storage["discussion_id"]:
try:
+ discussion_logger.debug(f"Sending discussion post with ID {post['id']}")
parse_discussion_post(post, comment_pages)
except ArticleCommentError:
return None
@@ -85,9 +102,12 @@ def fetch_discussions():
storage["discussion_id"] = int(post["id"])
datafile.save_datafile()
+
def parse_discussion_post(post, comment_pages):
"""Initial post recognition & handling"""
+ global client
post_type = post["_embedded"]["thread"][0]["containerType"]
+ context = Context(display_mode, webhook_url, client)
# Filter posts by forum
if post_type == "FORUM" and settings["fandom_discussions"].get("show_forums", []):
if not post["forumName"] in settings["fandom_discussions"]["show_forums"]:
@@ -100,7 +120,21 @@ def parse_discussion_post(post, comment_pages):
except KeyError:
discussion_logger.error("Could not parse paths for article comment, here is the content of comment_pages: {}, ignoring...".format(comment_pages))
raise ArticleCommentError
- formatter(post_type, post, comment_page)
+ event_type = f"discussion/{post_type.lower()}"
+ context.set_comment_page(comment_page)
+ run_hooks(pre_hooks, context, post)
+ try:
+ discord_message = default_message(event_type, formatter_hooks)(context, post)
+ except NoFormatter:
+ return
+ except:
+ if settings.get("error_tolerance", 1) > 0:
+ discord_message: Optional[DiscordMessage] = None # It's handled by send_to_discord, we still want other code to run
+ else:
+ raise
+ metadata = DiscordMessageMetadata("POST")
+ run_hooks(post_hooks, discord_message, metadata, context, post)
+ send_to_discord(discord_message, metadata)
def safe_request(url):
@@ -121,6 +155,6 @@ def safe_request(url):
return None
return request
-formatter = embed_formatter if settings["fandom_discussions"]["appearance"]["mode"] == "embed" else compact_formatter
-schedule.every(settings["fandom_discussions"]["cooldown"]).seconds.do(fetch_discussions)
\ No newline at end of file
+schedule.every(settings["fandom_discussions"]["cooldown"]).seconds.do(fetch_discussions)
+
diff --git a/src/exceptions.py b/src/exceptions.py
index 620f134..c4e84f2 100644
--- a/src/exceptions.py
+++ b/src/exceptions.py
@@ -1,5 +1,60 @@
+# This file is part of Recent changes Goat compatible Discord webhook (RcGcDw).
+
+# RcGcDw is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+
+# RcGcDw is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with RcGcDw. If not, see .
+
+
class MWError(Exception):
pass
+
class ArticleCommentError(Exception):
pass
+
+
+class FormatterBreaksAPISpec(Exception):
+ def __init__(self, field):
+ self.message = f"Formatter doesn't specify {field}!"
+ super().__init__(self.message)
+
+
+class ServerError(Exception):
+ """Exception for when a request fails because of Server error"""
+ pass
+
+class NoFormatter(Exception):
+ """Exception to throw when there are no formatters"""
+ pass
+
+
+class ClientError(Exception):
+ """Exception for when a request failes because of Client error"""
+
+ def __init__(self, request):
+ self.message = f"Client have made wrong request! {request.status_code}: {request.reason}. {request.text}"
+ super().__init__(self.message)
+
+
+class BadRequest(Exception):
+ """When type of parameter given to request making method is invalid"""
+ def __init__(self, object_type):
+ self.message = f"params must be either a strong or OrderedDict object, not {type(object_type)}!"
+ super().__init__(self.message)
+
+
+class MediaWikiError(Exception):
+ """When MediaWiki responds with an error"""
+ def __init__(self, errors):
+ self.message = f"MediaWiki returned the following errors: {errors}!"
+ super().__init__(self.message)
+
diff --git a/src/fileio/database.py b/src/fileio/database.py
index b924902..888d22a 100644
--- a/src/fileio/database.py
+++ b/src/fileio/database.py
@@ -1,3 +1,18 @@
+# This file is part of Recent changes Goat compatible Discord webhook (RcGcDw).
+
+# RcGcDw is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+
+# RcGcDw is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with RcGcDw. If not, see .
+
import sqlite3
import logging
import json
@@ -7,6 +22,7 @@ logger = logging.getLogger("rcgcdw.fileio.database")
def create_schema():
+ """Creates a SQLite database schema"""
logger.info("Creating database schema...")
db_cursor.executescript(
"""BEGIN TRANSACTION;
@@ -28,6 +44,7 @@ def create_schema():
def create_connection() -> (sqlite3.Connection, sqlite3.Cursor):
+ """Creates a connection to the database"""
_db_connection = sqlite3.connect(settings['auto_suppression'].get("db_location", ':memory:'))
_db_connection.row_factory = sqlite3.Row
_db_cursor = _db_connection.cursor()
@@ -45,6 +62,10 @@ def check_tables():
def add_entry(pageid: int, revid: int, logid: int, message, message_id: str):
"""Add an edit or log entry to the DB
+ :param message:
+ :param logid:
+ :param revid:
+ :param pageid:
:param message_id:
"""
db_cursor.execute("INSERT INTO messages (message_id, content) VALUES (?, ?)", (message_id, message))
@@ -52,6 +73,7 @@ def add_entry(pageid: int, revid: int, logid: int, message, message_id: str):
logger.debug("Adding an entry to the database (pageid: {}, revid: {}, logid: {}, message: {})".format(pageid, revid, logid, message))
db_connection.commit()
+
def clean_entries():
"""Cleans entries that are 50+"""
cleanup = db_cursor.execute(
diff --git a/src/i18n.py b/src/i18n.py
index 1f43c4c..b2a6e7c 100644
--- a/src/i18n.py
+++ b/src/i18n.py
@@ -1,19 +1,42 @@
+# This file is part of Recent changes Goat compatible Discord webhook (RcGcDw).
+
+# RcGcDw is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+
+# RcGcDw is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with RcGcDw. If not, see .
+
import gettext, sys, logging
from src.configloader import settings
logger = logging.getLogger("rcgcdw.i18n")
# Setup translation
+
+def python37_pgettext_backward_compatibility(context: str, string: str):
+ """Creates backward compatibility with Python 3.7 as pgettext has been introduced only in Python 3.8"""
+ translation = formatters_i18n.gettext("{}\x04{}".format(context, string))
+ if "\x04" in translation: # gettext returned same message
+ return string
+ return translation
+
try:
if settings["lang"] != "en":
rcgcdw = gettext.translation('rcgcdw', localedir='locale', languages=[settings["lang"]])
- discussion_formatters = gettext.translation('discussion_formatters', localedir='locale', languages=[settings["lang"]])
rc = gettext.translation('rc', localedir='locale', languages=[settings["lang"]])
- rc_formatters = gettext.translation('rc_formatters', localedir='locale', languages=[settings["lang"]])
+ formatters_i18n = gettext.translation('formatters', localedir='locale', languages=[settings["lang"]])
misc = gettext.translation('misc', localedir='locale', languages=[settings["lang"]])
redaction = gettext.translation('redaction', localedir='locale', languages=[settings["lang"]])
else:
- rcgcdw, discussion_formatters, rc, rc_formatters, misc, redaction = gettext.NullTranslations(), gettext.NullTranslations(), gettext.NullTranslations(), gettext.NullTranslations(), gettext.NullTranslations(), gettext.NullTranslations()
+ rcgcdw, discussion_formatters, rc, formatters_i18n, misc, redaction = gettext.NullTranslations(), gettext.NullTranslations(), gettext.NullTranslations(), gettext.NullTranslations(), gettext.NullTranslations(), gettext.NullTranslations()
+ formatters_i18n.pgettext = python37_pgettext_backward_compatibility
except FileNotFoundError:
logger.critical("No language files have been found. Make sure locale folder is located in the directory.")
sys.exit(1)
diff --git a/src/migrations/11311.py b/src/migrations/11311.py
index ec966b2..a7fb960 100644
--- a/src/migrations/11311.py
+++ b/src/migrations/11311.py
@@ -8,13 +8,12 @@ import sys
from src.migrations.utils import return_example_file
logger = logging.getLogger("rcgcdw.migrations.1.13.1.1")
-base_file = return_example_file()
new_settings = settings.copy()
def run():
- global base_file
if "event_appearance" not in settings:
logger.info("Running migration 1.13.1.1")
+ base_file = return_example_file()
if "event_appearance" not in base_file: # if local base file is outdated, download from repo
base_file = return_example_file(force=True)
try:
@@ -35,7 +34,7 @@ def run():
logger.exception("Failed to migrate appearance embed.")
sys.exit(1)
shutil.copy("settings.json", "settings.json.{}.bak".format(int(time.time())))
- with open("settings.json", "w") as new_write:
+ with open("settings.json", "w", encoding="utf-8") as new_write:
new_write.write(json.dumps(new_settings, indent=4))
load_settings()
logger.info("Migration 1.13.1.1 has been successful.")
diff --git a/src/migrations/utils.py b/src/migrations/utils.py
index fc448f1..5e66bc8 100644
--- a/src/migrations/utils.py
+++ b/src/migrations/utils.py
@@ -9,7 +9,7 @@ def return_example_file(force=False) -> dict:
try:
if force:
raise FileNotFoundError
- with open('settings.json.example', 'r') as example_file:
+ with open('settings.json.example', 'r', encoding="utf-8") as example_file:
return json.loads(example_file.read())
except FileNotFoundError:
try:
diff --git a/src/misc.py b/src/misc.py
index f241806..79e5881 100644
--- a/src/misc.py
+++ b/src/misc.py
@@ -1,32 +1,32 @@
# -*- coding: utf-8 -*-
-# Recent changes Goat compatible Discord webhook is a project for using a webhook as recent changes page from MediaWiki.
-# Copyright (C) 2018 Frisk
+# This file is part of Recent changes Goat compatible Discord webhook (RcGcDw).
-# This program is free software: you can redistribute it and/or modify
+# RcGcDw is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
-# This program is distributed in the hope that it will be useful,
+# RcGcDw is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
# You should have received a copy of the GNU General Public License
-# along with this program. If not, see .
+# along with RcGcDw. If not, see .
import base64
-import json, logging, sys, re
+import json, logging, sys, re, platform
from html.parser import HTMLParser
-from urllib.parse import urlparse, urlunparse, quote
+from urllib.parse import urlparse, urlunparse
import requests
+
from src.configloader import settings
+import src.api.util
from src.discord.message import DiscordMessage, DiscordMessageMetadata
from src.discord.queue import messagequeue, send_to_discord
+from src.exceptions import MediaWikiError
from src.i18n import misc
-AUTO_SUPPRESSION_ENABLED = settings.get("auto_suppression", {"enabled": False}).get("enabled")
-
_ = misc.gettext
# Create a custom logger
@@ -44,17 +44,19 @@ WIKI_JUST_DOMAIN: str = ""
profile_fields = {"profile-location": _("Location"), "profile-aboutme": _("About me"), "profile-link-google": _("Google link"), "profile-link-facebook":_("Facebook link"), "profile-link-twitter": _("Twitter link"), "profile-link-reddit": _("Reddit link"), "profile-link-twitch": _("Twitch link"), "profile-link-psn": _("PSN link"), "profile-link-vk": _("VK link"), "profile-link-xbl": _("XBL link"), "profile-link-steam": _("Steam link"), "profile-link-discord": _("Discord handle"), "profile-link-battlenet": _("Battle.net handle")}
+
class DataFile:
"""Data class which instance of is shared by multiple modules to remain consistent and do not cause too many IO operations."""
def __init__(self):
self.data = self.load_datafile()
+ misc_logger.debug("Current contents of data.json {}".format(self.data))
self.changed = False
@staticmethod
def generate_datafile():
"""Generate a data.json file from a template."""
try:
- with open("data.json", 'w') as data:
+ with open("data.json", 'w', encoding="utf-8") as data:
data.write(json.dumps(data_template, indent=4))
except PermissionError:
misc_logger.critical("Could not create a data file (no permissions). No way to store last edit.")
@@ -65,7 +67,7 @@ class DataFile:
:rtype: dict
"""
try:
- with open("data.json") as data:
+ with open("data.json", encoding="utf-8") as data:
return json.loads(data.read())
except FileNotFoundError:
self.generate_datafile()
@@ -77,12 +79,22 @@ class DataFile:
if self.changed is False: # don't cause unnecessary write operations
return
try:
- with open("data.json", "w") as data_file:
+ with open("data.json", "w", encoding="utf-8") as data_file:
data_file.write(json.dumps(self.data, indent=4))
self.changed = False
+ misc_logger.debug("Saving the database succeeded.")
except PermissionError:
misc_logger.critical("Could not modify a data file (no permissions). No way to store last edit.")
sys.exit(1)
+ except OSError as e:
+ if settings.get("error_tolerance", 1) > 1:
+ if platform.system() == "Windows":
+ if "Invalid argument: 'data.json'" in str(e):
+ misc_logger.error("Saving the data file failed due to Invalid argument exception, we've seen it "
+ "before in issue #209, if you know the reason for it happening please reopen the "
+ "issue with explanation, for now we are going to just ignore it.") # Reference #209
+ return
+ raise
def __setitem__(self, instance, value):
self.data[instance] = value
@@ -105,17 +117,25 @@ def weighted_average(value, weight, new_value):
return round(((value * weight) + new_value) / (weight + 1), 2)
-def link_formatter(link):
- """Formats a link to not embed it"""
- return "<" + quote(link.replace(" ", "_"), "/:?=&") + ">"
+def class_searcher(attribs: list) -> str:
+ """Function to return classes of given element in HTMLParser on handle_starttag
-
-def escape_formatting(data):
- """Escape Discord formatting"""
- return re.sub(r"([`_*~<>{}@/|\\])", "\\\\\\1", data, 0)
+ :returns a string with all of the classes of element
+ """
+ for attr in attribs:
+ if attr[0] == "class":
+ return attr[1]
+ return ""
class ContentParser(HTMLParser):
+ """ContentPerser is an implementation of HTMLParser that parses output of action=compare&prop=diff API request
+ for two MediaWiki revisions. It extracts the following:
+ small_prev_ins - storing up to 1000 characters of added text
+ small_prev_del - storing up to 1000 chracters of removed text
+ ins_length - storing length of inserted text
+ del_length - storing length of deleted text
+ """
more = _("\n__And more__")
current_tag = ""
last_ins = None
@@ -129,16 +149,21 @@ class ContentParser(HTMLParser):
def handle_starttag(self, tagname, attribs):
if tagname == "ins" or tagname == "del":
self.current_tag = tagname
- if tagname == "td" and "diff-addedline" in attribs[0] and self.ins_length <= 1000:
- self.current_tag = "tda"
- self.last_ins = ""
- if tagname == "td" and "diff-deletedline" in attribs[0] and self.del_length <= 1000:
- self.current_tag = "tdd"
- self.last_del = ""
- if tagname == "td" and "diff-empty" in attribs[0]:
- self.empty = True
+ if tagname == "td":
+ classes = class_searcher(attribs).split(' ')
+ if "diff-addedline" in classes and self.ins_length <= 1000:
+ self.current_tag = "tda"
+ self.last_ins = ""
+ if "diff-deletedline" in classes and self.del_length <= 1000:
+ self.current_tag = "tdd"
+ self.last_del = ""
+ if "diff-empty" in classes:
+ self.empty = True
def handle_data(self, data):
+ def escape_formatting(data: str) -> str:
+ """Escape Discord formatting"""
+ return re.sub(r"([`_*~<>{}@/|\\])", "\\\\\\1", data)
data = escape_formatting(data)
if self.current_tag == "ins" and self.ins_length <= 1000:
self.ins_length += len("**" + data + "**")
@@ -158,15 +183,18 @@ class ContentParser(HTMLParser):
self.last_del = self.last_del + data
def handle_endtag(self, tagname):
- self.current_tag = ""
if tagname == "ins":
self.current_tag = "tda"
elif tagname == "del":
self.current_tag = "tdd"
+ elif tagname == "td":
+ self.current_tag = ""
elif tagname == "tr":
if self.last_ins is not None:
self.ins_length += 1
- if self.empty and not self.last_ins.isspace() and "**" not in self.last_ins:
+ if self.empty and not self.last_ins.isspace():
+ if "**" in self.last_ins:
+ self.last_ins = self.last_ins.replace("**", "__")
self.ins_length += 4
self.last_ins = "**" + self.last_ins + "**"
self.small_prev_ins = self.small_prev_ins + "\n" + self.last_ins
@@ -175,7 +203,9 @@ class ContentParser(HTMLParser):
self.last_ins = None
if self.last_del is not None:
self.del_length += 1
- if self.empty and not self.last_del.isspace() and "~~" not in self.last_del:
+ if self.empty and not self.last_del.isspace():
+ if "~~" in self.last_del:
+ self.last_del = self.last_del.replace("~~", "__")
self.del_length += 4
self.last_del = "~~" + self.last_del + "~~"
self.small_prev_del = self.small_prev_del + "\n" + self.last_del
@@ -202,6 +232,21 @@ def safe_read(request, *keys):
return request
+def parse_mw_request_info(request_data: dict, url: str):
+ """A function parsing request JSON message from MediaWiki logging all warnings and raising on MediaWiki errors"""
+ # any([True for k in request_data.keys() if k in ("error", "errors")])
+ errors: list = request_data.get("errors", {}) # Is it ugly? I don't know tbh
+ if errors:
+ raise MediaWikiError(str(errors))
+ warnings: list = request_data.get("warnings", {})
+ if warnings:
+ for warning in warnings:
+ misc_logger.warning("MediaWiki returned the following warning: {code} - {text} on {url}.".format(
+ code=warning["code"], text=warning.get("text", warning.get("*", "")), url=url
+ ))
+ return request_data
+
+
def add_to_dict(dictionary, key):
if key in dictionary:
dictionary[key] += 1
@@ -209,6 +254,7 @@ def add_to_dict(dictionary, key):
dictionary[key] = 1
return dictionary
+
def prepare_paths(path, dry=False):
global WIKI_API_PATH
global WIKI_ARTICLE_PATH
@@ -255,11 +301,6 @@ def prepare_paths(path, dry=False):
prepare_paths(settings["wiki_url"])
-def create_article_path(article: str) -> str:
- """Takes the string and creates an URL with it as the article name"""
- return WIKI_ARTICLE_PATH.replace("$1", article)
-
-
def send_simple(msgtype, message, name, avatar):
discord_msg = DiscordMessage("compact", msgtype, settings["webhookURL"], content=message)
discord_msg.set_avatar(avatar)
@@ -268,6 +309,17 @@ def send_simple(msgtype, message, name, avatar):
send_to_discord(discord_msg, meta=DiscordMessageMetadata("POST"))
+def run_hooks(hooks, *arguments):
+ for hook in hooks:
+ try:
+ hook(*arguments)
+ except:
+ if settings.get("error_tolerance", 1) > 0:
+ misc_logger.exception("On running a pre hook, ignoring pre-hook")
+ else:
+ raise
+
+
def profile_field_name(name, embed):
try:
return profile_fields[name]
@@ -298,13 +350,13 @@ class LinkParser(HTMLParser):
def handle_data(self, data):
if self.recent_href:
- self.new_string = self.new_string + "[{}](<{}>)".format(data.replace("//", "/\\/"), self.recent_href)
+ self.new_string = self.new_string + "[{}](<{}>)".format(src.api.util.sanitize_to_markdown(data), self.recent_href)
self.recent_href = ""
else:
- self.new_string = self.new_string + data.replace("//", "/\\/")
+ self.new_string = self.new_string + src.api.util.sanitize_to_markdown(data)
def handle_comment(self, data):
- self.new_string = self.new_string + data.replace("//", "/\\/")
+ self.new_string = self.new_string + src.api.util.sanitize_to_markdown(data)
def handle_endtag(self, tag):
misc_logger.debug(self.new_string)
diff --git a/src/rc_formatters.py b/src/rc_formatters.py
deleted file mode 100644
index 662e61b..0000000
--- a/src/rc_formatters.py
+++ /dev/null
@@ -1,1292 +0,0 @@
-import ipaddress
-import math
-import re
-import time
-import logging
-import datetime
-import json
-from urllib.parse import quote_plus, quote
-
-from bs4 import BeautifulSoup
-
-from src.configloader import settings
-from src.misc import link_formatter, create_article_path, WIKI_SCRIPT_PATH, safe_read, \
- WIKI_API_PATH, ContentParser, profile_field_name, LinkParser, AUTO_SUPPRESSION_ENABLED
-from src.discord.queue import send_to_discord
-from src.discord.message import DiscordMessage, DiscordMessageMetadata
-
-if AUTO_SUPPRESSION_ENABLED:
- from src.discord.redaction import delete_messages, redact_messages
-
-from src.i18n import rc_formatters
-#from src.rc import recent_changes, pull_comment
-_ = rc_formatters.gettext
-ngettext = rc_formatters.ngettext
-
-logger = logging.getLogger("rcgcdw.rc_formatters")
-#from src.rcgcdw import recent_changes, ngettext, logger, profile_field_name, LinkParser, pull_comment
-abusefilter_results = {"": _("None"), "warn": _("Warning issued"), "block": _("**Blocked user**"), "tag": _("Tagged the edit"), "disallow": _("Disallowed the action"), "rangeblock": _("**IP range blocked**"), "throttle": _("Throttled actions"), "blockautopromote": _("Removed autoconfirmed group"), "degroup": _("**Removed from privileged groups**")}
-abusefilter_actions = {"edit": _("Edit"), "upload": _("Upload"), "move": _("Move"), "stashupload": _("Stash upload"), "delete": _("Deletion"), "createaccount": _("Account creation"), "autocreateaccount": _("Auto account creation")}
-
-LinkParser = LinkParser()
-
-def format_user(change, recent_changes, action):
- if "anon" in change:
- author_url = create_article_path("Special:Contributions/{user}".format(
- user=change["user"].replace(" ", "_"))) # Replace here needed in case of #75
- logger.debug("current user: {} with cache of IPs: {}".format(change["user"], recent_changes.map_ips.keys()))
- if change["user"] not in list(recent_changes.map_ips.keys()):
- contibs = safe_read(recent_changes.safe_request(
- "{wiki}?action=query&format=json&list=usercontribs&uclimit=max&ucuser={user}&ucstart={timestamp}&ucprop=".format(
- wiki=WIKI_API_PATH, user=change["user"], timestamp=change["timestamp"])), "query", "usercontribs")
- if contibs is None:
- logger.warning(
- "WARNING: Something went wrong when checking amount of contributions for given IP address")
- if settings.get("hide_ips", False):
- change["user"] = _("Unregistered user")
- change["user"] = change["user"] + "(?)"
- else:
- recent_changes.map_ips[change["user"]] = len(contibs)
- logger.debug(
- "Current params user {} and state of map_ips {}".format(change["user"], recent_changes.map_ips))
- if settings.get("hide_ips", False):
- change["user"] = _("Unregistered user")
- change["user"] = "{author} ({contribs})".format(author=change["user"], contribs=len(contibs))
- else:
- logger.debug(
- "Current params user {} and state of map_ips {}".format(change["user"], recent_changes.map_ips))
- if action in ("edit", "new"):
- recent_changes.map_ips[change["user"]] += 1
- change["user"] = "{author} ({amount})".format(author=change["user"] if settings.get("hide_ips", False) is False else _("Unregistered user"),
- amount=recent_changes.map_ips[change["user"]])
- else:
- author_url = create_article_path("User:{}".format(change["user"].replace(" ", "_")))
- return change["user"], author_url
-
-
-def abuse_filter_format_user(change):
- author = change["user"]
- if settings.get("hide_ips", False):
- try:
- ipaddress.ip_address(change["user"])
- except ValueError:
- pass
- else:
- author = _("Unregistered user")
- return author
-
-
-def compact_abuselog_formatter(change, recent_changes):
- action = "abuselog/{}".format(change["result"])
- author_url = link_formatter(create_article_path("User:{user}".format(user=change["user"])))
- author = abuse_filter_format_user(change)
- message = _("[{author}]({author_url}) triggered *{abuse_filter}*, performing the action \"{action}\" on *[{target}]({target_url})* - action taken: {result}.").format(
- author=author, author_url=author_url, abuse_filter=change["filter"],
- action=abusefilter_actions.get(change["action"], _("Unknown")), target=change.get("title", _("Unknown")),
- target_url=link_formatter(create_article_path(change.get("title", _("Unknown")))),
- result=abusefilter_results.get(change["result"], _("Unknown")))
- send_to_discord(DiscordMessage("compact", action, settings["webhookURL"], content=message), meta=DiscordMessageMetadata("POST"))
-
-
-def compact_formatter(action, change, parsed_comment, categories, recent_changes):
- request_metadata = DiscordMessageMetadata("POST", rev_id=change.get("revid", None), log_id=change.get("logid", None), page_id=change.get("pageid", None))
- if action != "suppressed":
- author_url = link_formatter(create_article_path("User:{user}".format(user=change["user"])))
- if "anon" in change:
- change["user"] = _("Unregistered user")
- author = change["user"]
- else:
- author = change["user"]
- parsed_comment = "" if parsed_comment is None else " *("+parsed_comment+")*"
- if action in ["edit", "new"]:
- edit_link = link_formatter("{wiki}index.php?title={article}&curid={pageid}&diff={diff}&oldid={oldrev}".format(
- wiki=WIKI_SCRIPT_PATH, pageid=change["pageid"], diff=change["revid"], oldrev=change["old_revid"],
- article=change["title"]))
- logger.debug(edit_link)
- edit_size = change["newlen"] - change["oldlen"]
- sign = ""
- if edit_size > 0:
- sign = "+"
- bold = ""
- if abs(edit_size) > 500:
- bold = "**"
- if change["title"].startswith("MediaWiki:Tag-"):
- pass
- if action == "edit":
- content = _("[{author}]({author_url}) edited [{article}]({edit_link}){comment} {bold}({sign}{edit_size}){bold}").format(author=author, author_url=author_url, article=change["title"], edit_link=edit_link, comment=parsed_comment, edit_size=edit_size, sign=sign, bold=bold)
- else:
- content = _("[{author}]({author_url}) created [{article}]({edit_link}){comment} {bold}({sign}{edit_size}){bold}").format(author=author, author_url=author_url, article=change["title"], edit_link=edit_link, comment=parsed_comment, edit_size=edit_size, sign=sign, bold=bold)
- elif action =="upload/upload":
- file_link = link_formatter(create_article_path(change["title"]))
- content = _("[{author}]({author_url}) uploaded [{file}]({file_link}){comment}").format(author=author,
- author_url=author_url,
- file=change["title"],
- file_link=file_link,
- comment=parsed_comment)
- elif action == "upload/revert":
- file_link = link_formatter(create_article_path(change["title"]))
- content = _("[{author}]({author_url}) reverted a version of [{file}]({file_link}){comment}").format(
- author=author, author_url=author_url, file=change["title"], file_link=file_link, comment=parsed_comment)
- elif action == "upload/overwrite":
- file_link = link_formatter(create_article_path(change["title"]))
- content = _("[{author}]({author_url}) uploaded a new version of [{file}]({file_link}){comment}").format(author=author, author_url=author_url, file=change["title"], file_link=file_link, comment=parsed_comment)
- elif action == "delete/delete":
- page_link = link_formatter(create_article_path(change["title"]))
- content = _("[{author}]({author_url}) deleted [{page}]({page_link}){comment}").format(author=author, author_url=author_url, page=change["title"], page_link=page_link,
- comment=parsed_comment)
- if AUTO_SUPPRESSION_ENABLED:
- delete_messages(dict(pageid=change.get("pageid")))
- elif action == "delete/delete_redir":
- page_link = link_formatter(create_article_path(change["title"]))
- content = _("[{author}]({author_url}) deleted redirect by overwriting [{page}]({page_link}){comment}").format(author=author, author_url=author_url, page=change["title"], page_link=page_link,
- comment=parsed_comment)
- if AUTO_SUPPRESSION_ENABLED:
- delete_messages(dict(pageid=change.get("pageid")))
- elif action == "move/move":
- link = link_formatter(create_article_path(change["logparams"]['target_title']))
- redirect_status = _("without making a redirect") if "suppressredirect" in change["logparams"] else _("with a redirect")
- content = _("[{author}]({author_url}) moved {redirect}*{article}* to [{target}]({target_url}) {made_a_redirect}{comment}").format(author=author, author_url=author_url, redirect="⤷ " if "redirect" in change else "", article=change["title"],
- target=change["logparams"]['target_title'], target_url=link, comment=parsed_comment, made_a_redirect=redirect_status)
- elif action == "move/move_redir":
- link = link_formatter(create_article_path(change["logparams"]["target_title"]))
- redirect_status = _("without making a redirect") if "suppressredirect" in change["logparams"] else _(
- "with a redirect")
- content = _("[{author}]({author_url}) moved {redirect}*{article}* over redirect to [{target}]({target_url}) {made_a_redirect}{comment}").format(author=author, author_url=author_url, redirect="⤷ " if "redirect" in change else "", article=change["title"],
- target=change["logparams"]['target_title'], target_url=link, comment=parsed_comment, made_a_redirect=redirect_status)
- elif action == "protect/move_prot":
- link = link_formatter(create_article_path(change["logparams"]["oldtitle_title"]))
- content = _(
- "[{author}]({author_url}) moved protection settings from {redirect}*{article}* to [{target}]({target_url}){comment}").format(author=author, author_url=author_url, redirect="⤷ " if "redirect" in change else "", article=change["logparams"]["oldtitle_title"],
- target=change["title"], target_url=link, comment=parsed_comment)
- elif action == "block/block":
- user = change["title"].split(':', 1)[1]
- restriction_description = ""
- try:
- ipaddress.ip_address(user)
- link = link_formatter(create_article_path("Special:Contributions/{user}".format(user=user)))
- except ValueError:
- link = link_formatter(create_article_path(change["title"]))
- if change["logparams"]["duration"] in ["infinite", "indefinite", "infinity", "never"]:
- block_time = _("for infinity and beyond")
- else:
- english_length = re.sub(r"(\d+)", "", change["logparams"][
- "duration"]) # note that translation won't work for millenia and century yet
- english_length_num = re.sub(r"(\D+)", "", change["logparams"]["duration"])
- try:
- if "@" in english_length:
- raise ValueError
- english_length = english_length.rstrip("s").strip()
- block_time = _("for {num} {translated_length}").format(num=english_length_num,
- translated_length=ngettext(english_length,
- english_length + "s",
- int(english_length_num)))
- except (AttributeError, ValueError):
- date_time_obj = datetime.datetime.strptime(change["logparams"]["expiry"], '%Y-%m-%dT%H:%M:%SZ')
- block_time = _("until {}").format(date_time_obj.strftime("%Y-%m-%d %H:%M:%S UTC"))
- if "sitewide" not in change["logparams"]:
- if "restrictions" in change["logparams"]:
- if "pages" in change["logparams"]["restrictions"] and change["logparams"]["restrictions"]["pages"]:
- restriction_description = _(" on pages: ")
- for page in change["logparams"]["restrictions"]["pages"]:
- restricted_pages = ["*{page}*".format(page=i["page_title"]) for i in change["logparams"]["restrictions"]["pages"]]
- restriction_description = restriction_description + ", ".join(restricted_pages)
- if "namespaces" in change["logparams"]["restrictions"] and change["logparams"]["restrictions"]["namespaces"]:
- namespaces = []
- if restriction_description:
- restriction_description = restriction_description + _(" and namespaces: ")
- else:
- restriction_description = _(" on namespaces: ")
- for namespace in change["logparams"]["restrictions"]["namespaces"]:
- if str(namespace) in recent_changes.namespaces: # if we have cached namespace name for given namespace number, add its name to the list
- namespaces.append("*{ns}*".format(ns=recent_changes.namespaces[str(namespace)]["*"]))
- else:
- namespaces.append("*{ns}*".format(ns=namespace))
- restriction_description = restriction_description + ", ".join(namespaces)
- restriction_description = restriction_description + "."
- if len(restriction_description) > 1020:
- logger.debug(restriction_description)
- restriction_description = restriction_description[:1020] + "…"
- content = _(
- "[{author}]({author_url}) blocked [{user}]({user_url}) {time}{restriction_desc}{comment}").format(author=author, author_url=author_url, user=user, time=block_time, user_url=link, restriction_desc=restriction_description, comment=parsed_comment)
- elif action == "block/reblock":
- link = link_formatter(create_article_path(change["title"]))
- user = change["title"].split(':', 1)[1]
- content = _("[{author}]({author_url}) changed block settings for [{blocked_user}]({user_url}){comment}").format(author=author, author_url=author_url, blocked_user=user, user_url=link, comment=parsed_comment)
- elif action == "block/unblock":
- link = link_formatter(create_article_path(change["title"]))
- user = change["title"].split(':', 1)[1]
- content = _("[{author}]({author_url}) unblocked [{blocked_user}]({user_url}){comment}").format(author=author, author_url=author_url, blocked_user=user, user_url=link, comment=parsed_comment)
- elif action == "curseprofile/comment-created":
- link = link_formatter(create_article_path("Special:CommentPermalink/{commentid}".format(commentid=change["logparams"]["4:comment_id"])))
- target_user = change["title"].split(':', 1)[1]
- if target_user != author:
- content = _("[{author}]({author_url}) left a [comment]({comment}) on {target}'s profile".format(author=author, author_url=author_url, comment=link, target=target_user))
- else:
- content = _("[{author}]({author_url}) left a [comment]({comment}) on their own profile".format(author=author, author_url=author_url, comment=link))
- elif action == "curseprofile/comment-replied":
- link = link_formatter(create_article_path("Special:CommentPermalink/{commentid}".format(commentid=change["logparams"]["4:comment_id"])))
- target_user = change["title"].split(':', 1)[1]
- if target_user != author:
- content = _(
- "[{author}]({author_url}) replied to a [comment]({comment}) on {target}'s profile".format(author=author,
- author_url=author_url,
- comment=link,
- target=target_user))
- else:
- content = _(
- "[{author}]({author_url}) replied to a [comment]({comment}) on their own profile".format(author=author,
- comment=link,
- author_url=author_url))
- elif action == "curseprofile/comment-edited":
- link = link_formatter(create_article_path("Special:CommentPermalink/{commentid}".format(commentid=change["logparams"]["4:comment_id"])))
- target_user = change["title"].split(':', 1)[1]
- if target_user != author:
- content = _(
- "[{author}]({author_url}) edited a [comment]({comment}) on {target}'s profile".format(author=author,
- author_url=author_url,
- comment=link,
- target=target_user))
- else:
- content = _(
- "[{author}]({author_url}) edited a [comment]({comment}) on their own profile".format(author=author,
- comment=link,
- author_url=author_url))
- elif action == "curseprofile/comment-purged":
- target_user = change["title"].split(':', 1)[1]
- if target_user != author:
- content = _("[{author}]({author_url}) purged a comment on {target}'s profile".format(author=author, author_url=author_url,target=target_user))
- else:
- content = _("[{author}]({author_url}) purged a comment on their own profile".format(author=author, author_url=author_url))
- elif action == "curseprofile/comment-deleted":
- if "4:comment_id" in change["logparams"]:
- link = link_formatter(create_article_path("Special:CommentPermalink/{commentid}".format(commentid=change["logparams"]["4:comment_id"])))
- else:
- link = link_formatter(create_article_path(change["title"]))
- target_user = change["title"].split(':', 1)[1]
- if target_user != author:
- content = _("[{author}]({author_url}) deleted a [comment]({comment}) on {target}'s profile".format(author=author,author_url=author_url, comment=link, target=target_user))
- else:
- content = _("[{author}]({author_url}) deleted a [comment]({comment}) on their own profile".format(author=author, author_url=author_url, comment=link))
- elif action == "curseprofile/profile-edited":
- target_user = change["title"].split(':', 1)[1]
- link = link_formatter(create_article_path("UserProfile:{user}".format(user=target_user)))
- if target_user != author:
- content = _("[{author}]({author_url}) edited the {field} on [{target}]({target_url})'s profile. *({desc})*").format(author=author,
- author_url=author_url,
- target=target_user,
- target_url=link,
- field=profile_field_name(change["logparams"]['4:section'], False),
- desc=BeautifulSoup(change["parsedcomment"], "lxml").get_text())
- else:
- content = _("[{author}]({author_url}) edited the {field} on [their own]({target_url}) profile. *({desc})*").format(
- author=author,
- author_url=author_url,
- target_url=link,
- field=profile_field_name(change["logparams"]['4:section'], False),
- desc=BeautifulSoup(change["parsedcomment"], "lxml").get_text())
- elif action in ("rights/rights", "rights/autopromote"):
- link = link_formatter(create_article_path("User:{user}".format(user=change["title"].split(":")[1])))
- old_groups = []
- new_groups = []
- for name in change["logparams"]["oldgroups"]:
- old_groups.append(_(name))
- for name in change["logparams"]["newgroups"]:
- new_groups.append(_(name))
- if len(old_groups) == 0:
- old_groups = [_("none")]
- if len(new_groups) == 0:
- new_groups = [_("none")]
-
- if action == "rights/rights":
- content = _("[{author}]({author_url}) changed group membership for [{target}]({target_url}) from {old_groups} to {new_groups}{comment}").format(author=author, author_url=author_url, target=change["title"].split(":")[1], target_url=link, old_groups=", ".join(old_groups), new_groups=', '.join(new_groups), comment=parsed_comment)
- else:
- content = _("{author} autopromoted [{target}]({target_url}) from {old_groups} to {new_groups}{comment}").format(
- author=_("System"), author_url=author_url, target=change["title"].split(":")[1], target_url=link,
- old_groups=", ".join(old_groups), new_groups=', '.join(new_groups),
- comment=parsed_comment)
- elif action == "protect/protect":
- link = link_formatter(create_article_path(change["title"]))
- content = _("[{author}]({author_url}) protected [{article}]({article_url}) with the following settings: {settings}{comment}").format(author=author, author_url=author_url,
- article=change["title"], article_url=link,
- settings=change["logparams"].get("description", "")+(_(" [cascading]") if "cascade" in change["logparams"] else ""),
- comment=parsed_comment)
- elif action == "protect/modify":
- link = link_formatter(create_article_path(change["title"]))
- content = _(
- "[{author}]({author_url}) modified protection settings of [{article}]({article_url}) to: {settings}{comment}").format(
- author=author, author_url=author_url,
- article=change["title"], article_url=link,
- settings=change["logparams"].get("description", "") + (_(" [cascading]") if "cascade" in change["logparams"] else ""),
- comment=parsed_comment)
- elif action == "protect/unprotect":
- link = link_formatter(create_article_path(change["title"]))
- content = _("[{author}]({author_url}) removed protection from [{article}]({article_url}){comment}").format(author=author, author_url=author_url, article=change["title"], article_url=link, comment=parsed_comment)
- elif action == "delete/revision":
- amount = len(change["logparams"]["ids"])
- link = link_formatter(create_article_path(change["title"]))
- content = ngettext("[{author}]({author_url}) changed visibility of revision on page [{article}]({article_url}){comment}",
- "[{author}]({author_url}) changed visibility of {amount} revisions on page [{article}]({article_url}){comment}", amount).format(author=author, author_url=author_url,
- article=change["title"], article_url=link, amount=amount, comment=parsed_comment)
- if AUTO_SUPPRESSION_ENABLED:
- try:
- logparams = change["logparams"]
- pageid = change["pageid"]
- except KeyError:
- pass
- else:
- delete_messages(dict(pageid=pageid))
- elif action == "import/upload":
- link = link_formatter(create_article_path(change["title"]))
- content = ngettext("[{author}]({author_url}) imported [{article}]({article_url}) with {count} revision{comment}",
- "[{author}]({author_url}) imported [{article}]({article_url}) with {count} revisions{comment}", change["logparams"]["count"]).format(
- author=author, author_url=author_url, article=change["title"], article_url=link, count=change["logparams"]["count"], comment=parsed_comment)
- elif action == "delete/restore":
- link = link_formatter(create_article_path(change["title"]))
- content = _("[{author}]({author_url}) restored [{article}]({article_url}){comment}").format(author=author, author_url=author_url, article=change["title"], article_url=link, comment=parsed_comment)
- elif action == "delete/event":
- content = _("[{author}]({author_url}) changed visibility of log events{comment}").format(author=author, author_url=author_url, comment=parsed_comment)
- if AUTO_SUPPRESSION_ENABLED:
- try:
- logparams = change["logparams"]
- except KeyError:
- pass
- else:
- for revid in logparams.get("ids", []):
- delete_messages(dict(revid=revid))
- elif action == "import/interwiki":
- link = link_formatter(create_article_path(change["title"]))
- source_link = link_formatter(create_article_path(change["logparams"]["interwiki_title"]))
- content = ngettext("[{author}]({author_url}) imported [{article}]({article_url}) with {count} revision from [{source}]({source_url}){comment}",
- "[{author}]({author_url}) imported [{article}]({article_url}) with {count} revisions from [{source}]({source_url}){comment}", change["logparams"]["count"]).format(
- author=author, author_url=author_url, article=change["title"], article_url=link, count=change["logparams"]["count"], source=change["logparams"]["interwiki_title"], source_url=source_link, comment=parsed_comment)
- elif action == "abusefilter/modify":
- link = link_formatter(create_article_path("Special:AbuseFilter/history/{number}/diff/prev/{historyid}".format(number=change["logparams"]['newId'], historyid=change["logparams"]["historyId"])))
- content = _("[{author}]({author_url}) edited abuse filter [number {number}]({filter_url})").format(author=author, author_url=author_url, number=change["logparams"]['newId'], filter_url=link)
- elif action == "abusefilter/create":
- link = link_formatter(
- create_article_path("Special:AbuseFilter/{number}".format(number=change["logparams"]['newId'])))
- content = _("[{author}]({author_url}) created abuse filter [number {number}]({filter_url})").format(author=author, author_url=author_url, number=change["logparams"]['newId'], filter_url=link)
- elif action == "merge/merge":
- link = link_formatter(create_article_path(change["title"]))
- link_dest = link_formatter(create_article_path(change["logparams"]["dest_title"]))
- content = _("[{author}]({author_url}) merged revision histories of [{article}]({article_url}) into [{dest}]({dest_url}){comment}").format(author=author, author_url=author_url, article=change["title"], article_url=link, dest_url=link_dest,
- dest=change["logparams"]["dest_title"], comment=parsed_comment)
- elif action == "newusers/autocreate":
- content = _("Account [{author}]({author_url}) was created automatically").format(author=author, author_url=author_url)
- elif action == "newusers/create":
- content = _("Account [{author}]({author_url}) was created").format(author=author, author_url=author_url)
- elif action == "newusers/create2":
- link = link_formatter(create_article_path(change["title"]))
- content = _("Account [{article}]({article_url}) was created by [{author}]({author_url}){comment}").format(article=change["title"], article_url=link, author=author, author_url=author_url, comment=parsed_comment)
- elif action == "newusers/byemail":
- link = link_formatter(create_article_path(change["title"]))
- content = _("Account [{article}]({article_url}) was created by [{author}]({author_url}) and password was sent by email{comment}").format(article=change["title"], article_url=link, author=author, author_url=author_url, comment=parsed_comment)
- elif action == "newusers/newusers":
- content = _("Account [{author}]({author_url}) was created").format(author=author, author_url=author_url)
- elif action == "interwiki/iw_add":
- link = link_formatter(create_article_path("Special:Interwiki"))
- content = _("[{author}]({author_url}) added an entry to the [interwiki table]({table_url}) pointing to {website} with {prefix} prefix").format(author=author, author_url=author_url, desc=parsed_comment,
- prefix=change["logparams"]['0'],
- website=change["logparams"]['1'],
- table_url=link)
- elif action == "interwiki/iw_edit":
- link = link_formatter(create_article_path("Special:Interwiki"))
- content = _("[{author}]({author_url}) edited an entry in [interwiki table]({table_url}) pointing to {website} with {prefix} prefix").format(author=author, author_url=author_url, desc=parsed_comment,
- prefix=change["logparams"]['0'],
- website=change["logparams"]['1'],
- table_url=link)
- elif action == "interwiki/iw_delete":
- link = link_formatter(create_article_path("Special:Interwiki"))
- content = _("[{author}]({author_url}) deleted an entry in [interwiki table]({table_url})").format(author=author, author_url=author_url, table_url=link)
- elif action == "contentmodel/change":
- link = link_formatter(create_article_path(change["title"]))
- content = _("[{author}]({author_url}) changed the content model of the page [{article}]({article_url}) from {old} to {new}{comment}").format(author=author, author_url=author_url, article=change["title"], article_url=link, old=change["logparams"]["oldmodel"],
- new=change["logparams"]["newmodel"], comment=parsed_comment)
- elif action == "contentmodel/new":
- link = link_formatter(create_article_path(change["title"]))
- content = _("[{author}]({author_url}) created the page [{article}]({article_url}) using a non-default content model {new}{comment}").format(author=author, author_url=author_url, article=change["title"], article_url=link, new=change["logparams"]["newmodel"], comment=parsed_comment)
- elif action == "sprite/sprite":
- link = link_formatter(create_article_path(change["title"]))
- content = _("[{author}]({author_url}) edited the sprite for [{article}]({article_url})").format(author=author, author_url=author_url, article=change["title"], article_url=link)
- elif action == "sprite/sheet":
- link = link_formatter(create_article_path(change["title"]))
- content = _("[{author}]({author_url}) created the sprite sheet for [{article}]({article_url})").format(author=author, author_url=author_url, article=change["title"], article_url=link)
- elif action == "sprite/slice":
- link = link_formatter(create_article_path(change["title"]))
- content = _("[{author}]({author_url}) edited the slice for [{article}]({article_url})").format(author=author, author_url=author_url, article=change["title"], article_url=link)
- elif action == "cargo/createtable":
- LinkParser.feed(change["logparams"]["0"])
- table = LinkParser.new_string
- LinkParser.new_string = ""
- content = _("[{author}]({author_url}) created the Cargo table \"{table}\"").format(author=author, author_url=author_url, table=table)
- elif action == "cargo/deletetable":
- content = _("[{author}]({author_url}) deleted the Cargo table \"{table}\"").format(author=author, author_url=author_url, table=change["logparams"]["0"])
- elif action == "cargo/recreatetable":
- LinkParser.feed(change["logparams"]["0"])
- table = LinkParser.new_string
- LinkParser.new_string = ""
- content = _("[{author}]({author_url}) recreated the Cargo table \"{table}\"").format(author=author, author_url=author_url, table=table)
- elif action == "cargo/replacetable":
- LinkParser.feed(change["logparams"]["0"])
- table = LinkParser.new_string
- LinkParser.new_string = ""
- content = _("[{author}]({author_url}) replaced the Cargo table \"{table}\"").format(author=author, author_url=author_url, table=table)
- elif action == "managetags/create":
- link = link_formatter(create_article_path(change["title"]))
- content = _("[{author}]({author_url}) created the [tag]({tag_url}) \"{tag}\"{comment}").format(author=author, author_url=author_url, tag=change["logparams"]["tag"], tag_url=link, comment=parsed_comment)
- recent_changes.init_info()
- elif action == "managetags/delete":
- link = link_formatter(create_article_path(change["title"]))
- if change["logparams"]["count"] == 0:
- content = _("[{author}]({author_url}) deleted the [tag]({tag_url}) \"{tag}\"{comment}").format(author=author, author_url=author_url, tag=change["logparams"]["tag"], tag_url=link, comment=parsed_comment)
- else:
- content = ngettext("[{author}]({author_url}) deleted the [tag]({tag_url}) \"{tag}\" and removed it from {count} revision or log entry{comment}",
- "[{author}]({author_url}) deleted the [tag]({tag_url}) \"{tag}\" and removed it from {count} revisions and/or log entries{comment}",
- change["logparams"]["count"]).format(author=author, author_url=author_url, tag=change["logparams"]["tag"], tag_url=link, count=change["logparams"]["count"], comment=parsed_comment)
- recent_changes.init_info()
- elif action == "managetags/activate":
- link = link_formatter(create_article_path(change["title"]))
- content = _("[{author}]({author_url}) activated the [tag]({tag_url}) \"{tag}\"{comment}").format(author=author, author_url=author_url, tag=change["logparams"]["tag"], tag_url=link, comment=parsed_comment)
- elif action == "managetags/deactivate":
- link = link_formatter(create_article_path(change["title"]))
- content = _("[{author}]({author_url}) deactivated the [tag]({tag_url}) \"{tag}\"{comment}").format(author=author, author_url=author_url, tag=change["logparams"]["tag"], tag_url=link, comment=parsed_comment)
- elif action == "managewiki/settings": # Miraheze's ManageWiki extension https://github.com/miraheze/ManageWiki
- content = _("[{author}]({author_url}) changed wiki settings{reason}".format(author=author, author_url=author_url, reason=parsed_comment))
- elif action == "managewiki/delete":
- content = _("[{author}]({author_url}) deleted a wiki *{wiki_name}*{comment}").format(author=author, author_url=author_url,
- wiki_name=change["logparams"].get("wiki", _("Unknown")), comment=parsed_comment)
- elif action == "managewiki/lock":
- content = _("[{author}]({author_url}) locked a wiki *{wiki_name}*{comment}").format(
- author=author, author_url=author_url, wiki_name=change["logparams"].get("wiki", _("Unknown")), comment=parsed_comment)
- elif action == "managewiki/namespaces":
- content = _("[{author}]({author_url}) modified namespace *{namespace_name}* on *{wiki_name}*{comment}").format(
- author=author, author_url=author_url, namespace_name=change["logparams"].get("namespace", _("Unknown")),
- wiki_name=change["logparams"].get("wiki", _("Unknown")), comment=parsed_comment)
- elif action == "managewiki/namespaces-delete":
- content = _(
- "[{author}]({author_url}) deleted a namespace *{namespace_name}* on *{wiki_name}*{comment}").format(
- author=author, author_url=author_url,
- namespace_name=change["logparams"].get("namespace", _("Unknown")),
- wiki_name=change["logparams"].get("wiki", _("Unknown")), comment=parsed_comment)
- elif action == "managewiki/rights":
- group_name = change["title"].split("/permissions/", 1)[1]
- content = _("[{author}]({author_url}) modified user group *{group_name}*{comment}").format(
- author=author, author_url=author_url, group_name=group_name, comment=parsed_comment
- )
- elif action == "managewiki/undelete":
- content = _("[{author}]({author_url}) undeleted a wiki *{wiki_name}*{comment}").format(
- author=author, author_url=author_url, wiki_name=change["logparams"].get("wiki", _("Unknown")), comment=parsed_comment
- )
- elif action == "managewiki/unlock":
- content = _("[{author}]({author_url}) unlocked a wiki *{wiki_name}*{comment}").format(
- author=author, author_url=author_url, wiki_name=change["logparams"].get("wiki", _("Unknown")),
- comment=parsed_comment
- )
- elif action == "datadump/generate":
- content = _("[{author}]({author_url}) generated *{file}* dump{comment}").format(
- author=author, author_url=author_url, file=change["logparams"]["filename"],
- comment=parsed_comment
- )
- elif action == "datadump/delete":
- content = _("[{author}]({author_url}) deleted *{file}* dump{comment}").format(
- author=author, author_url=author_url, file=change["logparams"]["filename"],
- comment=parsed_comment
- )
- elif action == "pagetranslation/mark":
- link = create_article_path(change["title"])
- if "?" in link:
- link = link + "&oldid={}".format(change["logparams"]["revision"])
- else:
- link = link + "?oldid={}".format(change["logparams"]["revision"])
- link = link_formatter(link)
- content = _("[{author}]({author_url}) marked [{article}]({article_url}) for translation{comment}").format(
- author=author, author_url=author_url,
- article=change["title"], article_url=link,
- comment=parsed_comment
- )
- elif action == "pagetranslation/unmark":
- link = link_formatter(create_article_path(change["title"]))
- content = _("[{author}]({author_url}) removed [{article}]({article_url}) from the translation system{comment}").format(
- author=author, author_url=author_url,
- article=change["title"], article_url=link,
- comment=parsed_comment
- )
- elif action == "pagetranslation/moveok":
- link = link_formatter(create_article_path(change["logparams"]["target"]))
- content = _("[{author}]({author_url}) completed moving translation pages from *{article}* to [{target}]({target_url}){comment}").format(
- author=author, author_url=author_url,
- article=change["title"], target=change["logparams"]["target"], target_url=link,
- comment=parsed_comment
- )
- elif action == "pagetranslation/movenok":
- link = link_formatter(create_article_path(change["title"]))
- target_url = link_formatter(create_article_path(change["logparams"]["target"]))
- content = _("[{author}]({author_url}) encountered a problem while moving [{article}]({article_url}) to [{target}]({target_url}){comment}").format(
- author=author, author_url=author_url,
- article=change["title"], article_url=link,
- target=change["logparams"]["target"], target_url=target_url,
- comment=parsed_comment
- )
- elif action == "pagetranslation/deletefok":
- link = link_formatter(create_article_path(change["title"]))
- content = _("[{author}]({author_url}) completed deletion of translatable page [{article}]({article_url}){comment}").format(
- author=author, author_url=author_url,
- article=change["title"], article_url=link,
- comment=parsed_comment
- )
- elif action == "pagetranslation/deletefnok":
- link = link_formatter(create_article_path(change["title"]))
- target_url = link_formatter(create_article_path(change["logparams"]["target"]))
- content = _("[{author}]({author_url}) failed to delete [{article}]({article_url}) which belongs to translatable page [{target}]({target_url}){comment}").format(
- author=author, author_url=author_url,
- article=change["title"], article_url=link,
- target=change["logparams"]["target"], target_url=target_url,
- comment=parsed_comment
- )
- elif action == "pagetranslation/deletelok":
- link = link_formatter(create_article_path(change["title"]))
- content = _("[{author}]({author_url}) completed deletion of translation page [{article}]({article_url}){comment}").format(
- author=author, author_url=author_url,
- article=change["title"], article_url=link,
- comment=parsed_comment
- )
- elif action == "pagetranslation/deletelnok":
- link = link_formatter(create_article_path(change["title"]))
- target_url = link_formatter(create_article_path(change["logparams"]["target"]))
- content = _("[{author}]({author_url}) failed to delete [{article}]({article_url}) which belongs to translation page [{target}]({target_url}){comment}").format(
- author=author, author_url=author_url,
- article=change["title"], article_url=link,
- target=change["logparams"]["target"], target_url=target_url,
- comment=parsed_comment
- )
- elif action == "pagetranslation/encourage":
- link = link_formatter(create_article_path(change["title"]))
- content = _("[{author}]({author_url}) encouraged translation of [{article}]({article_url}){comment}").format(
- author=author, author_url=author_url,
- article=change["title"], article_url=link,
- comment=parsed_comment
- )
- elif action == "pagetranslation/discourage":
- link = link_formatter(create_article_path(change["title"]))
- content = _("[{author}]({author_url}) discouraged translation of [{article}]({article_url}){comment}").format(
- author=author, author_url=author_url,
- article=change["title"], article_url=link,
- comment=parsed_comment
- )
- elif action == "pagetranslation/prioritylanguages":
- link = link_formatter(create_article_path(change["title"]))
- if "languages" in change["logparams"]:
- languages = "`, `".join(change["logparams"]["languages"].split(","))
- if change["logparams"]["force"] == "on":
- content = _("[{author}]({author_url}) limited languages for [{article}]({article_url}) to `{languages}`{comment}").format(
- author=author, author_url=author_url,
- article=change["title"], article_url=link,
- languages=languages, comment=parsed_comment
- )
- else:
- content = _("[{author}]({author_url}) set the priority languages for [{article}]({article_url}) to `{languages}`{comment}").format(
- author=author, author_url=author_url,
- article=change["title"], article_url=link,
- languages=languages, comment=parsed_comment
- )
- else:
- content = _("[{author}]({author_url}) removed priority languages from [{article}]({article_url}){comment}").format(
- author=author, author_url=author_url,
- article=change["title"], article_url=link,
- comment=parsed_comment
- )
- elif action == "pagetranslation/associate":
- link = link_formatter(create_article_path(change["title"]))
- content = _("[{author}]({author_url}) added translatable page [{article}]({article_url}) to aggregate group \"{group}\"{comment}").format(
- author=author, author_url=author_url,
- article=change["title"], article_url=link,
- group=change["logparams"]["aggregategroup"], comment=parsed_comment
- )
- elif action == "pagetranslation/dissociate":
- link = link_formatter(create_article_path(change["title"]))
- content = _("[{author}]({author_url}) removed translatable page [{article}]({article_url}) from aggregate group \"{group}\"{comment}").format(
- author=author, author_url=author_url,
- article=change["title"], article_url=link,
- group=change["logparams"]["aggregategroup"], comment=parsed_comment
- )
- elif action == "translationreview/message":
- link = create_article_path(change["title"])
- if "?" in link:
- link = link + "&oldid={}".format(change["logparams"]["revision"])
- else:
- link = link + "?oldid={}".format(change["logparams"]["revision"])
- link = link_formatter(link)
- content = _("[{author}]({author_url}) reviewed translation [{article}]({article_url}){comment}").format(
- author=author, author_url=author_url,
- article=change["title"], article_url=link,
- comment=parsed_comment
- )
- elif action == "translationreview/group":
- link = link_formatter(create_article_path(change["title"]))
- if "old-state" in change["logparams"]:
- content = _("[{author}]({author_url}) changed the state of `{language}` translations of [{article}]({article_url}) from `{old_state}` to `{new_state}`{comment}").format(
- author=author, author_url=author_url, language=change["logparams"]["language"],
- article=change["logparams"]["group-label"], article_url=link,
- old_state=change["logparams"]["old-state"], new_state=change["logparams"]["new-state"],
- comment=parsed_comment
- )
- else:
- content = _("[{author}]({author_url}) changed the state of `{language}` translations of [{article}]({article_url}) to `{new_state}`{comment}").format(
- author=author, author_url=author_url, language=change["logparams"]["language"],
- article=change["logparams"]["group-label"], article_url=link,
- new_state=change["logparams"]["new-state"], comment=parsed_comment
- )
- elif action == "pagelang/pagelang":
- link = link_formatter(create_article_path(change["title"]))
- old_lang = "`{}`".format(change["logparams"]["oldlanguage"])
- if change["logparams"]["oldlanguage"][-5:] == "[def]":
- old_lang = "`{}` {}".format(change["logparams"]["oldlanguage"][:-5], _("(default)"))
- new_lang = "`{}`".format(change["logparams"]["newlanguage"])
- if change["logparams"]["newlanguage"][-5:] == "[def]":
- new_lang = "`{}` {}".format(change["logparams"]["oldlanguage"][:-5], _("(default)"))
- content = _("[{author}]({author_url}) changed the language of [{article}]({article_url}) from {old_lang} to {new_lang}{comment}").format(
- author=author, author_url=author_url,
- article=change["title"], article_url=link,
- old_lang=old_lang, new_lang=new_lang, comment=parsed_comment
- )
- elif action == "renameuser/renameuser":
- link = link_formatter(create_article_path("User:"+change["logparams"]["newuser"]))
- edits = change["logparams"]["edits"]
- if edits > 0:
- content = ngettext("[{author}]({author_url}) renamed user *{old_name}* with {edits} edit to [{new_name}]({link}){comment}",
- "[{author}]({author_url}) renamed user *{old_name}* with {edits} edits to [{new_name}]({link}){comment}", edits).format(
- author=author, author_url=author_url, old_name=change["logparams"]["olduser"], edits=edits, new_name=change["logparams"]["newuser"], link=link, comment=parsed_comment
- )
- else:
- content = _("[{author}]({author_url}) renamed user *{old_name}* to [{new_name}]({link}){comment}").format(
- author=author, author_url=author_url, old_name=change["logparams"]["olduser"], new_name=change["logparams"]["newuser"], link=link, comment=parsed_comment
- )
- elif action == "suppressed":
- content = _("An action has been hidden by administration.")
- else:
- logger.warning("No entry for {event} with params: {params}".format(event=action, params=change))
- if not settings.get("support", None):
- return
- else:
- content = _(
- "Unknown event `{event}` by [{author}]({author_url}), report it on the [support server](<{support}>).").format(
- event=action, author=author, author_url=author_url, support=settings["support"])
- action = "unknown"
- send_to_discord(DiscordMessage("compact", action, settings["webhookURL"], content=content), meta=request_metadata)
-
-def embed_abuselog_formatter(change, recent_changes):
- action = "abuselog/{}".format(change["result"])
- embed = DiscordMessage("embed", action, settings["webhookURL"])
- author = abuse_filter_format_user(change)
- embed["title"] = _("{user} triggered \"{abuse_filter}\"").format(user=author, abuse_filter=change["filter"])
- embed.add_field(_("Performed"), abusefilter_actions.get(change["action"], _("Unknown")))
- embed.add_field(_("Action taken"), abusefilter_results.get(change["result"], _("Unknown")))
- embed.add_field(_("Title"), change.get("title", _("Unknown")))
- embed.finish_embed()
- send_to_discord(embed, meta=DiscordMessageMetadata("POST"))
-
-
-def embed_formatter(action, change, parsed_comment, categories, recent_changes):
- embed = DiscordMessage("embed", action, settings["webhookURL"])
- request_metadata = DiscordMessageMetadata("POST", rev_id=change.get("revid", None), log_id=change.get("logid", None), page_id=change.get("pageid", None))
- if parsed_comment is None:
- parsed_comment = _("No description provided")
- if action != "suppressed":
- change["user"], author_url = format_user(change, recent_changes, action)
- embed.set_author(change["user"], author_url)
- if action in ("edit", "new"): # edit or new page
- editsize = change["newlen"] - change["oldlen"]
- if editsize > 0:
- if editsize > 6032:
- embed["color"] = 65280
- else:
- embed["color"] = 35840 + (math.floor(editsize / 52)) * 256
- elif editsize < 0:
- if editsize < -6032:
- embed["color"] = 16711680
- else:
- embed["color"] = 9175040 + (math.floor((editsize * -1) / 52)) * 65536
- elif editsize == 0:
- embed["color"] = 8750469
- if change["title"].startswith("MediaWiki:Tag-"): # Refresh tag list when tag display name is edited
- recent_changes.init_info()
- link = "{wiki}index.php?title={article}&curid={pageid}&diff={diff}&oldid={oldrev}".format(
- wiki=WIKI_SCRIPT_PATH, pageid=change["pageid"], diff=change["revid"], oldrev=change["old_revid"],
- article=change["title"].replace(" ", "_").replace("%", "%25").replace("\\", "%5C").replace("&", "%26"))
- embed["title"] = "{redirect}{article} ({new}{minor}{bot}{space}{editsize})".format(redirect="⤷ " if "redirect" in change else "", article=change["title"], editsize="+" + str(
- editsize) if editsize > 0 else editsize, new=_("(N!) ") if action == "new" else "",
- minor=_("m") if action == "edit" and "minor" in change else "", bot=_('b') if "bot" in change else "", space=" " if "bot" in change or (action == "edit" and "minor" in change) or action == "new" else "")
- if settings["appearance"]["embed"]["show_edit_changes"]:
- if action == "new":
- changed_content = safe_read(recent_changes.safe_request(
- "{wiki}?action=compare&format=json&fromtext=&torev={diff}&topst=1&prop=diff".format(
- wiki=WIKI_API_PATH, diff=change["revid"]
- )), "compare", "*")
- else:
- changed_content = safe_read(recent_changes.safe_request(
- "{wiki}?action=compare&format=json&fromrev={oldrev}&torev={diff}&topst=1&prop=diff".format(
- wiki=WIKI_API_PATH, diff=change["revid"],oldrev=change["old_revid"]
- )), "compare", "*")
- if changed_content:
- EditDiff = ContentParser()
- EditDiff.feed(changed_content)
- if EditDiff.small_prev_del:
- if EditDiff.small_prev_del.replace("~~", "").isspace():
- EditDiff.small_prev_del = _('__Only whitespace__')
- else:
- EditDiff.small_prev_del = EditDiff.small_prev_del.replace("~~~~", "")
- if EditDiff.small_prev_ins:
- if EditDiff.small_prev_ins.replace("**", "").isspace():
- EditDiff.small_prev_ins = _('__Only whitespace__')
- else:
- EditDiff.small_prev_ins = EditDiff.small_prev_ins.replace("****", "")
- logger.debug("Changed content: {}".format(EditDiff.small_prev_ins))
- if EditDiff.small_prev_del and not action == "new":
- embed.add_field(_("Removed"), "{data}".format(data=EditDiff.small_prev_del), inline=True)
- if EditDiff.small_prev_ins:
- embed.add_field(_("Added"), "{data}".format(data=EditDiff.small_prev_ins), inline=True)
- else:
- logger.warning("Unable to download data on the edit content!")
- elif action in ("upload/overwrite", "upload/upload", "upload/revert"): # sending files
- license = None
- urls = safe_read(recent_changes.safe_request(
- "{wiki}?action=query&format=json&prop=imageinfo&list=&meta=&titles={filename}&iiprop=timestamp%7Curl%7Carchivename&iilimit=5".format(
- wiki=WIKI_API_PATH, filename=change["title"])), "query", "pages")
- link = create_article_path(change["title"])
- additional_info_retrieved = False
- if urls is not None:
- logger.debug(urls)
- if "-1" not in urls: # image still exists and not removed
- try:
- img_info = next(iter(urls.values()))["imageinfo"]
- for num, revision in enumerate(img_info):
- if revision["timestamp"] == change["logparams"]["img_timestamp"]: # find the correct revision corresponding for this log entry
- image_direct_url = "{rev}?{cache}".format(rev=revision["url"], cache=int(time.time()*5)) # cachebusting
- additional_info_retrieved = True
- break
- except KeyError:
- logger.warning("Wiki did not respond with extended information about file. The preview will not be shown.")
- else:
- logger.warning("Request for additional image information have failed. The preview will not be shown.")
- if action in ("upload/overwrite", "upload/revert"):
- if additional_info_retrieved:
- article_encoded = change["title"].replace(" ", "_").replace("%", "%25").replace("\\", "%5C").replace("&", "%26").replace(')', '\\)')
- try:
- revision = img_info[num+1]
- except IndexError:
- logger.exception("Could not analize the information about the image (does it have only one version when expected more in overwrite?) which resulted in no Options field: {}".format(img_info))
- else:
- undolink = "{wiki}index.php?title={filename}&action=revert&oldimage={archiveid}".format(
- wiki=WIKI_SCRIPT_PATH, filename=article_encoded, archiveid=revision["archivename"])
- embed.add_field(_("Options"), _("([preview]({link}) | [undo]({undolink}))").format(
- link=image_direct_url, undolink=undolink))
- if settings["appearance"]["embed"]["embed_images"]:
- embed["image"]["url"] = image_direct_url
- if action == "upload/overwrite":
- embed["title"] = _("Uploaded a new version of {name}").format(name=change["title"])
- elif action == "upload/revert":
- embed["title"] = _("Reverted a version of {name}").format(name=change["title"])
- else:
- embed["title"] = _("Uploaded {name}").format(name=change["title"])
- if settings["license_detection"]:
- article_content = safe_read(recent_changes.safe_request(
- "{wiki}?action=query&format=json&prop=revisions&titles={article}&rvprop=content".format(
- wiki=WIKI_API_PATH, article=quote_plus(change["title"], safe=''))), "query", "pages")
- if article_content is None:
- logger.warning("Something went wrong when getting license for the image")
- return 0
- if "-1" not in article_content:
- content = list(article_content.values())[0]['revisions'][0]['*']
- try:
- matches = re.search(re.compile(settings["license_regex"], re.IGNORECASE), content)
- if matches is not None:
- license = matches.group("license")
- else:
- if re.search(re.compile(settings["license_regex_detect"], re.IGNORECASE), content) is None:
- license = _("**No license!**")
- else:
- license = "?"
- except IndexError:
- logger.error(
- "Given regex for the license detection is incorrect. It does not have a capturing group called \"license\" specified. Please fix license_regex value in the config!")
- license = "?"
- except re.error:
- logger.error(
- "Given regex for the license detection is incorrect. Please fix license_regex or license_regex_detect values in the config!")
- license = "?"
- if license is not None:
- parsed_comment += _("\nLicense: {}").format(license)
- if additional_info_retrieved:
- embed.add_field(_("Options"), _("([preview]({link}))").format(link=image_direct_url))
- if settings["appearance"]["embed"]["embed_images"]:
- embed["image"]["url"] = image_direct_url
- elif action == "delete/delete":
- link = create_article_path(change["title"])
- embed["title"] = _("Deleted page {article}").format(article=change["title"])
- if AUTO_SUPPRESSION_ENABLED:
- delete_messages(dict(pageid=change.get("pageid")))
- elif action == "delete/delete_redir":
- link = create_article_path(change["title"])
- embed["title"] = _("Deleted redirect {article} by overwriting").format(article=change["title"])
- if AUTO_SUPPRESSION_ENABLED:
- delete_messages(dict(pageid=change.get("pageid")))
- elif action == "move/move":
- link = create_article_path(change["logparams"]['target_title'])
- parsed_comment = "{supress}. {desc}".format(desc=parsed_comment,
- supress=_("No redirect has been made") if "suppressredirect" in change["logparams"] else _(
- "A redirect has been made"))
- embed["title"] = _("Moved {redirect}{article} to {target}").format(redirect="⤷ " if "redirect" in change else "", article=change["title"], target=change["logparams"]['target_title'])
- elif action == "move/move_redir":
- link = create_article_path(change["logparams"]["target_title"])
- embed["title"] = _("Moved {redirect}{article} to {title} over redirect").format(redirect="⤷ " if "redirect" in change else "", article=change["title"],
- title=change["logparams"]["target_title"])
- elif action == "protect/move_prot":
- link = create_article_path(change["logparams"]["oldtitle_title"])
- embed["title"] = _("Moved protection settings from {redirect}{article} to {title}").format(redirect="⤷ " if "redirect" in change else "", article=change["logparams"]["oldtitle_title"],
- title=change["title"])
- elif action == "block/block":
- user = change["title"].split(':', 1)[1]
- try:
- ipaddress.ip_address(user)
- link = create_article_path("Special:Contributions/{user}".format(user=user))
- except ValueError:
- link = create_article_path(change["title"])
- if change["logparams"]["duration"] in ["infinite", "indefinite", "infinity", "never"]:
- block_time = _("for infinity and beyond")
- else:
- english_length = re.sub(r"(\d+)", "", change["logparams"]["duration"]) # note that translation won't work for millenia and century yet
- english_length_num = re.sub(r"(\D+)", "", change["logparams"]["duration"])
- try:
- if "@" in english_length:
- raise ValueError
- english_length = english_length.rstrip("s").strip()
- block_time = _("for {num} {translated_length}").format(num=english_length_num, translated_length=ngettext(english_length, english_length + "s", int(english_length_num)))
- except (AttributeError, ValueError):
- if "expiry" in change["logparams"]:
- date_time_obj = datetime.datetime.strptime(change["logparams"]["expiry"], '%Y-%m-%dT%H:%M:%SZ')
- block_time = _("until {}").format(date_time_obj.strftime("%Y-%m-%d %H:%M:%S UTC"))
- else:
- block_time = _("unknown expiry time") # THIS IS HERE JUST TEMPORARY AS A HOT FIX TO #157, will be changed with release of 1.13
- if "sitewide" not in change["logparams"]:
- restriction_description = ""
- if "restrictions" in change["logparams"]:
- if "pages" in change["logparams"]["restrictions"] and change["logparams"]["restrictions"]["pages"]:
- restriction_description = _("Blocked from editing the following pages: ")
- for page in change["logparams"]["restrictions"]["pages"]:
- restricted_pages = ["*"+i["page_title"]+"*" for i in change["logparams"]["restrictions"]["pages"]]
- restriction_description = restriction_description + ", ".join(restricted_pages)
- if "namespaces" in change["logparams"]["restrictions"] and change["logparams"]["restrictions"]["namespaces"]:
- namespaces = []
- if restriction_description:
- restriction_description = restriction_description + _(" and namespaces: ")
- else:
- restriction_description = _("Blocked from editing pages on following namespaces: ")
- for namespace in change["logparams"]["restrictions"]["namespaces"]:
- if str(namespace) in recent_changes.namespaces: # if we have cached namespace name for given namespace number, add its name to the list
- namespaces.append("*{ns}*".format(ns=recent_changes.namespaces[str(namespace)]["*"]))
- else:
- namespaces.append("*{ns}*".format(ns=namespace))
- restriction_description = restriction_description + ", ".join(namespaces)
- restriction_description = restriction_description + "."
- if len(restriction_description) > 1020:
- logger.debug(restriction_description)
- restriction_description = restriction_description[:1020]+"…"
- embed.add_field(_("Partial block details"), restriction_description, inline=True)
- embed["title"] = _("Blocked {blocked_user} {time}").format(blocked_user=user, time=block_time)
- elif action == "block/reblock":
- link = create_article_path(change["title"])
- user = change["title"].split(':', 1)[1]
- embed["title"] = _("Changed block settings for {blocked_user}").format(blocked_user=user)
- elif action == "block/unblock":
- link = create_article_path(change["title"])
- user = change["title"].split(':', 1)[1]
- embed["title"] = _("Unblocked {blocked_user}").format(blocked_user=user)
- elif action == "curseprofile/comment-created":
- if settings["appearance"]["embed"]["show_edit_changes"]:
- parsed_comment = recent_changes.pull_comment(change["logparams"]["4:comment_id"])
- link = create_article_path("Special:CommentPermalink/{commentid}".format(commentid=change["logparams"]["4:comment_id"]))
- target_user = change["title"].split(':', 1)[1]
- if target_user != change["user"]:
- embed["title"] = _("Left a comment on {target}'s profile").format(target=target_user)
- else:
- embed["title"] = _("Left a comment on their own profile")
- elif action == "curseprofile/comment-replied":
- if settings["appearance"]["embed"]["show_edit_changes"]:
- parsed_comment = recent_changes.pull_comment(change["logparams"]["4:comment_id"])
- link = create_article_path("Special:CommentPermalink/{commentid}".format(commentid=change["logparams"]["4:comment_id"]))
- target_user = change["title"].split(':', 1)[1]
- if target_user != change["user"]:
- embed["title"] = _("Replied to a comment on {target}'s profile").format(target=target_user)
- else:
- embed["title"] = _("Replied to a comment on their own profile")
- elif action == "curseprofile/comment-edited":
- if settings["appearance"]["embed"]["show_edit_changes"]:
- parsed_comment = recent_changes.pull_comment(change["logparams"]["4:comment_id"])
- link = create_article_path("Special:CommentPermalink/{commentid}".format(commentid=change["logparams"]["4:comment_id"]))
- target_user = change["title"].split(':', 1)[1]
- if target_user != change["user"]:
- embed["title"] = _("Edited a comment on {target}'s profile").format(target=target_user)
- else:
- embed["title"] = _("Edited a comment on their own profile")
- elif action == "curseprofile/profile-edited":
- target_user = change["title"].split(':', 1)[1]
- link = create_article_path("UserProfile:{target}".format(target=target_user))
- if target_user != change["user"]:
- embed["title"] = _("Edited {target}'s profile").format(target=target_user)
- else:
- embed["title"] = _("Edited their own profile")
- if not change["parsedcomment"]: # If the field is empty
- parsed_comment = _("Cleared the {field} field").format(field=profile_field_name(change["logparams"]['4:section'], True))
- else:
- parsed_comment = _("{field} field changed to: {desc}").format(field=profile_field_name(change["logparams"]['4:section'], True), desc=BeautifulSoup(change["parsedcomment"], "lxml").get_text())
- elif action == "curseprofile/comment-purged":
- link = create_article_path(change["title"])
- target_user = change["title"].split(':', 1)[1]
- if target_user != change["user"]:
- embed["title"] = _("Purged a comment on {target}'s profile").format(target=target_user)
- else:
- embed["title"] = _("Purged a comment on their own profile")
- elif action == "curseprofile/comment-deleted":
- if "4:comment_id" in change["logparams"]:
- link = create_article_path("Special:CommentPermalink/{commentid}".format(commentid=change["logparams"]["4:comment_id"]))
- else:
- link = create_article_path(change["title"])
- target_user = change["title"].split(':', 1)[1]
- if target_user != change["user"]:
- embed["title"] = _("Deleted a comment on {target}'s profile").format(target=target_user)
- else:
- embed["title"] = _("Deleted a comment on their own profile")
- elif action in ("rights/rights", "rights/autopromote"):
- link = create_article_path("User:{}".format(change["title"].split(":")[1]))
- if action == "rights/rights":
- embed["title"] = _("Changed group membership for {target}").format(target=change["title"].split(":")[1])
- else:
- author_url = ""
- embed.set_author(_("System"), author_url)
- embed["title"] = _("{target} got autopromoted to a new usergroup").format(
- target=change["title"].split(":")[1])
- if len(change["logparams"]["oldgroups"]) < len(change["logparams"]["newgroups"]):
- embed["thumbnail"]["url"] = "https://i.imgur.com/WnGhF5g.gif"
- old_groups = []
- new_groups = []
- for name in change["logparams"]["oldgroups"]:
- old_groups.append(_(name))
- for name in change["logparams"]["newgroups"]:
- new_groups.append(_(name))
- if len(old_groups) == 0:
- old_groups = [_("none")]
- if len(new_groups) == 0:
- new_groups = [_("none")]
- reason = ": {desc}".format(desc=parsed_comment) if parsed_comment != _("No description provided") else ""
- parsed_comment = _("Groups changed from {old_groups} to {new_groups}{reason}").format(
- old_groups=", ".join(old_groups), new_groups=', '.join(new_groups), reason=reason)
- elif action == "protect/protect":
- link = create_article_path(change["title"])
- embed["title"] = _("Protected {target}").format(target=change["title"])
- parsed_comment = "{settings}{cascade} | {reason}".format(settings=change["logparams"].get("description", ""),
- cascade=_(" [cascading]") if "cascade" in change["logparams"] else "",
- reason=parsed_comment)
- elif action == "protect/modify":
- link = create_article_path(change["title"])
- embed["title"] = _("Changed protection level for {article}").format(article=change["title"])
- parsed_comment = "{settings}{cascade} | {reason}".format(settings=change["logparams"].get("description", ""),
- cascade=_(" [cascading]") if "cascade" in change["logparams"] else "",
- reason=parsed_comment)
- elif action == "protect/unprotect":
- link = create_article_path(change["title"])
- embed["title"] = _("Removed protection from {article}").format(article=change["title"])
- elif action == "delete/revision":
- amount = len(change["logparams"]["ids"])
- link = create_article_path(change["title"])
- embed["title"] = ngettext("Changed visibility of revision on page {article} ",
- "Changed visibility of {amount} revisions on page {article} ", amount).format(
- article=change["title"], amount=amount)
- if AUTO_SUPPRESSION_ENABLED:
- try:
- logparams = change["logparams"]
- except KeyError:
- pass
- else:
- redact_messages(logparams.get("ids", []), 0, logparams.get("new", {}))
- elif action == "import/upload":
- link = create_article_path(change["title"])
- embed["title"] = ngettext("Imported {article} with {count} revision",
- "Imported {article} with {count} revisions", change["logparams"]["count"]).format(
- article=change["title"], count=change["logparams"]["count"])
- elif action == "delete/restore":
- link = create_article_path(change["title"])
- embed["title"] = _("Restored {article}").format(article=change["title"])
- elif action == "delete/event":
- link = create_article_path("Special:RecentChanges")
- embed["title"] = _("Changed visibility of log events")
- if AUTO_SUPPRESSION_ENABLED:
- try:
- logparams = change["logparams"]
- except KeyError:
- pass
- else:
- redact_messages(logparams.get("ids", []), 1, logparams.get("new", {}))
- elif action == "import/interwiki":
- link = create_article_path(change["title"])
- embed["title"] = ngettext("Imported {article} with {count} revision from \"{source}\"",
- "Imported {article} with {count} revisions from \"{source}\"", change["logparams"]["count"]).format(
- article=change["title"], count=change["logparams"]["count"], source=change["logparams"]["interwiki_title"])
- elif action == "abusefilter/modify":
- link = create_article_path("Special:AbuseFilter/history/{number}/diff/prev/{historyid}".format(number=change["logparams"]['newId'], historyid=change["logparams"]["historyId"]))
- embed["title"] = _("Edited abuse filter number {number}").format(number=change["logparams"]['newId'])
- elif action == "abusefilter/create":
- link = create_article_path("Special:AbuseFilter/{number}".format(number=change["logparams"]['newId']))
- embed["title"] = _("Created abuse filter number {number}").format(number=change["logparams"]['newId'])
- elif action == "merge/merge":
- link = create_article_path(change["title"])
- embed["title"] = _("Merged revision histories of {article} into {dest}").format(article=change["title"],
- dest=change["logparams"]["dest_title"])
- elif action == "newusers/autocreate":
- link = create_article_path(change["title"])
- embed["title"] = _("Created account automatically")
- elif action == "newusers/create":
- link = create_article_path(change["title"])
- embed["title"] = _("Created account")
- elif action == "newusers/create2":
- link = create_article_path(change["title"])
- embed["title"] = _("Created account {article}").format(article=change["title"])
- elif action == "newusers/byemail":
- link = create_article_path(change["title"])
- embed["title"] = _("Created account {article} and password was sent by email").format(article=change["title"])
- elif action == "newusers/newusers":
- link = author_url
- embed["title"] = _("Created account")
- elif action == "interwiki/iw_add":
- link = create_article_path("Special:Interwiki")
- embed["title"] = _("Added an entry to the interwiki table")
- parsed_comment = _("Prefix: {prefix}, website: {website} | {desc}").format(desc=parsed_comment,
- prefix=change["logparams"]['0'],
- website=change["logparams"]['1'])
- elif action == "interwiki/iw_edit":
- link = create_article_path("Special:Interwiki")
- embed["title"] = _("Edited an entry in interwiki table")
- parsed_comment = _("Prefix: {prefix}, website: {website} | {desc}").format(desc=parsed_comment,
- prefix=change["logparams"]['0'],
- website=change["logparams"]['1'])
- elif action == "interwiki/iw_delete":
- link = create_article_path("Special:Interwiki")
- embed["title"] = _("Deleted an entry in interwiki table")
- parsed_comment = _("Prefix: {prefix} | {desc}").format(desc=parsed_comment, prefix=change["logparams"]['0'])
- elif action == "contentmodel/change":
- link = create_article_path(change["title"])
- embed["title"] = _("Changed the content model of the page {article}").format(article=change["title"])
- parsed_comment = _("Model changed from {old} to {new}: {reason}").format(old=change["logparams"]["oldmodel"],
- new=change["logparams"]["newmodel"],
- reason=parsed_comment)
- elif action == "contentmodel/new":
- link = create_article_path(change["title"])
- embed["title"] = _("Created the page {article} using a non-default content model").format(article=change["title"])
- parsed_comment = _("Created with model {new}: {reason}").format(new=change["logparams"]["newmodel"], reason=parsed_comment)
- elif action == "sprite/sprite":
- link = create_article_path(change["title"])
- embed["title"] = _("Edited the sprite for {article}").format(article=change["title"])
- elif action == "sprite/sheet":
- link = create_article_path(change["title"])
- embed["title"] = _("Created the sprite sheet for {article}").format(article=change["title"])
- elif action == "sprite/slice":
- link = create_article_path(change["title"])
- embed["title"] = _("Edited the slice for {article}").format(article=change["title"])
- elif action == "cargo/createtable":
- LinkParser.feed(change["logparams"]["0"])
- table = re.search(r"\[(.*?)\]\(<(.*?)>\)", LinkParser.new_string)
- LinkParser.new_string = ""
- link = table.group(2)
- embed["title"] = _("Created the Cargo table \"{table}\"").format(table=table.group(1))
- parsed_comment = None
- elif action == "cargo/deletetable":
- link = create_article_path("Special:CargoTables")
- embed["title"] = _("Deleted the Cargo table \"{table}\"").format(table=change["logparams"]["0"])
- parsed_comment = None
- elif action == "cargo/recreatetable":
- LinkParser.feed(change["logparams"]["0"])
- table = re.search(r"\[(.*?)\]\(<(.*?)>\)", LinkParser.new_string)
- LinkParser.new_string = ""
- link = table.group(2)
- embed["title"] = _("Recreated the Cargo table \"{table}\"").format(table=table.group(1))
- parsed_comment = None
- elif action == "cargo/replacetable":
- LinkParser.feed(change["logparams"]["0"])
- table = re.search(r"\[(.*?)\]\(<(.*?)>\)", LinkParser.new_string)
- LinkParser.new_string = ""
- link = table.group(2)
- embed["title"] = _("Replaced the Cargo table \"{table}\"").format(table=table.group(1))
- parsed_comment = None
- elif action == "managetags/create":
- link = create_article_path(change["title"])
- embed["title"] = _("Created the tag \"{tag}\"").format(tag=change["logparams"]["tag"])
- recent_changes.init_info()
- elif action == "managetags/delete":
- link = create_article_path(change["title"])
- embed["title"] = _("Deleted the tag \"{tag}\"").format(tag=change["logparams"]["tag"])
- if change["logparams"]["count"] > 0:
- embed.add_field(_('Removed from'), ngettext("{} revision or log entry", "{} revisions and/or log entries", change["logparams"]["count"]).format(change["logparams"]["count"]))
- recent_changes.init_info()
- elif action == "managetags/activate":
- link = create_article_path(change["title"])
- embed["title"] = _("Activated the tag \"{tag}\"").format(tag=change["logparams"]["tag"])
- elif action == "managetags/deactivate":
- link = create_article_path(change["title"])
- embed["title"] = _("Deactivated the tag \"{tag}\"").format(tag=change["logparams"]["tag"])
- elif action == "managewiki/settings": # Miraheze's ManageWiki extension https://github.com/miraheze/ManageWiki
- link = create_article_path(change["title"])
- embed["title"] = _("Changed wiki settings")
- if change["logparams"].get("changes", ""):
- embed.add_field("Setting", change["logparams"].get("changes"))
- elif action == "managewiki/delete":
- embed["title"] = _("Deleted a \"{wiki}\" wiki").format(wiki=change["logparams"].get("wiki", _("Unknown")))
- link = create_article_path(change["title"])
- elif action == "managewiki/lock":
- embed["title"] = _("Locked a \"{wiki}\" wiki").format(wiki=change["logparams"].get("wiki", _("Unknown")))
- link = create_article_path(change["title"])
- elif action == "managewiki/namespaces":
- embed["title"] = _("Modified \"{namespace_name}\" namespace").format(namespace_name=change["logparams"].get("namespace", _("Unknown")))
- link = create_article_path(change["title"])
- embed.add_field(_('Wiki'), change["logparams"].get("wiki", _("Unknown")))
- elif action == "managewiki/namespaces-delete":
- embed["title"] = _("Deleted a \"{namespace_name}\" namespace").format(
- namespace_name=change["logparams"].get("namespace", _("Unknown")))
- link = create_article_path(change["title"])
- embed.add_field(_('Wiki'), change["logparams"].get("wiki", _("Unknown")))
- elif action == "managewiki/rights":
- group_name = change["title"].split("/permissions/", 1)[1]
- embed["title"] = _("Modified \"{usergroup_name}\" usergroup").format(usergroup_name=group_name)
- link = create_article_path(change["title"])
- elif action == "managewiki/undelete":
- embed["title"] = _("Undeleted a \"{wiki}\" wiki").format(wiki=change["logparams"].get("wiki", _("Unknown")))
- link = create_article_path(change["title"])
- elif action == "managewiki/unlock":
- embed["title"] = _("Unlocked a \"{wiki}\" wiki").format(wiki=change["logparams"].get("wiki", _("Unknown")))
- link = create_article_path(change["title"])
- elif action == "datadump/generate":
- embed["title"] = _("Generated {file} dump").format(file=change["logparams"]["filename"])
- link = create_article_path(change["title"])
- elif action == "datadump/delete":
- embed["title"] = _("Deleted {file} dump").format(file=change["logparams"]["filename"])
- link = create_article_path(change["title"])
- elif action == "pagetranslation/mark":
- link = create_article_path(change["title"])
- if "?" in link:
- link = link + "&oldid={}".format(change["logparams"]["revision"])
- else:
- link = link + "?oldid={}".format(change["logparams"]["revision"])
- embed["title"] = _("Marked \"{article}\" for translation").format(article=change["title"])
- elif action == "pagetranslation/unmark":
- link = create_article_path(change["title"])
- embed["title"] = _("Removed \"{article}\" from the translation system").format(article=change["title"])
- elif action == "pagetranslation/moveok":
- link = create_article_path(change["logparams"]["target"])
- embed["title"] = _("Completed moving translation pages from \"{article}\" to \"{target}\"").format(article=change["title"], target=change["logparams"]["target"])
- elif action == "pagetranslation/movenok":
- link = create_article_path(change["title"])
- embed["title"] = _("Encountered a problem while moving \"{article}\" to \"{target}\"").format(article=change["title"], target=change["logparams"]["target"])
- elif action == "pagetranslation/deletefok":
- link = create_article_path(change["title"])
- embed["title"] = _("Completed deletion of translatable page \"{article}\"").format(article=change["title"])
- elif action == "pagetranslation/deletefnok":
- link = create_article_path(change["title"])
- embed["title"] = _("Failed to delete \"{article}\" which belongs to translatable page \"{target}\"").format(article=change["title"], target=change["logparams"]["target"])
- elif action == "pagetranslation/deletelok":
- link = create_article_path(change["title"])
- embed["title"] = _("Completed deletion of translation page \"{article}\"").format(article=change["title"])
- elif action == "pagetranslation/deletelnok":
- link = create_article_path(change["title"])
- embed["title"] = _("Failed to delete \"{article}\" which belongs to translation page \"{target}\"").format(article=change["title"], target=change["logparams"]["target"])
- elif action == "pagetranslation/encourage":
- link = create_article_path(change["title"])
- embed["title"] = _("Encouraged translation of \"{article}\"").format(article=change["title"])
- elif action == "pagetranslation/discourage":
- link = create_article_path(change["title"])
- embed["title"] = _("Discouraged translation of \"{article}\"").format(article=change["title"])
- elif action == "pagetranslation/prioritylanguages":
- link = create_article_path(change["title"])
- if "languages" in change["logparams"]:
- languages = "`, `".join(change["logparams"]["languages"].split(","))
- if change["logparams"]["force"] == "on":
- embed["title"] = _("Limited languages for \"{article}\" to `{languages}`").format(article=change["title"], languages=languages)
- else:
- embed["title"] = _("Priority languages for \"{article}\" set to `{languages}`").format(article=change["title"], languages=languages)
- else:
- embed["title"] = _("Removed priority languages from \"{article}\"").format(article=change["title"])
- elif action == "pagetranslation/associate":
- link = create_article_path(change["title"])
- embed["title"] = _("Added translatable page \"{article}\" to aggregate group \"{group}\"").format(article=change["title"], group=change["logparams"]["aggregategroup"])
- elif action == "pagetranslation/dissociate":
- link = create_article_path(change["title"])
- embed["title"] = _("Removed translatable page \"{article}\" from aggregate group \"{group}\"").format(article=change["title"], group=change["logparams"]["aggregategroup"])
- elif action == "translationreview/message":
- link = create_article_path(change["title"])
- if "?" in link:
- link = link + "&oldid={}".format(change["logparams"]["revision"])
- else:
- link = link + "?oldid={}".format(change["logparams"]["revision"])
- embed["title"] = _("Reviewed translation \"{article}\"").format(article=change["title"])
- elif action == "translationreview/group":
- link = create_article_path(change["title"])
- embed["title"] = _("Changed the state of `{language}` translations of \"{article}\"").format(language=change["logparams"]["language"], article=change["title"])
- if "old-state" in change["logparams"]:
- embed.add_field(_("Old state"), change["logparams"]["old-state"], inline=True)
- embed.add_field(_("New state"), change["logparams"]["new-state"], inline=True)
- elif action == "pagelang/pagelang":
- link = create_article_path(change["title"])
- old_lang = "`{}`".format(change["logparams"]["oldlanguage"])
- if change["logparams"]["oldlanguage"][-5:] == "[def]":
- old_lang = "`{}` {}".format(change["logparams"]["oldlanguage"][:-5], _("(default)"))
- new_lang = "`{}`".format(change["logparams"]["newlanguage"])
- if change["logparams"]["newlanguage"][-5:] == "[def]":
- new_lang = "`{}` {}".format(change["logparams"]["oldlanguage"][:-5], _("(default)"))
- embed["title"] = _("Changed the language of \"{article}\"").format(article=change["title"])
- embed.add_field(_("Old language"), old_lang, inline=True)
- embed.add_field(_("New language"), new_lang, inline=True)
- elif action == "renameuser/renameuser":
- edits = change["logparams"]["edits"]
- if edits > 0:
- embed["title"] = ngettext("Renamed user \"{old_name}\" with {edits} edit to \"{new_name}\"", "Renamed user \"{old_name}\" with {edits} edits to \"{new_name}\"", edits).format(old_name=change["logparams"]["olduser"], edits=edits, new_name=change["logparams"]["newuser"])
- else:
- embed["title"] = _("Renamed user \"{old_name}\" to \"{new_name}\"").format(old_name=change["logparams"]["olduser"], new_name=change["logparams"]["newuser"])
- link = create_article_path("User:"+change["logparams"]["newuser"])
- elif action == "suppressed":
- link = create_article_path("")
- embed["title"] = _("Action has been hidden by administration")
- embed["author"]["name"] = _("Unknown")
- else:
- logger.warning("No entry for {event} with params: {params}".format(event=action, params=change))
- link = create_article_path("Special:RecentChanges")
- embed["title"] = _("Unknown event `{event}`").format(event=action)
- embed.event_type = "unknown"
- if settings.get("support", None):
- change_params = "[```json\n{params}\n```]({support})".format(params=json.dumps(change, indent=2),
- support=settings["support"])
- if len(change_params) > 1000:
- embed.add_field(_("Report this on the support server"), settings["support"])
- else:
- embed.add_field(_("Report this on the support server"), change_params)
- embed["url"] = quote(link.replace(" ", "_"), "/:?=&")
- if parsed_comment is not None:
- embed["description"] = parsed_comment
- if settings["appearance"]["embed"]["show_footer"]:
- embed["timestamp"] = change["timestamp"]
- if "tags" in change and change["tags"]:
- tag_displayname = []
- for tag in change["tags"]:
- if tag in recent_changes.tags:
- if recent_changes.tags[tag] is None:
- continue # Ignore hidden tags
- else:
- tag_displayname.append(recent_changes.tags[tag])
- else:
- tag_displayname.append(tag)
- embed.add_field(_("Tags"), ", ".join(tag_displayname))
- if len(embed["title"]) > 254:
- embed["title"] = embed["title"][0:253]+"…"
- logger.debug("Current params in edit action: {}".format(change))
- if categories is not None and not (len(categories["new"]) == 0 and len(categories["removed"]) == 0):
- new_cat = (_("**Added**: ") + ", ".join(list(categories["new"])[0:16]) + ("\n" if len(categories["new"])<=15 else _(" and {} more\n").format(len(categories["new"])-15))) if categories["new"] else ""
- del_cat = (_("**Removed**: ") + ", ".join(list(categories["removed"])[0:16]) + ("" if len(categories["removed"])<=15 else _(" and {} more").format(len(categories["removed"])-15))) if categories["removed"] else ""
- embed.add_field(_("Changed categories"), new_cat + del_cat)
- embed.finish_embed()
- send_to_discord(embed, meta=request_metadata)
diff --git a/src/rcgcdw.py b/src/rcgcdw.py
index 2bd33e5..612fc95 100644
--- a/src/rcgcdw.py
+++ b/src/rcgcdw.py
@@ -1,159 +1,148 @@
#!/usr/bin/python
# -*- coding: utf-8 -*-
-# Recent changes Goat compatible Discord webhook is a project for using a webhook as recent changes page from MediaWiki.
-# Copyright (C) 2018 Frisk
+# This file is part of Recent changes Goat compatible Discord webhook (RcGcDw).
-# This program is free software: you can redistribute it and/or modify
+# RcGcDw is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
-# This program is distributed in the hope that it will be useful,
+# RcGcDw is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
# You should have received a copy of the GNU General Public License
-# along with this program. If not, see .
+# along with RcGcDw. If not, see .
# WARNING! SHITTY CODE AHEAD. ENTER ONLY IF YOU ARE SURE YOU CAN TAKE IT
# You have been warned
-import time, logging.config, requests, datetime, gettext, math, os.path, schedule, sys
+import time, logging.config, requests, datetime, math, os.path, schedule, sys, re, importlib
import src.misc
-from collections import defaultdict, Counter
+from collections import defaultdict, Counter, OrderedDict
+
+from typing import Optional
+import src.api.client
+from src.api.context import Context
+from src.api.hooks import formatter_hooks, pre_hooks, post_hooks
from src.configloader import settings
-from src.misc import add_to_dict, datafile, \
- WIKI_API_PATH, create_article_path
+from src.misc import add_to_dict, datafile, WIKI_API_PATH, LinkParser, run_hooks
+from src.api.util import create_article_path, default_message
from src.discord.queue import send_to_discord
from src.discord.message import DiscordMessage, DiscordMessageMetadata
-from src.rc import recent_changes
-from src.exceptions import MWError
+from src.exceptions import MWError, ServerError, MediaWikiError, BadRequest, ClientError, NoFormatter
from src.i18n import rcgcdw
+from src.wiki import Wiki
_ = rcgcdw.gettext
ngettext = rcgcdw.ngettext
-if settings["fandom_discussions"]["enabled"]:
- import src.discussions
-
TESTING = True if "--test" in sys.argv else False # debug mode, pipeline testing
+AUTO_SUPPRESSION_ENABLED = settings.get("auto_suppression", {"enabled": False}).get("enabled")
+if AUTO_SUPPRESSION_ENABLED:
+ from src.discord.redaction import delete_messages, redact_messages
# Prepare logging
logging.config.dictConfig(settings["logging"])
logger = logging.getLogger("rcgcdw")
logger.debug("Current settings: {settings}".format(settings=settings))
-from src.migrations import * # migrations after logging
+
+
+def load_extensions():
+ """Loads all of the extensions, can be a local import because all we need is them to register"""
+ try:
+ importlib.import_module(settings.get('extensions_dir', 'extensions'), 'extensions')
+ except ImportError:
+ logger.critical("No extensions module found. What's going on?")
+ logger.exception("Error:")
+ sys.exit(1)
+
storage = datafile
# Remove previous data holding file if exists and limitfetch allows
if settings["limitrefetch"] != -1 and os.path.exists("lastchange.txt") is True:
- with open("lastchange.txt", 'r') as sfile:
+ with open("lastchange.txt", 'r', encoding="utf-8") as sfile:
logger.info("Converting old lastchange.txt file into new data storage data.json...")
storage["rcid"] = int(sfile.read().strip())
datafile.save_datafile()
os.remove("lastchange.txt")
-def day_overview_request():
+def no_formatter(ctx: Context, change: dict) -> None:
+ logger.warning(f"There is no formatter specified for {ctx.event}! Ignoring event.")
+ raise NoFormatter
+
+formatter_hooks["no_formatter"] = no_formatter
+
+def day_overview_request() -> list:
+ """Make requests for changes in last 24h"""
logger.info("Fetching daily overview... This may take up to 30 seconds!")
timestamp = (datetime.datetime.utcnow() - datetime.timedelta(hours=24)).isoformat(timespec='milliseconds')
- logger.debug("timestamp is {}".format(timestamp))
- complete = False
result = []
passes = 0
- continuearg = ""
- while not complete and passes < 10:
- request = recent_changes.safe_request(
- "{wiki}?action=query&format=json&list=recentchanges&rcend={timestamp}Z&rcprop=title%7Ctimestamp%7Csizes%7Cloginfo%7Cuser&rcshow=!bot&rclimit=500&rctype=edit%7Cnew%7Clog{continuearg}".format(
- wiki=WIKI_API_PATH, timestamp=timestamp, continuearg=continuearg))
- if request:
- try:
- request = request.json()
- request = recent_changes.handle_mw_errors(request)
- rc = request['query']['recentchanges']
- continuearg = request["continue"]["rccontinue"] if "continue" in request else None
- except ValueError:
- logger.warning("ValueError in fetching changes")
- recent_changes.downtime_controller(True)
- complete = 2
- except KeyError:
- logger.warning("Wiki returned %s" % (request))
- complete = 2
- except MWError:
- complete = 2
- else:
- result += rc
- if continuearg:
- continuearg = "&rccontinue={}".format(continuearg)
- passes += 1
- logger.debug(
- "continuing requesting next pages of recent changes with {} passes and continuearg being {}".format(
- passes, continuearg))
- time.sleep(3.0)
- else:
- complete = 1
+ continuearg: Optional[str] = None
+ while passes < 10:
+ params = OrderedDict(dict(action="query", format="json", list="recentchanges", rcend=timestamp,
+ rcprop="title|timestamp|sizes|loginfo|user", rcshow="!bot", rclimit="max",
+ rctype="edit|new|log", rccontinue=continuearg))
+ request = wiki.retried_api_request(params)
+ result += request['query']['recentchanges']
+ if "continue" in request:
+ continuearg = request["continue"].get("rccontinue", None)
else:
- complete = 2
- if passes == 10:
- logger.debug("quit the loop because there been too many passes")
- return result, complete
+ return result
+ passes += 1
+ logger.debug(
+ "continuing requesting next pages of recent changes with {} passes and continuearg being {}".format(
+ passes, continuearg))
+ time.sleep(3.0)
+ logger.debug("quit the loop because there been too many passes")
+ return result
-def daily_overview_sync(edits, files, admin, changed_bytes, new_articles, unique_contributors, day_score):
+def daily_overview_sync(data: dict) -> dict:
weight = storage["daily_overview"]["days_tracked"]
- logger.debug(_)
if weight == 0:
- storage["daily_overview"].update({"edits": edits, "new_files": files, "admin_actions": admin, "bytes_changed": changed_bytes, "new_articles": new_articles, "unique_editors": unique_contributors, "day_score": day_score})
- edits, files, admin, changed_bytes, new_articles, unique_contributors, day_score = str(edits), str(files), str(admin), str(changed_bytes), str(new_articles), str(unique_contributors), str(day_score)
+ storage["daily_overview"].update(data)
+ data_output = {k: str(v) for k, v in data.items()}
else:
- edits_avg = src.misc.weighted_average(storage["daily_overview"]["edits"], weight, edits)
- edits = _("{value} (avg. {avg})").format(value=edits, avg=edits_avg)
- files_avg = src.misc.weighted_average(storage["daily_overview"]["new_files"], weight, files)
- files = _("{value} (avg. {avg})").format(value=files, avg=files_avg)
- admin_avg = src.misc.weighted_average(storage["daily_overview"]["admin_actions"], weight, admin)
- admin = _("{value} (avg. {avg})").format(value=admin, avg=admin_avg)
- changed_bytes_avg = src.misc.weighted_average(storage["daily_overview"]["bytes_changed"], weight, changed_bytes)
- changed_bytes = _("{value} (avg. {avg})").format(value=changed_bytes, avg=changed_bytes_avg)
- new_articles_avg = src.misc.weighted_average(storage["daily_overview"]["new_articles"], weight, new_articles)
- new_articles = _("{value} (avg. {avg})").format(value=new_articles, avg=new_articles_avg)
- unique_contributors_avg = src.misc.weighted_average(storage["daily_overview"]["unique_editors"], weight, unique_contributors)
- unique_contributors = _("{value} (avg. {avg})").format(value=unique_contributors, avg=unique_contributors_avg)
- day_score_avg = src.misc.weighted_average(storage["daily_overview"]["day_score"], weight, day_score)
- day_score = _("{value} (avg. {avg})").format(value=day_score, avg=day_score_avg)
- storage["daily_overview"].update({"edits": edits_avg, "new_files": files_avg, "admin_actions": admin_avg, "bytes_changed": changed_bytes_avg,
- "new_articles": new_articles_avg, "unique_editors": unique_contributors_avg, "day_score": day_score_avg})
+ data_output = {}
+ for data_point, value in data.items():
+ new_average = src.misc.weighted_average(storage["daily_overview"][data_point], weight, value)
+ data_output[data_point] = _("{value} (avg. {avg})").format(value=value, avg=new_average)
+ storage["daily_overview"][data_point] = new_average
storage["daily_overview"]["days_tracked"] += 1
datafile.save_datafile()
- return edits, files, admin, changed_bytes, new_articles, unique_contributors, day_score
+ return data_output
+
def day_overview():
- result = day_overview_request()
- if result[1] == 1:
+ try:
+ result = day_overview_request()
+ except (ServerError, MediaWikiError):
+ logger.error("Couldn't complete Daily Overview as requests for changes resulted in errors.")
+ else:
activity = defaultdict(dict)
hours = defaultdict(dict)
articles = defaultdict(dict)
- edits = 0
- files = 0
- admin = 0
- changed_bytes = 0
- new_articles = 0
+ edits = files = admin = changed_bytes = new_articles = 0
active_articles = []
embed = DiscordMessage("embed", "daily_overview", settings["webhookURL"])
embed["title"] = _("Daily overview")
embed["url"] = create_article_path("Special:Statistics")
embed.set_author(settings["wikiname"], create_article_path(""))
- if not result[0]:
+ if not result:
if not settings["send_empty_overview"]:
return # no changes in this day
else:
embed["description"] = _("No activity")
else:
- for item in result[0]:
+ for item in result:
if "actionhidden" in item or "suppressed" in item or "userhidden" in item:
continue # while such actions have type value (edit/new/log) many other values are hidden and therefore can crash with key error, let's not process such events
activity = add_to_dict(activity, item["user"])
@@ -161,16 +150,16 @@ def day_overview():
if item["type"] == "edit":
edits += 1
changed_bytes += item["newlen"] - item["oldlen"]
- if (recent_changes.namespaces is not None and "content" in recent_changes.namespaces.get(str(item["ns"]), {})) or item["ns"] == 0:
+ if (wiki.namespaces is not None and "content" in wiki.namespaces.get(str(item["ns"]), {})) or item["ns"] == 0:
articles = add_to_dict(articles, item["title"])
elif item["type"] == "new":
- if "content" in (recent_changes.namespaces is not None and recent_changes.namespaces.get(str(item["ns"]), {})) or item["ns"] == 0:
+ if "content" in (wiki.namespaces is not None and wiki.namespaces.get(str(item["ns"]), {})) or item["ns"] == 0:
new_articles += 1
changed_bytes += item["newlen"]
elif item["type"] == "log":
files = files + 1 if item["logtype"] == item["logaction"] == "upload" else files
admin = admin + 1 if item["logtype"] in ["delete", "merge", "block", "protect", "import", "rights",
- "abusefilter", "interwiki", "managetags"] else admin
+ "abusefilter", "interwiki", "managetags"] else admin
overall = round(new_articles + edits * 0.1 + files * 0.3 + admin * 0.1 + math.fabs(changed_bytes * 0.001), 2)
if activity:
active_users = []
@@ -184,44 +173,144 @@ def day_overview():
active_hours.append(str(hour))
houramount = ngettext(" UTC ({} action)", " UTC ({} actions)", numberh).format(numberh)
else:
- active_users = [_("But nobody came")] # a reference to my favorite game of all the time, sorry ^_^
- active_hours = [_("But nobody came")]
- usramount = ""
- houramount = ""
+ active_users = active_hours = [_("But nobody came")] # a reference to my favorite game of all the time, sorry ^_^
+ usramount = houramount = ""
if not active_articles:
active_articles = [_("But nobody came")]
- edits, files, admin, changed_bytes, new_articles, unique_contributors, overall = daily_overview_sync(edits, files, admin, changed_bytes, new_articles, len(activity), overall)
+ messages = daily_overview_sync({"edits": edits, "new_files": files, "admin_actions": admin, "bytes_changed":
+ changed_bytes, "new_articles": new_articles, "unique_editors": len(activity), "day_score": overall})
fields = (
(ngettext("Most active user", "Most active users", len(active_users)), ', '.join(active_users)),
(ngettext("Most edited article", "Most edited articles", len(active_articles)), ', '.join(active_articles)),
- (_("Edits made"), edits), (_("New files"), files), (_("Admin actions"), admin),
- (_("Bytes changed"), changed_bytes), (_("New articles"), new_articles),
- (_("Unique contributors"), unique_contributors),
+ (_("Edits made"), messages["edits"]), (_("New files"), messages["new_files"]),
+ (_("Admin actions"), messages["admin_actions"]), (_("Bytes changed"), messages["bytes_changed"]),
+ (_("New articles"), messages["new_articles"]), (_("Unique contributors"), messages["unique_editors"]),
(ngettext("Most active hour", "Most active hours", len(active_hours)), ', '.join(active_hours) + houramount),
- (_("Day score"), overall))
+ (_("Day score"), messages["day_score"])
+ )
for name, value in fields:
embed.add_field(name, value, inline=True)
embed.finish_embed()
send_to_discord(embed, meta=DiscordMessageMetadata("POST"))
+
+
+def rc_processor(change, changed_categories):
+ """Prepares essential information for both embed and compact message format."""
+ from src.misc import LinkParser
+ LinkParser = LinkParser()
+ metadata = DiscordMessageMetadata("POST", rev_id=change.get("revid", None), log_id=change.get("logid", None),
+ page_id=change.get("pageid", None))
+ logger.debug(change)
+ context = Context(settings["appearance"]["mode"], settings["webhookURL"], client)
+ run_hooks(pre_hooks, context, change)
+ if ("actionhidden" in change or "suppressed" in change) and "suppressed" not in settings["ignored"]: # if event is hidden using suppression
+ context.event = "suppressed"
+ try:
+ discord_message: Optional[DiscordMessage] = default_message("suppressed", formatter_hooks)(context, change)
+ except NoFormatter:
+ return
+ except:
+ if settings.get("error_tolerance", 1) > 0:
+ discord_message: Optional[
+ DiscordMessage] = None # It's handled by send_to_discord, we still want other code to run
+ else:
+ raise
else:
- logger.debug("function requesting changes for day overview returned with error code")
+ if "commenthidden" not in change:
+ LinkParser.feed(change.get("parsedcomment", ""))
+ parsed_comment = LinkParser.new_string
+ else:
+ parsed_comment = _("~~hidden~~")
+ if not parsed_comment and context.message_type == "embed" and settings["appearance"].get("embed", {}).get("show_no_description_provided", True):
+ parsed_comment = _("No description provided")
+ context.set_parsedcomment(parsed_comment)
+ if "userhidden" in change:
+ change["user"] = _("hidden")
+ if change.get("ns", -1) in settings.get("ignored_namespaces", ()):
+ return
+ if change["type"] in ["edit", "new"]:
+ logger.debug("List of categories in essential_info: {}".format(changed_categories))
+ identification_string = change["type"]
+ context.set_categories(changed_categories)
+ elif change["type"] == "categorize":
+ return
+ elif change["type"] == "log":
+ identification_string = "{logtype}/{logaction}".format(logtype=change["logtype"], logaction=change["logaction"])
+ else:
+ identification_string = change.get("type", "unknown") # If event doesn't have a type
+ if identification_string in settings["ignored"]:
+ return
+ context.event = identification_string
+ try:
+ discord_message: Optional[DiscordMessage] = default_message(identification_string, formatter_hooks)(context, change)
+ except:
+ if settings.get("error_tolerance", 1) > 0:
+ discord_message: Optional[DiscordMessage] = None # It's handled by send_to_discord, we still want other code to run
+ else:
+ raise
+ if identification_string in ("delete/delete", "delete/delete_redir") and AUTO_SUPPRESSION_ENABLED: # TODO Move it into a hook?
+ delete_messages(dict(pageid=change.get("pageid")))
+ elif identification_string == "delete/event" and AUTO_SUPPRESSION_ENABLED:
+ logparams = change.get('logparams', {"ids": []})
+ if settings["appearance"]["mode"] == "embed":
+ redact_messages(logparams.get("ids", []), 1, logparams.get("new", {}))
+ else:
+ for logid in logparams.get("ids", []):
+ delete_messages(dict(logid=logid))
+ elif identification_string == "delete/revision" and AUTO_SUPPRESSION_ENABLED:
+ logparams = change.get('logparams', {"ids": []})
+ if settings["appearance"]["mode"] == "embed":
+ redact_messages(logparams.get("ids", []), 0, logparams.get("new", {}))
+ else:
+ for revid in logparams.get("ids", []):
+ delete_messages(dict(revid=revid))
+ run_hooks(post_hooks, discord_message, metadata, context, change)
+ discord_message.finish_embed()
+ send_to_discord(discord_message, metadata)
+def abuselog_processing(entry):
+ action = "abuselog"
+ if action in settings["ignored"]:
+ return
+ context = Context(settings["appearance"]["mode"], settings["webhookURL"], client)
+ run_hooks(pre_hooks, context, entry)
+ context.event = action
+ try:
+ discord_message: Optional[DiscordMessage] = default_message(action, formatter_hooks)(context, entry)
+ except NoFormatter:
+ return
+ except:
+ if settings.get("error_tolerance", 1) > 0:
+ discord_message: Optional[DiscordMessage] = None # It's handled by send_to_discord, we still want other code to run
+ else:
+ raise
+ metadata = DiscordMessageMetadata("POST")
+ run_hooks(post_hooks, discord_message, metadata, context, entry)
+ discord_message.finish_embed()
+ send_to_discord(discord_message, metadata)
+
+load_extensions()
# Log in and download wiki information
+wiki = Wiki(rc_processor, abuselog_processing)
+client = src.api.client.Client(formatter_hooks, wiki)
+if settings["fandom_discussions"]["enabled"] or TESTING:
+ import src.discussions
+ src.discussions.inject_client(client) # Not the prettiest but gets the job done
try:
if settings["wiki_bot_login"] and settings["wiki_bot_password"]:
- recent_changes.log_in()
+ wiki.log_in()
time.sleep(2.0)
- recent_changes.init_info()
+ wiki.init_info()
except requests.exceptions.ConnectionError:
logger.critical("A connection can't be established with the wiki. Exiting...")
sys.exit(1)
time.sleep(3.0) # this timeout is to prevent timeouts. It seems Fandom does not like our ~2-3 request in under a second
if settings["rc_enabled"]:
logger.info("Script started! Fetching newest changes...")
- recent_changes.fetch(amount=settings["limitrefetch"] if settings["limitrefetch"] != -1 else settings["limit"])
- schedule.every(settings["cooldown"]).seconds.do(recent_changes.fetch)
+ wiki.fetch(amount=settings["limitrefetch"] if settings["limitrefetch"] != -1 else settings["limit"])
+ schedule.every(settings["cooldown"]).seconds.do(wiki.fetch)
if settings["overview"]:
try:
overview_time = time.strptime(settings["overview_time"], '%H:%M')
@@ -235,25 +324,22 @@ if settings["rc_enabled"]:
except ValueError:
logger.error("Invalid time format! Currentely: {}. Note: It needs to be in HH:MM format.".format(
settings["overview_time"]))
- schedule.every().day.at("00:00").do(recent_changes.clear_cache)
+ schedule.every().day.at("00:00").do(wiki.clear_cache)
else:
logger.info("Script started! RC is disabled however, this means no recent changes will be sent :c")
-if 1 == 2: # additional translation strings in unreachable code
- print(_("director"), _("bot"), _("editor"), _("directors"), _("sysop"), _("bureaucrat"), _("reviewer"),
- _("autoreview"), _("autopatrol"), _("wiki_guardian"), ngettext("second", "seconds", 1), ngettext("minute", "minutes", 1), ngettext("hour", "hours", 1), ngettext("day", "days", 1), ngettext("week", "weeks", 1), ngettext("month", "months",1), ngettext("year", "years", 1), ngettext("millennium", "millennia", 1), ngettext("decade", "decades", 1), ngettext("century", "centuries", 1))
# noinspection PyUnreachableCode
if TESTING:
logger.debug("DEBUGGING ")
storage["rcid"] = 1
- recent_changes.fetch(amount=5)
+ wiki.fetch(amount=5)
day_overview()
import src.discussions
src.discussions.fetch_discussions()
sys.exit(0)
-while 1:
+while 1:
time.sleep(1.0)
schedule.run_pending()
diff --git a/src/session.py b/src/session.py
index d5cd81d..3db940a 100644
--- a/src/session.py
+++ b/src/session.py
@@ -1,20 +1,19 @@
# -*- coding: utf-8 -*-
-# Recent changes Goat compatible Discord webhook is a project for using a webhook as recent changes page from MediaWiki.
-# Copyright (C) 2020 Frisk
+# This file is part of Recent changes Goat compatible Discord webhook (RcGcDw).
-# This program is free software: you can redistribute it and/or modify
+# RcGcDw is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
-# This program is distributed in the hope that it will be useful,
+# RcGcDw is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
# You should have received a copy of the GNU General Public License
-# along with this program. If not, see .
+# along with RcGcDw. If not, see .
import requests
from src.configloader import settings
diff --git a/src/rc.py b/src/wiki.py
similarity index 62%
rename from src/rc.py
rename to src/wiki.py
index 2accac9..3114487 100644
--- a/src/rc.py
+++ b/src/wiki.py
@@ -1,3 +1,20 @@
+# -*- coding: utf-8 -*-
+
+# This file is part of Recent changes Goat compatible Discord webhook (RcGcDw).
+
+# RcGcDw is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+
+# RcGcDw is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with RcGcDw. If not, see .
+
import re
import sys
import time
@@ -6,11 +23,12 @@ import requests
from bs4 import BeautifulSoup
from src.configloader import settings
-from src.misc import WIKI_SCRIPT_PATH, WIKI_API_PATH, datafile, send_simple, safe_read, LinkParser, AUTO_SUPPRESSION_ENABLED
+from src.misc import WIKI_SCRIPT_PATH, WIKI_API_PATH, datafile, send_simple, safe_read, parse_mw_request_info
from src.discord.queue import messagequeue
-from src.exceptions import MWError
+from src.exceptions import MWError, BadRequest, ClientError, ServerError, MediaWikiError
from src.session import session
-from src.rc_formatters import compact_formatter, embed_formatter, compact_abuselog_formatter, embed_abuselog_formatter
+from typing import Union, Callable
+# from src.rc_formatters import compact_formatter, embed_formatter, compact_abuselog_formatter, embed_abuselog_formatter
from src.i18n import rc
from collections import OrderedDict
@@ -20,38 +38,11 @@ storage = datafile
logger = logging.getLogger("rcgcdw.rc")
-supported_logs = {"protect/protect", "protect/modify", "protect/unprotect", "upload/overwrite", "upload/upload",
- "delete/delete", "delete/delete_redir", "delete/restore", "delete/revision", "delete/event",
- "import/upload", "import/interwiki", "merge/merge", "move/move", "move/move_redir",
- "protect/move_prot", "block/block", "block/unblock", "block/reblock", "rights/rights",
- "rights/autopromote", "abusefilter/modify", "abusefilter/create", "interwiki/iw_add",
- "interwiki/iw_edit", "interwiki/iw_delete", "curseprofile/comment-created",
- "curseprofile/comment-edited", "curseprofile/comment-deleted", "curseprofile/comment-purged",
- "curseprofile/profile-edited", "curseprofile/comment-replied", "contentmodel/change", "sprite/sprite",
- "sprite/sheet", "sprite/slice", "managetags/create", "managetags/delete", "managetags/activate",
- "managetags/deactivate", "cargo/createtable", "cargo/deletetable",
- "cargo/recreatetable", "cargo/replacetable", "upload/revert", "newusers/create",
- "newusers/autocreate", "newusers/create2", "newusers/byemail", "newusers/newusers",
- "managewiki/settings", "managewiki/delete", "managewiki/lock", "managewiki/unlock",
- "managewiki/namespaces", "managewiki/namespaces-delete", "managewiki/rights", "managewiki/undelete"}
-
-# Set the proper formatter
-if settings["appearance"]["mode"] == "embed":
- appearance_mode = embed_formatter
- abuselog_appearance_mode = embed_abuselog_formatter
-elif settings["appearance"]["mode"] == "compact":
- appearance_mode = compact_formatter
- abuselog_appearance_mode = compact_abuselog_formatter
-else:
- logger.critical("Unknown formatter!")
- sys.exit(1)
-
-
-LinkParser = LinkParser()
-
-class Recent_Changes_Class(object):
+class Wiki(object):
"""Store verious data and functions related to wiki and fetching of Recent Changes"""
- def __init__(self):
+ def __init__(self, rc_processor: Callable, abuse_processor: Callable):
+ self.rc_processor = rc_processor
+ self.abuse_processor = abuse_processor
self.map_ips = {}
self.downtimecredibility = 0
self.last_downtime = 0
@@ -63,6 +54,8 @@ class Recent_Changes_Class(object):
self.session = session
self.logged_in = False
self.initial_run_complete = False
+ self.memory_id = None # Used only when limitrefetch is set to -1 to avoid reading from storage
+
@staticmethod
def handle_mw_errors(request):
@@ -114,26 +107,26 @@ class Recent_Changes_Class(object):
messagequeue.resend_msgs()
last_check = self.fetch_changes(amount=amount)
if last_check is not None:
- storage["rcid"] = last_check[0] if last_check[0] else storage["rcid"]
- storage["abuse_log_id"] = last_check[1] if last_check[1] else storage["abuse_log_id"]
- storage.save_datafile()
+ if settings["limitrefetch"] != -1:
+ storage["rcid"] = last_check[0] if last_check[0] else storage["rcid"]
+ storage["abuse_log_id"] = last_check[1] if last_check[1] else storage["abuse_log_id"]
+ storage.save_datafile()
+ else:
+ self.memory_id = last_check
self.initial_run_complete = True
def fetch_recentchanges_request(self, amount):
"""Make a typical MW request for rc/abuselog
If succeeds return the .json() of request and if not raises ConnectionError"""
- request = self.safe_request(WIKI_API_PATH, params=self.construct_params(amount))
- if request is not None:
- try:
- request = request.json()
- except ValueError:
- logger.warning("ValueError in fetching changes")
- logger.warning("Changes URL:" + request.url)
- self.downtime_controller(True)
- raise ConnectionError
- return request
- raise ConnectionError
+ try:
+ request = self.api_request(self.construct_params(amount))
+ except (ServerError, MediaWikiError):
+ raise ConnectionError
+ except (ClientError, KeyError, BadRequest):
+ raise
+ return request
+
def construct_params(self, amount):
"""Constructs GET parameters for recentchanges/abuselog fetching feature"""
@@ -155,8 +148,11 @@ class Recent_Changes_Class(object):
categorize_events = {}
new_events = 0
changes.reverse()
- highest_id = recent_id = storage["rcid"]
- dry_run = True if recent_id is None else False
+ if settings["limitrefetch"] == -1 and self.memory_id is not None:
+ highest_id = recent_id = self.memory_id[0]
+ else:
+ highest_id = recent_id = storage["rcid"]
+ dry_run = True if recent_id is None or (self.memory_id is None and settings["limitrefetch"] == -1) else False
for change in changes:
if not dry_run and not (change["rcid"] <= recent_id):
new_events += 1
@@ -172,30 +168,30 @@ class Recent_Changes_Class(object):
"There were too many new events, but the limit was high enough we don't care anymore about fetching them all.")
if change["type"] == "categorize":
if "commenthidden" not in change:
- if len(recent_changes.mw_messages.keys()) > 0:
+ if len(self.mw_messages.keys()) > 0:
cat_title = change["title"].split(':', 1)[1]
# I so much hate this, blame Markus for making me do this
if change["revid"] not in categorize_events:
categorize_events[change["revid"]] = {"new": set(), "removed": set()}
comment_to_match = re.sub(r'<.*?a>', '', change["parsedcomment"])
- if recent_changes.mw_messages["recentchanges-page-added-to-category"] in comment_to_match or \
- recent_changes.mw_messages[
+ if self.mw_messages["recentchanges-page-added-to-category"] in comment_to_match or \
+ self.mw_messages[
"recentchanges-page-added-to-category-bundled"] in comment_to_match:
categorize_events[change["revid"]]["new"].add(cat_title)
logger.debug("Matched {} to added category for {}".format(cat_title, change["revid"]))
- elif recent_changes.mw_messages[
+ elif self.mw_messages[
"recentchanges-page-removed-from-category"] in comment_to_match or \
- recent_changes.mw_messages[
+ self.mw_messages[
"recentchanges-page-removed-from-category-bundled"] in comment_to_match:
categorize_events[change["revid"]]["removed"].add(cat_title)
logger.debug("Matched {} to removed category for {}".format(cat_title, change["revid"]))
else:
logger.debug(
"Unknown match for category change with messages {}, {}, {}, {} and comment_to_match {}".format(
- recent_changes.mw_messages["recentchanges-page-added-to-category"],
- recent_changes.mw_messages["recentchanges-page-removed-from-category"],
- recent_changes.mw_messages["recentchanges-page-removed-from-category-bundled"],
- recent_changes.mw_messages["recentchanges-page-added-to-category-bundled"],
+ self.mw_messages["recentchanges-page-added-to-category"],
+ self.mw_messages["recentchanges-page-removed-from-category"],
+ self.mw_messages["recentchanges-page-removed-from-category-bundled"],
+ self.mw_messages["recentchanges-page-added-to-category-bundled"],
comment_to_match))
else:
logger.warning(
@@ -205,26 +201,30 @@ class Recent_Changes_Class(object):
if highest_id is None or change["rcid"] > highest_id:
highest_id = change["rcid"]
if not dry_run:
+ logger.debug(f"Currently considering whether IDs in newest batch are lower than {recent_id}.")
for change in changes:
if change["rcid"] <= recent_id:
- logger.debug("Change ({}) is lower or equal to recent_id {}".format(change["rcid"], recent_id))
+ #logger.debug("Change ({}) is lower or equal to recent_id {}".format(change["rcid"], recent_id))
continue
logger.debug(recent_id)
- essential_info(change, categorize_events.get(change.get("revid"), None))
+ self.rc_processor(change, categorize_events.get(change.get("revid"), None))
return highest_id
def prepare_abuse_log(self, abuse_log: list):
if not abuse_log:
return None
abuse_log.reverse()
- recent_id = storage["abuse_log_id"]
- dryrun = True if recent_id is None else False
+ if self.memory_id is not None and settings["limitrefetch"] == -1:
+ recent_id = self.memory_id[1]
+ else:
+ recent_id = storage["abuse_log_id"]
+ dryrun = True if recent_id is None or (self.initial_run_complete is False and settings["limitrefetch"] == -1) else False
for entry in abuse_log:
if dryrun:
continue
if entry["id"] <= recent_id:
continue
- abuselog_processing(entry, self)
+ self.abuse_processor(entry)
return entry["id"]
def fetch_changes(self, amount):
@@ -258,7 +258,9 @@ class Recent_Changes_Class(object):
abuselog_last_id = self.prepare_abuse_log(abuselog)
return rc_last_id, abuselog_last_id
- def safe_request(self, url, params=None):
+ def _safe_request(self, url, params=None):
+ """This method is depreciated, please use api_request"""
+ logger.warning("safe_request is depreciated, please use api_request or own requests request")
try:
if params:
request = self.session.get(url, params=params, timeout=10, allow_redirects=False)
@@ -281,10 +283,85 @@ class Recent_Changes_Class(object):
self.downtime_controller(True)
return None
elif request.status_code == 302:
- logger.critical("Redirect detected! Either the wiki given in the script settings (wiki field) is incorrect/the wiki got removed or Gamepedia is giving us the false value. Please provide the real URL to the wiki, current URL redirects to {}".format(request.next.url))
+ logger.critical("Redirect detected! Either the wiki given in the script settings (wiki field) is incorrect/the wiki got removed or is giving us the false value. Please provide the real URL to the wiki, current URL redirects to {}".format(request.next.url))
sys.exit(0)
return request
+ def retried_api_request(self, params: Union[str, OrderedDict], *json_path: str, timeout: int = 10, allow_redirects: bool = False):
+ """Wrapper around api_request function that additionally re-request the same request multiple times."""
+ retries = 0
+ while retries < 5:
+ try:
+ return self.api_request(params, *json_path, timeout=timeout, allow_redirects=allow_redirects)
+ except (ServerError, MediaWikiError):
+ retries += 1
+ time.sleep(2.0)
+ raise ServerError
+
+ def api_request(self, params: Union[str, OrderedDict], *json_path: str, timeout: int = 10, allow_redirects: bool = False) -> dict:
+ """Method to GET request data from the wiki's API with error handling including recognition of MediaWiki errors.
+
+ Parameters:
+
+ params (str, OrderedDict): a string or collections.OrderedDict object containing query parameters
+ json_path (str): *args taking strings as values. After request is parsed as json it will extract data from given json path
+ timeout (int, float) (default=10): int or float limiting time required for receiving a full response from a server before returning TimeoutError
+ allow_redirects (bool) (default=False): switches whether the request should follow redirects or not
+
+ Returns:
+
+ request_content (dict): a dict resulting from json extraction of HTTP GET request with given json_path
+ OR
+ One of the following exceptions:
+ ServerError: When connection with the wiki failed due to server error
+ ClientError: When connection with the wiki failed due to client error
+ KeyError: When json_path contained keys that weren't found in response JSON response
+ BadRequest: When params argument is of wrong type
+ MediaWikiError: When MediaWiki returns an error
+ """
+ # Making request
+ try:
+ if isinstance(params, str): # Todo Make it so there are some default arguments like warning/error format appended
+ request = self.session.get(WIKI_API_PATH + params+"&errorformat=raw", timeout=timeout, allow_redirects=allow_redirects)
+ elif isinstance(params, OrderedDict):
+ params["errorformat"] = "raw"
+ request = self.session.get(WIKI_API_PATH, params=params, timeout=timeout, allow_redirects=allow_redirects)
+ else:
+ raise BadRequest(params)
+ except (requests.exceptions.Timeout, requests.exceptions.ConnectionError, requests.exceptions.ChunkedEncodingError) as exc:
+ logger.warning("Reached {error} error for request on link {url}".format(error=repr(exc), url=WIKI_API_PATH+str(params)))
+ self.downtime_controller(True)
+ raise ServerError
+ # Catching HTTP errors
+ if 499 < request.status_code < 600:
+ self.downtime_controller(True)
+ raise ServerError
+ elif request.status_code == 302:
+ logger.critical(
+ "Redirect detected! Either the wiki given in the script settings (wiki field) is incorrect/the wiki got removed or is giving us the false value. Please provide the real URL to the wiki, current URL redirects to {}".format(
+ request.next.url))
+ sys.exit(0)
+ elif 399 < request.status_code < 500:
+ logger.error("Request returned ClientError status code on {url}".format(url=request.url))
+ raise ClientError(request)
+ else:
+ # JSON Extraction
+ try:
+ request_json = parse_mw_request_info(request.json(), request.url)
+ for item in json_path:
+ request_json = request_json[item]
+ except ValueError:
+ logger.warning("ValueError when extracting JSON data on {url}".format(url=request.url))
+ self.downtime_controller(True)
+ raise ServerError
+ except MediaWikiError:
+ logger.exception("MediaWiki error on request: {}".format(request.url))
+ raise
+ except KeyError:
+ logger.exception("KeyError while iterating over json_path, full response: {}".format(request.json()))
+ raise
+ return request_json
+
def check_connection(self, looped=False):
online = 0
for website in ["https://google.com", "https://instagram.com", "https://steamcommunity.com"]:
@@ -302,7 +379,7 @@ class Recent_Changes_Class(object):
if not looped:
while 1: # recursed loop, check for connection (every 10 seconds) as long as three services are down, don't do anything else
if self.check_connection(looped=True):
- recent_changes.fetch(amount=settings["limitrefetch"])
+ self.fetch(amount=settings["limitrefetch"])
break
time.sleep(10)
return False
@@ -336,12 +413,12 @@ class Recent_Changes_Class(object):
def clear_cache(self):
self.map_ips = {}
- if AUTO_SUPPRESSION_ENABLED:
+ if settings.get("auto_suppression", {"enabled": False}).get("enabled"):
from src.fileio.database import clean_entries
clean_entries()
def init_info(self):
- startup_info = safe_read(self.safe_request(
+ startup_info = safe_read(self._safe_request(
"{wiki}?action=query&format=json&uselang=content&list=tags&meta=allmessages%7Csiteinfo&utf8=1&tglimit=max&tgprop=displayname&ammessages=recentchanges-page-added-to-category%7Crecentchanges-page-removed-from-category%7Crecentchanges-page-added-to-category-bundled%7Crecentchanges-page-removed-from-category-bundled&amenableparser=1&amincludelocal=1&siprop=namespaces".format(
wiki=WIKI_API_PATH)), "query")
if startup_info:
@@ -352,7 +429,7 @@ class Recent_Changes_Class(object):
except KeyError:
self.tags[tag["name"]] = None # Tags with no display name are hidden and should not appear on RC as well
for message in startup_info["allmessages"]:
- if not "missing" in message: # ignore missing strings
+ if "missing" not in message: # ignore missing strings
self.mw_messages[message["name"]] = message["*"]
else:
logging.warning("Could not fetch the MW message translation for: {}".format(message["name"]))
@@ -369,15 +446,13 @@ class Recent_Changes_Class(object):
def pull_comment(self, comment_id):
try:
- comment = self.handle_mw_errors(self.safe_request(
- "{wiki}?action=comment&do=getRaw&comment_id={comment}&format=json".format(wiki=WIKI_API_PATH,
- comment=comment_id)).json())[
- "text"]
+ comment = self.api_request("?action=comment&do=getRaw&comment_id={comment}&format=json".format(wiki=WIKI_API_PATH,
+ comment=comment_id), "text")
logger.debug("Got the following comment from the API: {}".format(comment))
- except MWError:
+ except (ServerError, MediaWikiError):
pass
- except (TypeError, AttributeError):
- logger.exception("Could not resolve the comment text.")
+ except (BadRequest, ClientError):
+ logger.exception("Some kind of issue while creating a request (most likely client error).")
except KeyError:
logger.exception("CurseProfile extension API did not respond with a valid comment content.")
else:
@@ -385,47 +460,3 @@ class Recent_Changes_Class(object):
comment = comment[0:1000] + "…"
return comment
return ""
-
-
-recent_changes = Recent_Changes_Class()
-
-def essential_info(change, changed_categories):
- """Prepares essential information for both embed and compact message format."""
- logger.debug(change)
- if ("actionhidden" in change or "suppressed" in change) and "suppressed" not in settings["ignored"]: # if event is hidden using suppression
- appearance_mode("suppressed", change, "", changed_categories, recent_changes)
- return
- if "commenthidden" not in change:
- LinkParser.feed(change["parsedcomment"])
- parsed_comment = LinkParser.new_string
- LinkParser.new_string = ""
- parsed_comment = re.sub(r"(`|_|\*|~|{|}|\|\|)", "\\\\\\1", parsed_comment, 0)
- else:
- parsed_comment = _("~~hidden~~")
- if not parsed_comment:
- parsed_comment = None
- if "userhidden" in change:
- change["user"] = _("hidden")
- if change.get("ns", -1) in settings.get("ignored_namespaces", ()):
- return
- if change["type"] in ["edit", "new"]:
- logger.debug("List of categories in essential_info: {}".format(changed_categories))
- identification_string = change["type"]
- elif change["type"] == "log":
- identification_string = "{logtype}/{logaction}".format(logtype=change["logtype"], logaction=change["logaction"])
- if identification_string not in supported_logs:
- logger.warning(
- "This event is not implemented in the script. Please make an issue on the tracker attaching the following info: wiki url, time, and this information: {}".format(
- change))
- return
- elif change["type"] == "categorize":
- return
- else:
- logger.warning("This event is not implemented in the script. Please make an issue on the tracker attaching the following info: wiki url, time, and this information: {}".format(change))
- return
- if identification_string in settings["ignored"]:
- return
- appearance_mode(identification_string, change, parsed_comment, changed_categories, recent_changes)
-
-def abuselog_processing(entry, recent_changes):
- abuselog_appearance_mode(entry, recent_changes)
\ No newline at end of file
diff --git a/start.py b/start.py
index aee6d48..f783e5f 100644
--- a/start.py
+++ b/start.py
@@ -1,4 +1,4 @@
import src.rcgcdw, sys
if __name__ != "__main__": # return if called as a module
- sys.exit(1)
\ No newline at end of file
+ sys.exit(1)
diff --git a/test/__init__.py b/test/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/test/test_util.py b/test/test_util.py
new file mode 100644
index 0000000..d83e579
--- /dev/null
+++ b/test/test_util.py
@@ -0,0 +1,35 @@
+# This file is part of Recent changes Goat compatible Discord webhook (RcGcDw).
+#
+# RcGcDw is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# RcGcDw is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with RcGcDw. If not, see .
+
+from unittest import TestCase, main
+from src.api.util import sanitize_to_url, sanitize_to_markdown, clean_link
+
+
+class Test(TestCase):
+ def test_sanitize_to_url(self):
+ self.assertEqual(sanitize_to_url("Breaking rcgcdw . \ / : ? = ) & - ~ this is a test)"),
+ "Breaking_rcgcdw_._%5C_/_:_%3F_%3D_%29_%26_-_~_this_is_a_test%29")
+
+ def test_sanitize_to_markdown(self):
+ self.assertEqual(sanitize_to_markdown(
+ " This @MarkusRost [] is a **Markdown** te\"'''st __wow__ (I'm a link)[https://google.com/____]^^ ` nice {} comment\\\\foa*&&V^%A(!#)@!@I$Jfkasnfgamc,ajf ah wtf#####;h,a "),
+ " This \\@MarkusRost [] is a \\*\\*Markdown\\*\\* te\"\'\'\'st \\_\\_wow\\_\\_ (I\'m a link)[https\\:/\\/google.com/\\_\\_\\_\\_]^^ \\` nice \\{\\} comment\\\\\\\\foa\\*&&V^%A(!#)\\@!\\@I$Jfkasnfgamc,ajf ah wtf#####;h,a ")
+
+ def test_clean_link(self):
+ self.assertEqual(clean_link("https://example.com"), "")
+
+
+if __name__ == '__main__':
+ main()