Merge branch 'testing' into 'master'

1.14

Closes #202, #215, #216, #218, #219, and #222

See merge request piotrex43/RcGcDw!93
This commit is contained in:
Frisk 2021-07-30 10:52:31 +00:00
commit 62fe1008da
218 changed files with 38427 additions and 13364 deletions

1
.gitignore vendored
View file

@ -9,6 +9,7 @@ lastchange.txt
/venv/ /venv/
/lokalize-scripts/ /lokalize-scripts/
/venvv/ /venvv/
/.idea/
__pycache__ __pycache__
*.bat *.bat
*.code-workspace *.code-workspace

View file

@ -1,17 +1,47 @@
image: python:3.6-alpine image: python:3.7-alpine
include: include:
- template: Code-Quality.gitlab-ci.yml - 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: test:
type: test stage: test
script: script:
- apk add libxml2-dev libxslt-dev libxml2 gcc musl-dev linux-headers - 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/111111111111111111/$DISCORD1/g" settings.json.example
- sed -i -e "s/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/$DISCORD2/g" settings.json.example - sed -i -e "s/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/$DISCORD2/g" settings.json.example
- mv settings.json.example settings.json - mv settings.json.example settings.json
- python3.6 start.py --test - python3.7 start.py --test
only: only:
- testing - 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

View file

@ -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. `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 ## ## 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.

View file

@ -11,7 +11,7 @@
* Very customizable * Very customizable
### Dependencies ### ### Dependencies ###
* **Python 3.6+** * **Python 3.7+**
* requests 2.18.4+ * requests 2.18.4+
* beautifulsoup 4.6.0+ * beautifulsoup 4.6.0+
* schedule 0.5.0+ * schedule 0.5.0+
@ -31,15 +31,23 @@
* MarkusRost German translation * MarkusRost German translation
* JSBM French translation * JSBM French translation
* [Eduaddad](https://eduardoaddad.com.br) Brazilian Portuguese 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 * Mak_and_Iv Ukrainian translation
* Tamara Carvallo Spanish translation
* Lakejason0 - Simplified Chinese translation
Thank you! Thank you!
[![Translation status](https://weblate.frisk.space/widgets/rcgcdw/-/multi-auto.svg)](https://weblate.frisk.space/engage/rcgcdw/?utm_source=widget) [![Translation status](https://translate.wikibot.de/widgets/rcgcdw/-/multi-auto.svg)](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) * [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 ### ### Wiki ###
For more information, check the [wiki](https://gitlab.com/piotrex43/RcGcDw/wikis/Home)! For more information, check the [wiki](https://gitlab.com/piotrex43/RcGcDw/wikis/Home)!

151
docs/API spec.md Normal file
View file

@ -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)

17
extensions/__init__.py Normal file
View file

@ -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 <http://www.gnu.org/licenses/>.
import extensions.base
import extensions.hooks

View file

@ -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 <http://www.gnu.org/licenses/>.
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

View file

@ -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 <http://www.gnu.org/licenses/>.
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)

115
extensions/base/cargo.py Normal file
View file

@ -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 <http://www.gnu.org/licenses/>.
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)

View file

@ -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 <http://www.gnu.org/licenses/>.
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)

View file

@ -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 <http://www.gnu.org/licenses/>.
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)

View file

@ -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 <http://www.gnu.org/licenses/>.
# 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)

View file

@ -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 <http://www.gnu.org/licenses/>.
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)

View file

@ -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 <http://www.gnu.org/licenses/>.
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)

1189
extensions/base/mediawiki.py Normal file

File diff suppressed because it is too large Load diff

View file

@ -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 <http://www.gnu.org/licenses/>.
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)

91
extensions/base/sprite.py Normal file
View file

@ -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 <http://www.gnu.org/licenses/>.
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)

View file

@ -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 <http://www.gnu.org/licenses/>.
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)

View file

@ -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 <http://www.gnu.org/licenses/>.
import extensions.hooks.example_hook

View file

@ -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 <http://www.gnu.org/licenses/>.
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"])

View file

@ -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 <http://www.gnu.org/licenses/>.
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)

View file

@ -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 <http://www.gnu.org/licenses/>.
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]]

View file

@ -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 <EMAIL@ADDRESS>, 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 <thisisacreeper0101@gmail.com>\n"
"Language-Team: Bengali <https://translate.wikibot.de/projects/rcgcdw/"
"discussion_formatters/bn/>\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 "এটিকে সাহায্য সার্ভারে রিপোর্ট করুন"

Binary file not shown.

View file

@ -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 <EMAIL@ADDRESS>, 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 <piotrex43@protonmail.ch>\n"
"Language-Team: German <https://translate.wikibot.de/projects/rcgcdw/"
"discussion_formatters-1/de/>\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"

Binary file not shown.

File diff suppressed because it is too large Load diff

View file

@ -2,7 +2,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: \n" "Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \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" "PO-Revision-Date: 2020-08-03 13:44+0000\n"
"Last-Translator: MarkusRost <>\n" "Last-Translator: MarkusRost <>\n"
"Language-Team: German <https://weblate.frisk.space/projects/rcgcdw/main/de/" "Language-Team: German <https://weblate.frisk.space/projects/rcgcdw/main/de/"
@ -69,7 +69,7 @@ msgstr "Discord-Link"
msgid "Battle.net handle" msgid "Battle.net handle"
msgstr "Battle.net-Link" msgstr "Battle.net-Link"
#: src/misc.py:119 #: src/misc.py:139
msgid "" msgid ""
"\n" "\n"
"__And more__" "__And more__"
@ -77,10 +77,10 @@ msgstr ""
"\n" "\n"
"__Und mehr__" "__Und mehr__"
#: src/misc.py:276 #: src/misc.py:328
msgid "Unknown" msgid "Unknown"
msgstr "Unbekannt" msgstr "Unbekannt"
#: src/misc.py:278 #: src/misc.py:330
msgid "unknown" msgid "unknown"
msgstr "unbekannt" msgstr "unbekannt"

View file

@ -3,8 +3,8 @@ msgstr ""
"Project-Id-Version: \n" "Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2021-04-14 16:24+0200\n" "POT-Creation-Date: 2021-04-14 16:24+0200\n"
"PO-Revision-Date: 2020-12-29 15:21+0000\n" "PO-Revision-Date: 2021-05-06 14:10+0000\n"
"Last-Translator: MarkusRost <sukramxro@gmail.com>\n" "Last-Translator: magiczocker <jan-frederik-kriete@t-online.de>\n"
"Language-Team: German <https://translate.wikibot.de/projects/rcgcdw/" "Language-Team: German <https://translate.wikibot.de/projects/rcgcdw/"
"rc_formatters/de/>\n" "rc_formatters/de/>\n"
"Language: de\n" "Language: de\n"
@ -12,7 +12,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\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" "X-Loco-Source-Locale: de_DE\n"
"Generated-By: pygettext.py 1.5\n" "Generated-By: pygettext.py 1.5\n"
"X-Loco-Parser: loco_parse_po\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}“" msgstr "[{author}]({author_url}) ersetzte die Cargo-Tabelle „{table}“"
#: src/rc_formatters.py:436 #: src/rc_formatters.py:436
#, fuzzy, python-brace-format #, python-brace-format
msgid "" msgid ""
"[{author}]({author_url}) created the [tag]({tag_url}) \"{tag}\"{comment}" "[{author}]({author_url}) created the [tag]({tag_url}) \"{tag}\"{comment}"
msgstr "" 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 #: src/rc_formatters.py:441
#, fuzzy, python-brace-format #, python-brace-format
msgid "" msgid ""
"[{author}]({author_url}) deleted the [tag]({tag_url}) \"{tag}\"{comment}" "[{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 #: src/rc_formatters.py:443
#, fuzzy, python-brace-format #, python-brace-format
msgid "" msgid ""
"[{author}]({author_url}) deleted the [tag]({tag_url}) \"{tag}\" and removed " "[{author}]({author_url}) deleted the [tag]({tag_url}) \"{tag}\" and removed "
"it from {count} revision or log entry{comment}" "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 " "[{author}]({author_url}) deleted the [tag]({tag_url}) \"{tag}\" and removed "
"it from {count} revisions and/or log entries{comment}" "it from {count} revisions and/or log entries{comment}"
msgstr[0] "" msgstr[0] ""
"[{author}]({author_url}) importierte [{article}]({article_url}) mit einer " "[{author}]({author_url}) löschte die [Markierung]({tag_url}) „{tag}“ und "
"Version{comment}" "entfernte diese von {count} Version oder Logeintrag{comment}"
msgstr[1] "" msgstr[1] ""
"[{author}]({author_url}) importierte [{article}]({article_url}) mit {count} " "[{author}]({author_url}) löschte die [Markierung]({tag_url}) „{tag}“ und "
"Versionen{comment}" "entfernte diese von {count} Versionen und/oder Logeinträgen{comment}"
#: src/rc_formatters.py:449 #: src/rc_formatters.py:449
#, fuzzy, python-brace-format #, python-brace-format
msgid "" msgid ""
"[{author}]({author_url}) activated the [tag]({tag_url}) \"{tag}\"{comment}" "[{author}]({author_url}) activated the [tag]({tag_url}) \"{tag}\"{comment}"
msgstr "" 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 #: src/rc_formatters.py:452
#, fuzzy, python-brace-format #, python-brace-format
msgid "" msgid ""
"[{author}]({author_url}) deactivated the [tag]({tag_url}) \"{tag}\"{comment}" "[{author}]({author_url}) deactivated the [tag]({tag_url}) \"{tag}\"{comment}"
msgstr "" 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 #: src/rc_formatters.py:454
#, python-brace-format #, 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}" msgstr "[{author}]({author_url}) sperrte das Wiki *{wiki_name}*{comment}"
#: src/rc_formatters.py:462 #: src/rc_formatters.py:462
#, fuzzy, python-brace-format #, python-brace-format
msgid "" msgid ""
"[{author}]({author_url}) modified namespace *{namespace_name}* on " "[{author}]({author_url}) modified namespace *{namespace_name}* on "
"*{wiki_name}*{comment}" "*{wiki_name}*{comment}"
@ -683,9 +688,11 @@ msgstr ""
"*{comment}" "*{comment}"
#: src/rc_formatters.py:477 #: src/rc_formatters.py:477
#, fuzzy, python-brace-format #, python-brace-format
msgid "[{author}]({author_url}) undeleted a wiki *{wiki_name}*{comment}" 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 #: src/rc_formatters.py:481
#, python-brace-format #, python-brace-format
@ -1303,33 +1310,32 @@ msgid "Replaced the Cargo table \"{table}\""
msgstr "Ersetzte die Cargo-Tabelle „{table}“" msgstr "Ersetzte die Cargo-Tabelle „{table}“"
#: src/rc_formatters.py:1121 #: src/rc_formatters.py:1121
#, fuzzy, python-brace-format #, python-brace-format
msgid "Created the tag \"{tag}\"" msgid "Created the tag \"{tag}\""
msgstr "Erstellte die Markierung „{tag}“" msgstr "Erstellte die Markierung „{tag}“"
#: src/rc_formatters.py:1125 #: src/rc_formatters.py:1125
#, fuzzy, python-brace-format #, python-brace-format
msgid "Deleted the tag \"{tag}\"" msgid "Deleted the tag \"{tag}\""
msgstr "Löschte die Markierung „{tag}“" msgstr "Löschte die Markierung „{tag}“"
#: src/rc_formatters.py:1127 #: src/rc_formatters.py:1127
#, fuzzy
msgid "Removed from" msgid "Removed from"
msgstr "Entfernt" msgstr "Entfernt von"
#: src/rc_formatters.py:1127 #: src/rc_formatters.py:1127
msgid "{} revision or log entry" msgid "{} revision or log entry"
msgid_plural "{} revisions and/or log entries" msgid_plural "{} revisions and/or log entries"
msgstr[0] "" msgstr[0] "{} Version oder Logeintrag"
msgstr[1] "" msgstr[1] "{} Versionen und/oder Logeinträge"
#: src/rc_formatters.py:1131 #: src/rc_formatters.py:1131
#, fuzzy, python-brace-format #, python-brace-format
msgid "Activated the tag \"{tag}\"" msgid "Activated the tag \"{tag}\""
msgstr "Aktivierte die Markierung „{tag}“" msgstr "Aktivierte die Markierung „{tag}“"
#: src/rc_formatters.py:1134 #: src/rc_formatters.py:1134
#, fuzzy, python-brace-format #, python-brace-format
msgid "Deactivated the tag \"{tag}\"" msgid "Deactivated the tag \"{tag}\""
msgstr "Deaktivierte die Markierung „{tag}“" msgstr "Deaktivierte die Markierung „{tag}“"
@ -1348,7 +1354,7 @@ msgid "Locked a \"{wiki}\" wiki"
msgstr "Sperrte das Wiki „{wiki}“" msgstr "Sperrte das Wiki „{wiki}“"
#: src/rc_formatters.py:1147 #: src/rc_formatters.py:1147
#, fuzzy, python-brace-format #, python-brace-format
msgid "Modified \"{namespace_name}\" namespace" msgid "Modified \"{namespace_name}\" namespace"
msgstr "Bearbeitete den Namensraum „{namespace_name}“" msgstr "Bearbeitete den Namensraum „{namespace_name}“"
@ -1367,9 +1373,9 @@ msgid "Modified \"{usergroup_name}\" usergroup"
msgstr "Bearbeitete die Benutzergruppe „{usergroup_name}“" msgstr "Bearbeitete die Benutzergruppe „{usergroup_name}“"
#: src/rc_formatters.py:1160 #: src/rc_formatters.py:1160
#, fuzzy, python-brace-format #, python-brace-format
msgid "Undeleted a \"{wiki}\" wiki" msgid "Undeleted a \"{wiki}\" wiki"
msgstr "Löschte das Wiki „{wiki}“" msgstr "Das „{wiki}“ Wiki wiederhergestellt"
#: src/rc_formatters.py:1163 #: src/rc_formatters.py:1163
#, python-brace-format #, python-brace-format

Binary file not shown.

View file

@ -2,199 +2,190 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: \n" "Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \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-09-03 13:14+0200\n" "PO-Revision-Date: 2021-05-21 18:18+0000\n"
"Last-Translator: MarkusRost <>\n" "Last-Translator: MarkusRost <sukramxro@gmail.com>\n"
"Language-Team: German <https://weblate.frisk.space/projects/rcgcdw/main/de/" "Language-Team: German <https://translate.wikibot.de/projects/rcgcdw/main/de/"
">\n" ">\n"
"Language: de\n" "Language: de\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\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" "X-Loco-Source-Locale: de_DE\n"
"Generated-By: pygettext.py 1.5\n" "Generated-By: pygettext.py 1.5\n"
"X-Loco-Parser: loco_parse_po\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:117
#: src/rcgcdw.py:123 src/rcgcdw.py:125 src/rcgcdw.py:127
#, python-brace-format #, python-brace-format
msgid "{value} (avg. {avg})" msgid "{value} (avg. {avg})"
msgstr "{value} (vgl. {avg})" msgstr "{value} (vgl. {avg})"
#: src/rcgcdw.py:147 #: src/rcgcdw.py:136
msgid "Daily overview" msgid "Daily overview"
msgstr "Tägliche Übersicht" msgstr "Tägliche Übersicht"
#: src/rcgcdw.py:154 #: src/rcgcdw.py:143
msgid "No activity" msgid "No activity"
msgstr "Keine Aktivität" msgstr "Keine Aktivität"
#: src/rcgcdw.py:178 #: src/rcgcdw.py:167
msgid " ({} action)" msgid " ({} action)"
msgid_plural " ({} actions)" msgid_plural " ({} actions)"
msgstr[0] " (eine Aktion)" msgstr[0] " (eine Aktion)"
msgstr[1] " ({} Aktionen)" msgstr[1] " ({} Aktionen)"
#: src/rcgcdw.py:180 #: src/rcgcdw.py:169
msgid " ({} edit)" msgid " ({} edit)"
msgid_plural " ({} edits)" msgid_plural " ({} edits)"
msgstr[0] " (eine Änderung)" msgstr[0] " (eine Änderung)"
msgstr[1] " ({} Änderungen)" msgstr[1] " ({} Änderungen)"
#: src/rcgcdw.py:185 #: src/rcgcdw.py:174
msgid " UTC ({} action)" msgid " UTC ({} action)"
msgid_plural " UTC ({} actions)" msgid_plural " UTC ({} actions)"
msgstr[0] " UTC (eine Aktion)" msgstr[0] " UTC (eine Aktion)"
msgstr[1] " UTC ({} Aktionen)" 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" msgid "But nobody came"
msgstr "Keine Aktivität" msgstr "Keine Aktivität"
#: src/rcgcdw.py:195 #: src/rcgcdw.py:183
msgid "Most active user" msgid "Most active user"
msgid_plural "Most active users" msgid_plural "Most active users"
msgstr[0] "Aktivster Benutzer" msgstr[0] "Aktivster Benutzer"
msgstr[1] "Aktivste Benutzer" msgstr[1] "Aktivste Benutzer"
#: src/rcgcdw.py:196 #: src/rcgcdw.py:184
msgid "Most edited article" msgid "Most edited article"
msgid_plural "Most edited articles" msgid_plural "Most edited articles"
msgstr[0] "Meist bearbeiteter Artikel" msgstr[0] "Meist bearbeiteter Artikel"
msgstr[1] "Meist bearbeitete Artikel" msgstr[1] "Meist bearbeitete Artikel"
#: src/rcgcdw.py:197 #: src/rcgcdw.py:185
msgid "Edits made" msgid "Edits made"
msgstr "Bearbeitungen" msgstr "Bearbeitungen"
#: src/rcgcdw.py:197 #: src/rcgcdw.py:185
msgid "New files" msgid "New files"
msgstr "Neue Dateien" msgstr "Neue Dateien"
#: src/rcgcdw.py:197 #: src/rcgcdw.py:186
msgid "Admin actions" msgid "Admin actions"
msgstr "Admin-Aktionen" msgstr "Admin-Aktionen"
#: src/rcgcdw.py:198 #: src/rcgcdw.py:186
msgid "Bytes changed" msgid "Bytes changed"
msgstr "Bytes geändert" msgstr "Bytes geändert"
#: src/rcgcdw.py:198 #: src/rcgcdw.py:187
msgid "New articles" msgid "New articles"
msgstr "Neue Artikel" msgstr "Neue Artikel"
#: src/rcgcdw.py:199 #: src/rcgcdw.py:187
msgid "Unique contributors" msgid "Unique contributors"
msgstr "Einzelne Autoren" msgstr "Einzelne Autoren"
#: src/rcgcdw.py:200 #: src/rcgcdw.py:188
msgid "Most active hour" msgid "Most active hour"
msgid_plural "Most active hours" msgid_plural "Most active hours"
msgstr[0] "Aktivste Stunde" msgstr[0] "Aktivste Stunde"
msgstr[1] "Aktivste Stunden" msgstr[1] "Aktivste Stunden"
#: src/rcgcdw.py:201 #: src/rcgcdw.py:189
msgid "Day score" msgid "Day score"
msgstr "Tageswert" msgstr "Tageswert"
#: src/rcgcdw.py:243 #: src/rcgcdw.py:223
msgid "director" msgid "~~hidden~~"
msgstr "Direktor" msgstr "~~versteckt~~"
#: src/rcgcdw.py:243 #: src/rcgcdw.py:225
msgid "bot" msgid "No description provided"
msgstr "Bot" msgstr "Keine Zusammenfassung angegeben"
#: src/rcgcdw.py:243 #: src/rcgcdw.py:228
msgid "editor" msgid "hidden"
msgstr "editor" msgstr "versteckt"
#: src/rcgcdw.py:243 #~ msgid "director"
msgid "directors" #~ msgstr "Direktor"
msgstr "Direktor"
#: src/rcgcdw.py:243 #~ msgid "bot"
msgid "sysop" #~ msgstr "Bot"
msgstr "Administrator"
#: src/rcgcdw.py:243 #~ msgid "editor"
msgid "bureaucrat" #~ msgstr "editor"
msgstr "Bürokrat"
#: src/rcgcdw.py:243 #~ msgid "directors"
msgid "reviewer" #~ msgstr "Direktor"
msgstr "Prüfer"
#: src/rcgcdw.py:244 #~ msgid "sysop"
msgid "autoreview" #~ msgstr "Administrator"
msgstr "Passive Sichter"
#: src/rcgcdw.py:244 #~ msgid "bureaucrat"
msgid "autopatrol" #~ msgstr "Bürokrat"
msgstr "autopatrol"
#: src/rcgcdw.py:244 #~ msgid "reviewer"
msgid "wiki_guardian" #~ msgstr "Prüfer"
msgstr "Wiki Guardian"
#: src/rcgcdw.py:244 #~ msgid "autoreview"
msgid "second" #~ msgstr "Passive Sichter"
msgid_plural "seconds"
msgstr[0] "Sekunde"
msgstr[1] "Sekunden"
#: src/rcgcdw.py:244 #~ msgid "autopatrol"
msgid "minute" #~ msgstr "autopatrol"
msgid_plural "minutes"
msgstr[0] "Minute"
msgstr[1] "Minuten"
#: src/rcgcdw.py:244 #~ msgid "wiki_guardian"
msgid "hour" #~ msgstr "Wiki Guardian"
msgid_plural "hours"
msgstr[0] "Stunde"
msgstr[1] "Stunden"
#: src/rcgcdw.py:244 #~ msgid "second"
msgid "day" #~ msgid_plural "seconds"
msgid_plural "days" #~ msgstr[0] "Sekunde"
msgstr[0] "Tag" #~ msgstr[1] "Sekunden"
msgstr[1] "Tage"
#: src/rcgcdw.py:244 #~ msgid "minute"
msgid "week" #~ msgid_plural "minutes"
msgid_plural "weeks" #~ msgstr[0] "Minute"
msgstr[0] "Woche" #~ msgstr[1] "Minuten"
msgstr[1] "Wochen"
#: src/rcgcdw.py:244 #~ msgid "hour"
msgid "month" #~ msgid_plural "hours"
msgid_plural "months" #~ msgstr[0] "Stunde"
msgstr[0] "Monat" #~ msgstr[1] "Stunden"
msgstr[1] "Monate"
#: src/rcgcdw.py:244 #~ msgid "day"
msgid "year" #~ msgid_plural "days"
msgid_plural "years" #~ msgstr[0] "Tag"
msgstr[0] "Jahr" #~ msgstr[1] "Tage"
msgstr[1] "Jahre"
#: src/rcgcdw.py:244 #~ msgid "week"
msgid "millennium" #~ msgid_plural "weeks"
msgid_plural "millennia" #~ msgstr[0] "Woche"
msgstr[0] "Jahrtausend" #~ msgstr[1] "Wochen"
msgstr[1] "Jahrtausende"
#: src/rcgcdw.py:244 #~ msgid "month"
msgid "decade" #~ msgid_plural "months"
msgid_plural "decades" #~ msgstr[0] "Monat"
msgstr[0] "Jahrzehnt" #~ msgstr[1] "Monate"
msgstr[1] "Jahrzehnte"
#: src/rcgcdw.py:244 #~ msgid "year"
msgid "century" #~ msgid_plural "years"
msgid_plural "centuries" #~ msgstr[0] "Jahr"
msgstr[0] "Jahrhundert" #~ msgstr[1] "Jahre"
msgstr[1] "Jahrhunderte"
#~ 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"

Binary file not shown.

View file

@ -7,19 +7,25 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: RcGcDw\n" "Project-Id-Version: RcGcDw\n"
"Report-Msgid-Bugs-To: \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-20 09:22+0000\n" "PO-Revision-Date: 2021-07-30 10:44+0000\n"
"Last-Translator: MarkusRost <sukramxro@gmail.com>\n" "Last-Translator: MarkusRost <sukramxro@gmail.com>\n"
"Language-Team: German <https://weblate.frisk.space/projects/rcgcdw/redaction/" "Language-Team: German <https://translate.wikibot.de/projects/rcgcdw/"
"de/>\n" "redaction/de/>\n"
"Language: de\n" "Language: de\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\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:77
#: src/discord/redaction.py:70 msgid "hidden"
msgid "Removed" msgstr "versteckt"
msgstr "Versteckt"
#: src/discord/redaction.py:80 src/discord/redaction.py:85
msgid "~~hidden~~"
msgstr "~~versteckt~~"
#~ msgid "Removed"
#~ msgstr "Versteckt"

Binary file not shown.

File diff suppressed because it is too large Load diff

View file

@ -7,11 +7,11 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: RcGcDw\n" "Project-Id-Version: RcGcDw\n"
"Report-Msgid-Bugs-To: \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" "PO-Revision-Date: 2020-11-28 22:44+0000\n"
"Last-Translator: Tamara Carvallo <carvallotamara@hotmail.com>\n" "Last-Translator: Tamara Carvallo <carvallotamara@hotmail.com>\n"
"Language-Team: Spanish <https://weblate.frisk.space/projects/rcgcdw/misc/es/>" "Language-Team: Spanish <https://weblate.frisk.space/projects/rcgcdw/misc/es/"
"\n" ">\n"
"Language: es\n" "Language: es\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
@ -71,7 +71,7 @@ msgstr "ID de Discord"
msgid "Battle.net handle" msgid "Battle.net handle"
msgstr "Cuenta en Battle.net" msgstr "Cuenta en Battle.net"
#: src/misc.py:114 #: src/misc.py:139
msgid "" msgid ""
"\n" "\n"
"__And more__" "__And more__"
@ -79,10 +79,10 @@ msgstr ""
"\n" "\n"
"__Y más__" "__Y más__"
#: src/misc.py:271 #: src/misc.py:328
msgid "Unknown" msgid "Unknown"
msgstr "Desconocido" msgstr "Desconocido"
#: src/misc.py:273 #: src/misc.py:330
msgid "unknown" msgid "unknown"
msgstr "desconocido" msgstr "desconocido"

View file

@ -7,11 +7,11 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: RcGcDw\n" "Project-Id-Version: RcGcDw\n"
"Report-Msgid-Bugs-To: \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" "PO-Revision-Date: 2020-12-06 14:17+0000\n"
"Last-Translator: Tamara Carvallo <carvallotamara@hotmail.com>\n" "Last-Translator: Tamara Carvallo <carvallotamara@hotmail.com>\n"
"Language-Team: Spanish <https://translate.wikibot.de/projects/rcgcdw/rc/es/>" "Language-Team: Spanish <https://translate.wikibot.de/projects/rcgcdw/rc/es/"
"\n" ">\n"
"Language: es\n" "Language: es\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
@ -19,24 +19,24 @@ msgstr ""
"Plural-Forms: nplurals=2; plural=n != 1;\n" "Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Generator: Weblate 4.2.1\n" "X-Generator: Weblate 4.2.1\n"
#: src/rc.py:319 #: src/rc.py:322
#, python-brace-format #, python-brace-format
msgid "{wiki} seems to be down or unreachable." msgid "{wiki} seems to be down or unreachable."
msgstr "{wiki} parece estar caído o no alcanzable." 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" msgid "Connection status"
msgstr "Estado de la conexión" msgstr "Estado de la conexión"
#: src/rc.py:330 #: src/rc.py:333
#, python-brace-format #, python-brace-format
msgid "Connection to {wiki} seems to be stable now." msgid "Connection to {wiki} seems to be stable now."
msgstr "La conexión a {wiki} parece estar estable ahora." msgstr "La conexión a {wiki} parece estar estable ahora."
#: src/rc.py:401 #: src/rc.py:404
msgid "~~hidden~~" msgid "~~hidden~~"
msgstr "~~oculto~~" msgstr "~~oculto~~"
#: src/rc.py:405 #: src/rc.py:408
msgid "hidden" msgid "hidden"
msgstr "oculto" msgstr "oculto"

File diff suppressed because it is too large Load diff

View file

@ -7,7 +7,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: RcGcDw\n" "Project-Id-Version: RcGcDw\n"
"Report-Msgid-Bugs-To: \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" "PO-Revision-Date: 2020-12-06 14:17+0000\n"
"Last-Translator: Tamara Carvallo <carvallotamara@hotmail.com>\n" "Last-Translator: Tamara Carvallo <carvallotamara@hotmail.com>\n"
"Language-Team: Spanish <https://translate.wikibot.de/projects/rcgcdw/" "Language-Team: Spanish <https://translate.wikibot.de/projects/rcgcdw/"
@ -19,7 +19,13 @@ msgstr ""
"Plural-Forms: nplurals=2; plural=n != 1;\n" "Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Generator: Weblate 4.2.1\n" "X-Generator: Weblate 4.2.1\n"
#: src/discord/redaction.py:59 src/discord/redaction.py:62 #: src/discord/redaction.py:77
#: src/discord/redaction.py:67 msgid "hidden"
msgid "Removed" msgstr ""
msgstr "Eliminado"
#: src/discord/redaction.py:80 src/discord/redaction.py:85
msgid "~~hidden~~"
msgstr ""
#~ msgid "Removed"
#~ msgstr "Eliminado"

View file

@ -1,178 +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 <EMAIL@ADDRESS>, 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 ""

Binary file not shown.

File diff suppressed because it is too large Load diff

Binary file not shown.

View file

@ -6,7 +6,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: \n" "Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \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" "PO-Revision-Date: 2020-03-17 21:40+0100\n"
"Last-Translator: Frisk <>\n" "Last-Translator: Frisk <>\n"
"Language-Team: \n" "Language-Team: \n"
@ -72,7 +72,7 @@ msgstr ""
msgid "Battle.net handle" msgid "Battle.net handle"
msgstr "" msgstr ""
#: src/misc.py:119 #: src/misc.py:139
msgid "" msgid ""
"\n" "\n"
"__And more__" "__And more__"
@ -80,11 +80,11 @@ msgstr ""
"\n" "\n"
"__Et plus__" "__Et plus__"
#: src/misc.py:276 #: src/misc.py:328
msgid "Unknown" msgid "Unknown"
msgstr "Inconnu" msgstr "Inconnu"
#: src/misc.py:278 #: src/misc.py:330
#, fuzzy #, fuzzy
msgid "unknown" msgid "unknown"
msgstr "Inconnu" msgstr "Inconnu"

Binary file not shown.

View file

@ -7,17 +7,17 @@ msgstr ""
"Project-Id-Version: \n" "Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2020-12-23 00:28+0100\n" "POT-Creation-Date: 2020-12-23 00:28+0100\n"
"PO-Revision-Date: 2020-03-17 21:40+0100\n" "PO-Revision-Date: 2021-05-06 14:10+0000\n"
"Last-Translator: Frisk <>\n" "Last-Translator: Arnaud0865 <Arnaud2.8583@gmail.com>\n"
"Language-Team: \n" "Language-Team: French <https://translate.wikibot.de/projects/rcgcdw/rc/fr/>\n"
"Language: fr\n" "Language: fr\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\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" "Generated-By: pygettext.py 1.5\n"
"X-Generator: Poedit 2.3\n"
"X-Poedit-Basepath: ../../..\n" "X-Poedit-Basepath: ../../..\n"
"Plural-Forms: nplurals=2; plural=(n > 1);\n"
"X-Poedit-SearchPath-0: rcgcdw.pot\n" "X-Poedit-SearchPath-0: rcgcdw.pot\n"
#: src/rc.py:322 #: src/rc.py:322
@ -36,8 +36,8 @@ msgstr "La connexion avec {wiki} semble stable maintenant."
#: src/rc.py:404 #: src/rc.py:404
msgid "~~hidden~~" msgid "~~hidden~~"
msgstr "" msgstr "~~caché~~"
#: src/rc.py:408 #: src/rc.py:408
msgid "hidden" msgid "hidden"
msgstr "" msgstr "caché"

View file

@ -7,17 +7,18 @@ msgstr ""
"Project-Id-Version: \n" "Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2021-04-14 16:24+0200\n" "POT-Creation-Date: 2021-04-14 16:24+0200\n"
"PO-Revision-Date: 2020-03-17 21:40+0100\n" "PO-Revision-Date: 2021-05-06 14:10+0000\n"
"Last-Translator: Frisk <>\n" "Last-Translator: magiczocker <jan-frederik-kriete@t-online.de>\n"
"Language-Team: \n" "Language-Team: French <https://translate.wikibot.de/projects/rcgcdw/"
"rc_formatters/fr/>\n"
"Language: fr\n" "Language: fr\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\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" "Generated-By: pygettext.py 1.5\n"
"X-Generator: Poedit 2.3\n"
"X-Poedit-Basepath: ../../..\n" "X-Poedit-Basepath: ../../..\n"
"Plural-Forms: nplurals=2; plural=(n > 1);\n"
"X-Poedit-SearchPath-0: rcgcdw.pot\n" "X-Poedit-SearchPath-0: rcgcdw.pot\n"
#: src/rc_formatters.py:28 #: src/rc_formatters.py:28
@ -1287,7 +1288,7 @@ msgid ""
msgstr "" msgstr ""
#: src/rc_formatters.py:1195 #: src/rc_formatters.py:1195
#, fuzzy, python-brace-format #, python-brace-format
msgid "Completed deletion of translation page \"{article}\"" 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}"

View file

@ -6,7 +6,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: \n" "Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \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" "PO-Revision-Date: 2020-12-13 14:30+0000\n"
"Last-Translator: magiczocker <jan-frederik-kriete@t-online.de>\n" "Last-Translator: magiczocker <jan-frederik-kriete@t-online.de>\n"
"Language-Team: French <https://translate.wikibot.de/projects/rcgcdw/main/fr/" "Language-Team: French <https://translate.wikibot.de/projects/rcgcdw/main/fr/"
@ -21,184 +21,175 @@ msgstr ""
"X-Poedit-Basepath: ../../..\n" "X-Poedit-Basepath: ../../..\n"
"X-Poedit-SearchPath-0: rcgcdw.pot\n" "X-Poedit-SearchPath-0: rcgcdw.pot\n"
#: src/rcgcdw.py:115 src/rcgcdw.py:117 src/rcgcdw.py:119 src/rcgcdw.py:121 #: src/rcgcdw.py:117
#: src/rcgcdw.py:123 src/rcgcdw.py:125 src/rcgcdw.py:127
#, python-brace-format #, python-brace-format
msgid "{value} (avg. {avg})" msgid "{value} (avg. {avg})"
msgstr "" msgstr ""
#: src/rcgcdw.py:147 #: src/rcgcdw.py:136
msgid "Daily overview" msgid "Daily overview"
msgstr "Résumé de la journée" msgstr "Résumé de la journée"
#: src/rcgcdw.py:154 #: src/rcgcdw.py:143
msgid "No activity" msgid "No activity"
msgstr "Aucune activité" msgstr "Aucune activité"
#: src/rcgcdw.py:178 #: src/rcgcdw.py:167
msgid " ({} action)" msgid " ({} action)"
msgid_plural " ({} actions)" msgid_plural " ({} actions)"
msgstr[0] " ({} action)" msgstr[0] " ({} action)"
msgstr[1] " ({} actions)" msgstr[1] " ({} actions)"
#: src/rcgcdw.py:180 #: src/rcgcdw.py:169
msgid " ({} edit)" msgid " ({} edit)"
msgid_plural " ({} edits)" msgid_plural " ({} edits)"
msgstr[0] " ({} modification)" msgstr[0] " ({} modification)"
msgstr[1] " ({} modifications)" msgstr[1] " ({} modifications)"
#: src/rcgcdw.py:185 #: src/rcgcdw.py:174
msgid " UTC ({} action)" msgid " UTC ({} action)"
msgid_plural " UTC ({} actions)" msgid_plural " UTC ({} actions)"
msgstr[0] " UTC ({} action)" msgstr[0] " UTC ({} action)"
msgstr[1] " UTC ({} actions)" msgstr[1] " UTC ({} actions)"
#: src/rcgcdw.py:187 src/rcgcdw.py:188 src/rcgcdw.py:192 #: src/rcgcdw.py:176 src/rcgcdw.py:179
msgid "But nobody came" msgid "But nobody came"
msgstr "Aucune activité" msgstr "Aucune activité"
#: src/rcgcdw.py:195 #: src/rcgcdw.py:183
msgid "Most active user" msgid "Most active user"
msgid_plural "Most active users" msgid_plural "Most active users"
msgstr[0] "Membre le plus actif" msgstr[0] "Membre le plus actif"
msgstr[1] "Membres les plus actifs" msgstr[1] "Membres les plus actifs"
#: src/rcgcdw.py:196 #: src/rcgcdw.py:184
msgid "Most edited article" msgid "Most edited article"
msgid_plural "Most edited articles" msgid_plural "Most edited articles"
msgstr[0] "Article le plus modifié" msgstr[0] "Article le plus modifié"
msgstr[1] "Articles les plus modifiés" msgstr[1] "Articles les plus modifiés"
#: src/rcgcdw.py:197 #: src/rcgcdw.py:185
msgid "Edits made" msgid "Edits made"
msgstr "Modifications effectuées" msgstr "Modifications effectuées"
#: src/rcgcdw.py:197 #: src/rcgcdw.py:185
msgid "New files" msgid "New files"
msgstr "Nouveaux fichiers" msgstr "Nouveaux fichiers"
#: src/rcgcdw.py:197 #: src/rcgcdw.py:186
msgid "Admin actions" msgid "Admin actions"
msgstr "Actions d'administrateur" msgstr "Actions d'administrateur"
#: src/rcgcdw.py:198 #: src/rcgcdw.py:186
msgid "Bytes changed" msgid "Bytes changed"
msgstr "Octets modifiés" msgstr "Octets modifiés"
#: src/rcgcdw.py:198 #: src/rcgcdw.py:187
msgid "New articles" msgid "New articles"
msgstr "Nouveaux articles" msgstr "Nouveaux articles"
#: src/rcgcdw.py:199 #: src/rcgcdw.py:187
msgid "Unique contributors" msgid "Unique contributors"
msgstr "Contributeurs uniques" msgstr "Contributeurs uniques"
#: src/rcgcdw.py:200 #: src/rcgcdw.py:188
msgid "Most active hour" msgid "Most active hour"
msgid_plural "Most active hours" msgid_plural "Most active hours"
msgstr[0] "Heure la plus active" msgstr[0] "Heure la plus active"
msgstr[1] "Heures les plus actives" msgstr[1] "Heures les plus actives"
#: src/rcgcdw.py:201 #: src/rcgcdw.py:189
msgid "Day score" msgid "Day score"
msgstr "Score du jour" msgstr "Score du jour"
#: src/rcgcdw.py:243 #: src/rcgcdw.py:223
msgid "director" msgid "~~hidden~~"
msgstr "Directeur" msgstr ""
#: src/rcgcdw.py:243 #: src/rcgcdw.py:225
msgid "bot" msgid "No description provided"
msgstr "Robot" msgstr ""
#: src/rcgcdw.py:243 #: src/rcgcdw.py:228
msgid "editor" msgid "hidden"
msgstr "editor" msgstr ""
#: src/rcgcdw.py:243 #~ msgid "director"
msgid "directors" #~ msgstr "Directeur"
msgstr "Directeur"
#: src/rcgcdw.py:243 #~ msgid "bot"
msgid "sysop" #~ msgstr "Robot"
msgstr "Administrateur"
#: src/rcgcdw.py:243 #~ msgid "editor"
msgid "bureaucrat" #~ msgstr "editor"
msgstr "Bureaucrate"
#: src/rcgcdw.py:243 #~ msgid "directors"
msgid "reviewer" #~ msgstr "Directeur"
msgstr "reviewer"
#: src/rcgcdw.py:244 #~ msgid "sysop"
msgid "autoreview" #~ msgstr "Administrateur"
msgstr "autoreview"
#: src/rcgcdw.py:244 #~ msgid "bureaucrat"
msgid "autopatrol" #~ msgstr "Bureaucrate"
msgstr "autopatrol"
#: src/rcgcdw.py:244 #~ msgid "reviewer"
msgid "wiki_guardian" #~ msgstr "reviewer"
msgstr "Gardien du wiki"
#: src/rcgcdw.py:244 #~ msgid "autoreview"
msgid "second" #~ msgstr "autoreview"
msgid_plural "seconds"
msgstr[0] "seconde"
msgstr[1] "secondes"
#: src/rcgcdw.py:244 #~ msgid "autopatrol"
msgid "minute" #~ msgstr "autopatrol"
msgid_plural "minutes"
msgstr[0] "minute"
msgstr[1] "minutes"
#: src/rcgcdw.py:244 #~ msgid "wiki_guardian"
msgid "hour" #~ msgstr "Gardien du wiki"
msgid_plural "hours"
msgstr[0] "heure"
msgstr[1] "heures"
#: src/rcgcdw.py:244 #~ msgid "second"
msgid "day" #~ msgid_plural "seconds"
msgid_plural "days" #~ msgstr[0] "seconde"
msgstr[0] "jour" #~ msgstr[1] "secondes"
msgstr[1] "jours"
#: src/rcgcdw.py:244 #~ msgid "minute"
msgid "week" #~ msgid_plural "minutes"
msgid_plural "weeks" #~ msgstr[0] "minute"
msgstr[0] "semaine" #~ msgstr[1] "minutes"
msgstr[1] "semaines"
#: src/rcgcdw.py:244 #~ msgid "hour"
msgid "month" #~ msgid_plural "hours"
msgid_plural "months" #~ msgstr[0] "heure"
msgstr[0] "mois" #~ msgstr[1] "heures"
msgstr[1] "mois"
#: src/rcgcdw.py:244 #~ msgid "day"
msgid "year" #~ msgid_plural "days"
msgid_plural "years" #~ msgstr[0] "jour"
msgstr[0] "année" #~ msgstr[1] "jours"
msgstr[1] "années"
#: src/rcgcdw.py:244 #~ msgid "week"
msgid "millennium" #~ msgid_plural "weeks"
msgid_plural "millennia" #~ msgstr[0] "semaine"
msgstr[0] "millénaire" #~ msgstr[1] "semaines"
msgstr[1] "millénaires"
#: src/rcgcdw.py:244 #~ msgid "month"
msgid "decade" #~ msgid_plural "months"
msgid_plural "decades" #~ msgstr[0] "mois"
msgstr[0] "décennie" #~ msgstr[1] "mois"
msgstr[1] "décennies"
#: src/rcgcdw.py:244 #~ msgid "year"
msgid "century" #~ msgid_plural "years"
msgid_plural "centuries" #~ msgstr[0] "année"
msgstr[0] "centenaire" #~ msgstr[1] "années"
msgstr[1] "centenaires"
#~ 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"

View file

@ -7,7 +7,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: RcGcDw\n" "Project-Id-Version: RcGcDw\n"
"Report-Msgid-Bugs-To: \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: 2021-04-14 14:22+0000\n" "PO-Revision-Date: 2021-04-14 14:22+0000\n"
"Last-Translator: Arnaud0865 <Arnaud2.8583@gmail.com>\n" "Last-Translator: Arnaud0865 <Arnaud2.8583@gmail.com>\n"
"Language-Team: French <https://translate.wikibot.de/projects/rcgcdw/" "Language-Team: French <https://translate.wikibot.de/projects/rcgcdw/"
@ -19,7 +19,13 @@ msgstr ""
"Plural-Forms: nplurals=2; plural=n > 1;\n" "Plural-Forms: nplurals=2; plural=n > 1;\n"
"X-Generator: Weblate 4.4.2\n" "X-Generator: Weblate 4.4.2\n"
#: src/discord/redaction.py:62 src/discord/redaction.py:65 #: src/discord/redaction.py:77
#: src/discord/redaction.py:70 msgid "hidden"
msgid "Removed" msgstr ""
msgstr "Retiré"
#: src/discord/redaction.py:80 src/discord/redaction.py:85
msgid "~~hidden~~"
msgstr ""
#~ msgid "Removed"
#~ msgstr "Retiré"

View file

@ -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 <EMAIL@ADDRESS>, 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 <sukramxro@gmail.com>\n"
"Language-Team: Hindi <https://translate.wikibot.de/projects/rcgcdw/"
"discussion_formatters-1/hi/>\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 "इसे सहायता सर्वर पर रिपोर्ट करें"

Binary file not shown.

File diff suppressed because it is too large Load diff

View file

@ -7,7 +7,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: RcGcDw\n" "Project-Id-Version: RcGcDw\n"
"Report-Msgid-Bugs-To: \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" "PO-Revision-Date: 2020-11-25 10:16+0000\n"
"Last-Translator: Creeper <thisisacreeper0101@gmail.com>\n" "Last-Translator: Creeper <thisisacreeper0101@gmail.com>\n"
"Language-Team: Hindi <https://weblate.frisk.space/projects/rcgcdw/misc/hi/>\n" "Language-Team: Hindi <https://weblate.frisk.space/projects/rcgcdw/misc/hi/>\n"
@ -70,7 +70,7 @@ msgstr "डिस्कॉर्ड अकाउंट"
msgid "Battle.net handle" msgid "Battle.net handle"
msgstr "Battle.net अकाउंट" msgstr "Battle.net अकाउंट"
#: src/misc.py:119 #: src/misc.py:139
msgid "" msgid ""
"\n" "\n"
"__And more__" "__And more__"
@ -78,10 +78,10 @@ msgstr ""
"\n" "\n"
"__और काफी कुछ__" "__और काफी कुछ__"
#: src/misc.py:276 #: src/misc.py:328
msgid "Unknown" msgid "Unknown"
msgstr "अनजान" msgstr "अनजान"
#: src/misc.py:278 #: src/misc.py:330
msgid "unknown" msgid "unknown"
msgstr "अनजान" msgstr "अनजान"

View file

@ -8,7 +8,7 @@ msgstr ""
"Project-Id-Version: RcGcDw\n" "Project-Id-Version: RcGcDw\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2021-04-14 16:24+0200\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 <thisisacreeper0101@gmail.com>\n" "Last-Translator: Creeper <thisisacreeper0101@gmail.com>\n"
"Language-Team: Hindi <https://translate.wikibot.de/projects/rcgcdw/" "Language-Team: Hindi <https://translate.wikibot.de/projects/rcgcdw/"
"rc_formatters/hi/>\n" "rc_formatters/hi/>\n"
@ -17,7 +17,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n > 1;\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 #: src/rc_formatters.py:28
msgid "None" msgid "None"
@ -593,19 +593,22 @@ msgid "[{author}]({author_url}) replaced the Cargo table \"{table}\""
msgstr "[{author}]({author_url}) ने कार्गो टेबल \"{table}\" को बदल दिया" msgstr "[{author}]({author_url}) ने कार्गो टेबल \"{table}\" को बदल दिया"
#: src/rc_formatters.py:436 #: src/rc_formatters.py:436
#, fuzzy, python-brace-format #, python-brace-format
msgid "" msgid ""
"[{author}]({author_url}) created the [tag]({tag_url}) \"{tag}\"{comment}" "[{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 #: src/rc_formatters.py:441
#, fuzzy, python-brace-format #, python-brace-format
msgid "" msgid ""
"[{author}]({author_url}) deleted the [tag]({tag_url}) \"{tag}\"{comment}" "[{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 #: src/rc_formatters.py:443
#, fuzzy, python-brace-format #, python-brace-format
msgid "" msgid ""
"[{author}]({author_url}) deleted the [tag]({tag_url}) \"{tag}\" and removed " "[{author}]({author_url}) deleted the [tag]({tag_url}) \"{tag}\" and removed "
"it from {count} revision or log entry{comment}" "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 " "[{author}]({author_url}) deleted the [tag]({tag_url}) \"{tag}\" and removed "
"it from {count} revisions and/or log entries{comment}" "it from {count} revisions and/or log entries{comment}"
msgstr[0] "" msgstr[0] ""
"[{author}]({author_url}) ने [{article}]({article_url}) को {count} रिवीशन के " "[{author}]({author_url}) ने [टैग]({tag_url}) \"{tag}\" को डिलीट किया और इसे "
"साथ ({article_url}) इम्पोर्ट किया{comment}" "{count} रिवीशन या लॉग एंट्री से हटाया{comment}"
msgstr[1] "" msgstr[1] ""
"[{author}]({author_url}) ने [{article}]({article_url}) को {count} रिवीशनों के " "[{author}]({author_url}) ने [टैग]({tag_url}) \"{tag}\" को डिलीट किया और इसे "
"साथ ({article_url}) इम्पोर्ट किया{comment}" "{count} रिवीशनों या लॉग एंट्रियों से हटाया{comment}"
#: src/rc_formatters.py:449 #: src/rc_formatters.py:449
#, fuzzy, python-brace-format #, python-brace-format
msgid "" msgid ""
"[{author}]({author_url}) activated the [tag]({tag_url}) \"{tag}\"{comment}" "[{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 #: src/rc_formatters.py:452
#, fuzzy, python-brace-format #, python-brace-format
msgid "" msgid ""
"[{author}]({author_url}) deactivated the [tag]({tag_url}) \"{tag}\"{comment}" "[{author}]({author_url}) deactivated the [tag]({tag_url}) \"{tag}\"{comment}"
msgstr "" msgstr ""
"[{author}]({author_url}) ने एक [टैग]({tag_url}) \"{tag}\" को डिऐक्टिवेट किया" "[{author}]({author_url}) ने एक [टैग]({tag_url}) \"{tag}\" को अक्रीय "
"किया{comment}"
#: src/rc_formatters.py:454 #: src/rc_formatters.py:454
#, python-brace-format #, python-brace-format
@ -648,12 +654,12 @@ msgid "[{author}]({author_url}) locked a wiki *{wiki_name}*{comment}"
msgstr "[{author}]({author_url}) ने विकी *{wiki_name}* के लॉक किया{comment}" msgstr "[{author}]({author_url}) ने विकी *{wiki_name}* के लॉक किया{comment}"
#: src/rc_formatters.py:462 #: src/rc_formatters.py:462
#, fuzzy, python-brace-format #, python-brace-format
msgid "" msgid ""
"[{author}]({author_url}) modified namespace *{namespace_name}* on " "[{author}]({author_url}) modified namespace *{namespace_name}* on "
"*{wiki_name}*{comment}" "*{wiki_name}*{comment}"
msgstr "" msgstr ""
"[{author}]({author_url}) ने *{wiki_name}* पर एक नेमस्पेस *{namespace_name}* को " "[{author}]({author_url}) ने *{wiki_name}* पर नेमस्पेस *{namespace_name}* को "
"मॉडिफाइ किया{comment}" "मॉडिफाइ किया{comment}"
#: src/rc_formatters.py:467 #: src/rc_formatters.py:467
@ -672,9 +678,9 @@ msgstr ""
"[{author}]({author_url}) ने यूज़र ग्रुप *{group_name}* को मॉडिफाइ किया{comment}" "[{author}]({author_url}) ने यूज़र ग्रुप *{group_name}* को मॉडिफाइ किया{comment}"
#: src/rc_formatters.py:477 #: src/rc_formatters.py:477
#, fuzzy, python-brace-format #, python-brace-format
msgid "[{author}]({author_url}) undeleted a wiki *{wiki_name}*{comment}" 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 #: src/rc_formatters.py:481
#, python-brace-format #, python-brace-format
@ -1290,35 +1296,34 @@ msgid "Replaced the Cargo table \"{table}\""
msgstr "कोर्गो टेबल \"{table}\" को बदला गया" msgstr "कोर्गो टेबल \"{table}\" को बदला गया"
#: src/rc_formatters.py:1121 #: src/rc_formatters.py:1121
#, fuzzy, python-brace-format #, python-brace-format
msgid "Created the tag \"{tag}\"" msgid "Created the tag \"{tag}\""
msgstr "टैग \"{tag}\" बनाया गया" msgstr "टैग \"{tag}\" बनाया गया"
#: src/rc_formatters.py:1125 #: src/rc_formatters.py:1125
#, fuzzy, python-brace-format #, python-brace-format
msgid "Deleted the tag \"{tag}\"" msgid "Deleted the tag \"{tag}\""
msgstr "टैग \"{tag}\" को डिलीट किया गया" msgstr "टैग \"{tag}\" को डिलीट किया गया"
#: src/rc_formatters.py:1127 #: src/rc_formatters.py:1127
#, fuzzy
msgid "Removed from" msgid "Removed from"
msgstr "हटाया गया" msgstr "इससे हटाया गया"
#: src/rc_formatters.py:1127 #: src/rc_formatters.py:1127
msgid "{} revision or log entry" msgid "{} revision or log entry"
msgid_plural "{} revisions and/or log entries" msgid_plural "{} revisions and/or log entries"
msgstr[0] "" msgstr[0] "{} रिवीशन और/या लॉग एंट्री"
msgstr[1] "" msgstr[1] "{} रिवीशन और/या लॉग एंट्रियाँ"
#: src/rc_formatters.py:1131 #: src/rc_formatters.py:1131
#, fuzzy, python-brace-format #, python-brace-format
msgid "Activated the tag \"{tag}\"" msgid "Activated the tag \"{tag}\""
msgstr "टैग \"{tag}\" को ऐक्टिवेट किया गया" msgstr "टैग \"{tag}\" को सक्रीय किया गया"
#: src/rc_formatters.py:1134 #: src/rc_formatters.py:1134
#, fuzzy, python-brace-format #, python-brace-format
msgid "Deactivated the tag \"{tag}\"" msgid "Deactivated the tag \"{tag}\""
msgstr "टैग \"{tag}\" को डिऐक्टिवेट किया गया" msgstr "टैग \"{tag}\" को अक्रीय किया गया"
#: src/rc_formatters.py:1137 #: src/rc_formatters.py:1137
msgid "Changed wiki settings" msgid "Changed wiki settings"
@ -1335,7 +1340,7 @@ msgid "Locked a \"{wiki}\" wiki"
msgstr "\"{wiki}\" विकी को लॉक किया गया" msgstr "\"{wiki}\" विकी को लॉक किया गया"
#: src/rc_formatters.py:1147 #: src/rc_formatters.py:1147
#, fuzzy, python-brace-format #, python-brace-format
msgid "Modified \"{namespace_name}\" namespace" msgid "Modified \"{namespace_name}\" namespace"
msgstr "\"{namespace_name}\" नेमस्पेस को मॉडिफाइ किया गया" msgstr "\"{namespace_name}\" नेमस्पेस को मॉडिफाइ किया गया"
@ -1354,9 +1359,9 @@ msgid "Modified \"{usergroup_name}\" usergroup"
msgstr "\"{usergroup_name}\" यूज़रग्रुप को मॉडिफाइ किया गया" msgstr "\"{usergroup_name}\" यूज़रग्रुप को मॉडिफाइ किया गया"
#: src/rc_formatters.py:1160 #: src/rc_formatters.py:1160
#, fuzzy, python-brace-format #, python-brace-format
msgid "Undeleted a \"{wiki}\" wiki" msgid "Undeleted a \"{wiki}\" wiki"
msgstr "\"{wiki}\" विकी को डिलीट किया गया" msgstr "\"{wiki}\" विकि को अनडिलीट किया गया"
#: src/rc_formatters.py:1163 #: src/rc_formatters.py:1163
#, python-brace-format #, python-brace-format

Binary file not shown.

View file

@ -7,199 +7,190 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: RcGcDw\n" "Project-Id-Version: RcGcDw\n"
"Report-Msgid-Bugs-To: \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-06 14:17+0000\n" "PO-Revision-Date: 2021-07-11 12:33+0000\n"
"Last-Translator: Creeper <thisisacreeper0101@gmail.com>\n" "Last-Translator: Creeper <thisisacreeper0101@gmail.com>\n"
"Language-Team: Hindi <https://translate.wikibot.de/projects/rcgcdw/main/hi/" "Language-Team: Hindi <https://translate.wikibot.de/projects/rcgcdw/main/hi/>"
">\n" "\n"
"Language: hi\n" "Language: hi\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n > 1;\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:117
#: src/rcgcdw.py:123 src/rcgcdw.py:125 src/rcgcdw.py:127
#, python-brace-format #, python-brace-format
msgid "{value} (avg. {avg})" msgid "{value} (avg. {avg})"
msgstr "{value} (औसत {avg})" msgstr "{value} (औसत {avg})"
#: src/rcgcdw.py:147 #: src/rcgcdw.py:136
msgid "Daily overview" msgid "Daily overview"
msgstr "दैनिक अवलोकन" msgstr "दैनिक अवलोकन"
#: src/rcgcdw.py:154 #: src/rcgcdw.py:143
msgid "No activity" msgid "No activity"
msgstr "कोई ऐक्टिविटी नहीं थी" msgstr "कोई ऐक्टिविटी नहीं थी"
#: src/rcgcdw.py:178 #: src/rcgcdw.py:167
msgid " ({} action)" msgid " ({} action)"
msgid_plural " ({} actions)" msgid_plural " ({} actions)"
msgstr[0] " ({} एक्शन)" msgstr[0] " ({} एक्शन)"
msgstr[1] " ({} एक्शन)" msgstr[1] " ({} एक्शन)"
#: src/rcgcdw.py:180 #: src/rcgcdw.py:169
msgid " ({} edit)" msgid " ({} edit)"
msgid_plural " ({} edits)" msgid_plural " ({} edits)"
msgstr[0] " ({} सम्पादना)" msgstr[0] " ({} सम्पादना)"
msgstr[1] " ({} सम्पादनाएँ)" msgstr[1] " ({} सम्पादनाएँ)"
#: src/rcgcdw.py:185 #: src/rcgcdw.py:174
msgid " UTC ({} action)" msgid " UTC ({} action)"
msgid_plural " UTC ({} actions)" msgid_plural " UTC ({} actions)"
msgstr[0] " UTC ({} एक्शन)" msgstr[0] " UTC ({} एक्शन)"
msgstr[1] " 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" msgid "But nobody came"
msgstr "पर कोई नहीं आया" msgstr "पर कोई नहीं आया"
#: src/rcgcdw.py:195 #: src/rcgcdw.py:183
msgid "Most active user" msgid "Most active user"
msgid_plural "Most active users" msgid_plural "Most active users"
msgstr[0] "सबसे सक्रीय सदस्य" msgstr[0] "सबसे सक्रीय सदस्य"
msgstr[1] "सबसे सक्रीय सदस्य" msgstr[1] "सबसे सक्रीय सदस्य"
#: src/rcgcdw.py:196 #: src/rcgcdw.py:184
msgid "Most edited article" msgid "Most edited article"
msgid_plural "Most edited articles" msgid_plural "Most edited articles"
msgstr[0] "सबसे ज़्यादा सम्पादित किया गया आर्टिकल" msgstr[0] "सबसे ज़्यादा सम्पादित किया गया आर्टिकल"
msgstr[1] "सबसे ज़्यादा सम्पादित किए गए आर्टिकल" msgstr[1] "सबसे ज़्यादा सम्पादित किए गए आर्टिकल"
#: src/rcgcdw.py:197 #: src/rcgcdw.py:185
msgid "Edits made" msgid "Edits made"
msgstr "दिए गए सम्पादनाएँ" msgstr "दिए गए सम्पादनाएँ"
#: src/rcgcdw.py:197 #: src/rcgcdw.py:185
msgid "New files" msgid "New files"
msgstr "नए चित्र" msgstr "नए चित्र"
#: src/rcgcdw.py:197 #: src/rcgcdw.py:186
msgid "Admin actions" msgid "Admin actions"
msgstr "एडमिन एक्शन" msgstr "एडमिन एक्शन"
#: src/rcgcdw.py:198 #: src/rcgcdw.py:186
msgid "Bytes changed" msgid "Bytes changed"
msgstr "बदले गए बाइट" msgstr "बदले गए बाइट"
#: src/rcgcdw.py:198 #: src/rcgcdw.py:187
msgid "New articles" msgid "New articles"
msgstr "नए आर्टिकल" msgstr "नए आर्टिकल"
#: src/rcgcdw.py:199 #: src/rcgcdw.py:187
msgid "Unique contributors" msgid "Unique contributors"
msgstr "विशेष सदस्य" msgstr "विशेष सदस्य"
#: src/rcgcdw.py:200 #: src/rcgcdw.py:188
msgid "Most active hour" msgid "Most active hour"
msgid_plural "Most active hours" msgid_plural "Most active hours"
msgstr[0] "सबसे सक्रीय घंटा" msgstr[0] "सबसे सक्रीय घंटा"
msgstr[1] "सबसे सक्रीय घंटे" msgstr[1] "सबसे सक्रीय घंटे"
#: src/rcgcdw.py:201 #: src/rcgcdw.py:189
msgid "Day score" msgid "Day score"
msgstr "दिन का स्कोर" msgstr "दिन का स्कोर"
#: src/rcgcdw.py:243 #: src/rcgcdw.py:223
msgid "director" msgid "~~hidden~~"
msgstr "निर्देशक" msgstr "~~छिपाया गया~~"
#: src/rcgcdw.py:243 #: src/rcgcdw.py:225
msgid "bot" msgid "No description provided"
msgstr "बॉट" msgstr "कोई विवरण नहीं दिया गया"
#: src/rcgcdw.py:243 #: src/rcgcdw.py:228
msgid "editor" msgid "hidden"
msgstr "सम्पादक" msgstr "छिपाया गया"
#: src/rcgcdw.py:243 #~ msgid "director"
msgid "directors" #~ msgstr "निर्देशक"
msgstr "निर्देशक"
#: src/rcgcdw.py:243 #~ msgid "bot"
msgid "sysop" #~ msgstr "बॉट"
msgstr "साइसॉप"
#: src/rcgcdw.py:243 #~ msgid "editor"
msgid "bureaucrat" #~ msgstr "सम्पादक"
msgstr "ब्यूरोक्रैट"
#: src/rcgcdw.py:243 #~ msgid "directors"
msgid "reviewer" #~ msgstr "निर्देशक"
msgstr "रिव्युअर"
#: src/rcgcdw.py:244 #~ msgid "sysop"
msgid "autoreview" #~ msgstr "साइसॉप"
msgstr "ऑटोरिव्यु"
#: src/rcgcdw.py:244 #~ msgid "bureaucrat"
msgid "autopatrol" #~ msgstr "ब्यूरोक्रैट"
msgstr "ऑटोपैट्रॉल"
#: src/rcgcdw.py:244 #~ msgid "reviewer"
msgid "wiki_guardian" #~ msgstr "रिव्युअर"
msgstr "विकी_संरक्षक"
#: src/rcgcdw.py:244 #~ msgid "autoreview"
msgid "second" #~ msgstr "ऑटोरिव्यु"
msgid_plural "seconds"
msgstr[0] "सेकंड"
msgstr[1] "सेकंड"
#: src/rcgcdw.py:244 #~ msgid "autopatrol"
msgid "minute" #~ msgstr "ऑटोपैट्रॉल"
msgid_plural "minutes"
msgstr[0] "मिनट"
msgstr[1] "मिनट"
#: src/rcgcdw.py:244 #~ msgid "wiki_guardian"
msgid "hour" #~ msgstr "विकी_संरक्षक"
msgid_plural "hours"
msgstr[0] "घंटा"
msgstr[1] "घंटे"
#: src/rcgcdw.py:244 #~ msgid "second"
msgid "day" #~ msgid_plural "seconds"
msgid_plural "days" #~ msgstr[0] "सेकंड"
msgstr[0] "दिन" #~ msgstr[1] "सेकंड"
msgstr[1] "दिन"
#: src/rcgcdw.py:244 #~ msgid "minute"
msgid "week" #~ msgid_plural "minutes"
msgid_plural "weeks" #~ msgstr[0] "मिनट"
msgstr[0] "हफ्ता" #~ msgstr[1] "मिनट"
msgstr[1] "हफ्तें"
#: src/rcgcdw.py:244 #~ msgid "hour"
msgid "month" #~ msgid_plural "hours"
msgid_plural "months" #~ msgstr[0] "घंटा"
msgstr[0] "महीना" #~ msgstr[1] "घंटे"
msgstr[1] "महीनें"
#: src/rcgcdw.py:244 #~ msgid "day"
msgid "year" #~ msgid_plural "days"
msgid_plural "years" #~ msgstr[0] "दिन"
msgstr[0] "साल" #~ msgstr[1] "दिन"
msgstr[1] "साल"
#: src/rcgcdw.py:244 #~ msgid "week"
msgid "millennium" #~ msgid_plural "weeks"
msgid_plural "millennia" #~ msgstr[0] "हफ्ता"
msgstr[0] "सहस्त्राब्द" #~ msgstr[1] "हफ्तें"
msgstr[1] "सहस्त्राब्द"
#: src/rcgcdw.py:244 #~ msgid "month"
msgid "decade" #~ msgid_plural "months"
msgid_plural "decades" #~ msgstr[0] "महीना"
msgstr[0] "दशक" #~ msgstr[1] "महीनें"
msgstr[1] "दशक"
#: src/rcgcdw.py:244 #~ msgid "year"
msgid "century" #~ msgid_plural "years"
msgid_plural "centuries" #~ msgstr[0] "साल"
msgstr[0] "शताब्दी" #~ msgstr[1] "साल"
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" #~ msgid "None"
#~ msgstr "कुछ नहीं" #~ msgstr "कुछ नहीं"
@ -759,9 +750,6 @@ msgstr[1] "शताब्दियाँ"
#~ msgid "Title" #~ msgid "Title"
#~ msgstr "शीर्षक" #~ msgstr "शीर्षक"
#~ msgid "No description provided"
#~ msgstr "कोई विवरण नहीं दिया गया"
#~ msgid "(N!) " #~ msgid "(N!) "
#~ msgstr "(न!) " #~ msgstr "(न!) "

View file

@ -7,7 +7,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: RcGcDw\n" "Project-Id-Version: RcGcDw\n"
"Report-Msgid-Bugs-To: \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" "PO-Revision-Date: 2020-11-27 13:07+0000\n"
"Last-Translator: Creeper <thisisacreeper0101@gmail.com>\n" "Last-Translator: Creeper <thisisacreeper0101@gmail.com>\n"
"Language-Team: Hindi <https://translate.wikibot.de/projects/rcgcdw/redaction/" "Language-Team: Hindi <https://translate.wikibot.de/projects/rcgcdw/redaction/"
@ -19,7 +19,13 @@ msgstr ""
"Plural-Forms: nplurals=2; plural=n > 1;\n" "Plural-Forms: nplurals=2; plural=n > 1;\n"
"X-Generator: Weblate 4.2.1\n" "X-Generator: Weblate 4.2.1\n"
#: src/discord/redaction.py:62 src/discord/redaction.py:65 #: src/discord/redaction.py:77
#: src/discord/redaction.py:70 msgid "hidden"
msgid "Removed" msgstr ""
msgstr "हटाया गया"
#: src/discord/redaction.py:80 src/discord/redaction.py:85
msgid "~~hidden~~"
msgstr ""
#~ msgid "Removed"
#~ msgstr "हटाया गया"

View file

@ -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 <EMAIL@ADDRESS>, 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 ""

View file

@ -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 <EMAIL@ADDRESS>, 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 ""

Binary file not shown.

File diff suppressed because it is too large Load diff

Binary file not shown.

View file

@ -8,76 +8,81 @@ msgstr ""
"Project-Id-Version: RcGcDw\n" "Project-Id-Version: RcGcDw\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2020-11-30 11:58+0100\n" "POT-Creation-Date: 2020-11-30 11:58+0100\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: 2021-07-11 12:33+0000\n"
"Last-Translator: Automatically generated\n" "Last-Translator: しぃ <lzmashili@icloud.com>\n"
"Language-Team: none\n" "Language-Team: Japanese <https://translate.wikibot.de/projects/rcgcdw/misc/"
"ja/>\n"
"Language: ja\n" "Language: ja\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=1; plural=0;\n"
"X-Generator: Weblate 4.6.2\n"
#: src/misc.py:45 #: src/misc.py:45
msgid "Location" msgid "Location"
msgstr "" msgstr "ロケーション"
#: src/misc.py:45 #: src/misc.py:45
msgid "About me" msgid "About me"
msgstr "" msgstr "私について"
#: src/misc.py:45 #: src/misc.py:45
msgid "Google link" msgid "Google link"
msgstr "" msgstr "Googleのリンク"
#: src/misc.py:45 #: src/misc.py:45
msgid "Facebook link" msgid "Facebook link"
msgstr "" msgstr "Facebookのリンク"
#: src/misc.py:45 #: src/misc.py:45
msgid "Twitter link" msgid "Twitter link"
msgstr "" msgstr "Twitterのリンク"
#: src/misc.py:45 #: src/misc.py:45
msgid "Reddit link" msgid "Reddit link"
msgstr "" msgstr "Redditのリンク"
#: src/misc.py:45 #: src/misc.py:45
msgid "Twitch link" msgid "Twitch link"
msgstr "" msgstr "Twitchのリンク"
#: src/misc.py:45 #: src/misc.py:45
msgid "PSN link" msgid "PSN link"
msgstr "" msgstr "PSNのリンク"
#: src/misc.py:45 #: src/misc.py:45
msgid "VK link" msgid "VK link"
msgstr "" msgstr "VKのリンク"
#: src/misc.py:45 #: src/misc.py:45
msgid "XBL link" msgid "XBL link"
msgstr "" msgstr "XBLのリンク"
#: src/misc.py:45 #: src/misc.py:45
msgid "Steam link" msgid "Steam link"
msgstr "" msgstr "Steamのリンク"
#: src/misc.py:45 #: src/misc.py:45
msgid "Discord handle" msgid "Discord handle"
msgstr "" msgstr "Discordアカウントへのリンク"
#: src/misc.py:45 #: src/misc.py:45
msgid "Battle.net handle" msgid "Battle.net handle"
msgstr "" msgstr "Battle.net アカウントへのリンク"
#: src/misc.py:119 #: src/misc.py:119
msgid "" msgid ""
"\n" "\n"
"__And more__" "__And more__"
msgstr "" msgstr ""
"\n"
"__その他色々__"
#: src/misc.py:276 #: src/misc.py:276
msgid "Unknown" msgid "Unknown"
msgstr "" msgstr "不明"
#: src/misc.py:278 #: src/misc.py:278
msgid "unknown" msgid "unknown"
msgstr "" msgstr "不明"

Binary file not shown.

View file

@ -8,14 +8,16 @@ msgstr ""
"Project-Id-Version: RcGcDw\n" "Project-Id-Version: RcGcDw\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2020-11-30 11:58+0100\n" "POT-Creation-Date: 2020-11-30 11:58+0100\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: 2021-07-11 12:33+0000\n"
"Last-Translator: Automatically generated\n" "Last-Translator: しぃ <lzmashili@icloud.com>\n"
"Language-Team: none\n" "Language-Team: Japanese <https://translate.wikibot.de/projects/rcgcdw/main/"
"ja/>\n"
"Language: ja\n" "Language: ja\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=1; plural=0;\n" "Plural-Forms: nplurals=1; plural=0;\n"
"X-Generator: Weblate 4.6.2\n"
#: src/rc_formatters.py:28 #: src/rc_formatters.py:28
msgid "None" msgid "None"
@ -732,7 +734,7 @@ msgstr ""
#: src/rc_formatters.py:661 src/rc_formatters.py:948 #: src/rc_formatters.py:661 src/rc_formatters.py:948
msgid "No description provided" msgid "No description provided"
msgstr "" msgstr "説明はありません"
#: src/rc_formatters.py:685 #: src/rc_formatters.py:685
msgid "(N!) " msgid "(N!) "

Binary file not shown.

View file

@ -8,15 +8,18 @@ msgstr ""
"Project-Id-Version: RcGcDw\n" "Project-Id-Version: RcGcDw\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2020-11-30 11:58+0100\n" "POT-Creation-Date: 2020-11-30 11:58+0100\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: 2021-07-11 12:33+0000\n"
"Last-Translator: Automatically generated\n" "Last-Translator: しぃ <lzmashili@icloud.com>\n"
"Language-Team: none\n" "Language-Team: Japanese <https://translate.wikibot.de/projects/rcgcdw/"
"redaction/ja/>\n"
"Language: ja\n" "Language: ja\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\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:59 src/discord/redaction.py:62
#: src/discord/redaction.py:67 #: src/discord/redaction.py:67
msgid "Removed" msgid "Removed"
msgstr "" msgstr "削除"

View file

@ -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 <EMAIL@ADDRESS>, 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 <revi@pobox.com>\n"
"Language-Team: Korean <https://translate.wikibot.de/projects/rcgcdw/"
"discussion_formatters-1/ko/>\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 ""

Binary file not shown.

File diff suppressed because it is too large Load diff

View file

@ -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 <EMAIL@ADDRESS>, 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 ""

File diff suppressed because it is too large Load diff

View file

@ -7,7 +7,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: RcGcDw\n" "Project-Id-Version: RcGcDw\n"
"Report-Msgid-Bugs-To: \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" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: Automatically generated\n" "Last-Translator: Automatically generated\n"
"Language-Team: none\n" "Language-Team: none\n"
@ -68,16 +68,16 @@ msgstr ""
msgid "Battle.net handle" msgid "Battle.net handle"
msgstr "" msgstr ""
#: src/misc.py:119 #: src/misc.py:139
msgid "" msgid ""
"\n" "\n"
"__And more__" "__And more__"
msgstr "" msgstr ""
#: src/misc.py:276 #: src/misc.py:328
msgid "Unknown" msgid "Unknown"
msgstr "" msgstr ""
#: src/misc.py:278 #: src/misc.py:330
msgid "unknown" msgid "unknown"
msgstr "" msgstr ""

View file

@ -7,7 +7,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: PACKAGE VERSION\n" "Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \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" "PO-Revision-Date: 2020-08-16 19:13+0000\n"
"Last-Translator: Frisk The Evil Goat Overlord <>\n" "Last-Translator: Frisk The Evil Goat Overlord <>\n"
"Language-Team: Lolcat <https://weblate.frisk.space/projects/rcgcdw/main/lol/" "Language-Team: Lolcat <https://weblate.frisk.space/projects/rcgcdw/main/lol/"
@ -19,187 +19,119 @@ msgstr ""
"Plural-Forms: nplurals=2; plural=n != 1;\n" "Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Generator: Weblate 4.1.1\n" "X-Generator: Weblate 4.1.1\n"
#: src/rcgcdw.py:115 src/rcgcdw.py:117 src/rcgcdw.py:119 src/rcgcdw.py:121 #: src/rcgcdw.py:117
#: src/rcgcdw.py:123 src/rcgcdw.py:125 src/rcgcdw.py:127
#, python-brace-format #, python-brace-format
msgid "{value} (avg. {avg})" msgid "{value} (avg. {avg})"
msgstr "{value} (mor or less. {avg})" msgstr "{value} (mor or less. {avg})"
#: src/rcgcdw.py:147 #: src/rcgcdw.py:136
msgid "Daily overview" msgid "Daily overview"
msgstr "Morn' newz" msgstr "Morn' newz"
#: src/rcgcdw.py:154 #: src/rcgcdw.py:143
msgid "No activity" msgid "No activity"
msgstr "No food" msgstr "No food"
#: src/rcgcdw.py:178 #: src/rcgcdw.py:167
msgid " ({} action)" msgid " ({} action)"
msgid_plural " ({} actions)" msgid_plural " ({} actions)"
msgstr[0] " ({} action)" msgstr[0] " ({} action)"
msgstr[1] " ({} actionz)" msgstr[1] " ({} actionz)"
#: src/rcgcdw.py:180 #: src/rcgcdw.py:169
msgid " ({} edit)" msgid " ({} edit)"
msgid_plural " ({} edits)" msgid_plural " ({} edits)"
msgstr[0] "" msgstr[0] ""
msgstr[1] "" msgstr[1] ""
#: src/rcgcdw.py:185 #: src/rcgcdw.py:174
msgid " UTC ({} action)" msgid " UTC ({} action)"
msgid_plural " UTC ({} actions)" msgid_plural " UTC ({} actions)"
msgstr[0] " UTC ({} action)" msgstr[0] " UTC ({} action)"
msgstr[1] " UTC ({} actionz)" msgstr[1] " UTC ({} actionz)"
#: src/rcgcdw.py:187 src/rcgcdw.py:188 src/rcgcdw.py:192 #: src/rcgcdw.py:176 src/rcgcdw.py:179
msgid "But nobody came" msgid "But nobody came"
msgstr "No one brot food 😾" msgstr "No one brot food 😾"
#: src/rcgcdw.py:195 #: src/rcgcdw.py:183
msgid "Most active user" msgid "Most active user"
msgid_plural "Most active users" msgid_plural "Most active users"
msgstr[0] "Most skilld cat" msgstr[0] "Most skilld cat"
msgstr[1] "Most skilld cats" msgstr[1] "Most skilld cats"
#: src/rcgcdw.py:196 #: src/rcgcdw.py:184
msgid "Most edited article" msgid "Most edited article"
msgid_plural "Most edited articles" msgid_plural "Most edited articles"
msgstr[0] "" msgstr[0] ""
msgstr[1] "" msgstr[1] ""
#: src/rcgcdw.py:197 #: src/rcgcdw.py:185
msgid "Edits made" msgid "Edits made"
msgstr "edtz did" msgstr "edtz did"
#: src/rcgcdw.py:197 #: src/rcgcdw.py:185
msgid "New files" msgid "New files"
msgstr "new picturz" msgstr "new picturz"
#: src/rcgcdw.py:197 #: src/rcgcdw.py:186
msgid "Admin actions" msgid "Admin actions"
msgstr "" msgstr ""
#: src/rcgcdw.py:198 #: src/rcgcdw.py:186
msgid "Bytes changed" msgid "Bytes changed"
msgstr "" msgstr ""
#: src/rcgcdw.py:198 #: src/rcgcdw.py:187
msgid "New articles" msgid "New articles"
msgstr "" msgstr ""
#: src/rcgcdw.py:199 #: src/rcgcdw.py:187
msgid "Unique contributors" msgid "Unique contributors"
msgstr "" msgstr ""
#: src/rcgcdw.py:200 #: src/rcgcdw.py:188
msgid "Most active hour" msgid "Most active hour"
msgid_plural "Most active hours" msgid_plural "Most active hours"
msgstr[0] "" msgstr[0] ""
msgstr[1] "" msgstr[1] ""
#: src/rcgcdw.py:201 #: src/rcgcdw.py:189
msgid "Day score" msgid "Day score"
msgstr "" msgstr ""
#: src/rcgcdw.py:243 #: src/rcgcdw.py:223
msgid "director" msgid "~~hidden~~"
msgstr "" msgstr ""
#: src/rcgcdw.py:243 #: src/rcgcdw.py:225
msgid "bot" msgid "No description provided"
msgstr "robut"
#: src/rcgcdw.py:243
msgid "editor"
msgstr "editur"
#: src/rcgcdw.py:243
msgid "directors"
msgstr "directurs"
#: src/rcgcdw.py:243
msgid "sysop"
msgstr "admen"
#: src/rcgcdw.py:243
msgid "bureaucrat"
msgstr "burocrat"
#: src/rcgcdw.py:243
msgid "reviewer"
msgstr "reviver"
#: src/rcgcdw.py:244
msgid "autoreview"
msgstr "autureviver"
#: src/rcgcdw.py:244
msgid "autopatrol"
msgstr "" msgstr ""
#: src/rcgcdw.py:244 #: src/rcgcdw.py:228
msgid "wiki_guardian" msgid "hidden"
msgstr "" msgstr ""
#: src/rcgcdw.py:244 #~ msgid "bot"
msgid "second" #~ msgstr "robut"
msgid_plural "seconds"
msgstr[0] ""
msgstr[1] ""
#: src/rcgcdw.py:244 #~ msgid "editor"
msgid "minute" #~ msgstr "editur"
msgid_plural "minutes"
msgstr[0] ""
msgstr[1] ""
#: src/rcgcdw.py:244 #~ msgid "directors"
msgid "hour" #~ msgstr "directurs"
msgid_plural "hours"
msgstr[0] ""
msgstr[1] ""
#: src/rcgcdw.py:244 #~ msgid "sysop"
msgid "day" #~ msgstr "admen"
msgid_plural "days"
msgstr[0] ""
msgstr[1] ""
#: src/rcgcdw.py:244 #~ msgid "bureaucrat"
msgid "week" #~ msgstr "burocrat"
msgid_plural "weeks"
msgstr[0] ""
msgstr[1] ""
#: src/rcgcdw.py:244 #~ msgid "reviewer"
msgid "month" #~ msgstr "reviver"
msgid_plural "months"
msgstr[0] ""
msgstr[1] ""
#: src/rcgcdw.py:244 #~ msgid "autoreview"
msgid "year" #~ msgstr "autureviver"
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] ""
#~ msgid "Location" #~ msgid "Location"
#~ msgstr "Der place" #~ msgstr "Der place"

View file

@ -7,7 +7,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: RcGcDw\n" "Project-Id-Version: RcGcDw\n"
"Report-Msgid-Bugs-To: \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: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: Automatically generated\n" "Last-Translator: Automatically generated\n"
"Language-Team: none\n" "Language-Team: none\n"
@ -16,7 +16,10 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
#: src/discord/redaction.py:62 src/discord/redaction.py:65 #: src/discord/redaction.py:77
#: src/discord/redaction.py:70 msgid "hidden"
msgid "Removed" msgstr ""
#: src/discord/redaction.py:80 src/discord/redaction.py:85
msgid "~~hidden~~"
msgstr "" msgstr ""

View file

@ -1,186 +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 <EMAIL@ADDRESS>, 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 <sukramxro@gmail.com>\n"
"Language-Team: Polish <https://translate.wikibot.de/projects/rcgcdw/"
"discussion_formatters-1/pl/>\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"

Binary file not shown.

File diff suppressed because it is too large Load diff

Some files were not shown because too many files have changed in this diff Show more