From 0f3fb86148d4350eb00d1c93515ba1dd283cbb8d Mon Sep 17 00:00:00 2001 From: Frisk Date: Sun, 2 Aug 2020 01:43:49 +0200 Subject: [PATCH 01/21] Started work --- src/wiki_ratelimiter.py | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 src/wiki_ratelimiter.py diff --git a/src/wiki_ratelimiter.py b/src/wiki_ratelimiter.py new file mode 100644 index 0000000..f1decda --- /dev/null +++ b/src/wiki_ratelimiter.py @@ -0,0 +1,7 @@ +import logging + +logger = logging.getLogger("rcgcdw.ratelimiter") + +class RateLimiter: + def __init__(self): + self.domain_requests: dict = {} From 0e46d4c971a3d35ea6a2b82744eb369e4c2a29c3 Mon Sep 17 00:00:00 2001 From: Frisk Date: Sun, 2 Aug 2020 20:59:17 +0200 Subject: [PATCH 02/21] Initial work --- src/wiki_ratelimiter.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/wiki_ratelimiter.py b/src/wiki_ratelimiter.py index f1decda..62efb28 100644 --- a/src/wiki_ratelimiter.py +++ b/src/wiki_ratelimiter.py @@ -1,7 +1,10 @@ import logging +from urllib.parse import urlparse logger = logging.getLogger("rcgcdw.ratelimiter") class RateLimiter: def __init__(self): self.domain_requests: dict = {} + + def get_timeout(self, url): From a4462369bb6ba6afe13a5577bc731571ebe682c8 Mon Sep 17 00:00:00 2001 From: Frisk Date: Mon, 3 Aug 2020 16:44:42 +0200 Subject: [PATCH 03/21] Additional work done on the ratelimiting --- src/bot.py | 153 +++++++++++++++++++++++++++++----------------------- src/misc.py | 6 +++ 2 files changed, 91 insertions(+), 68 deletions(-) diff --git a/src/bot.py b/src/bot.py index 6f0b563..4d226ba 100644 --- a/src/bot.py +++ b/src/bot.py @@ -12,7 +12,7 @@ from src.argparser import command_line_args from src.config import settings from src.database import db_cursor from src.exceptions import * -from src.misc import get_paths +from src.misc import get_paths, get_domain from src.msgqueue import messagequeue from src.queue_handler import DBHandler from src.wiki import Wiki, process_cats, process_mwmsgs, essential_info, essential_feeds @@ -41,11 +41,11 @@ for wiki in db_cursor.execute('SELECT DISTINCT wiki FROM rcgcdw'): # Start queueing logic -def calculate_delay() -> float: +def calculate_delay_for_group(group_length: int) -> float: """Calculate the delay between fetching each wiki to avoid rate limits""" min_delay = 60 / settings["max_requests_per_minute"] - if (len(all_wikis) * min_delay) < settings["minimal_cooldown_per_wiki_in_sec"]: - return settings["minimal_cooldown_per_wiki_in_sec"] / len(all_wikis) + if (group_length * min_delay) < settings["minimal_cooldown_per_wiki_in_sec"]: + return settings["minimal_cooldown_per_wiki_in_sec"] / group_length else: return min_delay @@ -62,78 +62,95 @@ def generate_targets(wiki_url: str) -> defaultdict: return combinations +async def generate_domain_groups(): # oh boy, I cannot wait to learn about async generators + combinations = defaultdict(list) + fetch_all = db_cursor.execute('SELECT webhook, wiki, lang, display, wikiid, rcid FROM rcgcdw GROUP BY wiki') + for db_wiki in fetch_all.fetchall(): + combinations[get_domain(db_wiki["wiki"])].append(db_wiki) + for item in combinations.values(): + yield item + + +async def scan_group(group: list): + calc_delay = calculate_delay_for_group(len(group)) + for db_wiki in group: + logger.debug("Wiki {}".format(db_wiki["wiki"])) + if db_wiki["wiki"] not in all_wikis: + logger.info("Registering new wiki locally: {}".format(db_wiki["wiki"])) + all_wikis[db_wiki["wiki"]] = Wiki() + local_wiki = all_wikis[db_wiki["wiki"]] # set a reference to a wiki object from memory + if db_wiki["rcid"] != -1: + extended = False + if local_wiki.mw_messages is None: + extended = True + async with aiohttp.ClientSession(headers=settings["header"], + timeout=aiohttp.ClientTimeout(3.0)) as session: + try: + wiki_response = await local_wiki.fetch_wiki(extended, db_wiki["wiki"], session) + await local_wiki.check_status(db_wiki["wiki"], wiki_response.status) + except (WikiServerError, WikiError): + logger.error("Exeption when fetching the wiki") + continue # ignore this wiki if it throws errors + try: + recent_changes_resp = await wiki_response.json() + if "error" in recent_changes_resp or "errors" in recent_changes_resp: + error = recent_changes_resp.get("error", recent_changes_resp["errors"]) + if error["code"] == "readapidenied": + await local_wiki.fail_add(db_wiki["wiki"], 410) + continue + raise WikiError + recent_changes = recent_changes_resp['query']['recentchanges'] + recent_changes.reverse() + except aiohttp.ContentTypeError: + logger.exception("Wiki seems to be resulting in non-json content.") + await local_wiki.fail_add(db_wiki["wiki"], 410) + continue + except: + logger.exception("On loading json of response.") + continue + if extended: + await process_mwmsgs(recent_changes_resp, local_wiki, mw_msgs) + if db_wiki["rcid"] is None: # new wiki, just get the last rc to not spam the channel + if len(recent_changes) > 0: + DBHandler.add(db_wiki["wiki"], recent_changes[-1]["rcid"]) + else: + DBHandler.add(db_wiki["wiki"], 0) + DBHandler.update_db() + continue + categorize_events = {} + targets = generate_targets(db_wiki["wiki"]) + paths = get_paths(db_wiki["wiki"], recent_changes_resp) + for change in recent_changes: + await process_cats(change, local_wiki, mw_msgs, categorize_events) + for change in recent_changes: # Yeah, second loop since the categories require to be all loaded up + if change["rcid"] > db_wiki["rcid"]: + for target in targets.items(): + try: + await essential_info(change, categorize_events, local_wiki, db_wiki, + target, paths, recent_changes_resp) + except: + if command_line_args.debug: + raise # reraise the issue + else: + logger.exception("Exception on RC formatter") + await formatter_exception_logger(db_wiki["wiki"], change, traceback.format_exc()) + if recent_changes: + DBHandler.add(db_wiki["wiki"], change["rcid"]) + await asyncio.sleep(delay=calc_delay) + + async def wiki_scanner(): """Wiki scanner is spawned as a task which purpose is to continuously run over wikis in the DB, fetching recent changes to add messages based on the changes to message queue later handled by message_sender coroutine.""" try: while True: - calc_delay = calculate_delay() + async for group in generate_domain_groups(): + asyncio.create_task(scan_group(group)) + fetch_all = db_cursor.execute( 'SELECT webhook, wiki, lang, display, wikiid, rcid, postid FROM rcgcdw GROUP BY wiki') for db_wiki in fetch_all.fetchall(): - logger.debug("Wiki {}".format(db_wiki["wiki"])) - if db_wiki["wiki"] not in all_wikis: - logger.info("Registering new wiki locally: {}".format(db_wiki["wiki"])) - all_wikis[db_wiki["wiki"]] = Wiki() - local_wiki = all_wikis[db_wiki["wiki"]] # set a reference to a wiki object from memory - if db_wiki["rcid"] != -1: - extended = False - if local_wiki.mw_messages is None: - extended = True - async with aiohttp.ClientSession(headers=settings["header"], - timeout=aiohttp.ClientTimeout(3.0)) as session: - try: - wiki_response = await local_wiki.fetch_wiki(extended, db_wiki["wiki"], session) - await local_wiki.check_status(db_wiki["wiki"], wiki_response.status) - except (WikiServerError, WikiError): - logger.error("Exeption when fetching the wiki") - continue # ignore this wiki if it throws errors - try: - recent_changes_resp = await wiki_response.json() - if "error" in recent_changes_resp or "errors" in recent_changes_resp: - error = recent_changes_resp.get("error", recent_changes_resp["errors"]) - if error["code"] == "readapidenied": - await local_wiki.fail_add(db_wiki["wiki"], 410) - continue - raise WikiError - recent_changes = recent_changes_resp['query']['recentchanges'] - recent_changes.reverse() - except aiohttp.ContentTypeError: - logger.exception("Wiki seems to be resulting in non-json content.") - await local_wiki.fail_add(db_wiki["wiki"], 410) - continue - except: - logger.exception("On loading json of response.") - continue - if extended: - await process_mwmsgs(recent_changes_resp, local_wiki, mw_msgs) - if db_wiki["rcid"] is None: # new wiki, just get the last rc to not spam the channel - if len(recent_changes) > 0: - DBHandler.add(db_wiki["wiki"], recent_changes[-1]["rcid"]) - else: - DBHandler.add(db_wiki["wiki"], 0) - DBHandler.update_db() - continue - categorize_events = {} - targets = generate_targets(db_wiki["wiki"]) - paths = get_paths(db_wiki["wiki"], recent_changes_resp) - for change in recent_changes: - await process_cats(change, local_wiki, mw_msgs, categorize_events) - for change in recent_changes: # Yeah, second loop since the categories require to be all loaded up - if change["rcid"] > db_wiki["rcid"]: - for target in targets.items(): - try: - await essential_info(change, categorize_events, local_wiki, db_wiki, - target, paths, recent_changes_resp) - except: - if command_line_args.debug: - raise # reraise the issue - else: - logger.exception("Exception on RC formatter") - await formatter_exception_logger(db_wiki["wiki"], change, traceback.format_exc()) - if recent_changes: - DBHandler.add(db_wiki["wiki"], change["rcid"]) - await asyncio.sleep(delay=2.0) # temporary measure until rate limiting is not implemented + if db_wiki["wikiid"] is not None: header = settings["header"] header["Accept"] = "application/hal+json" diff --git a/src/misc.py b/src/misc.py index c8fcc3a..a041066 100644 --- a/src/misc.py +++ b/src/misc.py @@ -17,6 +17,12 @@ def get_paths(wiki: str, request) -> tuple: return WIKI_API_PATH, WIKI_SCRIPT_PATH, WIKI_ARTICLE_PATH, WIKI_JUST_DOMAIN +def get_domain(url: str) -> str: + """Get domain of given URL""" + parsed_url = urlparse(url) + return ".".join(urlunparse((*parsed_url[0:2], "", "", "", "")).split(".")[-2:]) # something like gamepedia.com, fandom.com + + class LinkParser(HTMLParser): new_string = "" From d7f341d0815646dd8b8404f89bcfe3edbac494bf Mon Sep 17 00:00:00 2001 From: Frisk Date: Wed, 5 Aug 2020 03:02:32 +0200 Subject: [PATCH 04/21] Not a lot but it's a honest work --- src/bot.py | 51 +++++++++++++++++++++++++++++++++++++++++---------- 1 file changed, 41 insertions(+), 10 deletions(-) diff --git a/src/bot.py b/src/bot.py index 4d226ba..8538d95 100644 --- a/src/bot.py +++ b/src/bot.py @@ -6,6 +6,7 @@ import sys import traceback from collections import defaultdict +import functools import requests from src.argparser import command_line_args @@ -37,6 +38,33 @@ mw_msgs: dict = {} # will have the type of id: tuple for wiki in db_cursor.execute('SELECT DISTINCT wiki FROM rcgcdw'): all_wikis[wiki] = Wiki() +class RcQueue: + def __init__(self): + self.domain_list = {} + self.to_remove = [] + + async def start_group(self, group): + """Starts a task for given domain group""" + if group not in self.domain_list: + self.domain_list[group] = {"task": asyncio.create_task(scan_group(group)), "last_rowid": 0, "query": []} + else: + raise KeyError + + async def remove_wiki_from_group(self, group, wiki): + """Removes a wiki from query of given domain group""" + self[group]["query"] # there can be multiple webhooks with + + + def __getitem__(self, item): + """Returns the query of given domain group""" + return self.domain_list[item] + + def __setitem__(self, key, value): + self.domain_list[key] = value + + +rcqueue = RcQueue() + # Start queueing logic @@ -63,17 +91,19 @@ def generate_targets(wiki_url: str) -> defaultdict: async def generate_domain_groups(): # oh boy, I cannot wait to learn about async generators + """Generate a list of wikis per domain (fandom.com, wikipedia.org etc.)""" combinations = defaultdict(list) fetch_all = db_cursor.execute('SELECT webhook, wiki, lang, display, wikiid, rcid FROM rcgcdw GROUP BY wiki') for db_wiki in fetch_all.fetchall(): combinations[get_domain(db_wiki["wiki"])].append(db_wiki) - for item in combinations.values(): - yield item + for group, db_wikis in combinations.items(): + yield group, db_wikis async def scan_group(group: list): - calc_delay = calculate_delay_for_group(len(group)) - for db_wiki in group: + while True: + calc_delay = calculate_delay_for_group(len(rcqueue[group])) + rcqueue[group] logger.debug("Wiki {}".format(db_wiki["wiki"])) if db_wiki["wiki"] not in all_wikis: logger.info("Registering new wiki locally: {}".format(db_wiki["wiki"])) @@ -137,19 +167,20 @@ async def scan_group(group: list): if recent_changes: DBHandler.add(db_wiki["wiki"], change["rcid"]) await asyncio.sleep(delay=calc_delay) + return group async def wiki_scanner(): """Wiki scanner is spawned as a task which purpose is to continuously run over wikis in the DB, fetching recent changes to add messages based on the changes to message queue later handled by message_sender coroutine.""" try: - while True: - async for group in generate_domain_groups(): - asyncio.create_task(scan_group(group)) + async for group, db_wikis in generate_domain_groups(): + await rcqueue.start_group(group) + rcqueue[group]["query"] = db_wikis # __SETITEM__ MIGHT BE BAD FOR NESTED, SEE IF CRASHES + while True: + await asyncio.sleep(20.0) + - fetch_all = db_cursor.execute( - 'SELECT webhook, wiki, lang, display, wikiid, rcid, postid FROM rcgcdw GROUP BY wiki') - for db_wiki in fetch_all.fetchall(): if db_wiki["wikiid"] is not None: header = settings["header"] From 1ab0eaa24ff49b8cef7335d9e0be35632b06796a Mon Sep 17 00:00:00 2001 From: Frisk Date: Wed, 5 Aug 2020 16:41:40 +0200 Subject: [PATCH 05/21] Created basic handling of wikis --- src/bot.py | 296 ++++++++++++++++++++++++++-------------------- src/exceptions.py | 6 + 2 files changed, 177 insertions(+), 125 deletions(-) diff --git a/src/bot.py b/src/bot.py index 8538d95..233c530 100644 --- a/src/bot.py +++ b/src/bot.py @@ -9,6 +9,7 @@ from collections import defaultdict import functools import requests +from contextlib import asynccontextmanager from src.argparser import command_line_args from src.config import settings from src.database import db_cursor @@ -38,15 +39,28 @@ mw_msgs: dict = {} # will have the type of id: tuple for wiki in db_cursor.execute('SELECT DISTINCT wiki FROM rcgcdw'): all_wikis[wiki] = Wiki() +queue_limit = settings.get("queue_limit", 30) + +class LimitedList(list): + def __init__(self, *args): + list.__init__(self, *args) + + def append(self, object) -> None: + if len(self) < queue_limit: + self.append(object) + return + raise ListFull + + class RcQueue: def __init__(self): self.domain_list = {} self.to_remove = [] - async def start_group(self, group): + async def start_group(self, group, initial_wikis): """Starts a task for given domain group""" if group not in self.domain_list: - self.domain_list[group] = {"task": asyncio.create_task(scan_group(group)), "last_rowid": 0, "query": []} + self.domain_list[group] = {"task": asyncio.create_task(scan_group(group)), "last_rowid": 0, "query": LimitedList(initial_wikis)} else: raise KeyError @@ -54,6 +68,39 @@ class RcQueue: """Removes a wiki from query of given domain group""" self[group]["query"] # there can be multiple webhooks with + @asynccontextmanager + async def retrieve_next_queued(self, group): + try: + yield self.domain_list[group]["query"][0] + except IndexError: + logger.warning("Queue for {} domain group is empty.".format(group)) + yield None + finally: # add exception handling? + self.domain_list[group]["query"].pop(0) + + async def update_queues(self): + fetch_all = db_cursor.execute( + 'SELECT ROWID, webhook, wiki, lang, display, wikiid, rcid FROM rcgcdw WHERE NOT rcid = -1 GROUP BY wiki ORDER BY ROWID') + self.to_remove = list(all_wikis.keys()) + full = [] + for db_wiki in fetch_all.fetchall(): + domain = get_domain(db_wiki["wiki"]) + current_domain = self[domain] + try: + if not db_wiki["ROWID"] < current_domain["last_rowid"]: + current_domain["query"].append(db_wiki) + self.to_remove.remove(domain) + except KeyError: + await self.start_group(domain, db_wiki) + logger.info("A new domain group has been added since last time, adding it to the domain_list and starting a task...") + except ListFull: + full.append(domain) + current_domain["last_rowid"] = db_wiki["ROWID"] + continue + for group, data in self.domain_list: + if group not in full: + self["domain"]["last_rowid"] = 0 # iter reached the end without being stuck on full list + def __getitem__(self, item): """Returns the query of given domain group""" @@ -90,149 +137,148 @@ def generate_targets(wiki_url: str) -> defaultdict: return combinations -async def generate_domain_groups(): # oh boy, I cannot wait to learn about async generators +async def generate_domain_groups(): """Generate a list of wikis per domain (fandom.com, wikipedia.org etc.)""" combinations = defaultdict(list) - fetch_all = db_cursor.execute('SELECT webhook, wiki, lang, display, wikiid, rcid FROM rcgcdw GROUP BY wiki') + fetch_all = db_cursor.execute('SELECT ROWID, webhook, wiki, lang, display, wikiid, rcid FROM rcgcdw WHERE NOT rcid = -1 GROUP BY wiki ORDER BY ROWID ASC') for db_wiki in fetch_all.fetchall(): combinations[get_domain(db_wiki["wiki"])].append(db_wiki) + all_wikis[db_wiki["wiki"]] = Wiki() # populate all_wikis for group, db_wikis in combinations.items(): yield group, db_wikis -async def scan_group(group: list): +async def scan_group(group: str): while True: calc_delay = calculate_delay_for_group(len(rcqueue[group])) - rcqueue[group] - logger.debug("Wiki {}".format(db_wiki["wiki"])) - if db_wiki["wiki"] not in all_wikis: - logger.info("Registering new wiki locally: {}".format(db_wiki["wiki"])) - all_wikis[db_wiki["wiki"]] = Wiki() - local_wiki = all_wikis[db_wiki["wiki"]] # set a reference to a wiki object from memory - if db_wiki["rcid"] != -1: - extended = False - if local_wiki.mw_messages is None: - extended = True - async with aiohttp.ClientSession(headers=settings["header"], - timeout=aiohttp.ClientTimeout(3.0)) as session: - try: - wiki_response = await local_wiki.fetch_wiki(extended, db_wiki["wiki"], session) - await local_wiki.check_status(db_wiki["wiki"], wiki_response.status) - except (WikiServerError, WikiError): - logger.error("Exeption when fetching the wiki") - continue # ignore this wiki if it throws errors - try: - recent_changes_resp = await wiki_response.json() - if "error" in recent_changes_resp or "errors" in recent_changes_resp: - error = recent_changes_resp.get("error", recent_changes_resp["errors"]) - if error["code"] == "readapidenied": - await local_wiki.fail_add(db_wiki["wiki"], 410) - continue - raise WikiError - recent_changes = recent_changes_resp['query']['recentchanges'] - recent_changes.reverse() - except aiohttp.ContentTypeError: - logger.exception("Wiki seems to be resulting in non-json content.") - await local_wiki.fail_add(db_wiki["wiki"], 410) + async with rcqueue.retrieve_next_queued(group) as db_wiki: # acquire next wiki in queue + if db_wiki is None: + raise QueueEmpty + logger.debug("Wiki {}".format(db_wiki["wiki"])) + local_wiki = all_wikis[db_wiki["wiki"]] # set a reference to a wiki object from memory + if db_wiki["rcid"] != -1: + extended = False + if local_wiki.mw_messages is None: + extended = True + async with aiohttp.ClientSession(headers=settings["header"], + timeout=aiohttp.ClientTimeout(3.0)) as session: + try: + wiki_response = await local_wiki.fetch_wiki(extended, db_wiki["wiki"], session) + await local_wiki.check_status(db_wiki["wiki"], wiki_response.status) + except (WikiServerError, WikiError): + logger.error("Exeption when fetching the wiki") + continue # ignore this wiki if it throws errors + try: + recent_changes_resp = await wiki_response.json() + if "error" in recent_changes_resp or "errors" in recent_changes_resp: + error = recent_changes_resp.get("error", recent_changes_resp["errors"]) + if error["code"] == "readapidenied": + await local_wiki.fail_add(db_wiki["wiki"], 410) + continue + raise WikiError + recent_changes = recent_changes_resp['query']['recentchanges'] + recent_changes.reverse() + except aiohttp.ContentTypeError: + logger.exception("Wiki seems to be resulting in non-json content.") + await local_wiki.fail_add(db_wiki["wiki"], 410) + continue + except: + logger.exception("On loading json of response.") + continue + if extended: + await process_mwmsgs(recent_changes_resp, local_wiki, mw_msgs) + if db_wiki["rcid"] is None: # new wiki, just get the last rc to not spam the channel + if len(recent_changes) > 0: + DBHandler.add(db_wiki["wiki"], recent_changes[-1]["rcid"]) + else: + DBHandler.add(db_wiki["wiki"], 0) + DBHandler.update_db() continue - except: - logger.exception("On loading json of response.") - continue - if extended: - await process_mwmsgs(recent_changes_resp, local_wiki, mw_msgs) - if db_wiki["rcid"] is None: # new wiki, just get the last rc to not spam the channel - if len(recent_changes) > 0: - DBHandler.add(db_wiki["wiki"], recent_changes[-1]["rcid"]) - else: - DBHandler.add(db_wiki["wiki"], 0) - DBHandler.update_db() - continue - categorize_events = {} - targets = generate_targets(db_wiki["wiki"]) - paths = get_paths(db_wiki["wiki"], recent_changes_resp) - for change in recent_changes: - await process_cats(change, local_wiki, mw_msgs, categorize_events) - for change in recent_changes: # Yeah, second loop since the categories require to be all loaded up - if change["rcid"] > db_wiki["rcid"]: - for target in targets.items(): - try: - await essential_info(change, categorize_events, local_wiki, db_wiki, - target, paths, recent_changes_resp) - except: - if command_line_args.debug: - raise # reraise the issue - else: - logger.exception("Exception on RC formatter") - await formatter_exception_logger(db_wiki["wiki"], change, traceback.format_exc()) - if recent_changes: - DBHandler.add(db_wiki["wiki"], change["rcid"]) - await asyncio.sleep(delay=calc_delay) - return group + categorize_events = {} + targets = generate_targets(db_wiki["wiki"]) + paths = get_paths(db_wiki["wiki"], recent_changes_resp) + for change in recent_changes: + await process_cats(change, local_wiki, mw_msgs, categorize_events) + for change in recent_changes: # Yeah, second loop since the categories require to be all loaded up + if change["rcid"] > db_wiki["rcid"]: + for target in targets.items(): + try: + await essential_info(change, categorize_events, local_wiki, db_wiki, + target, paths, recent_changes_resp) + except: + if command_line_args.debug: + raise # reraise the issue + else: + logger.exception("Exception on RC formatter") + await formatter_exception_logger(db_wiki["wiki"], change, traceback.format_exc()) + if recent_changes: + DBHandler.add(db_wiki["wiki"], change["rcid"]) + await asyncio.sleep(delay=calc_delay) + return group async def wiki_scanner(): """Wiki scanner is spawned as a task which purpose is to continuously run over wikis in the DB, fetching recent changes to add messages based on the changes to message queue later handled by message_sender coroutine.""" try: - async for group, db_wikis in generate_domain_groups(): - await rcqueue.start_group(group) - rcqueue[group]["query"] = db_wikis # __SETITEM__ MIGHT BE BAD FOR NESTED, SEE IF CRASHES - while True: - await asyncio.sleep(20.0) + async for group, db_wikis in generate_domain_groups(): # First scan + await rcqueue.start_group(group, db_wikis) + while True: + await asyncio.sleep(20.0) + await rcqueue.update_queues() - - if db_wiki["wikiid"] is not None: - header = settings["header"] - header["Accept"] = "application/hal+json" - async with aiohttp.ClientSession(headers=header, - timeout=aiohttp.ClientTimeout(3.0)) as session: - try: - feeds_response = await local_wiki.fetch_feeds(db_wiki["wikiid"], session) - except (WikiServerError, WikiError): - logger.error("Exeption when fetching the wiki") - continue # ignore this wiki if it throws errors - try: - discussion_feed_resp = await feeds_response.json(encoding="UTF-8") - if "title" in discussion_feed_resp: - error = discussion_feed_resp["error"] - if error == "site doesn't exists": - db_cursor.execute("UPDATE rcgcdw SET wikiid = ? WHERE wiki = ?", - (None, db_wiki["wiki"],)) - DBHandler.update_db() - continue - raise WikiError - discussion_feed = discussion_feed_resp["_embedded"]["doc:posts"] - discussion_feed.reverse() - except aiohttp.ContentTypeError: - logger.exception("Wiki seems to be resulting in non-json content.") - continue - except: - logger.exception("On loading json of response.") - continue - if db_wiki["postid"] is None: # new wiki, just get the last post to not spam the channel - if len(discussion_feed) > 0: - DBHandler.add(db_wiki["wiki"], discussion_feed[-1]["id"], True) - else: - DBHandler.add(db_wiki["wiki"], "0", True) - DBHandler.update_db() + if db_wiki["wikiid"] is not None: + header = settings["header"] + header["Accept"] = "application/hal+json" + async with aiohttp.ClientSession(headers=header, + timeout=aiohttp.ClientTimeout(3.0)) as session: + try: + feeds_response = await local_wiki.fetch_feeds(db_wiki["wikiid"], session) + except (WikiServerError, WikiError): + logger.error("Exeption when fetching the wiki") + continue # ignore this wiki if it throws errors + try: + discussion_feed_resp = await feeds_response.json(encoding="UTF-8") + if "title" in discussion_feed_resp: + error = discussion_feed_resp["error"] + if error == "site doesn't exists": + db_cursor.execute("UPDATE rcgcdw SET wikiid = ? WHERE wiki = ?", + (None, db_wiki["wiki"],)) + DBHandler.update_db() + continue + raise WikiError + discussion_feed = discussion_feed_resp["_embedded"]["doc:posts"] + discussion_feed.reverse() + except aiohttp.ContentTypeError: + logger.exception("Wiki seems to be resulting in non-json content.") continue - targets = generate_targets(db_wiki["wiki"]) - for post in discussion_feed: - if post["id"] > db_wiki["postid"]: - for target in targets.items(): - try: - await essential_feeds(post, db_wiki, target) - except: - if command_line_args.debug: - raise # reraise the issue - else: - logger.exception("Exception on Feeds formatter") - await formatter_exception_logger(db_wiki["wiki"], post, traceback.format_exc()) - if discussion_feed: - DBHandler.add(db_wiki["wiki"], post["id"], True) - await asyncio.sleep(delay=calc_delay) - DBHandler.update_db() + except: + logger.exception("On loading json of response.") + continue + if db_wiki["postid"] is None: # new wiki, just get the last post to not spam the channel + if len(discussion_feed) > 0: + DBHandler.add(db_wiki["wiki"], discussion_feed[-1]["id"], True) + else: + DBHandler.add(db_wiki["wiki"], "0", True) + DBHandler.update_db() + continue + targets = generate_targets(db_wiki["wiki"]) + for post in discussion_feed: + if post["id"] > db_wiki["postid"]: + for target in targets.items(): + try: + await essential_feeds(post, db_wiki, target) + except: + if command_line_args.debug: + raise # reraise the issue + else: + logger.exception("Exception on Feeds formatter") + await formatter_exception_logger(db_wiki["wiki"], post, traceback.format_exc()) + if discussion_feed: + DBHandler.add(db_wiki["wiki"], post["id"], True) + await asyncio.sleep(delay=calc_delay) + DBHandler.update_db() except asyncio.CancelledError: raise diff --git a/src/exceptions.py b/src/exceptions.py index 6fde0c1..0d54bb6 100644 --- a/src/exceptions.py +++ b/src/exceptions.py @@ -14,4 +14,10 @@ class WikiUnauthorizedError(Exception): pass class OtherWikiError(Exception): + pass + +class QueueEmpty(Exception): + pass + +class ListFull(Exception): pass \ No newline at end of file From 293947c510116efe6f93fe58165ae7d82fe3585f Mon Sep 17 00:00:00 2001 From: Frisk Date: Wed, 5 Aug 2020 19:20:38 +0200 Subject: [PATCH 06/21] Added removal handling, should be now mostly ok, with exception to exception handling --- src/bot.py | 134 +++++++++++++++++++++++++++-------------------------- 1 file changed, 69 insertions(+), 65 deletions(-) diff --git a/src/bot.py b/src/bot.py index 233c530..4abf06f 100644 --- a/src/bot.py +++ b/src/bot.py @@ -36,9 +36,6 @@ mw_msgs: dict = {} # will have the type of id: tuple # Reasons for this: 1. we require amount of wikis to calculate the cooldown between requests # 2. Easier to code -for wiki in db_cursor.execute('SELECT DISTINCT wiki FROM rcgcdw'): - all_wikis[wiki] = Wiki() - queue_limit = settings.get("queue_limit", 30) class LimitedList(list): @@ -64,12 +61,17 @@ class RcQueue: else: raise KeyError - async def remove_wiki_from_group(self, group, wiki): + async def remove_wiki_from_group(self, wiki): """Removes a wiki from query of given domain group""" - self[group]["query"] # there can be multiple webhooks with + group = get_domain(wiki) + self[group]["query"] = [x for x in self[group]["query"] if x["wiki"] == wiki] + if not self[group]["query"]: # if there is no wiki left in the queue, get rid of the task + self[group]["task"].cancel() + del self.domain_list[group] @asynccontextmanager async def retrieve_next_queued(self, group): + """Retrives next wiki in the queue for given domain""" try: yield self.domain_list[group]["query"][0] except IndexError: @@ -79,9 +81,10 @@ class RcQueue: self.domain_list[group]["query"].pop(0) async def update_queues(self): + """Makes a round on rcgcdw DB and looks for updates to the queues in self.domain_list""" fetch_all = db_cursor.execute( 'SELECT ROWID, webhook, wiki, lang, display, wikiid, rcid FROM rcgcdw WHERE NOT rcid = -1 GROUP BY wiki ORDER BY ROWID') - self.to_remove = list(all_wikis.keys()) + self.to_remove = list(all_wikis.keys()) # first populate this list and remove wikis that are still in the db, clean up the rest full = [] for db_wiki in fetch_all.fetchall(): domain = get_domain(db_wiki["wiki"]) @@ -89,7 +92,7 @@ class RcQueue: try: if not db_wiki["ROWID"] < current_domain["last_rowid"]: current_domain["query"].append(db_wiki) - self.to_remove.remove(domain) + self.to_remove.remove(db_wiki["wiki"]) except KeyError: await self.start_group(domain, db_wiki) logger.info("A new domain group has been added since last time, adding it to the domain_list and starting a task...") @@ -97,11 +100,13 @@ class RcQueue: full.append(domain) current_domain["last_rowid"] = db_wiki["ROWID"] continue + for wiki in self.to_remove: + del all_wikis[wiki] + await self.remove_wiki_from_group(wiki) for group, data in self.domain_list: if group not in full: self["domain"]["last_rowid"] = 0 # iter reached the end without being stuck on full list - def __getitem__(self, item): """Returns the query of given domain group""" return self.domain_list[item] @@ -139,18 +144,17 @@ def generate_targets(wiki_url: str) -> defaultdict: async def generate_domain_groups(): """Generate a list of wikis per domain (fandom.com, wikipedia.org etc.)""" - combinations = defaultdict(list) + domain_wikis = defaultdict(list) fetch_all = db_cursor.execute('SELECT ROWID, webhook, wiki, lang, display, wikiid, rcid FROM rcgcdw WHERE NOT rcid = -1 GROUP BY wiki ORDER BY ROWID ASC') for db_wiki in fetch_all.fetchall(): - combinations[get_domain(db_wiki["wiki"])].append(db_wiki) + domain_wikis[get_domain(db_wiki["wiki"])].append(db_wiki) all_wikis[db_wiki["wiki"]] = Wiki() # populate all_wikis - for group, db_wikis in combinations.items(): + for group, db_wikis in domain_wikis.items(): yield group, db_wikis async def scan_group(group: str): while True: - calc_delay = calculate_delay_for_group(len(rcqueue[group])) async with rcqueue.retrieve_next_queued(group) as db_wiki: # acquire next wiki in queue if db_wiki is None: raise QueueEmpty @@ -226,59 +230,59 @@ async def wiki_scanner(): while True: await asyncio.sleep(20.0) await rcqueue.update_queues() - - - if db_wiki["wikiid"] is not None: - header = settings["header"] - header["Accept"] = "application/hal+json" - async with aiohttp.ClientSession(headers=header, - timeout=aiohttp.ClientTimeout(3.0)) as session: - try: - feeds_response = await local_wiki.fetch_feeds(db_wiki["wikiid"], session) - except (WikiServerError, WikiError): - logger.error("Exeption when fetching the wiki") - continue # ignore this wiki if it throws errors - try: - discussion_feed_resp = await feeds_response.json(encoding="UTF-8") - if "title" in discussion_feed_resp: - error = discussion_feed_resp["error"] - if error == "site doesn't exists": - db_cursor.execute("UPDATE rcgcdw SET wikiid = ? WHERE wiki = ?", - (None, db_wiki["wiki"],)) - DBHandler.update_db() - continue - raise WikiError - discussion_feed = discussion_feed_resp["_embedded"]["doc:posts"] - discussion_feed.reverse() - except aiohttp.ContentTypeError: - logger.exception("Wiki seems to be resulting in non-json content.") - continue - except: - logger.exception("On loading json of response.") - continue - if db_wiki["postid"] is None: # new wiki, just get the last post to not spam the channel - if len(discussion_feed) > 0: - DBHandler.add(db_wiki["wiki"], discussion_feed[-1]["id"], True) - else: - DBHandler.add(db_wiki["wiki"], "0", True) - DBHandler.update_db() - continue - targets = generate_targets(db_wiki["wiki"]) - for post in discussion_feed: - if post["id"] > db_wiki["postid"]: - for target in targets.items(): - try: - await essential_feeds(post, db_wiki, target) - except: - if command_line_args.debug: - raise # reraise the issue - else: - logger.exception("Exception on Feeds formatter") - await formatter_exception_logger(db_wiki["wiki"], post, traceback.format_exc()) - if discussion_feed: - DBHandler.add(db_wiki["wiki"], post["id"], True) - await asyncio.sleep(delay=calc_delay) - DBHandler.update_db() + # + # + # if db_wiki["wikiid"] is not None: + # header = settings["header"] + # header["Accept"] = "application/hal+json" + # async with aiohttp.ClientSession(headers=header, + # timeout=aiohttp.ClientTimeout(3.0)) as session: + # try: + # feeds_response = await local_wiki.fetch_feeds(db_wiki["wikiid"], session) + # except (WikiServerError, WikiError): + # logger.error("Exeption when fetching the wiki") + # continue # ignore this wiki if it throws errors + # try: + # discussion_feed_resp = await feeds_response.json(encoding="UTF-8") + # if "title" in discussion_feed_resp: + # error = discussion_feed_resp["error"] + # if error == "site doesn't exists": + # db_cursor.execute("UPDATE rcgcdw SET wikiid = ? WHERE wiki = ?", + # (None, db_wiki["wiki"],)) + # DBHandler.update_db() + # continue + # raise WikiError + # discussion_feed = discussion_feed_resp["_embedded"]["doc:posts"] + # discussion_feed.reverse() + # except aiohttp.ContentTypeError: + # logger.exception("Wiki seems to be resulting in non-json content.") + # continue + # except: + # logger.exception("On loading json of response.") + # continue + # if db_wiki["postid"] is None: # new wiki, just get the last post to not spam the channel + # if len(discussion_feed) > 0: + # DBHandler.add(db_wiki["wiki"], discussion_feed[-1]["id"], True) + # else: + # DBHandler.add(db_wiki["wiki"], "0", True) + # DBHandler.update_db() + # continue + # targets = generate_targets(db_wiki["wiki"]) + # for post in discussion_feed: + # if post["id"] > db_wiki["postid"]: + # for target in targets.items(): + # try: + # await essential_feeds(post, db_wiki, target) + # except: + # if command_line_args.debug: + # raise # reraise the issue + # else: + # logger.exception("Exception on Feeds formatter") + # await formatter_exception_logger(db_wiki["wiki"], post, traceback.format_exc()) + # if discussion_feed: + # DBHandler.add(db_wiki["wiki"], post["id"], True) + # await asyncio.sleep(delay=calc_delay) + # DBHandler.update_db() except asyncio.CancelledError: raise From 493a1c8194cf188687b9b20616c5b8f4d0906ad0 Mon Sep 17 00:00:00 2001 From: Frisk Date: Thu, 6 Aug 2020 02:46:43 +0200 Subject: [PATCH 07/21] More progress, it's almost working? --- src/bot.py | 211 ++++++++++++++++++++++------------------ src/discord.py | 18 ++++ src/formatters/rc.py | 16 +-- src/wiki.py | 19 ++-- src/wiki_ratelimiter.py | 17 +++- 5 files changed, 169 insertions(+), 112 deletions(-) diff --git a/src/bot.py b/src/bot.py index 4abf06f..167f9ec 100644 --- a/src/bot.py +++ b/src/bot.py @@ -18,7 +18,9 @@ from src.misc import get_paths, get_domain from src.msgqueue import messagequeue from src.queue_handler import DBHandler from src.wiki import Wiki, process_cats, process_mwmsgs, essential_info, essential_feeds -from src.discord import DiscordMessage, formatter_exception_logger, msg_sender_exception_logger +from src.discord import DiscordMessage, formatter_exception_logger, msg_sender_exception_logger, \ + group_task_exception_logger, discussion_task_exception_logger +from src.wiki_ratelimiter import RateLimiter logging.config.dictConfig(settings["logging"]) logger = logging.getLogger("rcgcdb.bot") @@ -44,7 +46,7 @@ class LimitedList(list): def append(self, object) -> None: if len(self) < queue_limit: - self.append(object) + self.insert(len(self), object) return raise ListFull @@ -57,7 +59,7 @@ class RcQueue: async def start_group(self, group, initial_wikis): """Starts a task for given domain group""" if group not in self.domain_list: - self.domain_list[group] = {"task": asyncio.create_task(scan_group(group)), "last_rowid": 0, "query": LimitedList(initial_wikis)} + self.domain_list[group] = {"task": asyncio.create_task(scan_group(group), name=group), "last_rowid": 0, "query": LimitedList(initial_wikis), "rate_limiter": RateLimiter()} else: raise KeyError @@ -74,38 +76,46 @@ class RcQueue: """Retrives next wiki in the queue for given domain""" try: yield self.domain_list[group]["query"][0] - except IndexError: - logger.warning("Queue for {} domain group is empty.".format(group)) - yield None - finally: # add exception handling? + except: + if command_line_args.debug: + logger.exception("RC Group exception") + raise # reraise the issue + else: + logger.exception("Group task returned error") + await group_task_exception_logger(group, traceback.format_exc()) + else: self.domain_list[group]["query"].pop(0) + async def update_queues(self): """Makes a round on rcgcdw DB and looks for updates to the queues in self.domain_list""" - fetch_all = db_cursor.execute( - 'SELECT ROWID, webhook, wiki, lang, display, wikiid, rcid FROM rcgcdw WHERE NOT rcid = -1 GROUP BY wiki ORDER BY ROWID') - self.to_remove = list(all_wikis.keys()) # first populate this list and remove wikis that are still in the db, clean up the rest - full = [] - for db_wiki in fetch_all.fetchall(): - domain = get_domain(db_wiki["wiki"]) - current_domain = self[domain] - try: - if not db_wiki["ROWID"] < current_domain["last_rowid"]: - current_domain["query"].append(db_wiki) - self.to_remove.remove(db_wiki["wiki"]) - except KeyError: - await self.start_group(domain, db_wiki) - logger.info("A new domain group has been added since last time, adding it to the domain_list and starting a task...") - except ListFull: - full.append(domain) - current_domain["last_rowid"] = db_wiki["ROWID"] - continue - for wiki in self.to_remove: - del all_wikis[wiki] - await self.remove_wiki_from_group(wiki) - for group, data in self.domain_list: - if group not in full: - self["domain"]["last_rowid"] = 0 # iter reached the end without being stuck on full list + try: + fetch_all = db_cursor.execute( + 'SELECT ROWID, webhook, wiki, lang, display, wikiid, rcid FROM rcgcdw WHERE NOT rcid = -1 GROUP BY wiki ORDER BY ROWID') + self.to_remove = list(all_wikis.keys()) # first populate this list and remove wikis that are still in the db, clean up the rest + full = [] + for db_wiki in fetch_all.fetchall(): + domain = get_domain(db_wiki["wiki"]) + current_domain = self[domain] + try: + if not db_wiki["ROWID"] < current_domain["last_rowid"]: + current_domain["query"].append(db_wiki) + self.to_remove.remove(db_wiki["wiki"]) + except KeyError: + await self.start_group(domain, db_wiki) + logger.info("A new domain group has been added since last time, adding it to the domain_list and starting a task...") + except ListFull: + full.append(domain) + current_domain["last_rowid"] = db_wiki["ROWID"] + continue + for wiki in self.to_remove: + del all_wikis[wiki] + await self.remove_wiki_from_group(wiki) + for group, data in self.domain_list.items(): + if group not in full: + self[group]["last_rowid"] = 0 # iter reached the end without being stuck on full list + except: + logger.exception("Queue error!") def __getitem__(self, item): """Returns the query of given domain group""" @@ -120,14 +130,13 @@ rcqueue = RcQueue() # Start queueing logic - def calculate_delay_for_group(group_length: int) -> float: """Calculate the delay between fetching each wiki to avoid rate limits""" min_delay = 60 / settings["max_requests_per_minute"] if (group_length * min_delay) < settings["minimal_cooldown_per_wiki_in_sec"]: return settings["minimal_cooldown_per_wiki_in_sec"] / group_length else: - return min_delay + return 0.0 def generate_targets(wiki_url: str) -> defaultdict: @@ -154,10 +163,9 @@ async def generate_domain_groups(): async def scan_group(group: str): + rate_limiter = rcqueue[group]["rate_limiter"] while True: async with rcqueue.retrieve_next_queued(group) as db_wiki: # acquire next wiki in queue - if db_wiki is None: - raise QueueEmpty logger.debug("Wiki {}".format(db_wiki["wiki"])) local_wiki = all_wikis[db_wiki["wiki"]] # set a reference to a wiki object from memory if db_wiki["rcid"] != -1: @@ -167,7 +175,7 @@ async def scan_group(group: str): async with aiohttp.ClientSession(headers=settings["header"], timeout=aiohttp.ClientTimeout(3.0)) as session: try: - wiki_response = await local_wiki.fetch_wiki(extended, db_wiki["wiki"], session) + wiki_response = await local_wiki.fetch_wiki(extended, db_wiki["wiki"], session, rate_limiter) await local_wiki.check_status(db_wiki["wiki"], wiki_response.status) except (WikiServerError, WikiError): logger.error("Exeption when fetching the wiki") @@ -208,17 +216,19 @@ async def scan_group(group: str): for target in targets.items(): try: await essential_info(change, categorize_events, local_wiki, db_wiki, - target, paths, recent_changes_resp) + target, paths, recent_changes_resp, rate_limiter) except: if command_line_args.debug: - raise # reraise the issue + logger.exception("Exception on RC formatter") + raise else: logger.exception("Exception on RC formatter") await formatter_exception_logger(db_wiki["wiki"], change, traceback.format_exc()) if recent_changes: DBHandler.add(db_wiki["wiki"], change["rcid"]) - await asyncio.sleep(delay=calc_delay) - return group + delay_between_wikis = calculate_delay_for_group(len(rcqueue[group]["query"])) + await asyncio.sleep(delay_between_wikis) + DBHandler.update_db() async def wiki_scanner(): @@ -230,59 +240,6 @@ async def wiki_scanner(): while True: await asyncio.sleep(20.0) await rcqueue.update_queues() - # - # - # if db_wiki["wikiid"] is not None: - # header = settings["header"] - # header["Accept"] = "application/hal+json" - # async with aiohttp.ClientSession(headers=header, - # timeout=aiohttp.ClientTimeout(3.0)) as session: - # try: - # feeds_response = await local_wiki.fetch_feeds(db_wiki["wikiid"], session) - # except (WikiServerError, WikiError): - # logger.error("Exeption when fetching the wiki") - # continue # ignore this wiki if it throws errors - # try: - # discussion_feed_resp = await feeds_response.json(encoding="UTF-8") - # if "title" in discussion_feed_resp: - # error = discussion_feed_resp["error"] - # if error == "site doesn't exists": - # db_cursor.execute("UPDATE rcgcdw SET wikiid = ? WHERE wiki = ?", - # (None, db_wiki["wiki"],)) - # DBHandler.update_db() - # continue - # raise WikiError - # discussion_feed = discussion_feed_resp["_embedded"]["doc:posts"] - # discussion_feed.reverse() - # except aiohttp.ContentTypeError: - # logger.exception("Wiki seems to be resulting in non-json content.") - # continue - # except: - # logger.exception("On loading json of response.") - # continue - # if db_wiki["postid"] is None: # new wiki, just get the last post to not spam the channel - # if len(discussion_feed) > 0: - # DBHandler.add(db_wiki["wiki"], discussion_feed[-1]["id"], True) - # else: - # DBHandler.add(db_wiki["wiki"], "0", True) - # DBHandler.update_db() - # continue - # targets = generate_targets(db_wiki["wiki"]) - # for post in discussion_feed: - # if post["id"] > db_wiki["postid"]: - # for target in targets.items(): - # try: - # await essential_feeds(post, db_wiki, target) - # except: - # if command_line_args.debug: - # raise # reraise the issue - # else: - # logger.exception("Exception on Feeds formatter") - # await formatter_exception_logger(db_wiki["wiki"], post, traceback.format_exc()) - # if discussion_feed: - # DBHandler.add(db_wiki["wiki"], post["id"], True) - # await asyncio.sleep(delay=calc_delay) - # DBHandler.update_db() except asyncio.CancelledError: raise @@ -300,6 +257,72 @@ async def message_sender(): logger.exception("Exception on DC message sender") await msg_sender_exception_logger(traceback.format_exc()) +async def discussion_handler(): + try: + while True: + fetch_all = db_cursor.execute( + 'SELECT ROWID, webhook, wiki, lang, display, wikiid, rcid, postid FROM rcgcdw WHERE NOT wikiid = ""') + for db_wiki in fetch_all.fetchall(): + if db_wiki["wikiid"] is not None: + header = settings["header"] + header["Accept"] = "application/hal+json" + async with aiohttp.ClientSession(headers=header, + timeout=aiohttp.ClientTimeout(3.0)) as session: + local_wiki = all_wikis[db_wiki["wiki"]] # set a reference to a wiki object from memory + try: + feeds_response = await local_wiki.fetch_feeds(db_wiki["wikiid"], session) + except (WikiServerError, WikiError): + logger.error("Exeption when fetching the wiki") + continue # ignore this wiki if it throws errors + try: + discussion_feed_resp = await feeds_response.json(encoding="UTF-8") + if "title" in discussion_feed_resp: + error = discussion_feed_resp["error"] + if error == "site doesn't exists": + db_cursor.execute("UPDATE rcgcdw SET wikiid = ? WHERE wiki = ?", + (None, db_wiki["wiki"],)) + DBHandler.update_db() + continue + raise WikiError + discussion_feed = discussion_feed_resp["_embedded"]["doc:posts"] + discussion_feed.reverse() + except aiohttp.ContentTypeError: + logger.exception("Wiki seems to be resulting in non-json content.") + continue + except: + logger.exception("On loading json of response.") + continue + if db_wiki["postid"] is None: # new wiki, just get the last post to not spam the channel + if len(discussion_feed) > 0: + DBHandler.add(db_wiki["wiki"], discussion_feed[-1]["id"], True) + else: + DBHandler.add(db_wiki["wiki"], "0", True) + DBHandler.update_db() + continue + targets = generate_targets(db_wiki["wiki"]) + for post in discussion_feed: + if post["id"] > db_wiki["postid"]: + for target in targets.items(): + try: + await essential_feeds(post, db_wiki, target) + except: + if command_line_args.debug: + raise # reraise the issue + else: + logger.exception("Exception on Feeds formatter") + await formatter_exception_logger(db_wiki["wiki"], post, traceback.format_exc()) + if discussion_feed: + DBHandler.add(db_wiki["wiki"], post["id"], True) + await asyncio.sleep(delay=2.0) # hardcoded really doesn't need much more + DBHandler.update_db() + except: + if command_line_args.debug: + raise # reraise the issue + else: + logger.exception("Exception on Feeds formatter") + await discussion_task_exception_logger(db_wiki["wiki"], traceback.format_exc()) + + def shutdown(loop, signal=None): DBHandler.update_db() @@ -337,8 +360,10 @@ async def main_loop(): try: task1 = asyncio.create_task(wiki_scanner()) task2 = asyncio.create_task(message_sender()) + task3 = asyncio.create_task(discussion_handler()) await task1 await task2 + await task3 except KeyboardInterrupt: shutdown(loop) diff --git a/src/discord.py b/src/discord.py index 5bf5a3e..659bbf9 100644 --- a/src/discord.py +++ b/src/discord.py @@ -110,6 +110,24 @@ async def wiki_removal_monitor(wiki_url, status): await send_to_discord_webhook_monitoring(DiscordMessage("compact", "webhook/remove", content="Removing {} because {}.".format(wiki_url, status), webhook_url=[None], wiki=None)) +async def discussion_task_exception_logger(wiki, exception): + message = DiscordMessage("embed", "bot/exception", [None], wiki=None) + message["description"] = exception + message["title"] = "Discussion task exception logger" + message.add_field("Wiki", wiki) + message.finish_embed() + await send_to_discord_webhook_monitoring(message) + + +async def group_task_exception_logger(group, exception): + message = DiscordMessage("embed", "bot/exception", [None], wiki=None) + message["description"] = exception + message["title"] = "Group task exception logger" + message.add_field("Group", group) + message.finish_embed() + await send_to_discord_webhook_monitoring(message) + + async def formatter_exception_logger(wiki_url, change, exception): """Creates a Discord message reporting a crash in RC formatter area""" message = DiscordMessage("embed", "bot/exception", [None], wiki=None) diff --git a/src/formatters/rc.py b/src/formatters/rc.py index bfcc2dd..786b052 100644 --- a/src/formatters/rc.py +++ b/src/formatters/rc.py @@ -18,7 +18,7 @@ if 1 == 2: # additional translation strings in unreachable code print(_("director"), _("bot"), _("editor"), _("directors"), _("sysop"), _("bureaucrat"), _("reviewer"), _("autoreview"), _("autopatrol"), _("wiki_guardian"), ngettext("second", "seconds", 1), ngettext("minute", "minutes", 1), ngettext("hour", "hours", 1), ngettext("day", "days", 1), ngettext("week", "weeks", 1), ngettext("month", "months",1), ngettext("year", "years", 1), ngettext("millennium", "millennia", 1), ngettext("decade", "decades", 1), ngettext("century", "centuries", 1)) -async def compact_formatter(action, change, parsed_comment, categories, recent_changes, message_target, _, ngettext, paths, +async def compact_formatter(action, change, parsed_comment, categories, recent_changes, message_target, _, ngettext, paths, rate_limiter, additional_data=None): """Recent Changes compact formatter, part of RcGcDw""" if additional_data is None: @@ -330,7 +330,7 @@ async def compact_formatter(action, change, parsed_comment, categories, recent_c await send_to_discord(DiscordMessage("compact", action, message_target[1], content=content, wiki=WIKI_SCRIPT_PATH)) -async def embed_formatter(action, change, parsed_comment, categories, recent_changes, message_target, _, ngettext, paths, additional_data=None): +async def embed_formatter(action, change, parsed_comment, categories, recent_changes, message_target, _, ngettext, paths, rate_limiter, additional_data=None): """Recent Changes embed formatter, part of RcGcDw""" if additional_data is None: additional_data = {"namespaces": {}, "tags": {}} @@ -374,12 +374,12 @@ async def embed_formatter(action, change, parsed_comment, categories, recent_cha changed_content = await recent_changes.safe_request( "{wiki}?action=compare&format=json&fromtext=&torev={diff}&topst=1&prop=diff".format( wiki=WIKI_API_PATH, diff=change["revid"] - ), "compare", "*") + ), rate_limiter, "compare", "*") else: changed_content = await recent_changes.safe_request( "{wiki}?action=compare&format=json&fromrev={oldrev}&torev={diff}&topst=1&prop=diff".format( wiki=WIKI_API_PATH, diff=change["revid"],oldrev=change["old_revid"] - ), "compare", "*") + ), rate_limiter, "compare", "*") if changed_content: EditDiff = ContentParser(_) EditDiff.feed(changed_content) @@ -404,7 +404,7 @@ async def embed_formatter(action, change, parsed_comment, categories, recent_cha license = None urls = await recent_changes.safe_request( "{wiki}?action=query&format=json&prop=imageinfo&list=&meta=&titles={filename}&iiprop=timestamp%7Curl%7Carchivename&iilimit=5".format( - wiki=WIKI_API_PATH, filename=change["title"]), "query", "pages") + wiki=WIKI_API_PATH, filename=change["title"]), rate_limiter, "query", "pages") link = create_article_path(change["title"], WIKI_ARTICLE_PATH) additional_info_retrieved = False if urls is not None: @@ -520,21 +520,21 @@ async def embed_formatter(action, change, parsed_comment, categories, recent_cha embed["title"] = _("Unblocked {blocked_user}").format(blocked_user=user) elif action == "curseprofile/comment-created": if settings["appearance"]["embed"]["show_edit_changes"]: - parsed_comment = await recent_changes.pull_comment(change["logparams"]["4:comment_id"], WIKI_API_PATH) + parsed_comment = await recent_changes.pull_comment(change["logparams"]["4:comment_id"], WIKI_API_PATH, rate_limiter) link = create_article_path("Special:CommentPermalink/{commentid}".format(commentid=change["logparams"]["4:comment_id"]), WIKI_ARTICLE_PATH) embed["title"] = _("Left a comment on {target}'s profile").format(target=change["title"].split(':')[1]) if change["title"].split(':')[1] != \ change["user"] else _( "Left a comment on their own profile") elif action == "curseprofile/comment-replied": if settings["appearance"]["embed"]["show_edit_changes"]: - parsed_comment = await recent_changes.pull_comment(change["logparams"]["4:comment_id"], WIKI_API_PATH) + parsed_comment = await recent_changes.pull_comment(change["logparams"]["4:comment_id"], WIKI_API_PATH, rate_limiter) link = create_article_path("Special:CommentPermalink/{commentid}".format(commentid=change["logparams"]["4:comment_id"]), WIKI_ARTICLE_PATH) embed["title"] = _("Replied to a comment on {target}'s profile").format(target=change["title"].split(':')[1]) if change["title"].split(':')[1] != \ change["user"] else _( "Replied to a comment on their own profile") elif action == "curseprofile/comment-edited": if settings["appearance"]["embed"]["show_edit_changes"]: - parsed_comment = await recent_changes.pull_comment(change["logparams"]["4:comment_id"], WIKI_API_PATH) + parsed_comment = await recent_changes.pull_comment(change["logparams"]["4:comment_id"], WIKI_API_PATH, rate_limiter) link = create_article_path("Special:CommentPermalink/{commentid}".format(commentid=change["logparams"]["4:comment_id"]), WIKI_ARTICLE_PATH) embed["title"] = _("Edited a comment on {target}'s profile").format(target=change["title"].split(':')[1]) if change["title"].split(':')[1] != \ change["user"] else _( diff --git a/src/wiki.py b/src/wiki.py index 7a1dd47..727cf00 100644 --- a/src/wiki.py +++ b/src/wiki.py @@ -7,6 +7,7 @@ from src.formatters.rc import embed_formatter, compact_formatter from src.formatters.discussions import feeds_embed_formatter, feeds_compact_formatter from src.misc import parse_link from src.i18n import langs +from src.wiki_ratelimiter import RateLimiter import src.discord import asyncio from src.config import settings @@ -26,7 +27,8 @@ class Wiki: @staticmethod - async def fetch_wiki(extended, script_path, session: aiohttp.ClientSession) -> aiohttp.ClientResponse: + async def fetch_wiki(extended, script_path, session: aiohttp.ClientSession, ratelimiter: RateLimiter) -> aiohttp.ClientResponse: + await ratelimiter.timeout_wait() url_path = script_path + "api.php" amount = 20 if extended: @@ -45,6 +47,7 @@ class Wiki: "rclimit": amount, "rctype": "edit|new|log|categorize", "siprop": "namespaces|general"} try: response = await session.get(url_path, params=params) + ratelimiter.timeout_add(1.0) except (aiohttp.ClientConnectionError, aiohttp.ServerTimeoutError, asyncio.TimeoutError): logger.exception("A connection error occurred while requesting {}".format(url_path)) raise WikiServerError @@ -63,10 +66,12 @@ class Wiki: return response @staticmethod - async def safe_request(url, *keys): + async def safe_request(url, ratelimiter, *keys): + await ratelimiter.timeout_wait() try: async with aiohttp.ClientSession(headers=settings["header"], timeout=aiohttp.ClientTimeout(3.0)) as session: request = await session.get(url, allow_redirects=False) + ratelimiter.timeout_add(1.0) request.raise_for_status() json_request = await request.json(encoding="UTF-8") except (aiohttp.ClientConnectionError, aiohttp.ServerTimeoutError, asyncio.TimeoutError): @@ -108,11 +113,11 @@ class Wiki: logger.warning('{} rows affected by DELETE FROM rcgcdw WHERE wiki = "{}"'.format(db_cursor.rowcount, wiki_url)) db_connection.commit() - async def pull_comment(self, comment_id, WIKI_API_PATH): + async def pull_comment(self, comment_id, WIKI_API_PATH, rate_limiter): try: comment = await self.safe_request( "{wiki}?action=comment&do=getRaw&comment_id={comment}&format=json".format(wiki=WIKI_API_PATH, - comment=comment_id), "text") + comment=comment_id), rate_limiter, "text") logger.debug("Got the following comment from the API: {}".format(comment)) if comment is None: raise TypeError @@ -186,7 +191,7 @@ async def process_mwmsgs(wiki_response: dict, local_wiki: Wiki, mw_msgs: dict): local_wiki.mw_messages = key # db_wiki: webhook, wiki, lang, display, wikiid, rcid, postid -async def essential_info(change: dict, changed_categories, local_wiki: Wiki, db_wiki: tuple, target: tuple, paths: tuple, request: dict): +async def essential_info(change: dict, changed_categories, local_wiki: Wiki, db_wiki: tuple, target: tuple, paths: tuple, request: dict, rate_limiter: RateLimiter): """Prepares essential information for both embed and compact message format.""" def _(string: str) -> str: """Our own translation string to make it compatible with async""" @@ -199,7 +204,7 @@ async def essential_info(change: dict, changed_categories, local_wiki: Wiki, db_ logger.debug("List of categories in essential_info: {}".format(changed_categories)) appearance_mode = embed_formatter if target[0][1] > 0 else compact_formatter if "actionhidden" in change or "suppressed" in change: # if event is hidden using suppression - await appearance_mode("suppressed", change, "", changed_categories, local_wiki, target, _, ngettext, paths) + await appearance_mode("suppressed", change, "", changed_categories, local_wiki, target, _, ngettext, paths, rate_limiter) return if "commenthidden" not in change: parsed_comment = parse_link(paths[3], change["parsedcomment"]) @@ -223,7 +228,7 @@ async def essential_info(change: dict, changed_categories, local_wiki: Wiki, db_ additional_data["tags"][tag["name"]] = (BeautifulSoup(tag["displayname"], "lxml")).get_text() except KeyError: additional_data["tags"][tag["name"]] = None # Tags with no displ - await appearance_mode(identification_string, change, parsed_comment, changed_categories, local_wiki, target, _, ngettext, paths, additional_data=additional_data) + await appearance_mode(identification_string, change, parsed_comment, changed_categories, local_wiki, target, _, ngettext, paths, rate_limiter, additional_data=additional_data) async def essential_feeds(change: dict, db_wiki: tuple, target: tuple): diff --git a/src/wiki_ratelimiter.py b/src/wiki_ratelimiter.py index 62efb28..21acbd5 100644 --- a/src/wiki_ratelimiter.py +++ b/src/wiki_ratelimiter.py @@ -1,10 +1,19 @@ -import logging -from urllib.parse import urlparse +import logging, time, asyncio logger = logging.getLogger("rcgcdw.ratelimiter") class RateLimiter: def __init__(self): - self.domain_requests: dict = {} + self.timeout_until = 0 - def get_timeout(self, url): + def timeout_add(self, timeout: float): + """This function sets a new timeout""" + self.timeout_until = time.time() + timeout + logger.debug("Added {} timeout".format(timeout)) + + async def timeout_wait(self): + """This awaitable calculates the time to wait according to timeout_until, does not wait if it's past the timeout to not skip a cycle""" + calculated_timeout = self.timeout_until - time.time() + logger.debug("Waiting {}".format(calculated_timeout)) + if calculated_timeout > 0: + await asyncio.sleep(calculated_timeout) From 71a3bdd91d3d5dc0400ba50570145b050d93a50a Mon Sep 17 00:00:00 2001 From: Frisk Date: Thu, 6 Aug 2020 03:07:13 +0200 Subject: [PATCH 08/21] Small improvement --- src/bot.py | 113 ++++++++++++++++++++++++++--------------------------- 1 file changed, 56 insertions(+), 57 deletions(-) diff --git a/src/bot.py b/src/bot.py index 167f9ec..8a5ad62 100644 --- a/src/bot.py +++ b/src/bot.py @@ -168,64 +168,63 @@ async def scan_group(group: str): async with rcqueue.retrieve_next_queued(group) as db_wiki: # acquire next wiki in queue logger.debug("Wiki {}".format(db_wiki["wiki"])) local_wiki = all_wikis[db_wiki["wiki"]] # set a reference to a wiki object from memory - if db_wiki["rcid"] != -1: - extended = False - if local_wiki.mw_messages is None: - extended = True - async with aiohttp.ClientSession(headers=settings["header"], - timeout=aiohttp.ClientTimeout(3.0)) as session: - try: - wiki_response = await local_wiki.fetch_wiki(extended, db_wiki["wiki"], session, rate_limiter) - await local_wiki.check_status(db_wiki["wiki"], wiki_response.status) - except (WikiServerError, WikiError): - logger.error("Exeption when fetching the wiki") - continue # ignore this wiki if it throws errors - try: - recent_changes_resp = await wiki_response.json() - if "error" in recent_changes_resp or "errors" in recent_changes_resp: - error = recent_changes_resp.get("error", recent_changes_resp["errors"]) - if error["code"] == "readapidenied": - await local_wiki.fail_add(db_wiki["wiki"], 410) - continue - raise WikiError - recent_changes = recent_changes_resp['query']['recentchanges'] - recent_changes.reverse() - except aiohttp.ContentTypeError: - logger.exception("Wiki seems to be resulting in non-json content.") - await local_wiki.fail_add(db_wiki["wiki"], 410) - continue - except: - logger.exception("On loading json of response.") - continue - if extended: - await process_mwmsgs(recent_changes_resp, local_wiki, mw_msgs) - if db_wiki["rcid"] is None: # new wiki, just get the last rc to not spam the channel - if len(recent_changes) > 0: - DBHandler.add(db_wiki["wiki"], recent_changes[-1]["rcid"]) - else: - DBHandler.add(db_wiki["wiki"], 0) - DBHandler.update_db() + extended = False + if local_wiki.mw_messages is None: + extended = True + async with aiohttp.ClientSession(headers=settings["header"], + timeout=aiohttp.ClientTimeout(3.0)) as session: + try: + wiki_response = await local_wiki.fetch_wiki(extended, db_wiki["wiki"], session, rate_limiter) + await local_wiki.check_status(db_wiki["wiki"], wiki_response.status) + except (WikiServerError, WikiError): + logger.error("Exeption when fetching the wiki") + continue # ignore this wiki if it throws errors + try: + recent_changes_resp = await wiki_response.json() + if "error" in recent_changes_resp or "errors" in recent_changes_resp: + error = recent_changes_resp.get("error", recent_changes_resp["errors"]) + if error["code"] == "readapidenied": + await local_wiki.fail_add(db_wiki["wiki"], 410) + continue + raise WikiError + recent_changes = recent_changes_resp['query']['recentchanges'] + recent_changes.reverse() + except aiohttp.ContentTypeError: + logger.exception("Wiki seems to be resulting in non-json content.") + await local_wiki.fail_add(db_wiki["wiki"], 410) continue - categorize_events = {} - targets = generate_targets(db_wiki["wiki"]) - paths = get_paths(db_wiki["wiki"], recent_changes_resp) - for change in recent_changes: - await process_cats(change, local_wiki, mw_msgs, categorize_events) - for change in recent_changes: # Yeah, second loop since the categories require to be all loaded up - if change["rcid"] > db_wiki["rcid"]: - for target in targets.items(): - try: - await essential_info(change, categorize_events, local_wiki, db_wiki, - target, paths, recent_changes_resp, rate_limiter) - except: - if command_line_args.debug: - logger.exception("Exception on RC formatter") - raise - else: - logger.exception("Exception on RC formatter") - await formatter_exception_logger(db_wiki["wiki"], change, traceback.format_exc()) - if recent_changes: - DBHandler.add(db_wiki["wiki"], change["rcid"]) + except: + logger.exception("On loading json of response.") + continue + if extended: + await process_mwmsgs(recent_changes_resp, local_wiki, mw_msgs) + if db_wiki["rcid"] is None: # new wiki, just get the last rc to not spam the channel + if len(recent_changes) > 0: + DBHandler.add(db_wiki["wiki"], recent_changes[-1]["rcid"]) + else: + DBHandler.add(db_wiki["wiki"], 0) + DBHandler.update_db() + continue + categorize_events = {} + targets = generate_targets(db_wiki["wiki"]) + paths = get_paths(db_wiki["wiki"], recent_changes_resp) + for change in recent_changes: + await process_cats(change, local_wiki, mw_msgs, categorize_events) + for change in recent_changes: # Yeah, second loop since the categories require to be all loaded up + if change["rcid"] > db_wiki["rcid"]: + for target in targets.items(): + try: + await essential_info(change, categorize_events, local_wiki, db_wiki, + target, paths, recent_changes_resp, rate_limiter) + except: + if command_line_args.debug: + logger.exception("Exception on RC formatter") + raise + else: + logger.exception("Exception on RC formatter") + await formatter_exception_logger(db_wiki["wiki"], change, traceback.format_exc()) + if recent_changes: + DBHandler.add(db_wiki["wiki"], change["rcid"]) delay_between_wikis = calculate_delay_for_group(len(rcqueue[group]["query"])) await asyncio.sleep(delay_between_wikis) DBHandler.update_db() From 1b6be292d9e724de5d64c49572131029458ffb65 Mon Sep 17 00:00:00 2001 From: Frisk Date: Thu, 6 Aug 2020 15:26:06 +0200 Subject: [PATCH 09/21] Wrapping up the work on rate-limiting --- src/bot.py | 84 +++++++++++++++++++++++++++-------------- src/discord.py | 38 +++---------------- src/request_tracking.py | 23 ----------- src/wiki.py | 2 +- 4 files changed, 61 insertions(+), 86 deletions(-) delete mode 100644 src/request_tracking.py diff --git a/src/bot.py b/src/bot.py index 8a5ad62..baaa9cd 100644 --- a/src/bot.py +++ b/src/bot.py @@ -6,7 +6,6 @@ import sys import traceback from collections import defaultdict -import functools import requests from contextlib import asynccontextmanager @@ -18,8 +17,7 @@ from src.misc import get_paths, get_domain from src.msgqueue import messagequeue from src.queue_handler import DBHandler from src.wiki import Wiki, process_cats, process_mwmsgs, essential_info, essential_feeds -from src.discord import DiscordMessage, formatter_exception_logger, msg_sender_exception_logger, \ - group_task_exception_logger, discussion_task_exception_logger +from src.discord import DiscordMessage, generic_msg_sender_exception_logger from src.wiki_ratelimiter import RateLimiter logging.config.dictConfig(settings["logging"]) @@ -38,6 +36,9 @@ mw_msgs: dict = {} # will have the type of id: tuple # Reasons for this: 1. we require amount of wikis to calculate the cooldown between requests # 2. Easier to code +for db_wiki in db_cursor.execute('SELECT wiki FROM rcgcdw GROUP BY wiki ORDER BY ROWID'): + all_wikis[db_wiki["wiki"]] = Wiki() # populate all_wikis + queue_limit = settings.get("queue_limit", 30) class LimitedList(list): @@ -65,9 +66,11 @@ class RcQueue: async def remove_wiki_from_group(self, wiki): """Removes a wiki from query of given domain group""" + logger.debug(f"Removing {wiki} from group queue.") group = get_domain(wiki) self[group]["query"] = [x for x in self[group]["query"] if x["wiki"] == wiki] if not self[group]["query"]: # if there is no wiki left in the queue, get rid of the task + all_wikis[wiki].rc_active = False self[group]["task"].cancel() del self.domain_list[group] @@ -76,23 +79,29 @@ class RcQueue: """Retrives next wiki in the queue for given domain""" try: yield self.domain_list[group]["query"][0] + except asyncio.CancelledError: + raise except: if command_line_args.debug: logger.exception("RC Group exception") - raise # reraise the issue + shutdown(asyncio.get_event_loop()) else: logger.exception("Group task returned error") - await group_task_exception_logger(group, traceback.format_exc()) + await generic_msg_sender_exception_logger(traceback.format_exc(), "Group task error logger", Group=group) else: self.domain_list[group]["query"].pop(0) + @staticmethod + def filter_rc_active(wiki_obj): + return wiki_obj[1].rc_active + async def update_queues(self): """Makes a round on rcgcdw DB and looks for updates to the queues in self.domain_list""" try: fetch_all = db_cursor.execute( 'SELECT ROWID, webhook, wiki, lang, display, wikiid, rcid FROM rcgcdw WHERE NOT rcid = -1 GROUP BY wiki ORDER BY ROWID') - self.to_remove = list(all_wikis.keys()) # first populate this list and remove wikis that are still in the db, clean up the rest + self.to_remove = [x[0] for x in filter(self.filter_rc_active, all_wikis.items())] # first populate this list and remove wikis that are still in the db, clean up the rest full = [] for db_wiki in fetch_all.fetchall(): domain = get_domain(db_wiki["wiki"]) @@ -109,13 +118,19 @@ class RcQueue: current_domain["last_rowid"] = db_wiki["ROWID"] continue for wiki in self.to_remove: - del all_wikis[wiki] await self.remove_wiki_from_group(wiki) for group, data in self.domain_list.items(): if group not in full: self[group]["last_rowid"] = 0 # iter reached the end without being stuck on full list + logger.debug("Current domain_list structure: {}".format(self.domain_list)) except: - logger.exception("Queue error!") + if command_line_args.debug: + logger.exception("Queue error!") + shutdown(asyncio.get_event_loop()) + else: + logger.exception("Exception on queue updater") + await generic_msg_sender_exception_logger(traceback.format_exc(), "Queue updator") + def __getitem__(self, item): """Returns the query of given domain group""" @@ -133,6 +148,8 @@ rcqueue = RcQueue() def calculate_delay_for_group(group_length: int) -> float: """Calculate the delay between fetching each wiki to avoid rate limits""" min_delay = 60 / settings["max_requests_per_minute"] + if group_length == 0: + group_length = 1 if (group_length * min_delay) < settings["minimal_cooldown_per_wiki_in_sec"]: return settings["minimal_cooldown_per_wiki_in_sec"] / group_length else: @@ -156,8 +173,8 @@ async def generate_domain_groups(): domain_wikis = defaultdict(list) fetch_all = db_cursor.execute('SELECT ROWID, webhook, wiki, lang, display, wikiid, rcid FROM rcgcdw WHERE NOT rcid = -1 GROUP BY wiki ORDER BY ROWID ASC') for db_wiki in fetch_all.fetchall(): + all_wikis[db_wiki["wiki"]].rc_active = True domain_wikis[get_domain(db_wiki["wiki"])].append(db_wiki) - all_wikis[db_wiki["wiki"]] = Wiki() # populate all_wikis for group, db_wikis in domain_wikis.items(): yield group, db_wikis @@ -216,13 +233,15 @@ async def scan_group(group: str): try: await essential_info(change, categorize_events, local_wiki, db_wiki, target, paths, recent_changes_resp, rate_limiter) + except asyncio.CancelledError: + raise except: if command_line_args.debug: logger.exception("Exception on RC formatter") raise else: logger.exception("Exception on RC formatter") - await formatter_exception_logger(db_wiki["wiki"], change, traceback.format_exc()) + await generic_msg_sender_exception_logger(traceback.format_exc(), "Exception in RC formatter", Wiki=db_wiki["wiki"], Change=str(change)[0:1000]) if recent_changes: DBHandler.add(db_wiki["wiki"], change["rcid"]) delay_between_wikis = calculate_delay_for_group(len(rcqueue[group]["query"])) @@ -248,13 +267,15 @@ async def message_sender(): try: while True: await messagequeue.resend_msgs() + except asyncio.CancelledError: + pass except: if command_line_args.debug: logger.exception("Exception on DC message sender") - raise # reraise the issue + shutdown(loop=asyncio.get_event_loop()) else: logger.exception("Exception on DC message sender") - await msg_sender_exception_logger(traceback.format_exc()) + await generic_msg_sender_exception_logger(traceback.format_exc(), "Message sender exception") async def discussion_handler(): try: @@ -304,22 +325,27 @@ async def discussion_handler(): for target in targets.items(): try: await essential_feeds(post, db_wiki, target) + except asyncio.CancelledError: + raise except: if command_line_args.debug: - raise # reraise the issue + logger.exception("Exception on Feeds formatter") + shutdown(loop=asyncio.get_event_loop()) else: logger.exception("Exception on Feeds formatter") - await formatter_exception_logger(db_wiki["wiki"], post, traceback.format_exc()) + await generic_msg_sender_exception_logger(traceback.format_exc(), "Exception in feed formatter", Post=str(post)[0:1000], Wiki=db_wiki["wiki"]) if discussion_feed: DBHandler.add(db_wiki["wiki"], post["id"], True) await asyncio.sleep(delay=2.0) # hardcoded really doesn't need much more DBHandler.update_db() + except asyncio.CancelledError: + pass except: if command_line_args.debug: raise # reraise the issue else: logger.exception("Exception on Feeds formatter") - await discussion_task_exception_logger(db_wiki["wiki"], traceback.format_exc()) + await generic_msg_sender_exception_logger(traceback.format_exc(), "Discussion handler task exception", Wiki=db_wiki["wiki"]) @@ -327,22 +353,23 @@ def shutdown(loop, signal=None): DBHandler.update_db() if len(messagequeue) > 0: logger.warning("Some messages are still queued!") - loop.stop() - logger.info("Script has shut down due to signal {}.".format(signal)) for task in asyncio.all_tasks(loop): logger.debug("Killing task {}".format(task.get_name())) task.cancel() - sys.exit(0) + loop.run_until_complete(asyncio.gather(*asyncio.all_tasks(loop))) + loop.stop() + logger.info("Script has shut down due to signal {}.".format(signal)) + # sys.exit(0) -def global_exception_handler(loop, context): - """Global exception handler for asyncio, lets us know when something crashes""" - msg = context.get("exception", context["message"]) - logger.error("Global exception handler: {}".format(msg)) - if command_line_args.debug is False: - requests.post("https://discord.com/api/webhooks/"+settings["monitoring_webhook"], data=repr(DiscordMessage("compact", "monitoring", [settings["monitoring_webhook"]], wiki=None, content="[RcGcDb] Global exception handler: {}".format(msg))), headers={'Content-Type': 'application/json'}) - else: - shutdown(loop) +# def global_exception_handler(loop, context): +# """Global exception handler for asyncio, lets us know when something crashes""" +# msg = context.get("exception", context["message"]) +# logger.error("Global exception handler: {}".format(msg)) +# if command_line_args.debug is False: +# requests.post("https://discord.com/api/webhooks/"+settings["monitoring_webhook"], data=repr(DiscordMessage("compact", "monitoring", [settings["monitoring_webhook"]], wiki=None, content="[RcGcDb] Global exception handler: {}".format(msg))), headers={'Content-Type': 'application/json'}) +# else: +# shutdown(loop) async def main_loop(): @@ -355,7 +382,7 @@ async def main_loop(): except AttributeError: logger.info("Running on Windows, some things may not work as they should.") signals = (signal.SIGBREAK, signal.SIGTERM, signal.SIGINT) - loop.set_exception_handler(global_exception_handler) + # loop.set_exception_handler(global_exception_handler) try: task1 = asyncio.create_task(wiki_scanner()) task2 = asyncio.create_task(message_sender()) @@ -366,5 +393,4 @@ async def main_loop(): except KeyboardInterrupt: shutdown(loop) - -asyncio.run(main_loop(), debug=command_line_args.debug) +asyncio.run(main_loop(), debug=command_line_args.debug) \ No newline at end of file diff --git a/src/discord.py b/src/discord.py index 659bbf9..d1ebae9 100644 --- a/src/discord.py +++ b/src/discord.py @@ -110,41 +110,13 @@ async def wiki_removal_monitor(wiki_url, status): await send_to_discord_webhook_monitoring(DiscordMessage("compact", "webhook/remove", content="Removing {} because {}.".format(wiki_url, status), webhook_url=[None], wiki=None)) -async def discussion_task_exception_logger(wiki, exception): +async def generic_msg_sender_exception_logger(exception: str, title: str, **kwargs): + """Creates a Discord message reporting a crash""" message = DiscordMessage("embed", "bot/exception", [None], wiki=None) message["description"] = exception - message["title"] = "Discussion task exception logger" - message.add_field("Wiki", wiki) - message.finish_embed() - await send_to_discord_webhook_monitoring(message) - - -async def group_task_exception_logger(group, exception): - message = DiscordMessage("embed", "bot/exception", [None], wiki=None) - message["description"] = exception - message["title"] = "Group task exception logger" - message.add_field("Group", group) - message.finish_embed() - await send_to_discord_webhook_monitoring(message) - - -async def formatter_exception_logger(wiki_url, change, exception): - """Creates a Discord message reporting a crash in RC formatter area""" - message = DiscordMessage("embed", "bot/exception", [None], wiki=None) - message["description"] = exception - message["title"] = "RC Exception Report" - change = str(change)[0:1000] - message.add_field("Wiki URL", wiki_url) - message.add_field("Change", change) - message.finish_embed() - await send_to_discord_webhook_monitoring(message) - - -async def msg_sender_exception_logger(exception): - """Creates a Discord message reporting a crash in RC formatter area""" - message = DiscordMessage("embed", "bot/exception", [None], wiki=None) - message["description"] = exception - message["title"] = "MSGSENDER Exception Report" + message["title"] = title + for key, value in kwargs: + message.add_field(key, value) message.finish_embed() await send_to_discord_webhook_monitoring(message) diff --git a/src/request_tracking.py b/src/request_tracking.py deleted file mode 100644 index 13843ad..0000000 --- a/src/request_tracking.py +++ /dev/null @@ -1,23 +0,0 @@ -import aiohttp -import logging -from src.config import settings - -logger = logging.getLogger("rcgcdb.request_tracking") - -class WikiRequestTracking: - def __init__(self): - self.current_timeout = 0 - - async def add_timeout(self, time: float): - self.current_timeout += time - - def is_fandom(self, url): - if any(x in url for x in ("fandom.com", "gamepedia.com", "wikia.org")): - return True - return False - -async def on_request_start(session, trace_config_ctx, params): - if - -trace_config = aiohttp.TraceConfig() -trace_config.on_request_start.append(on_request_start) \ No newline at end of file diff --git a/src/wiki.py b/src/wiki.py index 727cf00..c3cabdf 100644 --- a/src/wiki.py +++ b/src/wiki.py @@ -24,7 +24,7 @@ class Wiki: mw_messages: int = None fail_times: int = 0 # corresponding to amount of times connection with wiki failed for client reasons (400-499) session: aiohttp.ClientSession = None - + rc_active: bool = False @staticmethod async def fetch_wiki(extended, script_path, session: aiohttp.ClientSession, ratelimiter: RateLimiter) -> aiohttp.ClientResponse: From 129368fcbdd3f9773ec38b375bfb616475354c5c Mon Sep 17 00:00:00 2001 From: Frisk Date: Thu, 6 Aug 2020 15:39:02 +0200 Subject: [PATCH 10/21] Fast fix for adding new wikis --- src/bot.py | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/src/bot.py b/src/bot.py index baaa9cd..ceb62f4 100644 --- a/src/bot.py +++ b/src/bot.py @@ -105,8 +105,13 @@ class RcQueue: full = [] for db_wiki in fetch_all.fetchall(): domain = get_domain(db_wiki["wiki"]) - current_domain = self[domain] try: + all_wikis[db_wiki["wiki"]] + except KeyError: + all_wikis[db_wiki["wiki"]] = Wiki() + all_wikis[db_wiki["wiki"]].rc_active = True + try: + current_domain = self[domain] if not db_wiki["ROWID"] < current_domain["last_rowid"]: current_domain["query"].append(db_wiki) self.to_remove.remove(db_wiki["wiki"]) @@ -288,7 +293,10 @@ async def discussion_handler(): header["Accept"] = "application/hal+json" async with aiohttp.ClientSession(headers=header, timeout=aiohttp.ClientTimeout(3.0)) as session: - local_wiki = all_wikis[db_wiki["wiki"]] # set a reference to a wiki object from memory + try: + local_wiki = all_wikis[db_wiki["wiki"]] # set a reference to a wiki object from memory + except KeyError: + local_wiki = all_wikis[db_wiki["wiki"]] = Wiki() try: feeds_response = await local_wiki.fetch_feeds(db_wiki["wikiid"], session) except (WikiServerError, WikiError): From a3eb577966703162a0b0f600e3839e8857e4211c Mon Sep 17 00:00:00 2001 From: Frisk Date: Fri, 7 Aug 2020 18:56:29 +0200 Subject: [PATCH 11/21] Quick patch for syncing rcid --- src/bot.py | 21 ++++++++++++--------- src/wiki.py | 5 +++-- 2 files changed, 15 insertions(+), 11 deletions(-) diff --git a/src/bot.py b/src/bot.py index ceb62f4..10358ad 100644 --- a/src/bot.py +++ b/src/bot.py @@ -70,7 +70,7 @@ class RcQueue: group = get_domain(wiki) self[group]["query"] = [x for x in self[group]["query"] if x["wiki"] == wiki] if not self[group]["query"]: # if there is no wiki left in the queue, get rid of the task - all_wikis[wiki].rc_active = False + all_wikis[wiki].rc_active = -1 self[group]["task"].cancel() del self.domain_list[group] @@ -94,7 +94,7 @@ class RcQueue: @staticmethod def filter_rc_active(wiki_obj): - return wiki_obj[1].rc_active + return wiki_obj[1].rc_active > -1 async def update_queues(self): """Makes a round on rcgcdw DB and looks for updates to the queues in self.domain_list""" @@ -109,7 +109,7 @@ class RcQueue: all_wikis[db_wiki["wiki"]] except KeyError: all_wikis[db_wiki["wiki"]] = Wiki() - all_wikis[db_wiki["wiki"]].rc_active = True + all_wikis[db_wiki["wiki"]].rc_active = db_wiki["rcid"] try: current_domain = self[domain] if not db_wiki["ROWID"] < current_domain["last_rowid"]: @@ -178,7 +178,7 @@ async def generate_domain_groups(): domain_wikis = defaultdict(list) fetch_all = db_cursor.execute('SELECT ROWID, webhook, wiki, lang, display, wikiid, rcid FROM rcgcdw WHERE NOT rcid = -1 GROUP BY wiki ORDER BY ROWID ASC') for db_wiki in fetch_all.fetchall(): - all_wikis[db_wiki["wiki"]].rc_active = True + all_wikis[db_wiki["wiki"]].rc_active = db_wiki["rcid"] domain_wikis[get_domain(db_wiki["wiki"])].append(db_wiki) for group, db_wikis in domain_wikis.items(): yield group, db_wikis @@ -220,10 +220,12 @@ async def scan_group(group: str): continue if extended: await process_mwmsgs(recent_changes_resp, local_wiki, mw_msgs) - if db_wiki["rcid"] is None: # new wiki, just get the last rc to not spam the channel + if local_wiki.active_rc is 0: # new wiki, just get the last rc to not spam the channel if len(recent_changes) > 0: + local_wiki.active_rc = recent_changes[-1]["rcid"] DBHandler.add(db_wiki["wiki"], recent_changes[-1]["rcid"]) else: + local_wiki.active_rc = 0 DBHandler.add(db_wiki["wiki"], 0) DBHandler.update_db() continue @@ -233,11 +235,11 @@ async def scan_group(group: str): for change in recent_changes: await process_cats(change, local_wiki, mw_msgs, categorize_events) for change in recent_changes: # Yeah, second loop since the categories require to be all loaded up - if change["rcid"] > db_wiki["rcid"]: + if change["rcid"] > local_wiki.active_rc: for target in targets.items(): try: - await essential_info(change, categorize_events, local_wiki, db_wiki, - target, paths, recent_changes_resp, rate_limiter) + await essential_info(change, categorize_events, local_wiki, target, paths, + recent_changes_resp, rate_limiter) except asyncio.CancelledError: raise except: @@ -248,8 +250,9 @@ async def scan_group(group: str): logger.exception("Exception on RC formatter") await generic_msg_sender_exception_logger(traceback.format_exc(), "Exception in RC formatter", Wiki=db_wiki["wiki"], Change=str(change)[0:1000]) if recent_changes: + local_wiki.active_rc = change["rcid"] DBHandler.add(db_wiki["wiki"], change["rcid"]) - delay_between_wikis = calculate_delay_for_group(len(rcqueue[group]["query"])) + delay_between_wikis = calculate_delay_for_group(len(rcqueue[group]["query"])) # TODO Find a way to not execute it every wiki await asyncio.sleep(delay_between_wikis) DBHandler.update_db() diff --git a/src/wiki.py b/src/wiki.py index c3cabdf..9d08f12 100644 --- a/src/wiki.py +++ b/src/wiki.py @@ -24,7 +24,7 @@ class Wiki: mw_messages: int = None fail_times: int = 0 # corresponding to amount of times connection with wiki failed for client reasons (400-499) session: aiohttp.ClientSession = None - rc_active: bool = False + rc_active: int = 0 @staticmethod async def fetch_wiki(extended, script_path, session: aiohttp.ClientSession, ratelimiter: RateLimiter) -> aiohttp.ClientResponse: @@ -191,7 +191,8 @@ async def process_mwmsgs(wiki_response: dict, local_wiki: Wiki, mw_msgs: dict): local_wiki.mw_messages = key # db_wiki: webhook, wiki, lang, display, wikiid, rcid, postid -async def essential_info(change: dict, changed_categories, local_wiki: Wiki, db_wiki: tuple, target: tuple, paths: tuple, request: dict, rate_limiter: RateLimiter): +async def essential_info(change: dict, changed_categories, local_wiki: Wiki, target: tuple, paths: tuple, request: dict, + rate_limiter: RateLimiter): """Prepares essential information for both embed and compact message format.""" def _(string: str) -> str: """Our own translation string to make it compatible with async""" From fca9eb72b9d6842813e15fe051926065f96c046d Mon Sep 17 00:00:00 2001 From: Frisk Date: Fri, 7 Aug 2020 23:03:20 +0200 Subject: [PATCH 12/21] Prevent setting -1 for rcid and postid to other values when feature disabled --- src/queue_handler.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/queue_handler.py b/src/queue_handler.py index d218d00..4bb9232 100644 --- a/src/queue_handler.py +++ b/src/queue_handler.py @@ -17,7 +17,7 @@ class UpdateDB: def update_db(self): for update in self.updated: update_type = "postid" if update[2] is not None else "rcid" - db_cursor.execute("UPDATE rcgcdw SET {} = ? WHERE wiki = ?".format(update_type), (update[1],update[0],)) + db_cursor.execute("UPDATE rcgcdw SET {} = ? WHERE wiki = ? AND NOT ? = -1".format(update_type), (update[1], update[0], update_type)) db_connection.commit() self.clear_list() From 6658c399dc7e5052b0abccdad59f5d8041d837f1 Mon Sep 17 00:00:00 2001 From: Markus-Rost Date: Sat, 8 Aug 2020 19:25:32 +0200 Subject: [PATCH 13/21] fix queue handler --- src/bot.py | 115 +++++++++++++++++++++---------------------- src/queue_handler.py | 7 ++- 2 files changed, 62 insertions(+), 60 deletions(-) diff --git a/src/bot.py b/src/bot.py index 10358ad..d1f0111 100644 --- a/src/bot.py +++ b/src/bot.py @@ -100,7 +100,7 @@ class RcQueue: """Makes a round on rcgcdw DB and looks for updates to the queues in self.domain_list""" try: fetch_all = db_cursor.execute( - 'SELECT ROWID, webhook, wiki, lang, display, wikiid, rcid FROM rcgcdw WHERE NOT rcid = -1 GROUP BY wiki ORDER BY ROWID') + 'SELECT ROWID, webhook, wiki, lang, display, wikiid, rcid FROM rcgcdw WHERE rcid != -1 GROUP BY wiki ORDER BY ROWID') self.to_remove = [x[0] for x in filter(self.filter_rc_active, all_wikis.items())] # first populate this list and remove wikis that are still in the db, clean up the rest full = [] for db_wiki in fetch_all.fetchall(): @@ -176,7 +176,7 @@ def generate_targets(wiki_url: str) -> defaultdict: async def generate_domain_groups(): """Generate a list of wikis per domain (fandom.com, wikipedia.org etc.)""" domain_wikis = defaultdict(list) - fetch_all = db_cursor.execute('SELECT ROWID, webhook, wiki, lang, display, wikiid, rcid FROM rcgcdw WHERE NOT rcid = -1 GROUP BY wiki ORDER BY ROWID ASC') + fetch_all = db_cursor.execute('SELECT ROWID, webhook, wiki, lang, display, wikiid, rcid FROM rcgcdw WHERE rcid != -1 GROUP BY wiki ORDER BY ROWID ASC') for db_wiki in fetch_all.fetchall(): all_wikis[db_wiki["wiki"]].rc_active = db_wiki["rcid"] domain_wikis[get_domain(db_wiki["wiki"])].append(db_wiki) @@ -289,64 +289,63 @@ async def discussion_handler(): try: while True: fetch_all = db_cursor.execute( - 'SELECT ROWID, webhook, wiki, lang, display, wikiid, rcid, postid FROM rcgcdw WHERE NOT wikiid = ""') + 'SELECT wiki, wikiid, postid FROM rcgcdw WHERE wikiid IS NOT NULL') for db_wiki in fetch_all.fetchall(): - if db_wiki["wikiid"] is not None: - header = settings["header"] - header["Accept"] = "application/hal+json" - async with aiohttp.ClientSession(headers=header, - timeout=aiohttp.ClientTimeout(3.0)) as session: - try: - local_wiki = all_wikis[db_wiki["wiki"]] # set a reference to a wiki object from memory - except KeyError: - local_wiki = all_wikis[db_wiki["wiki"]] = Wiki() - try: - feeds_response = await local_wiki.fetch_feeds(db_wiki["wikiid"], session) - except (WikiServerError, WikiError): - logger.error("Exeption when fetching the wiki") - continue # ignore this wiki if it throws errors - try: - discussion_feed_resp = await feeds_response.json(encoding="UTF-8") - if "title" in discussion_feed_resp: - error = discussion_feed_resp["error"] - if error == "site doesn't exists": - db_cursor.execute("UPDATE rcgcdw SET wikiid = ? WHERE wiki = ?", - (None, db_wiki["wiki"],)) - DBHandler.update_db() - continue - raise WikiError - discussion_feed = discussion_feed_resp["_embedded"]["doc:posts"] - discussion_feed.reverse() - except aiohttp.ContentTypeError: - logger.exception("Wiki seems to be resulting in non-json content.") - continue - except: - logger.exception("On loading json of response.") - continue - if db_wiki["postid"] is None: # new wiki, just get the last post to not spam the channel - if len(discussion_feed) > 0: - DBHandler.add(db_wiki["wiki"], discussion_feed[-1]["id"], True) - else: - DBHandler.add(db_wiki["wiki"], "0", True) - DBHandler.update_db() + header = settings["header"] + header["Accept"] = "application/hal+json" + async with aiohttp.ClientSession(headers=header, + timeout=aiohttp.ClientTimeout(3.0)) as session: + try: + local_wiki = all_wikis[db_wiki["wiki"]] # set a reference to a wiki object from memory + except KeyError: + local_wiki = all_wikis[db_wiki["wiki"]] = Wiki() + try: + feeds_response = await local_wiki.fetch_feeds(db_wiki["wikiid"], session) + except (WikiServerError, WikiError): + logger.error("Exeption when fetching the wiki") + continue # ignore this wiki if it throws errors + try: + discussion_feed_resp = await feeds_response.json(encoding="UTF-8") + if "title" in discussion_feed_resp: + error = discussion_feed_resp["error"] + if error == "site doesn't exists": + db_cursor.execute("UPDATE rcgcdw SET wikiid = ? WHERE wiki = ?", + (None, db_wiki["wiki"],)) + DBHandler.update_db() + continue + raise WikiError + discussion_feed = discussion_feed_resp["_embedded"]["doc:posts"] + discussion_feed.reverse() + except aiohttp.ContentTypeError: + logger.exception("Wiki seems to be resulting in non-json content.") continue - targets = generate_targets(db_wiki["wiki"]) - for post in discussion_feed: - if post["id"] > db_wiki["postid"]: - for target in targets.items(): - try: - await essential_feeds(post, db_wiki, target) - except asyncio.CancelledError: - raise - except: - if command_line_args.debug: - logger.exception("Exception on Feeds formatter") - shutdown(loop=asyncio.get_event_loop()) - else: - logger.exception("Exception on Feeds formatter") - await generic_msg_sender_exception_logger(traceback.format_exc(), "Exception in feed formatter", Post=str(post)[0:1000], Wiki=db_wiki["wiki"]) - if discussion_feed: - DBHandler.add(db_wiki["wiki"], post["id"], True) + except: + logger.exception("On loading json of response.") + continue + if db_wiki["postid"] is None: # new wiki, just get the last post to not spam the channel + if len(discussion_feed) > 0: + DBHandler.add(db_wiki["wikiid"], discussion_feed[-1]["id"], True) + else: + DBHandler.add(db_wiki["wikiid"], "0", True) + DBHandler.update_db() + continue + targets = generate_targets(db_wiki["wiki"]) + for post in discussion_feed: + if post["id"] > db_wiki["postid"]: + for target in targets.items(): + try: + await essential_feeds(post, db_wiki, target) + except asyncio.CancelledError: + raise + except: + if command_line_args.debug: + logger.exception("Exception on Feeds formatter") + shutdown(loop=asyncio.get_event_loop()) + else: + logger.exception("Exception on Feeds formatter") + await generic_msg_sender_exception_logger(traceback.format_exc(), "Exception in feed formatter", Post=str(post)[0:1000], Wiki=db_wiki["wiki"]) + if discussion_feed: + DBHandler.add(db_wiki["wikiid"], post["id"], True) await asyncio.sleep(delay=2.0) # hardcoded really doesn't need much more DBHandler.update_db() except asyncio.CancelledError: diff --git a/src/queue_handler.py b/src/queue_handler.py index 4bb9232..31ec2fe 100644 --- a/src/queue_handler.py +++ b/src/queue_handler.py @@ -16,8 +16,11 @@ class UpdateDB: def update_db(self): for update in self.updated: - update_type = "postid" if update[2] is not None else "rcid" - db_cursor.execute("UPDATE rcgcdw SET {} = ? WHERE wiki = ? AND NOT ? = -1".format(update_type), (update[1], update[0], update_type)) + if update[2] is None: + sql = "UPDATE rcgcdw SET rcid = ? WHERE wiki = ? AND rcid != -1" + else: + sql = "UPDATE rcgcdw SET postid = ? WHERE wikiid = ?" + db_cursor.execute(sql, (update[1], update[0])) db_connection.commit() self.clear_list() From 897dbd139c149ce19f949c1de530a227eeb40df1 Mon Sep 17 00:00:00 2001 From: Markus-Rost Date: Sat, 8 Aug 2020 19:32:53 +0200 Subject: [PATCH 14/21] readd missing `,` --- src/queue_handler.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/queue_handler.py b/src/queue_handler.py index 31ec2fe..473588b 100644 --- a/src/queue_handler.py +++ b/src/queue_handler.py @@ -20,7 +20,7 @@ class UpdateDB: sql = "UPDATE rcgcdw SET rcid = ? WHERE wiki = ? AND rcid != -1" else: sql = "UPDATE rcgcdw SET postid = ? WHERE wikiid = ?" - db_cursor.execute(sql, (update[1], update[0])) + db_cursor.execute(sql, (update[1], update[0],)) db_connection.commit() self.clear_list() From e81198d84b869cd6e95436d00181e31fc781c58e Mon Sep 17 00:00:00 2001 From: Frisk Date: Sun, 9 Aug 2020 13:53:11 +0200 Subject: [PATCH 15/21] Many fixes to rate-limiting related features, added wiki queuing with higher change limit in case 20 isn't enough --- src/bot.py | 98 +++++++++++++++++++++++++++++------------------------ src/wiki.py | 3 +- 2 files changed, 54 insertions(+), 47 deletions(-) diff --git a/src/bot.py b/src/bot.py index d1f0111..2980318 100644 --- a/src/bot.py +++ b/src/bot.py @@ -2,11 +2,9 @@ import aiohttp import asyncio import logging.config import signal -import sys import traceback -from collections import defaultdict - -import requests +from collections import defaultdict, namedtuple +from typing import Generator from contextlib import asynccontextmanager from src.argparser import command_line_args @@ -36,10 +34,12 @@ mw_msgs: dict = {} # will have the type of id: tuple # Reasons for this: 1. we require amount of wikis to calculate the cooldown between requests # 2. Easier to code -for db_wiki in db_cursor.execute('SELECT wiki FROM rcgcdw GROUP BY wiki ORDER BY ROWID'): +for db_wiki in db_cursor.execute('SELECT wiki, rcid FROM rcgcdw GROUP BY wiki ORDER BY ROWID'): all_wikis[db_wiki["wiki"]] = Wiki() # populate all_wikis + all_wikis[db_wiki["wiki"]].rc_active = db_wiki["rcid"] queue_limit = settings.get("queue_limit", 30) +QueuedWiki = namedtuple("QueuedWiki", ['url', 'amount']) class LimitedList(list): def __init__(self, *args): @@ -68,14 +68,14 @@ class RcQueue: """Removes a wiki from query of given domain group""" logger.debug(f"Removing {wiki} from group queue.") group = get_domain(wiki) - self[group]["query"] = [x for x in self[group]["query"] if x["wiki"] == wiki] + self[group]["query"] = [x for x in self[group]["query"] if x.url == wiki] if not self[group]["query"]: # if there is no wiki left in the queue, get rid of the task all_wikis[wiki].rc_active = -1 self[group]["task"].cancel() del self.domain_list[group] @asynccontextmanager - async def retrieve_next_queued(self, group): + async def retrieve_next_queued(self, group) -> Generator[QueuedWiki, None, None]: """Retrives next wiki in the queue for given domain""" try: yield self.domain_list[group]["query"][0] @@ -113,7 +113,7 @@ class RcQueue: try: current_domain = self[domain] if not db_wiki["ROWID"] < current_domain["last_rowid"]: - current_domain["query"].append(db_wiki) + current_domain["query"].append(QueuedWiki(db_wiki["wiki"], 20)) self.to_remove.remove(db_wiki["wiki"]) except KeyError: await self.start_group(domain, db_wiki) @@ -178,8 +178,7 @@ async def generate_domain_groups(): domain_wikis = defaultdict(list) fetch_all = db_cursor.execute('SELECT ROWID, webhook, wiki, lang, display, wikiid, rcid FROM rcgcdw WHERE rcid != -1 GROUP BY wiki ORDER BY ROWID ASC') for db_wiki in fetch_all.fetchall(): - all_wikis[db_wiki["wiki"]].rc_active = db_wiki["rcid"] - domain_wikis[get_domain(db_wiki["wiki"])].append(db_wiki) + domain_wikis[get_domain(db_wiki["wiki"])].append(QueuedWiki(db_wiki["wiki"], 20)) for group, db_wikis in domain_wikis.items(): yield group, db_wikis @@ -187,17 +186,17 @@ async def generate_domain_groups(): async def scan_group(group: str): rate_limiter = rcqueue[group]["rate_limiter"] while True: - async with rcqueue.retrieve_next_queued(group) as db_wiki: # acquire next wiki in queue - logger.debug("Wiki {}".format(db_wiki["wiki"])) - local_wiki = all_wikis[db_wiki["wiki"]] # set a reference to a wiki object from memory + async with rcqueue.retrieve_next_queued(group) as queued_wiki: # acquire next wiki in queue + logger.debug("Wiki {}".format(queued_wiki.url)) + local_wiki = all_wikis[queued_wiki.url] # set a reference to a wiki object from memory extended = False if local_wiki.mw_messages is None: extended = True async with aiohttp.ClientSession(headers=settings["header"], timeout=aiohttp.ClientTimeout(3.0)) as session: try: - wiki_response = await local_wiki.fetch_wiki(extended, db_wiki["wiki"], session, rate_limiter) - await local_wiki.check_status(db_wiki["wiki"], wiki_response.status) + wiki_response = await local_wiki.fetch_wiki(extended, queued_wiki.url, session, rate_limiter, amount=queued_wiki.amount) + await local_wiki.check_status(queued_wiki.url, wiki_response.status) except (WikiServerError, WikiError): logger.error("Exeption when fetching the wiki") continue # ignore this wiki if it throws errors @@ -206,52 +205,61 @@ async def scan_group(group: str): if "error" in recent_changes_resp or "errors" in recent_changes_resp: error = recent_changes_resp.get("error", recent_changes_resp["errors"]) if error["code"] == "readapidenied": - await local_wiki.fail_add(db_wiki["wiki"], 410) + await local_wiki.fail_add(queued_wiki.url, 410) continue raise WikiError recent_changes = recent_changes_resp['query']['recentchanges'] recent_changes.reverse() except aiohttp.ContentTypeError: logger.exception("Wiki seems to be resulting in non-json content.") - await local_wiki.fail_add(db_wiki["wiki"], 410) + await local_wiki.fail_add(queued_wiki.url, 410) continue except: logger.exception("On loading json of response.") continue if extended: await process_mwmsgs(recent_changes_resp, local_wiki, mw_msgs) - if local_wiki.active_rc is 0: # new wiki, just get the last rc to not spam the channel + if local_wiki.rc_active == 0: # new wiki, just get the last rc to not spam the channel if len(recent_changes) > 0: - local_wiki.active_rc = recent_changes[-1]["rcid"] - DBHandler.add(db_wiki["wiki"], recent_changes[-1]["rcid"]) + local_wiki.rc_active = recent_changes[-1]["rcid"] + DBHandler.add(queued_wiki.url, recent_changes[-1]["rcid"]) else: - local_wiki.active_rc = 0 - DBHandler.add(db_wiki["wiki"], 0) + local_wiki.rc_active = 0 + DBHandler.add(queued_wiki.url, 0) DBHandler.update_db() continue categorize_events = {} - targets = generate_targets(db_wiki["wiki"]) - paths = get_paths(db_wiki["wiki"], recent_changes_resp) + targets = generate_targets(queued_wiki.url) + paths = get_paths(queued_wiki.url, recent_changes_resp) + new_events = 0 for change in recent_changes: + if change["rcid"] > local_wiki.rc_active and queued_wiki.amount != 450: + new_events += 1 + if new_events == 20: + # call the function again with max limit for more results, ignore the ones in this request + logger.debug("There were too many new events, queuing wiki with 450 limit.") + rcqueue[group]["query"].insert(1, QueuedWiki(queued_wiki.url, 450)) + break await process_cats(change, local_wiki, mw_msgs, categorize_events) - for change in recent_changes: # Yeah, second loop since the categories require to be all loaded up - if change["rcid"] > local_wiki.active_rc: - for target in targets.items(): - try: - await essential_info(change, categorize_events, local_wiki, target, paths, - recent_changes_resp, rate_limiter) - except asyncio.CancelledError: - raise - except: - if command_line_args.debug: - logger.exception("Exception on RC formatter") + else: # If we broke from previous loop (too many changes) don't execute sending messages here + for change in recent_changes: # Yeah, second loop since the categories require to be all loaded up + if change["rcid"] > local_wiki.rc_active: + for target in targets.items(): + try: + await essential_info(change, categorize_events, local_wiki, target, paths, + recent_changes_resp, rate_limiter) + except asyncio.CancelledError: raise - else: - logger.exception("Exception on RC formatter") - await generic_msg_sender_exception_logger(traceback.format_exc(), "Exception in RC formatter", Wiki=db_wiki["wiki"], Change=str(change)[0:1000]) - if recent_changes: - local_wiki.active_rc = change["rcid"] - DBHandler.add(db_wiki["wiki"], change["rcid"]) + except: + if command_line_args.debug: + logger.exception("Exception on RC formatter") + raise + else: + logger.exception("Exception on RC formatter") + await generic_msg_sender_exception_logger(traceback.format_exc(), "Exception in RC formatter", Wiki=queued_wiki.url, Change=str(change)[0:1000]) + if recent_changes: + local_wiki.rc_active = change["rcid"] + DBHandler.add(queued_wiki.url, change["rcid"]) delay_between_wikis = calculate_delay_for_group(len(rcqueue[group]["query"])) # TODO Find a way to not execute it every wiki await asyncio.sleep(delay_between_wikis) DBHandler.update_db() @@ -394,13 +402,13 @@ async def main_loop(): signals = (signal.SIGBREAK, signal.SIGTERM, signal.SIGINT) # loop.set_exception_handler(global_exception_handler) try: - task1 = asyncio.create_task(wiki_scanner()) - task2 = asyncio.create_task(message_sender()) - task3 = asyncio.create_task(discussion_handler()) + task1 = asyncio.create_task(wiki_scanner(), name="Wiki RC scanner") + task2 = asyncio.create_task(message_sender(), name="Discord message sender") + task3 = asyncio.create_task(discussion_handler(), name="Discussion handler") await task1 await task2 await task3 except KeyboardInterrupt: shutdown(loop) -asyncio.run(main_loop(), debug=command_line_args.debug) \ No newline at end of file +asyncio.run(main_loop(), debug=False) diff --git a/src/wiki.py b/src/wiki.py index 9d08f12..e59bdc4 100644 --- a/src/wiki.py +++ b/src/wiki.py @@ -27,10 +27,9 @@ class Wiki: rc_active: int = 0 @staticmethod - async def fetch_wiki(extended, script_path, session: aiohttp.ClientSession, ratelimiter: RateLimiter) -> aiohttp.ClientResponse: + async def fetch_wiki(extended, script_path, session: aiohttp.ClientSession, ratelimiter: RateLimiter, amount=20) -> aiohttp.ClientResponse: await ratelimiter.timeout_wait() url_path = script_path + "api.php" - amount = 20 if extended: params = {"action": "query", "format": "json", "uselang": "content", "list": "tags|recentchanges", "meta": "allmessages|siteinfo", From d6df680e925dd20b67c7762f5f8677273e81afd3 Mon Sep 17 00:00:00 2001 From: Frisk Date: Sun, 9 Aug 2020 15:03:04 +0200 Subject: [PATCH 16/21] Fixed an oopsie --- README.md | 1 - requirements.txt | 1 - src/bot.py | 2 +- 3 files changed, 1 insertion(+), 3 deletions(-) diff --git a/README.md b/README.md index 152935b..41a0daa 100644 --- a/README.md +++ b/README.md @@ -3,7 +3,6 @@ RcGcDb is a backend for handling webhooks to which recent changes of MediaWiki w ### Dependencies ### * **Python 3.6>** -* requests 2.18.4> * beautifulsoup 4.6.0> * aiohttp 3.6.2> * lxml 4.2.1> diff --git a/requirements.txt b/requirements.txt index c92d56c..945fadf 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,4 +1,3 @@ beautifulsoup4 >= 4.6.0; python_version >= '3.6' -requests >= 2.18.4 aiohttp >= 3.6.2 lxml >= 4.2.1 \ No newline at end of file diff --git a/src/bot.py b/src/bot.py index 2980318..0602cb6 100644 --- a/src/bot.py +++ b/src/bot.py @@ -111,10 +111,10 @@ class RcQueue: all_wikis[db_wiki["wiki"]] = Wiki() all_wikis[db_wiki["wiki"]].rc_active = db_wiki["rcid"] try: + self.to_remove.remove(db_wiki["wiki"]) current_domain = self[domain] if not db_wiki["ROWID"] < current_domain["last_rowid"]: current_domain["query"].append(QueuedWiki(db_wiki["wiki"], 20)) - self.to_remove.remove(db_wiki["wiki"]) except KeyError: await self.start_group(domain, db_wiki) logger.info("A new domain group has been added since last time, adding it to the domain_list and starting a task...") From e2077a7ca1638f69898c159215bf8039039e5cae Mon Sep 17 00:00:00 2001 From: Frisk Date: Sun, 9 Aug 2020 15:31:21 +0200 Subject: [PATCH 17/21] Fixed anotter oopsie --- src/bot.py | 163 ++++++++++++++++++++++++++++------------------------- 1 file changed, 85 insertions(+), 78 deletions(-) diff --git a/src/bot.py b/src/bot.py index 0602cb6..aa71c6d 100644 --- a/src/bot.py +++ b/src/bot.py @@ -70,6 +70,7 @@ class RcQueue: group = get_domain(wiki) self[group]["query"] = [x for x in self[group]["query"] if x.url == wiki] if not self[group]["query"]: # if there is no wiki left in the queue, get rid of the task + logger.debug(f"{group} no longer has any wikis queued!") all_wikis[wiki].rc_active = -1 self[group]["task"].cancel() del self.domain_list[group] @@ -106,12 +107,15 @@ class RcQueue: for db_wiki in fetch_all.fetchall(): domain = get_domain(db_wiki["wiki"]) try: - all_wikis[db_wiki["wiki"]] - except KeyError: + if db_wiki["wiki"] not in all_wikis: + raise AssertionError + self.to_remove.remove(db_wiki["wiki"]) + except AssertionError: all_wikis[db_wiki["wiki"]] = Wiki() all_wikis[db_wiki["wiki"]].rc_active = db_wiki["rcid"] + except ValueError: + pass try: - self.to_remove.remove(db_wiki["wiki"]) current_domain = self[domain] if not db_wiki["ROWID"] < current_domain["last_rowid"]: current_domain["query"].append(QueuedWiki(db_wiki["wiki"], 20)) @@ -186,83 +190,86 @@ async def generate_domain_groups(): async def scan_group(group: str): rate_limiter = rcqueue[group]["rate_limiter"] while True: - async with rcqueue.retrieve_next_queued(group) as queued_wiki: # acquire next wiki in queue - logger.debug("Wiki {}".format(queued_wiki.url)) - local_wiki = all_wikis[queued_wiki.url] # set a reference to a wiki object from memory - extended = False - if local_wiki.mw_messages is None: - extended = True - async with aiohttp.ClientSession(headers=settings["header"], - timeout=aiohttp.ClientTimeout(3.0)) as session: - try: - wiki_response = await local_wiki.fetch_wiki(extended, queued_wiki.url, session, rate_limiter, amount=queued_wiki.amount) - await local_wiki.check_status(queued_wiki.url, wiki_response.status) - except (WikiServerError, WikiError): - logger.error("Exeption when fetching the wiki") - continue # ignore this wiki if it throws errors - try: - recent_changes_resp = await wiki_response.json() - if "error" in recent_changes_resp or "errors" in recent_changes_resp: - error = recent_changes_resp.get("error", recent_changes_resp["errors"]) - if error["code"] == "readapidenied": - await local_wiki.fail_add(queued_wiki.url, 410) - continue - raise WikiError - recent_changes = recent_changes_resp['query']['recentchanges'] - recent_changes.reverse() - except aiohttp.ContentTypeError: - logger.exception("Wiki seems to be resulting in non-json content.") - await local_wiki.fail_add(queued_wiki.url, 410) + try: + async with rcqueue.retrieve_next_queued(group) as queued_wiki: # acquire next wiki in queue + logger.debug("Wiki {}".format(queued_wiki.url)) + local_wiki = all_wikis[queued_wiki.url] # set a reference to a wiki object from memory + extended = False + if local_wiki.mw_messages is None: + extended = True + async with aiohttp.ClientSession(headers=settings["header"], + timeout=aiohttp.ClientTimeout(3.0)) as session: + try: + wiki_response = await local_wiki.fetch_wiki(extended, queued_wiki.url, session, rate_limiter, amount=queued_wiki.amount) + await local_wiki.check_status(queued_wiki.url, wiki_response.status) + except (WikiServerError, WikiError): + logger.error("Exeption when fetching the wiki") + continue # ignore this wiki if it throws errors + try: + recent_changes_resp = await wiki_response.json() + if "error" in recent_changes_resp or "errors" in recent_changes_resp: + error = recent_changes_resp.get("error", recent_changes_resp["errors"]) + if error["code"] == "readapidenied": + await local_wiki.fail_add(queued_wiki.url, 410) + continue + raise WikiError + recent_changes = recent_changes_resp['query']['recentchanges'] + recent_changes.reverse() + except aiohttp.ContentTypeError: + logger.exception("Wiki seems to be resulting in non-json content.") + await local_wiki.fail_add(queued_wiki.url, 410) + continue + except: + logger.exception("On loading json of response.") + continue + if extended: + await process_mwmsgs(recent_changes_resp, local_wiki, mw_msgs) + if local_wiki.rc_active == 0: # new wiki, just get the last rc to not spam the channel + if len(recent_changes) > 0: + local_wiki.rc_active = recent_changes[-1]["rcid"] + DBHandler.add(queued_wiki.url, recent_changes[-1]["rcid"]) + else: + local_wiki.rc_active = 0 + DBHandler.add(queued_wiki.url, 0) + DBHandler.update_db() continue - except: - logger.exception("On loading json of response.") - continue - if extended: - await process_mwmsgs(recent_changes_resp, local_wiki, mw_msgs) - if local_wiki.rc_active == 0: # new wiki, just get the last rc to not spam the channel - if len(recent_changes) > 0: - local_wiki.rc_active = recent_changes[-1]["rcid"] - DBHandler.add(queued_wiki.url, recent_changes[-1]["rcid"]) - else: - local_wiki.rc_active = 0 - DBHandler.add(queued_wiki.url, 0) - DBHandler.update_db() - continue - categorize_events = {} - targets = generate_targets(queued_wiki.url) - paths = get_paths(queued_wiki.url, recent_changes_resp) - new_events = 0 - for change in recent_changes: - if change["rcid"] > local_wiki.rc_active and queued_wiki.amount != 450: - new_events += 1 - if new_events == 20: - # call the function again with max limit for more results, ignore the ones in this request - logger.debug("There were too many new events, queuing wiki with 450 limit.") - rcqueue[group]["query"].insert(1, QueuedWiki(queued_wiki.url, 450)) - break - await process_cats(change, local_wiki, mw_msgs, categorize_events) - else: # If we broke from previous loop (too many changes) don't execute sending messages here - for change in recent_changes: # Yeah, second loop since the categories require to be all loaded up - if change["rcid"] > local_wiki.rc_active: - for target in targets.items(): - try: - await essential_info(change, categorize_events, local_wiki, target, paths, - recent_changes_resp, rate_limiter) - except asyncio.CancelledError: - raise - except: - if command_line_args.debug: - logger.exception("Exception on RC formatter") + categorize_events = {} + targets = generate_targets(queued_wiki.url) + paths = get_paths(queued_wiki.url, recent_changes_resp) + new_events = 0 + for change in recent_changes: + if change["rcid"] > local_wiki.rc_active and queued_wiki.amount != 450: + new_events += 1 + if new_events == 20: + # call the function again with max limit for more results, ignore the ones in this request + logger.debug("There were too many new events, queuing wiki with 450 limit.") + rcqueue[group]["query"].insert(1, QueuedWiki(queued_wiki.url, 450)) + break + await process_cats(change, local_wiki, mw_msgs, categorize_events) + else: # If we broke from previous loop (too many changes) don't execute sending messages here + for change in recent_changes: # Yeah, second loop since the categories require to be all loaded up + if change["rcid"] > local_wiki.rc_active: + for target in targets.items(): + try: + await essential_info(change, categorize_events, local_wiki, target, paths, + recent_changes_resp, rate_limiter) + except asyncio.CancelledError: raise - else: - logger.exception("Exception on RC formatter") - await generic_msg_sender_exception_logger(traceback.format_exc(), "Exception in RC formatter", Wiki=queued_wiki.url, Change=str(change)[0:1000]) - if recent_changes: - local_wiki.rc_active = change["rcid"] - DBHandler.add(queued_wiki.url, change["rcid"]) - delay_between_wikis = calculate_delay_for_group(len(rcqueue[group]["query"])) # TODO Find a way to not execute it every wiki - await asyncio.sleep(delay_between_wikis) - DBHandler.update_db() + except: + if command_line_args.debug: + logger.exception("Exception on RC formatter") + raise + else: + logger.exception("Exception on RC formatter") + await generic_msg_sender_exception_logger(traceback.format_exc(), "Exception in RC formatter", Wiki=queued_wiki.url, Change=str(change)[0:1000]) + if recent_changes: + local_wiki.rc_active = change["rcid"] + DBHandler.add(queued_wiki.url, change["rcid"]) + delay_between_wikis = calculate_delay_for_group(len(rcqueue[group]["query"])) # TODO Find a way to not execute it every wiki + await asyncio.sleep(delay_between_wikis) + DBHandler.update_db() + except asyncio.CancelledError: + return async def wiki_scanner(): From ed131fb6da11886cc40bc59e5b54b9b967ea953d Mon Sep 17 00:00:00 2001 From: Frisk Date: Mon, 10 Aug 2020 01:57:14 +0200 Subject: [PATCH 18/21] Added translation work --- .../de/LC_MESSAGES/discussion_formatters.po | 132 ++ locale/de/LC_MESSAGES/discussions.mo | Bin 2378 -> 0 bytes locale/de/LC_MESSAGES/discussions.po | 105 -- locale/de/LC_MESSAGES/misc.mo | Bin 441 -> 0 bytes locale/de/LC_MESSAGES/misc.po | 85 +- .../{rcgcdw.po => rc_formatters.po} | 820 +++++++------ locale/de/LC_MESSAGES/rcgcdw.mo | Bin 20279 -> 0 bytes locale/de/LC_MESSAGES/wiki.po | 40 + locale/en/LC_MESSAGES/discussions.mo | Bin 1648 -> 0 bytes locale/en/LC_MESSAGES/discussions.po | 90 -- locale/en/LC_MESSAGES/misc.mo | Bin 441 -> 0 bytes locale/en/LC_MESSAGES/misc.po | 27 - locale/en/LC_MESSAGES/rcgcdw.mo | Bin 19610 -> 0 bytes locale/en/LC_MESSAGES/rcgcdw.po | 1073 ----------------- .../pl/LC_MESSAGES/discussion_formatters.mo | Bin 0 -> 1014 bytes .../pl/LC_MESSAGES/discussion_formatters.po | 137 +++ locale/pl/LC_MESSAGES/discussions.mo | Bin 2568 -> 0 bytes locale/pl/LC_MESSAGES/discussions.po | 110 -- locale/pl/LC_MESSAGES/misc.mo | Bin 502 -> 1180 bytes locale/pl/LC_MESSAGES/misc.po | 81 +- locale/pl/LC_MESSAGES/rc_formatters.mo | Bin 0 -> 20148 bytes .../{rcgcdw.po => rc_formatters.po} | 859 +++++++------ locale/pl/LC_MESSAGES/rcgcdw.mo | Bin 21130 -> 0 bytes .../LC_MESSAGES/discussion_formatters.po | 132 ++ locale/pt-br/LC_MESSAGES/discussions.mo | Bin 1274 -> 0 bytes locale/pt-br/LC_MESSAGES/discussions.po | 106 -- locale/pt-br/LC_MESSAGES/misc.mo | Bin 438 -> 0 bytes locale/pt-br/LC_MESSAGES/misc.po | 77 +- .../{rcgcdw.po => rc_formatters.po} | 967 +++++++-------- locale/pt-br/LC_MESSAGES/rcgcdw.mo | Bin 11239 -> 0 bytes locale/pt-br/LC_MESSAGES/wiki.po | 42 + .../generate_translations.sh | 0 src/bot.py | 2 +- src/discord.py | 2 +- src/formatters/discussions.py | 7 +- src/formatters/rc.py | 17 +- src/i18n.py | 19 +- src/misc.py | 8 +- src/wiki.py | 18 +- 39 files changed, 2035 insertions(+), 2921 deletions(-) create mode 100644 locale/de/LC_MESSAGES/discussion_formatters.po delete mode 100644 locale/de/LC_MESSAGES/discussions.mo delete mode 100644 locale/de/LC_MESSAGES/discussions.po delete mode 100644 locale/de/LC_MESSAGES/misc.mo rename locale/de/LC_MESSAGES/{rcgcdw.po => rc_formatters.po} (72%) delete mode 100644 locale/de/LC_MESSAGES/rcgcdw.mo create mode 100644 locale/de/LC_MESSAGES/wiki.po delete mode 100644 locale/en/LC_MESSAGES/discussions.mo delete mode 100644 locale/en/LC_MESSAGES/discussions.po delete mode 100644 locale/en/LC_MESSAGES/misc.mo delete mode 100644 locale/en/LC_MESSAGES/misc.po delete mode 100644 locale/en/LC_MESSAGES/rcgcdw.mo delete mode 100644 locale/en/LC_MESSAGES/rcgcdw.po create mode 100644 locale/pl/LC_MESSAGES/discussion_formatters.mo create mode 100644 locale/pl/LC_MESSAGES/discussion_formatters.po delete mode 100644 locale/pl/LC_MESSAGES/discussions.mo delete mode 100644 locale/pl/LC_MESSAGES/discussions.po create mode 100644 locale/pl/LC_MESSAGES/rc_formatters.mo rename locale/pl/LC_MESSAGES/{rcgcdw.po => rc_formatters.po} (75%) delete mode 100644 locale/pl/LC_MESSAGES/rcgcdw.mo create mode 100644 locale/pt-br/LC_MESSAGES/discussion_formatters.po delete mode 100644 locale/pt-br/LC_MESSAGES/discussions.mo delete mode 100644 locale/pt-br/LC_MESSAGES/discussions.po delete mode 100644 locale/pt-br/LC_MESSAGES/misc.mo rename locale/pt-br/LC_MESSAGES/{rcgcdw.po => rc_formatters.po} (58%) delete mode 100644 locale/pt-br/LC_MESSAGES/rcgcdw.mo create mode 100644 locale/pt-br/LC_MESSAGES/wiki.po rename locale/pt-br/LC_MESSAGES/.gitkeep => scripts/generate_translations.sh (100%) diff --git a/locale/de/LC_MESSAGES/discussion_formatters.po b/locale/de/LC_MESSAGES/discussion_formatters.po new file mode 100644 index 0000000..94e923a --- /dev/null +++ b/locale/de/LC_MESSAGES/discussion_formatters.po @@ -0,0 +1,132 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +msgid "" +msgstr "" +"Project-Id-Version: \n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2020-08-08 22:56+0200\n" +"PO-Revision-Date: 2020-08-10 01:54+0200\n" +"Last-Translator: \n" +"Language-Team: \n" +"Language: de\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Poedit 2.3.1\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: src/discussion_formatters.py:38 +#, 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 "" +"[{author}](<{url}f/u/{creatorId}>) erstellte eine [Antwork](<{url}f/p/" +"{threadId}/r/{postId}>) zu [{title}](<{url}f/p/{threadId}>) in {forumName}" + +#: src/discussion_formatters.py:40 src/discussion_formatters.py:49 +#: src/discussion_formatters.py:104 src/discussion_formatters.py:117 +msgid "unknown" +msgstr "Unbekannt" + +#: src/discussion_formatters.py:44 +#, 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 "" +"[{author}](<{url}f/u/{creatorId}>) erstellte [{title}](<{wikiurl}wiki/" +"Message_Wall:{user_wall}?threadId={threadid}>) auf der Nachrichtenseite von " +"{user}" + +#: src/discussion_formatters.py:46 +#, 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 "" +"[{author}](<{url}f/u/{creatorId}>) antwortete auf [{title}](<{wikiurl}wiki/" +"Message_Wall:{user_wall}?threadId={threadid}#{replyId}>) auf der " +"Nachrichtenseite von {user}" + +#: src/discussion_formatters.py:51 +#, python-brace-format +msgid "" +"[{author}]({author_url}) created a [comment](<{url}wiki/{article}?" +"commentId={commentId}>) on [{article}](<{url}wiki/{article}>)" +msgstr "" + +#: src/discussion_formatters.py:53 +#, python-brace-format +msgid "" +"[{author}]({author_url}) created a [reply](<{url}wiki/{article}?" +"threadId={threadId}) to a [comment](<{url}wiki/{article}?" +"commentId={commentId}&replyId={replyId}>) on [{article}](<{url}wiki/{article}" +">)" +msgstr "" + +#: src/discussion_formatters.py:82 +#, python-brace-format +msgid "Created \"{title}\"" +msgstr "Erstellte „{title}“" + +#: src/discussion_formatters.py:87 +#, fuzzy, python-brace-format +msgid "Created a poll \"{title}\"" +msgstr "Erstellte eine Umfrage „{title}“" + +#: src/discussion_formatters.py:92 +msgid "Option {}" +msgstr "Option {}" + +#: src/discussion_formatters.py:93 +#, python-brace-format +msgid "__[View image]({image_url})__" +msgstr "__[Bild öffnen]({image_url})__" + +#: src/discussion_formatters.py:101 +#, python-brace-format +msgid "Replied to \"{title}\"" +msgstr "Antwortete auf „{title}“" + +#: src/discussion_formatters.py:110 +#, python-brace-format +msgid "Created \"{title}\" on {user}'s Message Wall" +msgstr "Erstellte „{title}“ auf der Nachrichtenseite von {user}" + +#: src/discussion_formatters.py:114 +#, 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:121 +#, fuzzy, python-brace-format +msgid "Commented on {article}" +msgstr "Erstellte „{title}“" + +#: src/discussion_formatters.py:125 +#, fuzzy, python-brace-format +msgid "Replied to a comment on {article}" +msgstr "Antwortete auf „{title}“" + +#, python-brace-format +#~ msgid "" +#~ "[{author}](<{url}f/u/{creatorId}>) created [{title}](<{url}f/p/{threadId}" +#~ ">) in {forumName}" +#~ msgstr "" +#~ "[{author}](<{url}f/u/{creatorId}>) erstellte [{title}](<{url}f/p/" +#~ "{threadId}>) in {forumName}" + +#, python-brace-format +#~ msgid "" +#~ "[{author}](<{url}f/u/{creatorId}>) created a poll [{title}](<{url}f/p/" +#~ "{threadId}>) in {forumName}" +#~ msgstr "" +#~ "[{author}](<{url}f/u/{creatorId}>) erstellte eine Umfrage [{title}](<{url}" +#~ "f/p/{threadId}>) in {forumName}" diff --git a/locale/de/LC_MESSAGES/discussions.mo b/locale/de/LC_MESSAGES/discussions.mo deleted file mode 100644 index 7e93b3daa11716a34a864cb97e23f311d7d41b12..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2378 zcmcJP&ubGw6vxNk8nxgL@S-?Y!A998tpz19T3cH!*dIt*#VBE#og`y7vtf4DSeJ!f zR74M61P|h|UOjpABKk*o@F4yN-o%67*`!TETZxelOg=l4H}Ac9@6G#maQiEQ(Svyu z^9AN1%-@)1T;D>-0dN951LnZv;1h5UxC|Z!--8zT8N37j1fPRbTM2mvegzq5ZzJS2 z_ys%$=C>2F3k*SuGmpU|STFA&Bn^H9Pl3NcWAFIRx}R}y80&HHF8CBQdVhc~!4OIX z*t46Eci=Pi~;9#`RMk4|#WV+F~?aIWwh!#4vjRls+z89VGf7nCa*dI zX0+R4X}!&jjpYL7>$0oDdwmxJUpZkh;U|KE@!wSwc6cdHqXn$w8kcEGRuh3PL)5Md z3OH4Cm0y`+6&{ieiNh8D1c3{U@q7woL22!hyG*`g{&Tw4U>@1=jH^jQBgsy-|Gt^ z=1s2S`8@IEf^=(=%qaIhFKBDRw&u9<06+l~qi7j;U*$yuoD2hZ|Owvr5Z4MQt9N zoR}PI8XxFS#ztMKxrC0zDvW6UP$#Mm6EaN;Wu`o?Gqc%o>q1k`*eY^mjmd&*3t39h z3-dz9Zd=#50tl4*o@;V=2+vds(2|XtI^WS45n%QGt(#Oi3}Zxr(, YEAR. -# -msgid "" -msgstr "" -"Project-Id-Version: \n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2020-07-04 00:58+0200\n" -"PO-Revision-Date: 2020-07-04 01:04+0200\n" -"Last-Translator: \n" -"Language-Team: \n" -"Language: de\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" - -#: discussions.py:56 -#, python-brace-format -msgid "Replied to \"{title}\"" -msgstr "Antwortete auf „{title}“" - -#: discussions.py:63 discussions.py:79 discussions.py:127 discussions.py:143 -msgid "unknown" -msgstr "Unbekannt" - -#: discussions.py:68 -#, python-brace-format -msgid "Replied to \"{title}\" on {user}'s Message Wall" -msgstr "Antwortete auf „{title}“ auf der Nachrichtenseite von {user}" - -#: discussions.py:72 -#, python-brace-format -msgid "Created \"{title}\"" -msgstr "Erstellte „{title}“" - -#: discussions.py:86 -#, python-brace-format -msgid "Created \"{title}\" on {user}'s Message Wall" -msgstr "Erstellte „{title}“ auf der Nachrichtenseite von {user}" - -#: discussions.py:99 -#, python-brace-format -msgid "Created a poll titled \"{title}\"" -msgstr "Erstellte eine Umfrage „{title}“" - -#: discussions.py:104 -msgid "Option {}" -msgstr "Option {}" - -#: discussions.py:105 -#, python-brace-format -msgid "__[View image]({image_url})__" -msgstr "__[Bild öffnen]({image_url})__" - -#: discussions.py:121 -#, python-brace-format -msgid "" -"[{author}](<{url}f/u/{creatorId}>) created [{title}](<{url}f/p/{threadId}>) " -"in {forumName}" -msgstr "" -"[{author}](<{url}f/u/{creatorId}>) erstellte [{title}](<{url}f/p/{threadId}" -">) in {forumName}" - -#: discussions.py:130 -#, python-brace-format -msgid "" -"[{author}](<{url}f/u/{creatorId}>) created [{title}](<{wikiurl}wiki/" -"Message_Wall:{user_wall}?threadId={threadid}>) on {user}'s Message Wall" -msgstr "" -"[{author}](<{url}f/u/{creatorId}>) erstellte [{title}](<{wikiurl}wiki/" -"Message_Wall:{user_wall}?threadId={threadid}>) auf der Nachrichtenseite von " -"{user}" - -#: discussions.py:136 -#, python-brace-format -msgid "" -"[{author}](<{url}f/u/{creatorId}>) created a [reply](<{url}f/p/{threadId}/r/" -"{postId}>) to [{title}](<{url}f/p/{threadId}>) in {forumName}" -msgstr "" -"[{author}](<{url}f/u/{creatorId}>) erstellte eine [Antwork](<{url}f/p/" -"{threadId}/r/{postId}>) zu [{title}](<{url}f/p/{threadId}>) in {forumName}" - -#: discussions.py:147 -#, python-brace-format -msgid "" -"[{author}](<{url}f/u/{creatorId}>) replied to [{title}](<{wikiurl}wiki/" -"Message_Wall:{user_wall}?threadId={threadid}#{replyId}>) on {user}'s Message " -"Wall" -msgstr "" -"[{author}](<{url}f/u/{creatorId}>) antwortete auf [{title}](<{wikiurl}wiki/" -"Message_Wall:{user_wall}?threadId={threadid}#{replyId}>) auf der " -"Nachrichtenseite von {user}" - -#: discussions.py:153 -#, python-brace-format -msgid "" -"[{author}](<{url}f/u/{creatorId}>) created a poll [{title}](<{url}f/p/" -"{threadId}>) in {forumName}" -msgstr "" -"[{author}](<{url}f/u/{creatorId}>) erstellte eine Umfrage [{title}](<{url}f/" -"p/{threadId}>) in {forumName}" diff --git a/locale/de/LC_MESSAGES/misc.mo b/locale/de/LC_MESSAGES/misc.mo deleted file mode 100644 index f6d60e542df6fe3f36a823b11ef0eeff9bac8a40..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 441 zcmZvY!A`?442BDWOC&CwIfNSsJlaYVBclfx8=BZenL5O+3ajagx}-`{1P{Vf@J>7n z?uyujU-={_`E4iu-rxE3NZZ5#aZ2nGmqeqO*drc@yDiU4fA?P$(^{*^{S!;mE0yt; zHkhVfZ1gKG9E>w~L}LrB1ZOj>v~e)Cd6B_&om)sW9mn?x3=B#~F1V2n1rPn;0{kw7 zJ`c`C&^z%%-zOu?@U3X7{p$<6t#2Y#UdtRILAjy^)A4k;c}CFj*+46Y%0co`Q8$P0 z?yM?hq56EWl*Xcq=E(?p8=sNNzMz4jTIj4$x!}F$!m%f~MTJH>Z3K@sW`*NnC+q}l zA}y6~(#rOh#bs?|2_tP*R&Z6Vw>Ap, YEAR. -# msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-05-20 17:18+0200\n" -"PO-Revision-Date: 2019-05-20 17:25+0200\n" -"Language-Team: \n" +"POT-Creation-Date: 2020-08-08 14:00+0200\n" +"PO-Revision-Date: 2020-08-10 01:54+0200\n" +"Last-Translator: MarkusRost \n" +"Language-Team: German \n" +"Language: de\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Generator: Poedit 2.2.1\n" -"Last-Translator: \n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" -"Language: de\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Poedit 2.3.1\n" +"X-Loco-Source-Locale: de_DE\n" +"Generated-By: pygettext.py 1.5\n" +"X-Loco-Parser: loco_parse_po\n" -#: misc.py:76 +#: src/misc.py:42 +msgid "Location" +msgstr "Wohnort" + +#: src/misc.py:42 +msgid "About me" +msgstr "„Über mich“-Abschnitt" + +#: src/misc.py:42 +msgid "Google link" +msgstr "Google-Link" + +#: src/misc.py:42 +msgid "Facebook link" +msgstr "Facebook-Link" + +#: src/misc.py:42 +msgid "Twitter link" +msgstr "Twitter-Link" + +#: src/misc.py:42 +msgid "Reddit link" +msgstr "Reddit-Link" + +#: src/misc.py:42 +msgid "Twitch link" +msgstr "Twitch-Link" + +#: src/misc.py:42 +msgid "PSN link" +msgstr "PSN-Link" + +#: src/misc.py:42 +msgid "VK link" +msgstr "VK-Link" + +#: src/misc.py:42 +msgid "XBL link" +msgstr "Xbox-Live-Link" + +#: src/misc.py:42 +msgid "Steam link" +msgstr "Steam-Link" + +#: src/misc.py:42 +msgid "Discord handle" +msgstr "Discord-Link" + +#: src/misc.py:42 +msgid "Battle.net handle" +msgstr "Battle.net-Link" + +#: src/misc.py:142 msgid "" "\n" "__And more__" msgstr "" "\n" "__Und mehr__" + +#: src/misc.py:423 +msgid "Unknown" +msgstr "Unbekannt" + +#: src/misc.py:425 +msgid "unknown" +msgstr "unbekannt" diff --git a/locale/de/LC_MESSAGES/rcgcdw.po b/locale/de/LC_MESSAGES/rc_formatters.po similarity index 72% rename from locale/de/LC_MESSAGES/rcgcdw.po rename to locale/de/LC_MESSAGES/rc_formatters.po index 11946c4..f1a5f69 100644 --- a/locale/de/LC_MESSAGES/rcgcdw.po +++ b/locale/de/LC_MESSAGES/rc_formatters.po @@ -2,80 +2,220 @@ msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2020-03-17 20:53+0100\n" -"PO-Revision-Date: 2020-04-23 23:25+0200\n" -"Last-Translator: Frisk \n" +"POT-Creation-Date: 2020-08-08 17:21+0200\n" +"PO-Revision-Date: 2020-08-10 01:54+0200\n" +"Last-Translator: MarkusRost \n" +"Language-Team: German \n" "Language: de\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Poedit 2.3.1\n" +"X-Loco-Source-Locale: de_DE\n" +"Generated-By: pygettext.py 1.5\n" +"X-Loco-Parser: loco_parse_po\n" +"Project-Id-Version: \n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2020-08-08 22:56+0200\n" +"PO-Revision-Date: 2020-08-03 13:44+0000\n" +"Last-Translator: MarkusRost \n" +"Language-Team: German \n" +"Language: de\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Weblate 4.1.1\n" "X-Loco-Source-Locale: de_DE\n" "Generated-By: pygettext.py 1.5\n" -"X-Generator: Lokalize 19.12.3\n" "X-Loco-Parser: loco_parse_po\n" -#: rcgcdw.py:71 -msgid "Location" -msgstr "Wohnort" +#: src/rcgcdw.py:113 src/rcgcdw.py:115 src/rcgcdw.py:117 src/rcgcdw.py:119 +#: src/rcgcdw.py:121 src/rcgcdw.py:123 src/rcgcdw.py:125 +#, python-brace-format +msgid "{value} (avg. {avg})" +msgstr "{value} (vgl. {avg})" -#: rcgcdw.py:71 -msgid "About me" -msgstr "„Über mich“-Abschnitt" +#: src/rcgcdw.py:145 +msgid "Daily overview" +msgstr "Tägliche Übersicht" -#: rcgcdw.py:71 -msgid "Google link" -msgstr "Google-Link" +#: src/rcgcdw.py:153 +msgid "No activity" +msgstr "Keine Aktivität" -#: rcgcdw.py:71 -msgid "Facebook link" -msgstr "Facebook-Link" +#: src/rcgcdw.py:177 +msgid " ({} action)" +msgid_plural " ({} actions)" +msgstr[0] " (eine Aktion)" +msgstr[1] " ({} Aktionen)" -#: rcgcdw.py:71 -msgid "Twitter link" -msgstr "Twitter-Link" +#: src/rcgcdw.py:179 +msgid " ({} edit)" +msgid_plural " ({} edits)" +msgstr[0] " (eine Änderung)" +msgstr[1] " ({} Änderungen)" -#: rcgcdw.py:71 -msgid "Reddit link" -msgstr "Reddit-Link" +#: src/rcgcdw.py:184 +msgid " UTC ({} action)" +msgid_plural " UTC ({} actions)" +msgstr[0] " UTC (eine Aktion)" +msgstr[1] " UTC ({} Aktionen)" -#: rcgcdw.py:71 -msgid "Twitch link" -msgstr "Twitch-Link" +#: src/rcgcdw.py:186 src/rcgcdw.py:187 src/rcgcdw.py:191 +msgid "But nobody came" +msgstr "Keine Aktivität" -#: rcgcdw.py:71 -msgid "PSN link" -msgstr "PSN-Link" +#: src/rcgcdw.py:194 +msgid "Most active user" +msgid_plural "Most active users" +msgstr[0] "Aktivster Benutzer" +msgstr[1] "Aktivste Benutzer" -#: rcgcdw.py:71 -msgid "VK link" -msgstr "VK-Link" +#: src/rcgcdw.py:195 +msgid "Most edited article" +msgid_plural "Most edited articles" +msgstr[0] "Meist bearbeiteter Artikel" +msgstr[1] "Meist bearbeitete Artikel" -#: rcgcdw.py:71 -msgid "XBL link" -msgstr "Xbox-Live-Link" +#: src/rcgcdw.py:196 +msgid "Edits made" +msgstr "Bearbeitungen" -#: rcgcdw.py:71 -msgid "Steam link" -msgstr "Steam-Link" +#: src/rcgcdw.py:196 +msgid "New files" +msgstr "Neue Dateien" -#: rcgcdw.py:71 -msgid "Discord handle" -msgstr "Discord-Link" +#: src/rcgcdw.py:196 +msgid "Admin actions" +msgstr "Admin-Aktionen" -#: rcgcdw.py:71 -msgid "Battle.net handle" -msgstr "Battle.net-Link" +#: src/rcgcdw.py:197 +msgid "Bytes changed" +msgstr "Bytes geändert" -#: rcgcdw.py:172 rcgcdw.py:924 -msgid "Unknown" -msgstr "Unbekannt" +#: src/rcgcdw.py:197 +msgid "New articles" +msgstr "Neue Artikel" -#: rcgcdw.py:174 -msgid "unknown" -msgstr "unbekannt" +#: src/rcgcdw.py:198 +msgid "Unique contributors" +msgstr "Einzelne Autoren" -#: rcgcdw.py:244 +#: src/rcgcdw.py:199 +msgid "Most active hour" +msgid_plural "Most active hours" +msgstr[0] "Aktivste Stunde" +msgstr[1] "Aktivste Stunden" + +#: src/rcgcdw.py:200 +msgid "Day score" +msgstr "Tageswert" + +#: src/rcgcdw.py:242 +msgid "director" +msgstr "Direktor" + +#: src/rcgcdw.py:242 +msgid "bot" +msgstr "Bot" + +#: src/rcgcdw.py:242 +msgid "editor" +msgstr "editor" + +#: src/rcgcdw.py:242 +msgid "directors" +msgstr "Direktor" + +#: src/rcgcdw.py:242 +msgid "sysop" +msgstr "Administrator" + +#: src/rcgcdw.py:242 +msgid "bureaucrat" +msgstr "Bürokrat" + +#: src/rcgcdw.py:242 +msgid "reviewer" +msgstr "Prüfer" + +#: src/rcgcdw.py:243 +msgid "autoreview" +msgstr "Passive Sichter" + +#: src/rcgcdw.py:243 +msgid "autopatrol" +msgstr "autopatrol" + +#: src/rcgcdw.py:243 +msgid "wiki_guardian" +msgstr "Wiki Guardian" + +#: src/rcgcdw.py:243 +msgid "second" +msgid_plural "seconds" +msgstr[0] "Sekunde" +msgstr[1] "Sekunden" + +#: src/rcgcdw.py:243 +msgid "minute" +msgid_plural "minutes" +msgstr[0] "Minute" +msgstr[1] "Minuten" + +#: src/rcgcdw.py:243 +msgid "hour" +msgid_plural "hours" +msgstr[0] "Stunde" +msgstr[1] "Stunden" + +#: src/rcgcdw.py:243 +msgid "day" +msgid_plural "days" +msgstr[0] "Tag" +msgstr[1] "Tage" + +#: src/rcgcdw.py:243 +msgid "week" +msgid_plural "weeks" +msgstr[0] "Woche" +msgstr[1] "Wochen" + +#: src/rcgcdw.py:243 +msgid "month" +msgid_plural "months" +msgstr[0] "Monat" +msgstr[1] "Monate" + +#: src/rcgcdw.py:243 +msgid "year" +msgid_plural "years" +msgstr[0] "Jahr" +msgstr[1] "Jahre" + +#: src/rcgcdw.py:243 +msgid "millennium" +msgid_plural "millennia" +msgstr[0] "Jahrtausend" +msgstr[1] "Jahrtausende" + +#: src/rcgcdw.py:243 +msgid "decade" +msgid_plural "decades" +msgstr[0] "Jahrzehnt" +msgstr[1] "Jahrzehnte" + +#: src/rcgcdw.py:243 +msgid "century" +msgid_plural "centuries" +msgstr[0] "Jahrhundert" +msgstr[1] "Jahrhunderte" + +#: src/rc_formatters.py:41 #, python-brace-format msgid "" "[{author}]({author_url}) edited [{article}]({edit_link}){comment} ({sign}" @@ -84,7 +224,7 @@ msgstr "" "[{author}]({author_url}) bearbeitete [{article}]({edit_link}){comment} " "({sign}{edit_size})" -#: rcgcdw.py:246 +#: src/rc_formatters.py:43 #, python-brace-format msgid "" "[{author}]({author_url}) created [{article}]({edit_link}){comment} ({sign}" @@ -93,12 +233,12 @@ msgstr "" "[{author}]({author_url}) erstellte [{article}]({edit_link}){comment} ({sign}" "{edit_size})" -#: rcgcdw.py:249 +#: src/rc_formatters.py:46 #, python-brace-format msgid "[{author}]({author_url}) uploaded [{file}]({file_link}){comment}" msgstr "[{author}]({author_url}) lud [{file}]({file_link}) hoch{comment}" -#: rcgcdw.py:256 +#: src/rc_formatters.py:53 #, python-brace-format msgid "" "[{author}]({author_url}) reverted a version of [{file}]({file_link}){comment}" @@ -106,7 +246,7 @@ msgstr "" "[{author}]({author_url}) setzte [{file}]({file_link}) auf eine alte Version " "zurück{comment}" -#: rcgcdw.py:260 +#: src/rc_formatters.py:57 #, python-brace-format msgid "" "[{author}]({author_url}) uploaded a new version of [{file}]({file_link})" @@ -115,12 +255,12 @@ msgstr "" "[{author}]({author_url}) lud eine neue Version von [{file}]({file_link}) " "hoch{comment}" -#: rcgcdw.py:263 +#: src/rc_formatters.py:60 #, python-brace-format msgid "[{author}]({author_url}) deleted [{page}]({page_link}){comment}" msgstr "[{author}]({author_url}) löschte [{page}]({page_link}){comment}" -#: rcgcdw.py:267 +#: src/rc_formatters.py:64 #, python-brace-format msgid "" "[{author}]({author_url}) deleted redirect by overwriting [{page}]" @@ -129,15 +269,15 @@ msgstr "" "[{author}]({author_url}) löschte die Weiterleitung [{page}]({page_link}) " "durch Überschreiben{comment}" -#: rcgcdw.py:271 rcgcdw.py:276 +#: src/rc_formatters.py:68 src/rc_formatters.py:73 msgid "without making a redirect" msgstr "ohne eine Weiterleitung zu erstellen" -#: rcgcdw.py:271 rcgcdw.py:277 +#: src/rc_formatters.py:68 src/rc_formatters.py:74 msgid "with a redirect" msgstr "und erstellte eine Weiterleitung" -#: rcgcdw.py:272 +#: src/rc_formatters.py:69 #, python-brace-format msgid "" "[{author}]({author_url}) moved {redirect}*{article}* to [{target}]" @@ -146,7 +286,7 @@ msgstr "" "[{author}]({author_url}) verschob {redirect}*{article}* nach [{target}]" "({target_url}) {made_a_redirect}{comment}" -#: rcgcdw.py:278 +#: src/rc_formatters.py:75 #, python-brace-format msgid "" "[{author}]({author_url}) moved {redirect}*{article}* over redirect to " @@ -155,7 +295,7 @@ msgstr "" "[{author}]({author_url}) verschob {redirect}*{article}* nach [{target}]" "({target_url}) und überschrieb eine Weiterleitung {made_a_redirect}{comment}" -#: rcgcdw.py:283 +#: src/rc_formatters.py:80 #, python-brace-format msgid "" "[{author}]({author_url}) moved protection settings from {redirect}*{article}" @@ -164,32 +304,42 @@ msgstr "" "[{author}]({author_url}) verschob die Schutzeinstellungen von {redirect}" "*{article}* nach [{target}]({target_url}){comment}" -#: rcgcdw.py:294 rcgcdw.py:699 -msgid "infinity and beyond" +#: src/rc_formatters.py:91 src/rc_formatters.py:512 +#, fuzzy +msgid "for infinity and beyond" msgstr "alle Ewigkeit" -#: rcgcdw.py:311 +#: src/rc_formatters.py:100 src/rc_formatters.py:520 +#, python-brace-format +msgid "for {num} {translated_length}" +msgstr "" + +#: src/rc_formatters.py:106 src/rc_formatters.py:523 +msgid "until {}" +msgstr "" + +#: src/rc_formatters.py:110 msgid " on pages: " msgstr " auf Seiten: " -#: rcgcdw.py:318 rcgcdw.py:719 +#: src/rc_formatters.py:117 src/rc_formatters.py:534 msgid " and namespaces: " msgstr " und Namensräumen: " -#: rcgcdw.py:320 +#: src/rc_formatters.py:119 msgid " on namespaces: " msgstr " in Namensräumen: " -#: rcgcdw.py:332 -#, python-brace-format +#: src/rc_formatters.py:131 +#, fuzzy, python-brace-format msgid "" -"[{author}]({author_url}) blocked [{user}]({user_url}) for {time}" +"[{author}]({author_url}) blocked [{user}]({user_url}) {time}" "{restriction_desc}{comment}" msgstr "" "[{author}]({author_url}) sperrte [{user}]({user_url}) für {time}" "{restriction_desc}{comment}" -#: rcgcdw.py:336 +#: src/rc_formatters.py:135 #, python-brace-format msgid "" "[{author}]({author_url}) changed block settings for [{blocked_user}]" @@ -198,7 +348,7 @@ msgstr "" "[{author}]({author_url}) änderte die Sperreinstellungen für [{blocked_user}]" "({user_url}){comment}" -#: rcgcdw.py:340 +#: src/rc_formatters.py:139 #, python-brace-format msgid "" "[{author}]({author_url}) unblocked [{blocked_user}]({user_url}){comment}" @@ -206,7 +356,7 @@ msgstr "" "[{author}]({author_url}) hob die Sperre von [{blocked_user}]({user_url}) " "auf{comment}" -#: rcgcdw.py:343 +#: src/rc_formatters.py:142 #, python-brace-format msgid "" "[{author}]({author_url}) left a [comment]({comment}) on {target} profile" @@ -214,11 +364,11 @@ msgstr "" "[{author}]({author_url}) hinterließ ein [Kommentar]({comment}) auf dem " "Profil von {target}" -#: rcgcdw.py:343 +#: src/rc_formatters.py:142 msgid "their own profile" msgstr "das eigene Profil" -#: rcgcdw.py:346 +#: src/rc_formatters.py:145 #, python-brace-format msgid "" "[{author}]({author_url}) replied to a [comment]({comment}) on {target} " @@ -227,11 +377,12 @@ msgstr "" "[{author}]({author_url}) antwortete auf ein [Kommentar]({comment}) auf dem " "Profil von {target}" -#: rcgcdw.py:349 rcgcdw.py:355 rcgcdw.py:366 rcgcdw.py:370 +#: src/rc_formatters.py:148 src/rc_formatters.py:154 src/rc_formatters.py:165 +#: src/rc_formatters.py:169 msgid "their own" msgstr "sich selbst" -#: rcgcdw.py:352 +#: src/rc_formatters.py:151 #, python-brace-format msgid "" "[{author}]({author_url}) edited a [comment]({comment}) on {target} profile" @@ -239,46 +390,46 @@ msgstr "" "[{author}]({author_url}) bearbeitete ein [Kommentar]({comment}) auf dem " "Profil von {target}" -#: rcgcdw.py:358 +#: src/rc_formatters.py:157 #, python-brace-format -#| msgid "[{author}]({author_url}) deleted a comment on {target} profile" msgid "[{author}]({author_url}) purged a comment on {target} profile" msgstr "" -"[{author}]({author_url}) löschte ein Kommentar auf dem Profil von {target}" -" dauerhaft" +"[{author}]({author_url}) löschte ein Kommentar auf dem Profil von {target} " +"dauerhaft" -#: rcgcdw.py:368 +#: src/rc_formatters.py:167 #, python-brace-format msgid "[{author}]({author_url}) deleted a comment on {target} profile" msgstr "" "[{author}]({author_url}) löschte ein Kommentar auf dem Profil von {target}" -#: rcgcdw.py:374 +#: src/rc_formatters.py:173 #, python-brace-format msgid "[{target}]({target_url})'s" msgstr "dem Profil von [{target}]({target_url})" -#: rcgcdw.py:374 +#: src/rc_formatters.py:173 #, python-brace-format msgid "[their own]({target_url})" msgstr "dem [eigenen Profil]({target_url})" -#: rcgcdw.py:375 +#: src/rc_formatters.py:174 #, python-brace-format msgid "" "[{author}]({author_url}) edited the {field} on {target} profile. *({desc})*" msgstr "" "[{author}]({author_url}) bearbeitete den {field} auf {target}. *({desc})*" -#: rcgcdw.py:389 rcgcdw.py:391 rcgcdw.py:800 rcgcdw.py:802 +#: src/rc_formatters.py:188 src/rc_formatters.py:190 src/rc_formatters.py:612 +#: src/rc_formatters.py:614 msgid "none" msgstr "keine" -#: rcgcdw.py:397 rcgcdw.py:787 +#: src/rc_formatters.py:196 src/rc_formatters.py:599 msgid "System" msgstr "System" -#: rcgcdw.py:402 +#: src/rc_formatters.py:201 #, python-brace-format msgid "" "[{author}]({author_url}) protected [{article}]({article_url}) with the " @@ -287,11 +438,12 @@ msgstr "" "[{author}]({author_url}) schützte [{article}]({article_url}) {settings}" "{comment}" -#: rcgcdw.py:404 rcgcdw.py:412 rcgcdw.py:810 rcgcdw.py:816 +#: src/rc_formatters.py:203 src/rc_formatters.py:211 src/rc_formatters.py:622 +#: src/rc_formatters.py:628 msgid " [cascading]" msgstr " [kaskadierend]" -#: rcgcdw.py:409 +#: src/rc_formatters.py:208 #, python-brace-format msgid "" "[{author}]({author_url}) modified protection settings of [{article}]" @@ -300,7 +452,7 @@ msgstr "" "[{author}]({author_url}) änderte den Schutzstatus von [{article}]" "({article_url}) {settings}{comment}" -#: rcgcdw.py:416 +#: src/rc_formatters.py:215 #, python-brace-format msgid "" "[{author}]({author_url}) removed protection from [{article}]({article_url})" @@ -309,7 +461,7 @@ msgstr "" "[{author}]({author_url}) entfernte den Schutz von [{article}]({article_url})" "{comment}" -#: rcgcdw.py:420 +#: src/rc_formatters.py:219 #, python-brace-format msgid "" "[{author}]({author_url}) changed visibility of revision on page [{article}]" @@ -324,7 +476,7 @@ msgstr[1] "" "[{author}]({author_url}) änderte die Sichtbarkeit von {amount} Versionen von " "[{article}]({article_url}){comment}" -#: rcgcdw.py:425 +#: src/rc_formatters.py:224 #, python-brace-format msgid "" "[{author}]({author_url}) imported [{article}]({article_url}) with {count} " @@ -339,40 +491,40 @@ msgstr[1] "" "[{author}]({author_url}) importierte [{article}]({article_url}) mit {count} " "Versionen{comment}" -#: rcgcdw.py:430 +#: src/rc_formatters.py:229 #, python-brace-format msgid "[{author}]({author_url}) restored [{article}]({article_url}){comment}" msgstr "" "[{author}]({author_url}) stellte [{article}]({article_url}) wieder " "her{comment}" -#: rcgcdw.py:432 +#: src/rc_formatters.py:231 #, python-brace-format msgid "[{author}]({author_url}) changed visibility of log events{comment}" msgstr "" "[{author}]({author_url}) änderte die Sichtbarkeit eines " "Logbucheintrags{comment}" -#: rcgcdw.py:434 +#: src/rc_formatters.py:233 #, python-brace-format msgid "[{author}]({author_url}) imported interwiki{comment}" msgstr "[{author}]({author_url}) importierte Interwiki{comment}" -#: rcgcdw.py:437 +#: src/rc_formatters.py:236 #, python-brace-format msgid "" "[{author}]({author_url}) edited abuse filter [number {number}]({filter_url})" msgstr "" "[{author}]({author_url}) änderte [Missbrauchsfilter {number}]({filter_url})" -#: rcgcdw.py:440 +#: src/rc_formatters.py:240 #, python-brace-format msgid "" "[{author}]({author_url}) created abuse filter [number {number}]({filter_url})" msgstr "" "[{author}]({author_url}) erstellte [Missbrauchsfilter {number}]({filter_url})" -#: rcgcdw.py:444 +#: src/rc_formatters.py:244 #, python-brace-format msgid "" "[{author}]({author_url}) merged revision histories of [{article}]" @@ -381,7 +533,33 @@ msgstr "" "[{author}]({author_url}) vereinigte Versionen von [{article}]({article_url}) " "in [{dest}]({dest_url}){comment}" -#: rcgcdw.py:448 +#: src/rc_formatters.py:248 +#, fuzzy, python-brace-format +msgid "Account [{author}]({author_url}) was created automatically" +msgstr "[{author}]({author_url}) erstellte die Cargo-Tabelle „{table}“" + +#: src/rc_formatters.py:251 src/rc_formatters.py:260 +#, fuzzy, python-brace-format +msgid "Account [{author}]({author_url}) was created" +msgstr "[{author}]({author_url}) erstellte die Cargo-Tabelle „{table}“" + +#: src/rc_formatters.py:254 +#, fuzzy, python-brace-format +msgid "" +"Account [{article}]({article_url}) was created by [{author}]({author_url})" +"{comment}" +msgstr "" +"[{author}]({author_url}) stellte [{article}]({article_url}) wieder " +"her{comment}" + +#: src/rc_formatters.py:257 +#, python-brace-format +msgid "" +"Account [{article}]({article_url}) was created by [{author}]({author_url}) " +"and password was sent by email{comment}" +msgstr "" + +#: src/rc_formatters.py:263 #, python-brace-format msgid "" "[{author}]({author_url}) added an entry to the [interwiki table]" @@ -390,7 +568,7 @@ msgstr "" "[{author}]({author_url}) erstellte den [Interwiki-Präfix]({table_url}) " "{prefix} nach {website}" -#: rcgcdw.py:454 +#: src/rc_formatters.py:269 #, python-brace-format msgid "" "[{author}]({author_url}) edited an entry in [interwiki table]({table_url}) " @@ -399,13 +577,13 @@ msgstr "" "[{author}]({author_url}) bearbeitete den [Interwiki-Präfix]({table_url}) " "{prefix} nach {website}" -#: rcgcdw.py:460 +#: src/rc_formatters.py:275 #, python-brace-format msgid "" "[{author}]({author_url}) deleted an entry in [interwiki table]({table_url})" msgstr "[{author}]({author_url}) entfernte ein [Interwiki-Präfix]({table_url})" -#: rcgcdw.py:463 +#: src/rc_formatters.py:278 #, python-brace-format msgid "" "[{author}]({author_url}) changed the content model of the page [{article}]" @@ -414,14 +592,14 @@ msgstr "" "[{author}]({author_url}) änderte das Inhaltsmodell der Seite [{article}]" "({article_url}) von {old} zu {new}{comment}" -#: rcgcdw.py:467 +#: src/rc_formatters.py:282 #, python-brace-format msgid "" "[{author}]({author_url}) edited the sprite for [{article}]({article_url})" msgstr "" -"[{author}]({author_url}) edited the sprite for [{article}]({article_url})" +"[{author}]({author_url}) änderte das Sprite für [{article}]({article_url})" -#: rcgcdw.py:470 +#: src/rc_formatters.py:285 #, python-brace-format msgid "" "[{author}]({author_url}) created the sprite sheet for [{article}]" @@ -430,117 +608,117 @@ msgstr "" "[{author}]({author_url}) erstellte das Sprite-sheet für [{article}]" "({article_url})" -#: rcgcdw.py:473 +#: src/rc_formatters.py:288 #, python-brace-format msgid "" "[{author}]({author_url}) edited the slice for [{article}]({article_url})" msgstr "" -"[{author}]({author_url}) edited the slice for [{article}]({article_url})" +"[{author}]({author_url}) änderte das Stück für [{article}]({article_url})" -#: rcgcdw.py:478 +#: src/rc_formatters.py:293 #, python-brace-format msgid "[{author}]({author_url}) created the Cargo table \"{table}\"" msgstr "[{author}]({author_url}) erstellte die Cargo-Tabelle „{table}“" -#: rcgcdw.py:480 +#: src/rc_formatters.py:295 #, python-brace-format msgid "[{author}]({author_url}) deleted the Cargo table \"{table}\"" msgstr "[{author}]({author_url}) löschte die Cargo-Tabelle „{table}“" -#: rcgcdw.py:485 +#: src/rc_formatters.py:300 #, python-brace-format msgid "[{author}]({author_url}) recreated the Cargo table \"{table}\"" msgstr "[{author}]({author_url}) erstellte die Cargo-Tabelle „{table}“ neu" -#: rcgcdw.py:490 +#: src/rc_formatters.py:305 #, python-brace-format msgid "[{author}]({author_url}) replaced the Cargo table \"{table}\"" msgstr "[{author}]({author_url}) ersetzte die Cargo-Tabelle „{table}“" -#: rcgcdw.py:493 +#: src/rc_formatters.py:308 #, python-brace-format msgid "[{author}]({author_url}) created a [tag]({tag_url}) \"{tag}\"" msgstr "" "[{author}]({author_url}) erstellte eine [Markierung]({tag_url}) „{tag}“" -#: rcgcdw.py:497 +#: src/rc_formatters.py:312 #, python-brace-format msgid "[{author}]({author_url}) deleted a [tag]({tag_url}) \"{tag}\"" msgstr "[{author}]({author_url}) löschte eine [Markierung]({tag_url}) „{tag}“" -#: rcgcdw.py:501 +#: src/rc_formatters.py:316 #, python-brace-format msgid "[{author}]({author_url}) activated a [tag]({tag_url}) \"{tag}\"" msgstr "" "[{author}]({author_url}) aktivierte eine [Markierung]({tag_url}) „{tag}“" -#: rcgcdw.py:504 +#: src/rc_formatters.py:319 #, python-brace-format msgid "[{author}]({author_url}) deactivated a [tag]({tag_url}) \"{tag}\"" msgstr "" "[{author}]({author_url}) deaktivierte eine [Markierung]({tag_url}) „{tag}“" -#: rcgcdw.py:506 +#: src/rc_formatters.py:321 msgid "An action has been hidden by administration." msgstr "Eine Aktion wurde versteckt." -#: rcgcdw.py:515 rcgcdw.py:803 +#: src/rc_formatters.py:331 src/rc_formatters.py:615 msgid "No description provided" msgstr "Keine Zusammenfassung angegeben" -#: rcgcdw.py:563 +#: src/rc_formatters.py:378 msgid "(N!) " msgstr "(N!) " -#: rcgcdw.py:564 +#: src/rc_formatters.py:379 msgid "m" msgstr "K" -#: rcgcdw.py:564 +#: src/rc_formatters.py:379 msgid "b" msgstr "B" -#: rcgcdw.py:583 rcgcdw.py:588 +#: src/rc_formatters.py:396 src/rc_formatters.py:401 msgid "__Only whitespace__" msgstr "__Nur Leerraum__" -#: rcgcdw.py:594 +#: src/rc_formatters.py:406 msgid "Removed" msgstr "Entfernt" -#: rcgcdw.py:597 +#: src/rc_formatters.py:408 msgid "Added" msgstr "Hinzugefügt" -#: rcgcdw.py:631 rcgcdw.py:669 +#: src/rc_formatters.py:442 src/rc_formatters.py:481 msgid "Options" msgstr "Optionen" -#: rcgcdw.py:631 +#: src/rc_formatters.py:442 #, python-brace-format msgid "([preview]({link}) | [undo]({undolink}))" msgstr "([Vorschau]({link}) | [zurücksetzen]({undolink}))" -#: rcgcdw.py:634 +#: src/rc_formatters.py:447 #, python-brace-format msgid "Uploaded a new version of {name}" msgstr "Neue Dateiversion {name}" -#: rcgcdw.py:636 +#: src/rc_formatters.py:449 #, python-brace-format msgid "Reverted a version of {name}" msgstr "Setzte {name} auf eine alte Version zurück" -#: rcgcdw.py:638 +#: src/rc_formatters.py:451 #, python-brace-format msgid "Uploaded {name}" msgstr "Neue Datei {name}" -#: rcgcdw.py:654 +#: src/rc_formatters.py:467 msgid "**No license!**" msgstr "**Keine Lizenz!**" -#: rcgcdw.py:666 +#: src/rc_formatters.py:479 msgid "" "\n" "License: {}" @@ -548,527 +726,335 @@ msgstr "" "\n" "Lizenz: {}" -#: rcgcdw.py:669 +#: src/rc_formatters.py:481 #, python-brace-format msgid "([preview]({link}))" msgstr "([Vorschau]({link}))" -#: rcgcdw.py:673 +#: src/rc_formatters.py:486 #, python-brace-format msgid "Deleted page {article}" msgstr "Löschte {article}" -#: rcgcdw.py:676 +#: src/rc_formatters.py:489 #, python-brace-format msgid "Deleted redirect {article} by overwriting" msgstr "Löschte die Weiterleitung {article} um Platz zu machen" -#: rcgcdw.py:680 +#: src/rc_formatters.py:493 msgid "No redirect has been made" msgstr "Die Erstellung einer Weiterleitung wurde unterdrückt" -#: rcgcdw.py:681 +#: src/rc_formatters.py:494 msgid "A redirect has been made" msgstr "Eine Weiterleitung wurde erstellt" -#: rcgcdw.py:682 +#: src/rc_formatters.py:495 #, python-brace-format msgid "Moved {redirect}{article} to {target}" msgstr "Verschob {redirect}{article} nach {target}" -#: rcgcdw.py:685 +#: src/rc_formatters.py:498 #, python-brace-format msgid "Moved {redirect}{article} to {title} over redirect" msgstr "" "Verschob {redirect}{article} nach {title} und überschrieb eine Weiterleitung" -#: rcgcdw.py:689 +#: src/rc_formatters.py:502 #, python-brace-format msgid "Moved protection settings from {redirect}{article} to {title}" msgstr "Verschob die Schutzeinstellungen von {redirect}{article} nach {title}" -#: rcgcdw.py:712 +#: src/rc_formatters.py:527 msgid "Blocked from editing the following pages: " msgstr "Bearbeiten von folgenden Seiten gesperrt: " -#: rcgcdw.py:721 +#: src/rc_formatters.py:536 msgid "Blocked from editing pages on following namespaces: " msgstr "Bearbeiten von Seiten in folgenden Namensräumen gesperrt: " -#: rcgcdw.py:735 +#: src/rc_formatters.py:547 msgid "Partial block details" msgstr "Teilweise Sperre" -#: rcgcdw.py:736 -#, python-brace-format -msgid "Blocked {blocked_user} for {time}" +#: src/rc_formatters.py:548 +#, fuzzy, python-brace-format +msgid "Blocked {blocked_user} {time}" msgstr "Sperrte {blocked_user} für {time}" -#: rcgcdw.py:740 +#: src/rc_formatters.py:552 #, python-brace-format msgid "Changed block settings for {blocked_user}" msgstr "Änderte die Sperreinstellungen für {blocked_user}" -#: rcgcdw.py:744 +#: src/rc_formatters.py:556 #, python-brace-format msgid "Unblocked {blocked_user}" msgstr "Hob die Sperre von {blocked_user} auf" -#: rcgcdw.py:749 +#: src/rc_formatters.py:561 #, python-brace-format msgid "Left a comment on {target}'s profile" msgstr "Hinterließ ein Kommentar auf dem Profil von {target}" -#: rcgcdw.py:751 +#: src/rc_formatters.py:563 msgid "Left a comment on their own profile" msgstr "Hinterließ ein Kommentar auf dem eigenen Profil" -#: rcgcdw.py:756 +#: src/rc_formatters.py:568 #, python-brace-format msgid "Replied to a comment on {target}'s profile" msgstr "Antwortete auf ein Kommentar auf dem Profil von {target}" -#: rcgcdw.py:758 +#: src/rc_formatters.py:570 msgid "Replied to a comment on their own profile" msgstr "Antwortete auf ein Kommentar auf dem eigenen Profil" -#: rcgcdw.py:763 +#: src/rc_formatters.py:575 #, python-brace-format msgid "Edited a comment on {target}'s profile" msgstr "Bearbeitete ein Kommentar auf dem Profil von {target}" -#: rcgcdw.py:765 +#: src/rc_formatters.py:577 msgid "Edited a comment on their own profile" msgstr "Bearbeitete ein Kommentar auf dem eigenen Profil" -#: rcgcdw.py:768 +#: src/rc_formatters.py:580 #, python-brace-format msgid "Edited {target}'s profile" msgstr "Bearbeitete das Profil von {target}" -#: rcgcdw.py:768 +#: src/rc_formatters.py:580 msgid "Edited their own profile" msgstr "Bearbeitete das eigene Profil" -#: rcgcdw.py:770 +#: src/rc_formatters.py:582 #, python-brace-format msgid "Cleared the {field} field" msgstr "Entfernte den {field}" -#: rcgcdw.py:772 +#: src/rc_formatters.py:584 #, python-brace-format msgid "{field} field changed to: {desc}" msgstr "{field} geändert zu: {desc}" -#: rcgcdw.py:775 +#: src/rc_formatters.py:587 #, python-brace-format msgid "Purged a comment on {target}'s profile" msgstr "Löschte ein Kommentar auf dem Profil von {target} dauerhaft" -#: rcgcdw.py:781 +#: src/rc_formatters.py:593 #, python-brace-format msgid "Deleted a comment on {target}'s profile" msgstr "Löschte ein Kommentar auf dem Profil von {target}" -#: rcgcdw.py:785 +#: src/rc_formatters.py:597 #, python-brace-format msgid "Changed group membership for {target}" msgstr "Änderte die Gruppenzugehörigkeit von {target}" -#: rcgcdw.py:789 +#: src/rc_formatters.py:601 #, python-brace-format msgid "{target} got autopromoted to a new usergroup" -msgstr "{target} got autopromoted to a new usergroup" +msgstr "{target} wurde automatisch einer neuen Benutzergruppe zugeordnet" -#: rcgcdw.py:804 +#: src/rc_formatters.py:616 #, python-brace-format msgid "Groups changed from {old_groups} to {new_groups}{reason}" msgstr "" "Änderte die Gruppenzugehörigkeit von {old_groups} auf {new_groups}{reason}" -#: rcgcdw.py:808 +#: src/rc_formatters.py:620 #, python-brace-format msgid "Protected {target}" msgstr "Schützte {target}" -#: rcgcdw.py:814 +#: src/rc_formatters.py:626 #, python-brace-format msgid "Changed protection level for {article}" msgstr "Änderte den Schutzstatus von {article}" -#: rcgcdw.py:820 +#: src/rc_formatters.py:632 #, python-brace-format msgid "Removed protection from {article}" msgstr "Entfernte den Schutz von {article}" -#: rcgcdw.py:824 +#: src/rc_formatters.py:636 #, python-brace-format msgid "Changed visibility of revision on page {article} " msgid_plural "Changed visibility of {amount} revisions on page {article} " msgstr[0] "Änderte die Sichtbarkeit einer Versionen von {article} " msgstr[1] "Änderte die Sichtbarkeit von {amount} Versionen von {article} " -#: rcgcdw.py:829 +#: src/rc_formatters.py:641 #, python-brace-format msgid "Imported {article} with {count} revision" msgid_plural "Imported {article} with {count} revisions" msgstr[0] "Importierte {article} mit einer Version" msgstr[1] "Importierte {article} mit {count} Versionen" -#: rcgcdw.py:834 +#: src/rc_formatters.py:646 #, python-brace-format msgid "Restored {article}" msgstr "Stellte {article} wieder her" -#: rcgcdw.py:837 +#: src/rc_formatters.py:649 msgid "Changed visibility of log events" msgstr "Änderte die Sichtbarkeit eines Logbucheintrags" -#: rcgcdw.py:840 +#: src/rc_formatters.py:652 msgid "Imported interwiki" msgstr "Importierte Interwiki" -#: rcgcdw.py:843 +#: src/rc_formatters.py:655 #, python-brace-format msgid "Edited abuse filter number {number}" msgstr "Änderte Missbrauchsfilter {number}" -#: rcgcdw.py:846 +#: src/rc_formatters.py:658 #, python-brace-format msgid "Created abuse filter number {number}" msgstr "Erstellte Missbrauchsfilter {number}" -#: rcgcdw.py:849 +#: src/rc_formatters.py:661 #, python-brace-format msgid "Merged revision histories of {article} into {dest}" msgstr "Vereinigte Versionen von {article} in {dest}" -#: rcgcdw.py:853 +#: src/rc_formatters.py:665 +msgid "Created account automatically" +msgstr "" + +#: src/rc_formatters.py:668 src/rc_formatters.py:677 +msgid "Created account" +msgstr "" + +#: src/rc_formatters.py:671 +#, fuzzy, python-brace-format +msgid "Created account {article}" +msgstr "Löschte {article}" + +#: src/rc_formatters.py:674 +#, python-brace-format +msgid "Created account {article} and password was sent by email" +msgstr "" + +#: src/rc_formatters.py:680 msgid "Added an entry to the interwiki table" msgstr "Fügte ein Interwiki-Präfix hinzu" -#: rcgcdw.py:854 rcgcdw.py:860 +#: src/rc_formatters.py:681 src/rc_formatters.py:687 #, python-brace-format msgid "Prefix: {prefix}, website: {website} | {desc}" msgstr "Präfix: {prefix}, URL: {website} | {desc}" -#: rcgcdw.py:859 +#: src/rc_formatters.py:686 msgid "Edited an entry in interwiki table" msgstr "Änderte ein Interwiki-Präfix" -#: rcgcdw.py:865 +#: src/rc_formatters.py:692 msgid "Deleted an entry in interwiki table" msgstr "Entfernte ein Interwiki-Präfix" -#: rcgcdw.py:866 +#: src/rc_formatters.py:693 #, python-brace-format msgid "Prefix: {prefix} | {desc}" msgstr "Präfix: {prefix} | {desc}" -#: rcgcdw.py:869 +#: src/rc_formatters.py:696 #, python-brace-format msgid "Changed the content model of the page {article}" msgstr "Änderte das Inhaltsmodell von {article}" -#: rcgcdw.py:870 +#: src/rc_formatters.py:697 #, python-brace-format msgid "Model changed from {old} to {new}: {reason}" msgstr "Modell geändert von {old} zu {new}: {reason}" -#: rcgcdw.py:875 +#: src/rc_formatters.py:702 #, python-brace-format msgid "Edited the sprite for {article}" -msgstr "Edited the sprite for {article}" +msgstr "Änderte das Sprite für {article}" -#: rcgcdw.py:878 +#: src/rc_formatters.py:705 #, python-brace-format msgid "Created the sprite sheet for {article}" -msgstr "Created the sprite sheet for {article}" +msgstr "Erstellte das Sprite-sheet für {article}" -#: rcgcdw.py:881 +#: src/rc_formatters.py:708 #, python-brace-format msgid "Edited the slice for {article}" -msgstr "Edited the slice for {article}" +msgstr "Änderte das Stück für {article}" -#: rcgcdw.py:887 +#: src/rc_formatters.py:714 #, python-brace-format msgid "Created the Cargo table \"{table}\"" msgstr "Erstellte die Cargo-Tabelle „{table}“" -#: rcgcdw.py:891 +#: src/rc_formatters.py:718 #, python-brace-format msgid "Deleted the Cargo table \"{table}\"" msgstr "Löschte die Cargo-Tabelle „{table}“" -#: rcgcdw.py:898 +#: src/rc_formatters.py:725 #, python-brace-format msgid "Recreated the Cargo table \"{table}\"" msgstr "Erstellte die Cargo-Tabelle „{table}“ neu" -#: rcgcdw.py:905 +#: src/rc_formatters.py:732 #, python-brace-format msgid "Replaced the Cargo table \"{table}\"" msgstr "Ersetzte die Cargo-Tabelle „{table}“" -#: rcgcdw.py:909 +#: src/rc_formatters.py:736 #, python-brace-format msgid "Created a tag \"{tag}\"" msgstr "Erstellte die Markierung „{tag}“" -#: rcgcdw.py:913 +#: src/rc_formatters.py:740 #, python-brace-format msgid "Deleted a tag \"{tag}\"" msgstr "Löschte die Markierung „{tag}“" -#: rcgcdw.py:917 +#: src/rc_formatters.py:744 #, python-brace-format msgid "Activated a tag \"{tag}\"" msgstr "Aktivierte die Markierung „{tag}“" -#: rcgcdw.py:920 +#: src/rc_formatters.py:747 #, python-brace-format msgid "Deactivated a tag \"{tag}\"" msgstr "Deaktivierte die Markierung „{tag}“" -#: rcgcdw.py:923 -msgid "Action has been hidden by administration." +#: src/rc_formatters.py:750 +#, fuzzy +msgid "Action has been hidden by administration" msgstr "Aktion wurde versteckt" -#: rcgcdw.py:951 +#: src/rc_formatters.py:751 +msgid "Unknown" +msgstr "Unbekannt" + +#: src/rc_formatters.py:770 msgid "Tags" msgstr "Markierungen" -#: rcgcdw.py:956 +#: src/rc_formatters.py:773 msgid "**Added**: " msgstr "**Hinzugefügt:** " -#: rcgcdw.py:956 +#: src/rc_formatters.py:773 msgid " and {} more\n" msgstr " und {} mehr\n" -#: rcgcdw.py:957 +#: src/rc_formatters.py:774 msgid "**Removed**: " msgstr "**Entfernt:** " -#: rcgcdw.py:957 +#: src/rc_formatters.py:774 msgid " and {} more" msgstr " und {} mehr" -#: rcgcdw.py:958 +#: src/rc_formatters.py:775 msgid "Changed categories" msgstr "Geänderte Kategorien" - -#: rcgcdw.py:977 -msgid "~~hidden~~" -msgstr "~~versteckt~~" - -#: rcgcdw.py:983 -msgid "hidden" -msgstr "versteckt" - -#: rcgcdw.py:1050 rcgcdw.py:1052 rcgcdw.py:1054 rcgcdw.py:1056 rcgcdw.py:1058 -#: rcgcdw.py:1060 rcgcdw.py:1062 -#, python-brace-format -msgid "{value} (avg. {avg})" -msgstr "{value} (vgl. {avg})" - -#: rcgcdw.py:1086 rcgcdw.py:1114 -msgid "Daily overview" -msgstr "Tägliche Übersicht" - -#: rcgcdw.py:1088 -msgid "No activity" -msgstr "Keine Aktivität" - -#: rcgcdw.py:1123 -msgid " ({} action)" -msgid_plural " ({} actions)" -msgstr[0] " (eine Aktion)" -msgstr[1] " ({} Aktionen)" - -#: rcgcdw.py:1125 -msgid " ({} edit)" -msgid_plural " ({} edits)" -msgstr[0] " (eine Änderung)" -msgstr[1] " ({} Änderungen)" - -#: rcgcdw.py:1130 -msgid " UTC ({} action)" -msgid_plural " UTC ({} actions)" -msgstr[0] " UTC (eine Aktion)" -msgstr[1] " UTC ({} Aktionen)" - -#: rcgcdw.py:1132 rcgcdw.py:1133 rcgcdw.py:1137 -msgid "But nobody came" -msgstr "Keine Aktivität" - -#: rcgcdw.py:1141 -msgid "Most active user" -msgid_plural "Most active users" -msgstr[0] "Aktivster Benutzer" -msgstr[1] "Aktivste Benutzer" - -#: rcgcdw.py:1142 -msgid "Most edited article" -msgid_plural "Most edited articles" -msgstr[0] "Meist bearbeiteter Artikel" -msgstr[1] "Meist bearbeitete Artikel" - -#: rcgcdw.py:1143 -msgid "Edits made" -msgstr "Bearbeitungen" - -#: rcgcdw.py:1143 -msgid "New files" -msgstr "Neue Dateien" - -#: rcgcdw.py:1143 -msgid "Admin actions" -msgstr "Admin-Aktionen" - -#: rcgcdw.py:1144 -msgid "Bytes changed" -msgstr "Bytes geändert" - -#: rcgcdw.py:1144 -msgid "New articles" -msgstr "Neue Artikel" - -#: rcgcdw.py:1145 -msgid "Unique contributors" -msgstr "Einzelne Autoren" - -#: rcgcdw.py:1146 -msgid "Most active hour" -msgid_plural "Most active hours" -msgstr[0] "Aktivste Stunde" -msgstr[1] "Aktivste Stunden" - -#: rcgcdw.py:1147 -msgid "Day score" -msgstr "Tageswert" - -#: rcgcdw.py:1291 -#, python-brace-format -msgid "Connection to {wiki} seems to be stable now." -msgstr "{wiki} scheint wieder erreichbar zu sein." - -#: rcgcdw.py:1292 rcgcdw.py:1407 -msgid "Connection status" -msgstr "Verbindungsstatus" - -#: rcgcdw.py:1406 -#, python-brace-format -msgid "{wiki} seems to be down or unreachable." -msgstr "Das {wiki} scheint unerreichbar zu sein." - -#: rcgcdw.py:1465 -msgid "director" -msgstr "Direktor" - -#: rcgcdw.py:1465 -msgid "bot" -msgstr "Bot" - -#: rcgcdw.py:1465 -msgid "editor" -msgstr "editor" - -#: rcgcdw.py:1465 -msgid "directors" -msgstr "Direktor" - -#: rcgcdw.py:1465 -msgid "sysop" -msgstr "Administrator" - -#: rcgcdw.py:1465 -msgid "bureaucrat" -msgstr "Bürokrat" - -#: rcgcdw.py:1465 -msgid "reviewer" -msgstr "reviewer" - -#: rcgcdw.py:1466 -msgid "autoreview" -msgstr "autoreview" - -#: rcgcdw.py:1466 -msgid "autopatrol" -msgstr "autopatrol" - -#: rcgcdw.py:1466 -msgid "wiki_guardian" -msgstr "Wiki Guardian" - -#: rcgcdw.py:1466 -msgid "second" -msgid_plural "seconds" -msgstr[0] "Sekunde" -msgstr[1] "Sekunden" - -#: rcgcdw.py:1466 -msgid "minute" -msgid_plural "minutes" -msgstr[0] "Minute" -msgstr[1] "Minuten" - -#: rcgcdw.py:1466 -msgid "hour" -msgid_plural "hours" -msgstr[0] "Stunde" -msgstr[1] "Stunden" - -#: rcgcdw.py:1466 -msgid "day" -msgid_plural "days" -msgstr[0] "Tag" -msgstr[1] "Tage" - -#: rcgcdw.py:1466 -msgid "week" -msgid_plural "weeks" -msgstr[0] "Woche" -msgstr[1] "Wochen" - -#: rcgcdw.py:1466 -msgid "month" -msgid_plural "months" -msgstr[0] "Monat" -msgstr[1] "Monate" - -#: rcgcdw.py:1466 -msgid "year" -msgid_plural "years" -msgstr[0] "Jahr" -msgstr[1] "Jahre" - -#: rcgcdw.py:1466 -msgid "millennium" -msgid_plural "millennia" -msgstr[0] "Jahrtausend" -msgstr[1] "Jahrtausende" - -#: rcgcdw.py:1466 -msgid "decade" -msgid_plural "decades" -msgstr[0] "Jahrzehnt" -msgstr[1] "Jahrzehnte" - -#: rcgcdw.py:1466 -msgid "century" -msgid_plural "centuries" -msgstr[0] "Jahrhundert" -msgstr[1] "Jahrhunderte" - -#~ msgid "Comment content" -#~ msgstr "Kommentarinhalt" - -#~ msgid "" -#~ "[{author}]({author_url}) moved {redirect}*{article}* over redirect to " -#~ "[{target}]({target_url}){comment}" -#~ msgstr "" -#~ "[{author}]({author_url}) verschob {redirect}*{article}* nach [{target}]" -#~ "({target_url}) und überschrieb eine Weiterleitung {made_a_redirect}" -#~ "{comment}" diff --git a/locale/de/LC_MESSAGES/rcgcdw.mo b/locale/de/LC_MESSAGES/rcgcdw.mo deleted file mode 100644 index 9828492f36dcb54ebe04229d3d01e0a7d0283aa9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20279 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\n" +"Language-Team: German \n" +"Language: de\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Poedit 2.3.1\n" +"X-Loco-Source-Locale: de_DE\n" +"Generated-By: pygettext.py 1.5\n" +"X-Loco-Parser: loco_parse_po\n" + +#: src/rc.py:150 +#, python-brace-format +msgid "Connection to {wiki} seems to be stable now." +msgstr "{wiki} scheint wieder erreichbar zu sein." + +#: src/rc.py:151 src/rc.py:266 +msgid "Connection status" +msgstr "Verbindungsstatus" + +#: src/rc.py:265 +#, python-brace-format +msgid "{wiki} seems to be down or unreachable." +msgstr "Das {wiki} scheint unerreichbar zu sein." + +#: src/rc.py:334 +msgid "~~hidden~~" +msgstr "~~versteckt~~" + +#: src/rc.py:340 +msgid "hidden" +msgstr "versteckt" diff --git a/locale/en/LC_MESSAGES/discussions.mo b/locale/en/LC_MESSAGES/discussions.mo deleted file mode 100644 index 25fa1aaa8fa7f888e781d8ba5df7c7e3bc7b4bbc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1648 zcmeH`O>fgM7{>z}Z-EOFM-bi)(1N_a@lv&v17kx)E32k52Gv%X#%;q=JF*?d6v7!k z0NnTvoH%pm%nfnoWAJx^)=CVC9XP=wIlnyClmGv*9eGD zXeHeTwCbF+6E>C)D7tVxS&&4!#jVnMK9%19`KfTRl3 zQfr~{?Z=6;&cncmjgeDM2TlIotQ)h)jHF7oa<}401<9Zg72>|_U#g~;+|H9UflK%2 zVkVVgAvPnFdRd{5rUp_);|FZa6Xy`pjC2*&vUjj_K^5XqYLmHOv46Fbbkh&((Cc+K ze7;NkF^+L77pLsm{ml1zP9%1O+!an+$!EN8Xw#z`TxpzQjkq{3sSIuDq3_W<(NNQl z#B_U&uJh-r zHlE6BgbTOTY%NdBON&K!NeaUSH1, YEAR. -# -msgid "" -msgstr "" -"Project-Id-Version: \n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2020-06-23 14:54+0200\n" -"PO-Revision-Date: 2020-06-23 14:57+0200\n" -"Last-Translator: \n" -"Language-Team: \n" -"Language: en\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" - -#: discussions.py:56 -#, python-brace-format -msgid "Replied to \"{title}\"" -msgstr "Replied to \"{title}\"" - -#: discussions.py:63 discussions.py:79 -msgid "unknown" -msgstr "unknown" - -#: discussions.py:68 -#, python-brace-format -msgid "Replied to \"{title}\" on {user}'s Message Wall" -msgstr "Replied to \"{title}\" on {user}'s Message Wall" - -#: discussions.py:72 -#, python-brace-format -msgid "Created \"{title}\"" -msgstr "Created \"{title}\"" - -#: discussions.py:86 -#, python-brace-format -msgid "Created \"{title}\" on {user}'s Message Wall" -msgstr "Created \"{title}\" on {user}'s Message Wall" - -#: discussions.py:99 -#, python-brace-format -msgid "Created a poll titled \"{title}\"" -msgstr "Created a poll titled \"{title}\"" - -#: discussions.py:104 -msgid "Option {}" -msgstr "Option {}" - -#: discussions.py:105 -#, python-brace-format -msgid "__[View image]({image_url})__" -msgstr "__[View image]({image_url})__" - -#: discussions.py:118 -#, python-brace-format -#| msgid "" -#| "[{author}](<{url}f/u/{creatorId}>) created [{title}](<{url}f/p/{threadId}" -#| ">) in ${forumName}" -msgid "" -"[{author}](<{url}f/u/{creatorId}>) created [{title}](<{url}f/p/{threadId}>) " -"in {forumName}" -msgstr "" -"[{author}](<{url}f/u/{creatorId}>) created [{title}](<{url}f/p/{threadId}>) " -"in {forumName}" - -#: discussions.py:121 -#, python-brace-format -msgid "" -"[{author}](<{url}f/u/{creatorId}>) created a [reply](<{url}f/p/{threadId}/r/" -"{postId}>) to [{title}](<{url}f/p/{threadId}>) in {forumName}" -msgstr "" -"[{author}](<{url}f/u/{creatorId}>) created a [reply](<{url}f/p/{threadId}/r/" -"{postId}>) to [{title}](<{url}f/p/{threadId}>) in {forumName}" - -#: discussions.py:126 -#, python-brace-format -#| msgid "" -#| "[{author}](<{url}f/u/{creatorId}>) created [{title}](<{url}f/p/{threadId}" -#| ">) in ${forumName}" -msgid "" -"[{author}](<{url}f/u/{creatorId}>) created a poll [{title}](<{url}f/p/" -"{threadId}>) in {forumName}" -msgstr "" -"[{author}](<{url}f/u/{creatorId}>) created a poll [{title}](<{url}f/p/" -"{threadId}>) in {forumName}" diff --git a/locale/en/LC_MESSAGES/misc.mo b/locale/en/LC_MESSAGES/misc.mo deleted file mode 100644 index 2a92917dde3e75a406335fe29e6ac81d7bb37327..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 441 zcmZvY!A`?442BDWOC&CwIfNSsJklb>=;#5)h9;OOQ$gISu$mIoB~_9kco3d~cj8%a zSHy(GuY8i7{I-*PZLWO;q*Y>z*eBMBQ=(ByY!J7^)k+ZLKlvxcv=(Y=f5r0rOc#7+ zEarKTTJwTa52FI^(K=;x%-IBMV?B&rsR}rsmku&R+v!aPeT&kQ3ofL`m`5T!0dWM8 z;Nfu`cK1Xi1Q}t1ud39bP1C$uooQ&T8i#=QHeJbQpk)M%wQHs-0pLU|r_qE5)J wrK9#uS=FAhw3=I4!O+;5i@B~BsY{|BZ^L9q^X-I(yFDsy9}siYEcpAg-z*e#$N&HU diff --git a/locale/en/LC_MESSAGES/misc.po b/locale/en/LC_MESSAGES/misc.po deleted file mode 100644 index f1358ed..0000000 --- a/locale/en/LC_MESSAGES/misc.po +++ /dev/null @@ -1,27 +0,0 @@ -# SOME DESCRIPTIVE TITLE. -# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER -# This file is distributed under the same license as the PACKAGE package. -# FIRST AUTHOR , YEAR. -# -msgid "" -msgstr "" -"Project-Id-Version: \n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-05-20 17:18+0200\n" -"PO-Revision-Date: 2019-05-20 17:32+0200\n" -"Language-Team: \n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"X-Generator: Poedit 2.2.1\n" -"Last-Translator: \n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" -"Language: en\n" - -#: misc.py:76 -msgid "" -"\n" -"__And more__" -msgstr "" -"\n" -"__And more__" diff --git a/locale/en/LC_MESSAGES/rcgcdw.mo b/locale/en/LC_MESSAGES/rcgcdw.mo deleted file mode 100644 index 3ad4cda31a57adddc65fe6e659ed82bc41684b61..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19610 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 diff --git a/locale/en/LC_MESSAGES/rcgcdw.po b/locale/en/LC_MESSAGES/rcgcdw.po deleted file mode 100644 index b2c4f6f..0000000 --- a/locale/en/LC_MESSAGES/rcgcdw.po +++ /dev/null @@ -1,1073 +0,0 @@ -# SOME DESCRIPTIVE TITLE. -# Copyright (C) YEAR ORGANIZATION -# FIRST AUTHOR , YEAR. -# -msgid "" -msgstr "" -"Project-Id-Version: \n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2020-03-17 20:53+0100\n" -"PO-Revision-Date: 2020-03-17 20:55+0100\n" -"Last-Translator: Frisk \n" -"Language-Team: \n" -"Language: en\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Generated-By: pygettext.py 1.5\n" -"X-Generator: Poedit 2.3\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#: rcgcdw.py:71 -msgid "Location" -msgstr "Location" - -#: rcgcdw.py:71 -msgid "About me" -msgstr "About me" - -#: rcgcdw.py:71 -msgid "Google link" -msgstr "Google link" - -#: rcgcdw.py:71 -msgid "Facebook link" -msgstr "Facebook link" - -#: rcgcdw.py:71 -msgid "Twitter link" -msgstr "Twitter link" - -#: rcgcdw.py:71 -msgid "Reddit link" -msgstr "Reddit link" - -#: rcgcdw.py:71 -msgid "Twitch link" -msgstr "Twitch link" - -#: rcgcdw.py:71 -msgid "PSN link" -msgstr "PSN link" - -#: rcgcdw.py:71 -msgid "VK link" -msgstr "VK link" - -#: rcgcdw.py:71 -msgid "XBL link" -msgstr "XBL link" - -#: rcgcdw.py:71 -msgid "Steam link" -msgstr "Steam link" - -#: rcgcdw.py:71 -msgid "Discord handle" -msgstr "Discord handle" - -#: rcgcdw.py:71 -msgid "Battle.net handle" -msgstr "Battle.net handle" - -#: rcgcdw.py:172 rcgcdw.py:924 -msgid "Unknown" -msgstr "Unknown" - -#: rcgcdw.py:174 -msgid "unknown" -msgstr "unknown" - -#: rcgcdw.py:244 -#, python-brace-format -msgid "" -"[{author}]({author_url}) edited [{article}]({edit_link}){comment} ({sign}" -"{edit_size})" -msgstr "" -"[{author}]({author_url}) edited [{article}]({edit_link}){comment} ({sign}" -"{edit_size})" - -#: rcgcdw.py:246 -#, python-brace-format -msgid "" -"[{author}]({author_url}) created [{article}]({edit_link}){comment} ({sign}" -"{edit_size})" -msgstr "" -"[{author}]({author_url}) created [{article}]({edit_link}){comment} ({sign}" -"{edit_size})" - -#: rcgcdw.py:249 -#, python-brace-format -msgid "[{author}]({author_url}) uploaded [{file}]({file_link}){comment}" -msgstr "[{author}]({author_url}) uploaded [{file}]({file_link}){comment}" - -#: rcgcdw.py:256 -#, python-brace-format -#| msgid "" -#| "[{author}]({author_url}) uploaded a new version of [{file}]({file_link})" -#| "{comment}" -msgid "" -"[{author}]({author_url}) reverted a version of [{file}]({file_link}){comment}" -msgstr "" -"[{author}]({author_url}) reverted a version of [{file}]({file_link}){comment}" - -#: rcgcdw.py:260 -#, python-brace-format -msgid "" -"[{author}]({author_url}) uploaded a new version of [{file}]({file_link})" -"{comment}" -msgstr "" -"[{author}]({author_url}) uploaded a new version of [{file}]({file_link})" -"{comment}" - -#: rcgcdw.py:263 -#, python-brace-format -msgid "[{author}]({author_url}) deleted [{page}]({page_link}){comment}" -msgstr "[{author}]({author_url}) deleted [{page}]({page_link}){comment}" - -#: rcgcdw.py:267 -#, python-brace-format -msgid "" -"[{author}]({author_url}) deleted redirect by overwriting [{page}]" -"({page_link}){comment}" -msgstr "" -"[{author}]({author_url}) deleted redirect by overwriting [{page}]" -"({page_link}){comment}" - -#: rcgcdw.py:271 rcgcdw.py:276 -msgid "without making a redirect" -msgstr "without making a redirect" - -#: rcgcdw.py:271 rcgcdw.py:277 -msgid "with a redirect" -msgstr "with a redirect" - -#: rcgcdw.py:272 -#, python-brace-format -msgid "" -"[{author}]({author_url}) moved {redirect}*{article}* to [{target}]" -"({target_url}) {made_a_redirect}{comment}" -msgstr "" -"[{author}]({author_url}) moved {redirect}*{article}* to [{target}]" -"({target_url}) {made_a_redirect}{comment}" - -#: rcgcdw.py:278 -#, python-brace-format -msgid "" -"[{author}]({author_url}) moved {redirect}*{article}* over redirect to " -"[{target}]({target_url}) {made_a_redirect}{comment}" -msgstr "" -"[{author}]({author_url}) moved {redirect}*{article}* over redirect to " -"[{target}]({target_url}) {made_a_redirect}{comment}" - -#: rcgcdw.py:283 -#, python-brace-format -msgid "" -"[{author}]({author_url}) moved protection settings from {redirect}*{article}" -"* to [{target}]({target_url}){comment}" -msgstr "" -"[{author}]({author_url}) moved protection settings from {redirect}*{article}" -"* to [{target}]({target_url}){comment}" - -#: rcgcdw.py:294 rcgcdw.py:699 -msgid "infinity and beyond" -msgstr "infinity and beyond" - -#: rcgcdw.py:311 -msgid " on pages: " -msgstr " on pages: " - -#: rcgcdw.py:318 rcgcdw.py:719 -msgid " and namespaces: " -msgstr " and namespaces: " - -#: rcgcdw.py:320 -msgid " on namespaces: " -msgstr " on namespaces: " - -#: rcgcdw.py:332 -#, python-brace-format -msgid "" -"[{author}]({author_url}) blocked [{user}]({user_url}) for {time}" -"{restriction_desc}{comment}" -msgstr "" -"[{author}]({author_url}) blocked [{user}]({user_url}) for {time}" -"{restriction_desc}{comment}" - -#: rcgcdw.py:336 -#, python-brace-format -msgid "" -"[{author}]({author_url}) changed block settings for [{blocked_user}]" -"({user_url}){comment}" -msgstr "" -"[{author}]({author_url}) changed block settings for [{blocked_user}]" -"({user_url}){comment}" - -#: rcgcdw.py:340 -#, python-brace-format -msgid "" -"[{author}]({author_url}) unblocked [{blocked_user}]({user_url}){comment}" -msgstr "" -"[{author}]({author_url}) unblocked [{blocked_user}]({user_url}){comment}" - -#: rcgcdw.py:343 -#, python-brace-format -msgid "" -"[{author}]({author_url}) left a [comment]({comment}) on {target} profile" -msgstr "" -"[{author}]({author_url}) left a [comment]({comment}) on {target} profile" - -#: rcgcdw.py:343 -msgid "their own profile" -msgstr "their own profile" - -#: rcgcdw.py:346 -#, python-brace-format -msgid "" -"[{author}]({author_url}) replied to a [comment]({comment}) on {target} " -"profile" -msgstr "" -"[{author}]({author_url}) replied to a [comment]({comment}) on {target} " -"profile" - -#: rcgcdw.py:349 rcgcdw.py:355 rcgcdw.py:366 rcgcdw.py:370 -msgid "their own" -msgstr "their own" - -#: rcgcdw.py:352 -#, python-brace-format -msgid "" -"[{author}]({author_url}) edited a [comment]({comment}) on {target} profile" -msgstr "" -"[{author}]({author_url}) edited a [comment]({comment}) on {target} profile" - -#: rcgcdw.py:358 -#, python-brace-format -msgid "[{author}]({author_url}) purged a comment on {target} profile" -msgstr "[{author}]({author_url}) purged a comment on {target} profile" - -#: rcgcdw.py:368 -#, python-brace-format -msgid "[{author}]({author_url}) deleted a comment on {target} profile" -msgstr "[{author}]({author_url}) deleted a comment on {target} profile" - -#: rcgcdw.py:374 -#, python-brace-format -msgid "[{target}]({target_url})'s" -msgstr "[{target}]({target_url})'s" - -#: rcgcdw.py:374 -#, python-brace-format -msgid "[their own]({target_url})" -msgstr "[their own]({target_url})" - -#: rcgcdw.py:375 -#, python-brace-format -msgid "" -"[{author}]({author_url}) edited the {field} on {target} profile. *({desc})*" -msgstr "" -"[{author}]({author_url}) edited the {field} on {target} profile. *({desc})*" - -#: rcgcdw.py:389 rcgcdw.py:391 rcgcdw.py:800 rcgcdw.py:802 -msgid "none" -msgstr "none" - -#: rcgcdw.py:397 rcgcdw.py:787 -msgid "System" -msgstr "System" - -#: rcgcdw.py:402 -#, python-brace-format -msgid "" -"[{author}]({author_url}) protected [{article}]({article_url}) with the " -"following settings: {settings}{comment}" -msgstr "" -"[{author}]({author_url}) protected [{article}]({article_url}) with the " -"following settings: {settings}{comment}" - -#: rcgcdw.py:404 rcgcdw.py:412 rcgcdw.py:810 rcgcdw.py:816 -msgid " [cascading]" -msgstr " [cascading]" - -#: rcgcdw.py:409 -#, python-brace-format -msgid "" -"[{author}]({author_url}) modified protection settings of [{article}]" -"({article_url}) to: {settings}{comment}" -msgstr "" -"[{author}]({author_url}) modified protection settings of [{article}]" -"({article_url}) to: {settings}{comment}" - -#: rcgcdw.py:416 -#, python-brace-format -msgid "" -"[{author}]({author_url}) removed protection from [{article}]({article_url})" -"{comment}" -msgstr "" -"[{author}]({author_url}) removed protection from [{article}]({article_url})" -"{comment}" - -#: rcgcdw.py:420 -#, python-brace-format -msgid "" -"[{author}]({author_url}) changed visibility of revision on page [{article}]" -"({article_url}){comment}" -msgid_plural "" -"[{author}]({author_url}) changed visibility of {amount} revisions on page " -"[{article}]({article_url}){comment}" -msgstr[0] "" -"[{author}]({author_url}) changed visibility of revision on page [{article}]" -"({article_url}){comment}" -msgstr[1] "" -"[{author}]({author_url}) changed visibility of {amount} revisions on page " -"[{article}]({article_url}){comment}" - -#: rcgcdw.py:425 -#, python-brace-format -msgid "" -"[{author}]({author_url}) imported [{article}]({article_url}) with {count} " -"revision{comment}" -msgid_plural "" -"[{author}]({author_url}) imported [{article}]({article_url}) with {count} " -"revisions{comment}" -msgstr[0] "" -"[{author}]({author_url}) imported [{article}]({article_url}) with {count} " -"revision{comment}" -msgstr[1] "" -"[{author}]({author_url}) imported [{article}]({article_url}) with {count} " -"revisions{comment}" - -#: rcgcdw.py:430 -#, python-brace-format -msgid "[{author}]({author_url}) restored [{article}]({article_url}){comment}" -msgstr "[{author}]({author_url}) restored [{article}]({article_url}){comment}" - -#: rcgcdw.py:432 -#, python-brace-format -msgid "[{author}]({author_url}) changed visibility of log events{comment}" -msgstr "[{author}]({author_url}) changed visibility of log events{comment}" - -#: rcgcdw.py:434 -#, python-brace-format -msgid "[{author}]({author_url}) imported interwiki{comment}" -msgstr "[{author}]({author_url}) imported interwiki{comment}" - -#: rcgcdw.py:437 -#, python-brace-format -msgid "" -"[{author}]({author_url}) edited abuse filter [number {number}]({filter_url})" -msgstr "" -"[{author}]({author_url}) edited abuse filter [number {number}]({filter_url})" - -#: rcgcdw.py:440 -#, python-brace-format -msgid "" -"[{author}]({author_url}) created abuse filter [number {number}]({filter_url})" -msgstr "" -"[{author}]({author_url}) created abuse filter [number {number}]({filter_url})" - -#: rcgcdw.py:444 -#, python-brace-format -msgid "" -"[{author}]({author_url}) merged revision histories of [{article}]" -"({article_url}) into [{dest}]({dest_url}){comment}" -msgstr "" -"[{author}]({author_url}) merged revision histories of [{article}]" -"({article_url}) into [{dest}]({dest_url}){comment}" - -#: rcgcdw.py:448 -#, python-brace-format -msgid "" -"[{author}]({author_url}) added an entry to the [interwiki table]" -"({table_url}) pointing to {website} with {prefix} prefix" -msgstr "" -"[{author}]({author_url}) added an entry to the [interwiki table]" -"({table_url}) pointing to {website} with {prefix} prefix" - -#: rcgcdw.py:454 -#, python-brace-format -msgid "" -"[{author}]({author_url}) edited an entry in [interwiki table]({table_url}) " -"pointing to {website} with {prefix} prefix" -msgstr "" -"[{author}]({author_url}) edited an entry in [interwiki table]({table_url}) " -"pointing to {website} with {prefix} prefix" - -#: rcgcdw.py:460 -#, python-brace-format -msgid "" -"[{author}]({author_url}) deleted an entry in [interwiki table]({table_url})" -msgstr "" -"[{author}]({author_url}) deleted an entry in [interwiki table]({table_url})" - -#: rcgcdw.py:463 -#, python-brace-format -msgid "" -"[{author}]({author_url}) changed the content model of the page [{article}]" -"({article_url}) from {old} to {new}{comment}" -msgstr "" -"[{author}]({author_url}) changed the content model of the page [{article}]" -"({article_url}) from {old} to {new}{comment}" - -#: rcgcdw.py:467 -#, python-brace-format -msgid "" -"[{author}]({author_url}) edited the sprite for [{article}]({article_url})" -msgstr "" -"[{author}]({author_url}) edited the sprite for [{article}]({article_url})" - -#: rcgcdw.py:470 -#, python-brace-format -msgid "" -"[{author}]({author_url}) created the sprite sheet for [{article}]" -"({article_url})" -msgstr "" -"[{author}]({author_url}) created the sprite sheet for [{article}]" -"({article_url})" - -#: rcgcdw.py:473 -#, python-brace-format -msgid "" -"[{author}]({author_url}) edited the slice for [{article}]({article_url})" -msgstr "" -"[{author}]({author_url}) edited the slice for [{article}]({article_url})" - -#: rcgcdw.py:478 -#, python-brace-format -msgid "[{author}]({author_url}) created the Cargo table \"{table}\"" -msgstr "[{author}]({author_url}) created the Cargo table \"{table}\"" - -#: rcgcdw.py:480 -#, python-brace-format -msgid "[{author}]({author_url}) deleted the Cargo table \"{table}\"" -msgstr "[{author}]({author_url}) deleted the Cargo table \"{table}\"" - -#: rcgcdw.py:485 -#, python-brace-format -msgid "[{author}]({author_url}) recreated the Cargo table \"{table}\"" -msgstr "[{author}]({author_url}) recreated the Cargo table \"{table}\"" - -#: rcgcdw.py:490 -#, python-brace-format -msgid "[{author}]({author_url}) replaced the Cargo table \"{table}\"" -msgstr "[{author}]({author_url}) replaced the Cargo table \"{table}\"" - -#: rcgcdw.py:493 -#, python-brace-format -msgid "[{author}]({author_url}) created a [tag]({tag_url}) \"{tag}\"" -msgstr "[{author}]({author_url}) created a [tag]({tag_url}) \"{tag}\"" - -#: rcgcdw.py:497 -#, python-brace-format -msgid "[{author}]({author_url}) deleted a [tag]({tag_url}) \"{tag}\"" -msgstr "[{author}]({author_url}) deleted a [tag]({tag_url}) \"{tag}\"" - -#: rcgcdw.py:501 -#, python-brace-format -msgid "[{author}]({author_url}) activated a [tag]({tag_url}) \"{tag}\"" -msgstr "[{author}]({author_url}) activated a [tag]({tag_url}) \"{tag}\"" - -#: rcgcdw.py:504 -#, python-brace-format -msgid "[{author}]({author_url}) deactivated a [tag]({tag_url}) \"{tag}\"" -msgstr "[{author}]({author_url}) deactivated a [tag]({tag_url}) \"{tag}\"" - -#: rcgcdw.py:506 -msgid "An action has been hidden by administration." -msgstr "An action has been hidden by administration." - -#: rcgcdw.py:515 rcgcdw.py:803 -msgid "No description provided" -msgstr "No description provided" - -#: rcgcdw.py:563 -msgid "(N!) " -msgstr "(N!) " - -#: rcgcdw.py:564 -msgid "m" -msgstr "m" - -#: rcgcdw.py:564 -msgid "b" -msgstr "b" - -#: rcgcdw.py:583 rcgcdw.py:588 -msgid "__Only whitespace__" -msgstr "__Only whitespace__" - -#: rcgcdw.py:594 -msgid "Removed" -msgstr "Removed" - -#: rcgcdw.py:597 -msgid "Added" -msgstr "Added" - -#: rcgcdw.py:631 rcgcdw.py:669 -msgid "Options" -msgstr "Options" - -#: rcgcdw.py:631 -#, python-brace-format -msgid "([preview]({link}) | [undo]({undolink}))" -msgstr "([preview]({link}) | [undo]({undolink}))" - -#: rcgcdw.py:634 -#, python-brace-format -msgid "Uploaded a new version of {name}" -msgstr "Uploaded a new version of {name}" - -#: rcgcdw.py:636 -#, python-brace-format -#| msgid "Uploaded a new version of {name}" -msgid "Reverted a version of {name}" -msgstr "Reverted a version of {name}" - -#: rcgcdw.py:638 -#, python-brace-format -msgid "Uploaded {name}" -msgstr "Uploaded {name}" - -#: rcgcdw.py:654 -msgid "**No license!**" -msgstr "**No license!**" - -#: rcgcdw.py:666 -msgid "" -"\n" -"License: {}" -msgstr "" -"\n" -"License: {}" - -#: rcgcdw.py:669 -#, python-brace-format -msgid "([preview]({link}))" -msgstr "([preview]({link}))" - -#: rcgcdw.py:673 -#, python-brace-format -msgid "Deleted page {article}" -msgstr "Deleted page {article}" - -#: rcgcdw.py:676 -#, python-brace-format -msgid "Deleted redirect {article} by overwriting" -msgstr "Deleted redirect {article} by overwriting" - -#: rcgcdw.py:680 -msgid "No redirect has been made" -msgstr "No redirect has been made" - -#: rcgcdw.py:681 -msgid "A redirect has been made" -msgstr "A redirect has been made" - -#: rcgcdw.py:682 -#, python-brace-format -msgid "Moved {redirect}{article} to {target}" -msgstr "Moved {redirect}{article} to {target}" - -#: rcgcdw.py:685 -#, python-brace-format -msgid "Moved {redirect}{article} to {title} over redirect" -msgstr "Moved {redirect}{article} to {title} over redirect" - -#: rcgcdw.py:689 -#, python-brace-format -msgid "Moved protection settings from {redirect}{article} to {title}" -msgstr "Moved protection settings from {redirect}{article} to {title}" - -#: rcgcdw.py:712 -msgid "Blocked from editing the following pages: " -msgstr "Blocked from editing the following pages: " - -#: rcgcdw.py:721 -msgid "Blocked from editing pages on following namespaces: " -msgstr "Blocked from editing pages on following namespaces: " - -#: rcgcdw.py:735 -msgid "Partial block details" -msgstr "Partial block details" - -#: rcgcdw.py:736 -#, python-brace-format -msgid "Blocked {blocked_user} for {time}" -msgstr "Blocked {blocked_user} for {time}" - -#: rcgcdw.py:740 -#, python-brace-format -msgid "Changed block settings for {blocked_user}" -msgstr "Changed block settings for {blocked_user}" - -#: rcgcdw.py:744 -#, python-brace-format -msgid "Unblocked {blocked_user}" -msgstr "Unblocked {blocked_user}" - -#: rcgcdw.py:749 -#, python-brace-format -msgid "Left a comment on {target}'s profile" -msgstr "Left a comment on {target}'s profile" - -#: rcgcdw.py:751 -msgid "Left a comment on their own profile" -msgstr "Left a comment on their own profile" - -#: rcgcdw.py:756 -#, python-brace-format -msgid "Replied to a comment on {target}'s profile" -msgstr "Replied to a comment on {target}'s profile" - -#: rcgcdw.py:758 -msgid "Replied to a comment on their own profile" -msgstr "Replied to a comment on their own profile" - -#: rcgcdw.py:763 -#, python-brace-format -msgid "Edited a comment on {target}'s profile" -msgstr "Edited a comment on {target}'s profile" - -#: rcgcdw.py:765 -msgid "Edited a comment on their own profile" -msgstr "Edited a comment on their own profile" - -#: rcgcdw.py:768 -#, python-brace-format -msgid "Edited {target}'s profile" -msgstr "Edited {target}'s profile" - -#: rcgcdw.py:768 -msgid "Edited their own profile" -msgstr "Edited their own profile" - -#: rcgcdw.py:770 -#, python-brace-format -msgid "Cleared the {field} field" -msgstr "Cleared the {field} field" - -#: rcgcdw.py:772 -#, python-brace-format -msgid "{field} field changed to: {desc}" -msgstr "{field} field changed to: {desc}" - -#: rcgcdw.py:775 -#, python-brace-format -msgid "Purged a comment on {target}'s profile" -msgstr "Purged a comment on {target}'s profile" - -#: rcgcdw.py:781 -#, python-brace-format -msgid "Deleted a comment on {target}'s profile" -msgstr "Deleted a comment on {target}'s profile" - -#: rcgcdw.py:785 -#, python-brace-format -msgid "Changed group membership for {target}" -msgstr "Changed group membership for {target}" - -#: rcgcdw.py:789 -#, python-brace-format -msgid "{target} got autopromoted to a new usergroup" -msgstr "{target} got autopromoted to a new usergroup" - -#: rcgcdw.py:804 -#, python-brace-format -msgid "Groups changed from {old_groups} to {new_groups}{reason}" -msgstr "Groups changed from {old_groups} to {new_groups}{reason}" - -#: rcgcdw.py:808 -#, python-brace-format -msgid "Protected {target}" -msgstr "Protected {target}" - -#: rcgcdw.py:814 -#, python-brace-format -msgid "Changed protection level for {article}" -msgstr "Changed protection level for {article}" - -#: rcgcdw.py:820 -#, python-brace-format -msgid "Removed protection from {article}" -msgstr "Removed protection from {article}" - -#: rcgcdw.py:824 -#, python-brace-format -msgid "Changed visibility of revision on page {article} " -msgid_plural "Changed visibility of {amount} revisions on page {article} " -msgstr[0] "Changed visibility of revision on page {article} " -msgstr[1] "Changed visibility of {amount} revisions on page {article} " - -#: rcgcdw.py:829 -#, python-brace-format -msgid "Imported {article} with {count} revision" -msgid_plural "Imported {article} with {count} revisions" -msgstr[0] "Imported {article} with {count} revision" -msgstr[1] "Imported {article} with {count} revisions" - -#: rcgcdw.py:834 -#, python-brace-format -msgid "Restored {article}" -msgstr "Restored {article}" - -#: rcgcdw.py:837 -msgid "Changed visibility of log events" -msgstr "Changed visibility of log events" - -#: rcgcdw.py:840 -msgid "Imported interwiki" -msgstr "Imported interwiki" - -#: rcgcdw.py:843 -#, python-brace-format -msgid "Edited abuse filter number {number}" -msgstr "Edited abuse filter number {number}" - -#: rcgcdw.py:846 -#, python-brace-format -msgid "Created abuse filter number {number}" -msgstr "Created abuse filter number {number}" - -#: rcgcdw.py:849 -#, python-brace-format -msgid "Merged revision histories of {article} into {dest}" -msgstr "Merged revision histories of {article} into {dest}" - -#: rcgcdw.py:853 -msgid "Added an entry to the interwiki table" -msgstr "Added an entry to the interwiki table" - -#: rcgcdw.py:854 rcgcdw.py:860 -#, python-brace-format -msgid "Prefix: {prefix}, website: {website} | {desc}" -msgstr "Prefix: {prefix}, website: {website} | {desc}" - -#: rcgcdw.py:859 -msgid "Edited an entry in interwiki table" -msgstr "Edited an entry in interwiki table" - -#: rcgcdw.py:865 -msgid "Deleted an entry in interwiki table" -msgstr "Deleted an entry in interwiki table" - -#: rcgcdw.py:866 -#, python-brace-format -msgid "Prefix: {prefix} | {desc}" -msgstr "Prefix: {prefix} | {desc}" - -#: rcgcdw.py:869 -#, python-brace-format -msgid "Changed the content model of the page {article}" -msgstr "Changed the content model of the page {article}" - -#: rcgcdw.py:870 -#, python-brace-format -msgid "Model changed from {old} to {new}: {reason}" -msgstr "Model changed from {old} to {new}: {reason}" - -#: rcgcdw.py:875 -#, python-brace-format -msgid "Edited the sprite for {article}" -msgstr "Edited the sprite for {article}" - -#: rcgcdw.py:878 -#, python-brace-format -msgid "Created the sprite sheet for {article}" -msgstr "Created the sprite sheet for {article}" - -#: rcgcdw.py:881 -#, python-brace-format -msgid "Edited the slice for {article}" -msgstr "Edited the slice for {article}" - -#: rcgcdw.py:887 -#, python-brace-format -msgid "Created the Cargo table \"{table}\"" -msgstr "Created the Cargo table \"{table}\"" - -#: rcgcdw.py:891 -#, python-brace-format -msgid "Deleted the Cargo table \"{table}\"" -msgstr "Deleted the Cargo table \"{table}\"" - -#: rcgcdw.py:898 -#, python-brace-format -msgid "Recreated the Cargo table \"{table}\"" -msgstr "Recreated the Cargo table \"{table}\"" - -#: rcgcdw.py:905 -#, python-brace-format -msgid "Replaced the Cargo table \"{table}\"" -msgstr "Replaced the Cargo table \"{table}\"" - -#: rcgcdw.py:909 -#, python-brace-format -msgid "Created a tag \"{tag}\"" -msgstr "Created a tag \"{tag}\"" - -#: rcgcdw.py:913 -#, python-brace-format -msgid "Deleted a tag \"{tag}\"" -msgstr "Deleted a tag \"{tag}\"" - -#: rcgcdw.py:917 -#, python-brace-format -msgid "Activated a tag \"{tag}\"" -msgstr "Activated a tag \"{tag}\"" - -#: rcgcdw.py:920 -#, python-brace-format -msgid "Deactivated a tag \"{tag}\"" -msgstr "Deactivated a tag \"{tag}\"" - -#: rcgcdw.py:923 -msgid "Action has been hidden by administration." -msgstr "Action has been hidden by administration." - -#: rcgcdw.py:951 -msgid "Tags" -msgstr "Tags" - -#: rcgcdw.py:956 -msgid "**Added**: " -msgstr "**Added**: " - -#: rcgcdw.py:956 -msgid " and {} more\n" -msgstr " and {} more\n" - -#: rcgcdw.py:957 -msgid "**Removed**: " -msgstr "**Removed**: " - -#: rcgcdw.py:957 -msgid " and {} more" -msgstr " and {} more" - -#: rcgcdw.py:958 -msgid "Changed categories" -msgstr "Changed categories" - -#: rcgcdw.py:977 -msgid "~~hidden~~" -msgstr "~~hidden~~" - -#: rcgcdw.py:983 -msgid "hidden" -msgstr "hidden" - -#: rcgcdw.py:1050 rcgcdw.py:1052 rcgcdw.py:1054 rcgcdw.py:1056 rcgcdw.py:1058 -#: rcgcdw.py:1060 rcgcdw.py:1062 -#, python-brace-format -msgid "{value} (avg. {avg})" -msgstr "{value} (avg. {avg})" - -#: rcgcdw.py:1086 rcgcdw.py:1114 -msgid "Daily overview" -msgstr "Daily overview" - -#: rcgcdw.py:1088 -msgid "No activity" -msgstr "No activity" - -#: rcgcdw.py:1123 -msgid " ({} action)" -msgid_plural " ({} actions)" -msgstr[0] " ({} action)" -msgstr[1] " ({} actions)" - -#: rcgcdw.py:1125 -msgid " ({} edit)" -msgid_plural " ({} edits)" -msgstr[0] " ({} edit)" -msgstr[1] " ({} edits)" - -#: rcgcdw.py:1130 -msgid " UTC ({} action)" -msgid_plural " UTC ({} actions)" -msgstr[0] " UTC ({} action)" -msgstr[1] " UTC ({} actions)" - -#: rcgcdw.py:1132 rcgcdw.py:1133 rcgcdw.py:1137 -msgid "But nobody came" -msgstr "But nobody came" - -#: rcgcdw.py:1141 -msgid "Most active user" -msgid_plural "Most active users" -msgstr[0] "Most active user" -msgstr[1] "Most active users" - -#: rcgcdw.py:1142 -msgid "Most edited article" -msgid_plural "Most edited articles" -msgstr[0] "Most edited article" -msgstr[1] "Most edited articles" - -#: rcgcdw.py:1143 -msgid "Edits made" -msgstr "Edits made" - -#: rcgcdw.py:1143 -msgid "New files" -msgstr "New files" - -#: rcgcdw.py:1143 -msgid "Admin actions" -msgstr "Admin actions" - -#: rcgcdw.py:1144 -msgid "Bytes changed" -msgstr "Bytes changed" - -#: rcgcdw.py:1144 -msgid "New articles" -msgstr "New articles" - -#: rcgcdw.py:1145 -msgid "Unique contributors" -msgstr "Unique contributors" - -#: rcgcdw.py:1146 -msgid "Most active hour" -msgid_plural "Most active hours" -msgstr[0] "Most active hour" -msgstr[1] "Most active hours" - -#: rcgcdw.py:1147 -msgid "Day score" -msgstr "Day score" - -#: rcgcdw.py:1291 -#, python-brace-format -msgid "Connection to {wiki} seems to be stable now." -msgstr "Connection to {wiki} seems to be stable now." - -#: rcgcdw.py:1292 rcgcdw.py:1407 -msgid "Connection status" -msgstr "Connection status" - -#: rcgcdw.py:1406 -#, python-brace-format -msgid "{wiki} seems to be down or unreachable." -msgstr "{wiki} seems to be down or unreachable." - -#: rcgcdw.py:1465 -msgid "director" -msgstr "Director" - -#: rcgcdw.py:1465 -msgid "bot" -msgstr "Bot" - -#: rcgcdw.py:1465 -msgid "editor" -msgstr "Editor" - -#: rcgcdw.py:1465 -msgid "directors" -msgstr "Directors" - -#: rcgcdw.py:1465 -msgid "sysop" -msgstr "Administrator" - -#: rcgcdw.py:1465 -msgid "bureaucrat" -msgstr "Bureaucrat" - -#: rcgcdw.py:1465 -msgid "reviewer" -msgstr "Reviewer" - -#: rcgcdw.py:1466 -msgid "autoreview" -msgstr "Autoreview" - -#: rcgcdw.py:1466 -msgid "autopatrol" -msgstr "Autopatrol" - -#: rcgcdw.py:1466 -msgid "wiki_guardian" -msgstr "Wiki guardian" - -#: rcgcdw.py:1466 -msgid "second" -msgid_plural "seconds" -msgstr[0] "second" -msgstr[1] "seconds" - -#: rcgcdw.py:1466 -msgid "minute" -msgid_plural "minutes" -msgstr[0] "minute" -msgstr[1] "minutes" - -#: rcgcdw.py:1466 -msgid "hour" -msgid_plural "hours" -msgstr[0] "hour" -msgstr[1] "hours" - -#: rcgcdw.py:1466 -msgid "day" -msgid_plural "days" -msgstr[0] "day" -msgstr[1] "days" - -#: rcgcdw.py:1466 -msgid "week" -msgid_plural "weeks" -msgstr[0] "week" -msgstr[1] "weeks" - -#: rcgcdw.py:1466 -msgid "month" -msgid_plural "months" -msgstr[0] "month" -msgstr[1] "months" - -#: rcgcdw.py:1466 -msgid "year" -msgid_plural "years" -msgstr[0] "year" -msgstr[1] "years" - -#: rcgcdw.py:1466 -msgid "millennium" -msgid_plural "millennia" -msgstr[0] "millennium" -msgstr[1] "millennia" - -#: rcgcdw.py:1466 -msgid "decade" -msgid_plural "decades" -msgstr[0] "decade" -msgstr[1] "decades" - -#: rcgcdw.py:1466 -msgid "century" -msgid_plural "centuries" -msgstr[0] "century" -msgstr[1] "centuries" - -#~ msgid "* and namespaces: *" -#~ msgstr "* and namespaces: *" - -#~ msgid "Comment content" -#~ msgstr "Comment content" - -#~ msgid "" -#~ "[{author}]({author_url}) moved {redirect}*{article}* over redirect to " -#~ "[{target}]({target_url}){comment}" -#~ msgstr "" -#~ "[{author}]({author_url}) moved {redirect}*{article}* over redirect to " -#~ "[{target}]({target_url}){comment}" - -#~ msgid "Unable to process the event" -#~ msgstr "Unable to process the event" - -#~ msgid "error" -#~ msgstr "error" diff --git a/locale/pl/LC_MESSAGES/discussion_formatters.mo b/locale/pl/LC_MESSAGES/discussion_formatters.mo new file mode 100644 index 0000000000000000000000000000000000000000..68a2c2d3982f160698eaa5821d6f76ddb819eb3c GIT binary patch literal 1014 zcmbV~&rcIU6vszJ)b*mqlhI^C0=Alg-2w?IEG8lt5-JTAG@xmQ-LVec&aAVu)-E(5 z{tq6EKmHPrlBjo2CLXw(_$Th-l1DcV%FQ2%jZv&VXBqHeKXC#h;G z-BzS(^o9s5n-AHFFbUe1se?w^SXN0IGGw>YM#5?u;p!q=63=CRiQU0hmTAc?xy+ql zo=aV?JU)ICzUwUT#Il;^d`AS)ov) z6QhY0FYHJhaj7P0@RXZGSbw=T$0iQ$<-MK=!)8^WL#Y~NIA`OLSiN8!X`N)A2WKFrhO<12`gXi0`7{, YEAR. +# +msgid "" +msgstr "" +"Project-Id-Version: \n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2020-08-08 22:56+0200\n" +"PO-Revision-Date: 2020-08-10 01:55+0200\n" +"Last-Translator: \n" +"Language-Team: \n" +"Language: pl\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Poedit 2.3.1\n" +"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 " +"|| n%100>14) ? 1 : 2);\n" + +#: src/discussion_formatters.py:38 +#, 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 "" +"[{author}](<{url}f/u/{creatorId}>) utworzył(a) [odpowiedź](<{url}f/p/" +"{threadId}/r/{postId}>) pod tematem [{title}](<{url}f/p/{threadId}>) w " +"{forumName}" + +#: src/discussion_formatters.py:40 src/discussion_formatters.py:49 +#: src/discussion_formatters.py:104 src/discussion_formatters.py:117 +msgid "unknown" +msgstr "nieznany" + +#: src/discussion_formatters.py:44 +#, 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 "" +"[{author}](<{url}f/u/{creatorId}>) utworzył(a) [{title}](<{wikiurl}wiki/" +"Message_Wall:{user_wall}?threadId={threadid}>) na tablicy wiadomości " +"użytkownika/użytkowniczki {user}" + +#: src/discussion_formatters.py:46 +#, 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 "" +"[{author}](<{url}f/u/{creatorId}>) odpowiedział(a) na[{title}](<{wikiurl}" +"wiki/Message_Wall:{user_wall}?threadId={threadid}#{replyId}>) na tablicy " +"wiadomości użytkownika/użytkowniczki {user}" + +#: src/discussion_formatters.py:51 +#, python-brace-format +msgid "" +"[{author}]({author_url}) created a [comment](<{url}wiki/{article}?" +"commentId={commentId}>) on [{article}](<{url}wiki/{article}>)" +msgstr "" + +#: src/discussion_formatters.py:53 +#, python-brace-format +msgid "" +"[{author}]({author_url}) created a [reply](<{url}wiki/{article}?" +"threadId={threadId}) to a [comment](<{url}wiki/{article}?" +"commentId={commentId}&replyId={replyId}>) on [{article}](<{url}wiki/{article}" +">)" +msgstr "" + +#: src/discussion_formatters.py:82 +#, python-brace-format +msgid "Created \"{title}\"" +msgstr "Utworzył(a) „{title}”" + +#: src/discussion_formatters.py:87 +#, fuzzy, python-brace-format +msgid "Created a poll \"{title}\"" +msgstr "Utworzył(a) ankietę zatytułowaną „{title}”" + +#: src/discussion_formatters.py:92 +msgid "Option {}" +msgstr "Opcja {}" + +#: src/discussion_formatters.py:93 +#, python-brace-format +msgid "__[View image]({image_url})__" +msgstr "__[Zobacz zdjęcie]({image_url})__" + +#: src/discussion_formatters.py:101 +#, python-brace-format +msgid "Replied to \"{title}\"" +msgstr "Odpowiedział(a) w „{title}”" + +#: src/discussion_formatters.py:110 +#, python-brace-format +msgid "Created \"{title}\" on {user}'s Message Wall" +msgstr "" +"Utworzył(a) „{title}” na tablicy wiadomości użytkownika/użytkowniczki {user}" + +#: src/discussion_formatters.py:114 +#, python-brace-format +msgid "Replied to \"{title}\" on {user}'s Message Wall" +msgstr "" +"Odpowiedział(a) na „{title}” z tablicy wiadomości użytkownika/użytkowniczki " +"{user}" + +#: src/discussion_formatters.py:121 +#, fuzzy, python-brace-format +msgid "Commented on {article}" +msgstr "Utworzył(a) „{title}”" + +#: src/discussion_formatters.py:125 +#, fuzzy, python-brace-format +msgid "Replied to a comment on {article}" +msgstr "Odpowiedział(a) w „{title}”" + +#, python-brace-format +#~ msgid "" +#~ "[{author}](<{url}f/u/{creatorId}>) created [{title}](<{url}f/p/{threadId}" +#~ ">) in {forumName}" +#~ msgstr "" +#~ "[{author}](<{url}f/u/{creatorId}>) utworzył(a) [{title}](<{url}f/p/" +#~ "{threadId}>) w {forumName}" + +#, python-brace-format +#~ msgid "" +#~ "[{author}](<{url}f/u/{creatorId}>) created a poll [{title}](<{url}f/p/" +#~ "{threadId}>) in {forumName}" +#~ msgstr "" +#~ "[{author}](<{url}f/u/{creatorId}>) utworzył(a) ankietę [{title}](<{url}f/" +#~ "p/{threadId}>) w {forumName}" diff --git a/locale/pl/LC_MESSAGES/discussions.mo b/locale/pl/LC_MESSAGES/discussions.mo deleted file mode 100644 index a25426a4e80883d5a5ef300e4bdeba4b03946086..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2568 zcmcJQ?~5Bn7{^DgR^t!w#|tTn!-+Lfw%McymfYnE)>aRC%~8^-4K>W|&gJH^nOSCM zU6buXIjA7@t>7X0(pSDvUy5&pi+@BBh5ie^6G6YT$=&6yJ?%w1Fno3<&pf~8nJ2$K zbL2CE@f79@n4e-ki}@#}9q&9q$kX5=_!`&(Ujjb{9|OMzp98-I9dHO<0e=T?f)^en zHB7mhQHBu(4LkVzZ`ncC|R4#yZGW%W*mNtp7?c`q@H><_lP9 zjf2^h49lrmgQ!0e6mV))>9}`+^>{|6RGo;fu#Q-k$BAj%#MJV1wG(`1r?>6a#~z5> z)dO>S2wxa&Y2>wk_b|)4oQ5hgqll6C`NQ$GQ7dhnrKlr(=gqhi zIZcJ_<%V;Se<-Yw^A=uQjaJ>N>$qFloY$_ck{MoGgZbo4_QG5jM_4g)6S9QD?ij<~5`YMygW?aEnO zt6V#0rKfx$J2iT0MVP{S&f8paJ#u1MabFl(J#n(I9K@Oh&N-!fQH{zlUqy9<@s5{^`Gq*|IQkV_^} zde9$k6j_PhzW&wtJ>S0m=o36)V}Kk*RNPPj8+64$*wCs1@c7=)hm!+VsSo9asuJkWBW;-_Uqw ATmS$7 diff --git a/locale/pl/LC_MESSAGES/discussions.po b/locale/pl/LC_MESSAGES/discussions.po deleted file mode 100644 index 6bd9b94..0000000 --- a/locale/pl/LC_MESSAGES/discussions.po +++ /dev/null @@ -1,110 +0,0 @@ -# SOME DESCRIPTIVE TITLE. -# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER -# This file is distributed under the same license as the PACKAGE package. -# FIRST AUTHOR , YEAR. -# -msgid "" -msgstr "" -"Project-Id-Version: \n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2020-07-04 00:58+0200\n" -"PO-Revision-Date: 2020-07-04 01:12+0200\n" -"Last-Translator: \n" -"Language-Team: \n" -"Language: pl\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"X-Generator: Poedit 2.3\n" -"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 " -"|| n%100>14) ? 1 : 2);\n" - -#: discussions.py:56 -#, python-brace-format -msgid "Replied to \"{title}\"" -msgstr "Odpowiedział(a) w „{title}”" - -#: discussions.py:63 discussions.py:79 discussions.py:127 discussions.py:143 -msgid "unknown" -msgstr "nieznany" - -#: discussions.py:68 -#, python-brace-format -msgid "Replied to \"{title}\" on {user}'s Message Wall" -msgstr "" -"Odpowiedział(a) na „{title}” z tablicy wiadomości użytkownika/użytkowniczki " -"{user}" - -#: discussions.py:72 -#, python-brace-format -msgid "Created \"{title}\"" -msgstr "Utworzył(a) „{title}”" - -#: discussions.py:86 -#, python-brace-format -msgid "Created \"{title}\" on {user}'s Message Wall" -msgstr "" -"Utworzył(a) „{title}” na tablicy wiadomości użytkownika/użytkowniczki {user}" - -#: discussions.py:99 -#, python-brace-format -msgid "Created a poll titled \"{title}\"" -msgstr "Utworzył(a) ankietę zatytułowaną „{title}”" - -#: discussions.py:104 -msgid "Option {}" -msgstr "Opcja {}" - -#: discussions.py:105 -#, python-brace-format -msgid "__[View image]({image_url})__" -msgstr "__[Zobacz zdjęcie]({image_url})__" - -#: discussions.py:121 -#, python-brace-format -msgid "" -"[{author}](<{url}f/u/{creatorId}>) created [{title}](<{url}f/p/{threadId}>) " -"in {forumName}" -msgstr "" -"[{author}](<{url}f/u/{creatorId}>) utworzył(a) [{title}](<{url}f/p/{threadId}" -">) w {forumName}" - -#: discussions.py:130 -#, python-brace-format -msgid "" -"[{author}](<{url}f/u/{creatorId}>) created [{title}](<{wikiurl}wiki/" -"Message_Wall:{user_wall}?threadId={threadid}>) on {user}'s Message Wall" -msgstr "" -"[{author}](<{url}f/u/{creatorId}>) utworzył(a) [{title}](<{wikiurl}wiki/" -"Message_Wall:{user_wall}?threadId={threadid}>) na tablicy wiadomości " -"użytkownika/użytkowniczki {user}" - -#: discussions.py:136 -#, python-brace-format -msgid "" -"[{author}](<{url}f/u/{creatorId}>) created a [reply](<{url}f/p/{threadId}/r/" -"{postId}>) to [{title}](<{url}f/p/{threadId}>) in {forumName}" -msgstr "" -"[{author}](<{url}f/u/{creatorId}>) utworzył(a) [odpowiedź](<{url}f/p/" -"{threadId}/r/{postId}>) pod tematem [{title}](<{url}f/p/{threadId}>) w " -"{forumName}" - -#: discussions.py:147 -#, python-brace-format -msgid "" -"[{author}](<{url}f/u/{creatorId}>) replied to [{title}](<{wikiurl}wiki/" -"Message_Wall:{user_wall}?threadId={threadid}#{replyId}>) on {user}'s Message " -"Wall" -msgstr "" -"[{author}](<{url}f/u/{creatorId}>) odpowiedział(a) na[{title}](<{wikiurl}" -"wiki/Message_Wall:{user_wall}?threadId={threadid}#{replyId}>) na tablicy " -"wiadomości użytkownika/użytkowniczki {user}" - -#: discussions.py:153 -#, python-brace-format -msgid "" -"[{author}](<{url}f/u/{creatorId}>) created a poll [{title}](<{url}f/p/" -"{threadId}>) in {forumName}" -msgstr "" -"[{author}](<{url}f/u/{creatorId}>) utworzył(a) ankietę [{title}](<{url}f/p/" -"{threadId}>) w {forumName}" diff --git a/locale/pl/LC_MESSAGES/misc.mo b/locale/pl/LC_MESSAGES/misc.mo index d674b72a2b35dd28fb28e4b91f4704258880493b..78479274f2e501e3a1c41ad0a250f809ec4b4ef0 100644 GIT binary patch literal 1180 zcmYL{J8u&~5XTn?j~uT+lLn-15+#B&cTR$W69*FVP!uPz9488uwK*^L#phjXZ%rPg zqXCH)Avy{^0p9?Lo)3To4J`#7bo|GAmPgwA&CJfu<1{~R54~fMTR3-cKH-ew+&_m8 z=O6~90C7=)Zg%s<0wddjDeIl1S#L6%)bOuA6uFI45U6JNO1-E?=eaA}Cc53w~wo!ASTWOrJt6EAQDYm!a?ER&ZQ@Ytj+2}(VS%1Cm z?@5!QSbFw&v#;NjXa*7deSl4YSk8Tl8c%Pc%T|x(U5)> zbD>b*F7Qs`ZLV*w3_1*Rf%jA^D-}wdbkKv9$M!)d5wV)%QB#;y+Tw0?)t?>2Q7g}- z@mEx&>#=GS`0PP!y)~(%!5o6vM9Y7YIsgMiy?o^1CHylFjy$&`S^HGoi9$4IzjGW9zX8vtmmhg zU=nXayva|_d9+pAMx64a`0IyA9%8e$d0WMjwJ^WtgYC*3*>W*jCf;8yXSvm4CEXIy tp>RHImQ&njIlZ@8PIa3#(6L!;E0(89s4T2k9W*VQOM0NN{x?a2q?WYs8Cqx?7#SE$&Sw%; zMiw_R28(m~B<7`;CZ?zAhNLFuS}9C^$`n00o>@%PNY4-`S6reSQk0lioRe6RUj&q` zVD_;zQmCm>$Wt{mFt9T;(NwTkFjN3qs%Z^3%1WUihl>H|DgUCxDuwdQBQujzvw$80 E0L1u8O8@`> diff --git a/locale/pl/LC_MESSAGES/misc.po b/locale/pl/LC_MESSAGES/misc.po index 760567e..1e61275 100644 --- a/locale/pl/LC_MESSAGES/misc.po +++ b/locale/pl/LC_MESSAGES/misc.po @@ -1,27 +1,88 @@ # SOME DESCRIPTIVE TITLE. -# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER -# This file is distributed under the same license as the PACKAGE package. +# Copyright (C) YEAR ORGANIZATION # FIRST AUTHOR , YEAR. # msgid "" msgstr "" -"Project-Id-Version: \n" +"Project-Id-Version: RcGcDw\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-05-20 17:18+0200\n" -"PO-Revision-Date: 2019-05-20 17:23+0200\n" +"POT-Creation-Date: 2020-08-08 14:00+0200\n" +"PO-Revision-Date: 2020-08-10 01:55+0200\n" +"Last-Translator: Frisk \n" "Language-Team: \n" +"Language: pl\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Generator: Poedit 2.2.1\n" -"Last-Translator: \n" -"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : 2);\n" -"Language: pl\n" +"Generated-By: pygettext.py 1.5\n" +"X-Generator: Poedit 2.3.1\n" +"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 " +"|| n%100>=20) ? 1 : 2);\n" -#: misc.py:76 +#: src/misc.py:42 +msgid "Location" +msgstr "Lokacja" + +#: src/misc.py:42 +msgid "About me" +msgstr "O mnie" + +#: src/misc.py:42 +msgid "Google link" +msgstr "link Google" + +#: src/misc.py:42 +msgid "Facebook link" +msgstr "link Facebook" + +#: src/misc.py:42 +msgid "Twitter link" +msgstr "link Twitter" + +#: src/misc.py:42 +msgid "Reddit link" +msgstr "link Reddit" + +#: src/misc.py:42 +msgid "Twitch link" +msgstr "link Twitch" + +#: src/misc.py:42 +msgid "PSN link" +msgstr "link PSN" + +#: src/misc.py:42 +msgid "VK link" +msgstr "link VK" + +#: src/misc.py:42 +msgid "XBL link" +msgstr "link XBL" + +#: src/misc.py:42 +msgid "Steam link" +msgstr "link Steam" + +#: src/misc.py:42 +msgid "Discord handle" +msgstr "konto Discord" + +#: src/misc.py:42 +msgid "Battle.net handle" +msgstr "konto Battle.net" + +#: src/misc.py:142 msgid "" "\n" "__And more__" msgstr "" "\n" "__Oraz więcej__" + +#: src/misc.py:423 +msgid "Unknown" +msgstr "Nieznana" + +#: src/misc.py:425 +msgid "unknown" +msgstr "nieznana sekcja" diff --git a/locale/pl/LC_MESSAGES/rc_formatters.mo b/locale/pl/LC_MESSAGES/rc_formatters.mo new file mode 100644 index 0000000000000000000000000000000000000000..a2d8327c9750fecf16aa435813d4763a8f915c7b GIT binary patch literal 20148 zcmds<3yfS>d4NwK3Gs#`5JCunBsUI@z3c3H{R(Ci2YYSDaq1U-#E=ba?#^8A-kq6y zhkNgMGP7AA#!d=>mNz)zSxN~s2!$Y}O@Tu&9A6`?nz4AZbeVq6C&wrllA6|OyhZWbCkXIuo&Qt22;m>;b;d7 zUw~J@C*UjKccJ+IC%6Ls8x(h!5y=g3IotsE!9I8b;zWHJio2&^FZ>R?6#fcII6Wl( zdN>Hzz$4Is55N+91ilhpj;EKyLHHVYE4&sKp!k0;q$t!^;WGF%6o21=E8$O}_`ifq zUk6t}DbHO{(sehK@ZJq2U5`Qu_ZcYepNCTJS6!ym)o=^E29820r?*3i?_*G^@GEc= z{5m9R^-FjFE+Y{V-d#}g@ea5Seh#jN&q9gkToNZ-38lVnhnryxC4G-U@%McwdeTEB zNxokJrM|C)Qg8kINV;~w7r{|T6l&bQpN9QBe-uhOXQ1T!St#lJEfjy(kx40^)lky4 z2THk>q15+7Q2U3X&(Fg1;VKqb7QK~DUggXEocq0^jIRg2o#`%%_-Usi2 zPr*0AO*DpM@B?rdE_;)BfVF0h7(xp5efH%V#cnH3L%98XSfqUTx;STusQ1ZWO zrHStt+`{uy@C{IuiXv18pwveRir(I5`5t%<&mV;^gs1HLPe7WadIVkopM=uxp0>}= zK+(hJ;Q8<$p@jQ0DB=AI(iGJ5Q2bqt5{dp^1w~K#;016El<%A1d2lCO2KPXT{|JgyR2rztQ*iL5fa&6^cE24odni z98d}sQ&&KVX9L89sqIkWI}9&|A(ZsK4N80`pv3nWlyLqMN;~-;lyH6mQ4RG=NK;l< z5UG^g8iZl(; zR9^@3C2%!?Nk0A>ihcMA6!*V|lD-w|jJ?_kU&?b4O8LJHiobWk_3*P${C^)xy8ji@ z^wjx$9D&zC3GeL?RaBpW8{oI0#P=I0{#No*zHfmvK{Wv-o(G`R&u5^d<6H1X_yZ{A z@Y0Qh4SOL~t-b(X3%>^?ybEzmlGJ*55FUjtd=lp2t8siQybp@MZ}GDaiZQ>1X=tFQD&p(E@!mv;S=xxd>&51-Mke0_5_she*t&F1H&f#k3*@~|A0GTMBul7g(O>@fG>pi!yfo<_)7R;DEjtg z_%iqnsOuAoyXWllPoU_mcK1_w1AHF77+z22<#|0swbb443ivRT^sGc~M&x?HAp6CMzCLg1!A~Lg zBGLw5g?tz}hNM@Co4b(!8AslM$R%Yziu^tz_5LPAuJBUG!(A<}lGT<$|oAX2we z$R8qPNqr7UuL3t>1Ed@zuU|yojogJ)5os@SeF!;@d;}>XJCSRU85zkPDHDeR;p-h~;PC!^lm@+mRY_ zDe?hiEh5+JkX8E5^ckz|{hgKr@OI=5`z-cDu8WX9WDPQm$n|mLlgMY0KSf@IJc!73 z12T;~ifluUA}>Jn)wA2rc|q(AIaAZhSv587xVgj+gWl$c*gkoAp8=P4CAaeW@S$z3 zzFJ?1laZVo=iIy>jK5hqZjg5Zx8%iTH|NDej(J10r7-eZ9(t4$25oM6QFh0*zg2s$ z?RC_uk#gi6^S$buS4|cDpfKI*-0O@~f_%sefqB{6!C|lJ>)V>od-=XTlF`?ZTb+muM_w**CfwK=^Sr<*xp_}*rLc~Vgcv00a`1lwr5=Oq{2e#N_wKctM#5CcP%)l9|Ij%VM<0NvW zjt10lG0YW+{Ad)G9H|lt*_4o!-O;dE46E|0rNldWl7uzfr-eLRNt_@Y3-dK6N2RIZ zTH?h{Zo&=5y}a6H=!{7!oY+ew`j}uMXG*{G@}rg5i>5P|If`mLjC?Q7UX4d#rR&8zDMbep-D@xuviYB-7}R@fvsZ zTl8EMOs90}sP7f?(~gGP7I_`CD|Nos=< zqiN_$T^T!6C#jYYQg_XbCwrSV9GXXaqe3XAzs-G<|7F>q6XS52R%(7-qhrq!-eIgF$%vs!GtYE)3wPbQqH zTx)w-u)|pG_Kqf);W=w-wwn%F-s7RC`K-x06Ifhrw8Tg>(o1H@Z{CZsQ+u?rv4*ix zGFg#K)4!&ru_ug4r?ec;nFuQpo?BnUEpNnv&U#^;cveM?9W<_5--$zdF;UmlfHn-Z z^cp0~^la0OoJqbCKM~7ne0OzZ&GbC3bWpnWW&Nny>s1}Am$7~jgTP&AiUyM`_mplf z^2^%rlZ9hG{k6PL6W!<}b$7f^yNuO-3E3^$o+BlB}cfiZdYnAP|Ls>T0obKkcYQjai z$SBJ68=XzOIPt{=#X5J(=;pFxE~Gt3_A|qBfPPcAaM$6+^pUg`8Fx&pgS9yEO6rh1 z9;?HF9T~I_5e^6bTPvpbj{LC-5s2eLfUQ-B%f*n+V|ylCws7BbmK3eXkCazSo9Y z4*4#_Gih&`ni(^gs;FW2WTz&l!x(I&br446VoFThm|5K~PtPB+^flebRFsGvgh_## zTbn(jt@IBKE4YYgTgOq2q1hP+k&eK!0a*8>pK%;>4EL56o3$D(frz0WHS?P+!OX>C ze>|9;(jQ~L?#-q1sWEb$#cO=#w|PV}(l!W1C(P*7sKgw~Hm_ME>zx~Jnh-rEY9Gb6 z6j+OTc27&bWmvoTlF8da?Z}i2PQ}m&+iPmB_|rl0naAB??5FI&I~%ihEz30N*_4%$ z_uNKo{%mAjb?X4!S!(e}eRuBkx@OM~jarmq>8;3yN+YsHl^RdYYj5+!Xa4d}gE}j1 zDh;e@Ix%-$I%lIpva#ycn9WdHN_>IMusNW{TxN+OrL*g%>1bLj15V#6GaT&g>#o&) zI+f|35U1lrCR2&uLD=zP0?)=I3-DAlQ>u|AD|TtFDb*ZBspnWDW|Bp-lF8PB2QVxE z`K+RJp8GJ9nu!HLCbtYD_)zsPzl&oPfn z4Mq0`%mVS5k7FXU-rTH2dIa4)-wUX!X#Oc8;ddTbiQjDQII?6D5Ycw^tZ|7M>NL?D zkzuADY6%xU)T(5&(IrlnD(MXMj8l>ZFl&lCZ-{nu*JeRh#%gqQU%<+3b%KQqz27oA zs;KL*>?ToI)VDGzVoi5UjfIICtDwD=9GeS@J)xu$)huPbKJV5x{=rTCYX_adwL=>>uI72LXSW+C{f8nqh>I@uGUVJE`EkLy zx$K8YYl}SV5-IJ_gUCIw`l7fmb#G4Nvy0w2(!<{7Ms2BC`2y%4M!T6A~Y0OW0c6xz_ z?s?>~MpQL6fF!Via?M#gu(9Wj{nmkGVSgw}=Byi7Kd`oEf3Xs|#r|8vsKkz9P}Yy} z=Jhv`Uiq?lRj_&UTIco7pu^`CYX@)Hyw17)dVPEI<_&VYN?s4%Ou^lIuYNCX27B?d z7C-BHZ|XUd`Z?6UP5J|NjM^$_aFerc-O$DxO$BwU$o2heUrU`1ZG7$OK~nesydwW+ zs!^E@@7$zI+f8@83q0C=ZI^qm>7IjzcE7vUaOCBANL}d%ahC0T+u)j?#c}hqxF0FF zaly@p)sTJhFmme{uR5J1KY{P&CfK#DS7nD>e`AZ>4}w~5qWzhD^1$upl`jMs1_Vb) z*`9frA1|IhnWxKWY?@bVx$vkv$-B0F^LEFwalSpwyMbqS&W9tnVD`>)lfKzJKO9#A z|MaQEIJuJz4tM5w=v0zw7}c@tI=uzoi^8fK`0Rlfl3G>nWtXzCjjp2!m4Q<&`>~VP z`@(Nud9Z7*~+$T;1}3y_jSqC;<}fgIj-(3 z`KUrDweF0$lgZPMSM9r*mk@wLD$dNW@O z!kLFpKOiML9jw7Ius*ct(I^}Q!~d2Dob{Uk75@a#sYhsI_`B`RuwC{xTPRz zFOxC5;!+UeDF|b+Hj}0a*L1{UmaGlwP_jEryPr9}%I$3}fw&s_rL-KBbw|xFqL><< z=FxzL!?u!Ze8|-)IBB+416u38;cl+aCYN#b>BlE+#+veFYP?H@-x-Bt)-ZX}8Tx7` zrlaQ6t;O=3y3=wr0OQi}XuzGWSy3~#zo8eVX)Vo z9Ammur!_dbmE&eS~Eg^#)kVWe{+4K;Wdmw2fu#P_gtsIXFD)Tos)Ek(m|%jB1|w(KOWB< zU!x6;A971gbn|8pN-WZ!9w5}TDKqv@4?QTIG#z_GhHcDeZ4pT)YG1K-Q;Z zG3yw`Tn8-7uym+t<2yTzac4Hfkffwj>#Wys%3f4r^cf^FTv|knYxJ6B0;UV|WLv&- z2b*?XO7M^4}O=`OZxG!JkD5ggnWFRbk3r(^m>8;&MlXC)XcRP1y zjE>c+(bJE!VnXSq+Dqpz<9l8i!+C1<=?q`(%S%;ai|PJbPY-YwgC4)AhoaIn(=o8< zO+9ciETY=d25k1i>gkj1QMEd;XEn&&h{=2v-*HgOI@u=sQE=Oqx4JLFro$T2(N8&# zEcz@*p2lH4r!x)$K~I{d96B}GNsb$w0%LPd_);-dmpay_B0JF`6FWI@wiNeu;~fEm6!Kt#@Caoz>?oUI!)j+Hb`kVvt( zNY65LZ%eJI>Smg|Zh*9UZ<%Rz*R$@a$v384XIxHt!o=jPY36jM=O{V_wdi{55J*d} zmUZ6U3)xOLn{uSBZe1+*Tt>HhL3c=0xp_QeR-a^An`Zzd>rYtJGdruJqhbQ9yP8ES znBFLn&err)XSYe(0dyL8RxPxi#_1F~-}$SkHKeoEI9o&2bzYsX&d+8?+Zw+)O@AiM zx-A@YRAuP_H7_V-b+oWED)q*kI<5U?)v_Z(drGtJOnP}1eC$~5WTqV5+t;GPCp`TJ zFnZLaD6_}RL{0#e61sH`XJl>t4#Ttdq#+ckiit*2}qK+nmrO6lmGM%!L(XMQTC zcGNdxd~J4`#+Xer9M*Q{h&_PPIx%N8_C{T&$~Q-SOJCWv^-*HwCR;iw`HR$rPTh0Y8GTyd ziqv&JrqVh}n|Eg4J)GGCkwzKmZ5DZ;?iO}9qP>77HhVj*-`UExoK8KmZ;ikR)d;~39Y zj+m6(gdHduz1H1?wIvpOUA;5e_El1?w|ni^F*VF#pJBfeg$2%AxGGL6MUO?-^d@_w zWC?lZgktl^h$kDH9Q~2qMgz6I7I_6Z?vvisYy4qSo>ds$rHjsnHT%r}LXgyApT%zz zZPSC>{KXs$vd4sK=80bxZ}FPl$oV08b&56SF?OQ$LR52pW3RxDHks0_S(-n)Hh)V^ zO3fySU4i0B_Ildaqez=AkfcVAD0$xK8+DLB$z~&!-8DIFq|8=+W6P?f*fh1vtJ;)E zon)WQURC2!Q89|MI\n" +"Language-Team: \n" +"Language: pl\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: pygettext.py 1.5\n" +"X-Generator: Poedit 2.3.1\n" +"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 " +"|| n%100>=20) ? 1 : 2);\n" +"Project-Id-Version: RcGcDw\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2020-08-08 22:56+0200\n" "PO-Revision-Date: 2020-03-17 20:57+0100\n" "Last-Translator: Frisk \n" "Language-Team: \n" @@ -19,67 +33,205 @@ msgstr "" "Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 " "|| n%100>=20) ? 1 : 2);\n" -#: rcgcdw.py:71 -msgid "Location" -msgstr "Lokacja" +#: src/rcgcdw.py:113 src/rcgcdw.py:115 src/rcgcdw.py:117 src/rcgcdw.py:119 +#: src/rcgcdw.py:121 src/rcgcdw.py:123 src/rcgcdw.py:125 +#, python-brace-format +msgid "{value} (avg. {avg})" +msgstr "{value} (średnio {avg})" -#: rcgcdw.py:71 -msgid "About me" -msgstr "O mnie" +#: src/rcgcdw.py:145 +msgid "Daily overview" +msgstr "Podsumowanie dnia" -#: rcgcdw.py:71 -msgid "Google link" -msgstr "link Google" +#: src/rcgcdw.py:153 +msgid "No activity" +msgstr "Brak aktywności" -#: rcgcdw.py:71 -msgid "Facebook link" -msgstr "link Facebook" +#: src/rcgcdw.py:177 +msgid " ({} action)" +msgid_plural " ({} actions)" +msgstr[0] " ({} akcja)" +msgstr[1] " ({} akcje)" +msgstr[2] " ({} akcji)" -#: rcgcdw.py:71 -msgid "Twitter link" -msgstr "link Twitter" +#: src/rcgcdw.py:179 +msgid " ({} edit)" +msgid_plural " ({} edits)" +msgstr[0] " ({} edycja)" +msgstr[1] " ({} edycje)" +msgstr[2] " ({} edycji)" -#: rcgcdw.py:71 -msgid "Reddit link" -msgstr "link Reddit" +#: src/rcgcdw.py:184 +msgid " UTC ({} action)" +msgid_plural " UTC ({} actions)" +msgstr[0] " UTC ({} akcja)" +msgstr[1] " UTC ({} akcje)" +msgstr[2] " UTC ({} akcji)" -#: rcgcdw.py:71 -msgid "Twitch link" -msgstr "link Twitch" +#: src/rcgcdw.py:186 src/rcgcdw.py:187 src/rcgcdw.py:191 +msgid "But nobody came" +msgstr "Ale nikt nie przyszedł" -#: rcgcdw.py:71 -msgid "PSN link" -msgstr "link PSN" +#: src/rcgcdw.py:194 +msgid "Most active user" +msgid_plural "Most active users" +msgstr[0] "Najbardziej aktywny użytkownik" +msgstr[1] "Najbardziej aktywni użytkownicy" +msgstr[2] "Najbardziej aktywni użytkownicy" -#: rcgcdw.py:71 -msgid "VK link" -msgstr "link VK" +#: src/rcgcdw.py:195 +msgid "Most edited article" +msgid_plural "Most edited articles" +msgstr[0] "Najczęściej edytowany artykuł" +msgstr[1] "Najczęściej edytowane artykuły" +msgstr[2] "Najczęściej edytowane artykuły" -#: rcgcdw.py:71 -msgid "XBL link" -msgstr "link XBL" +#: src/rcgcdw.py:196 +msgid "Edits made" +msgstr "Zrobionych edycji" -#: rcgcdw.py:71 -msgid "Steam link" -msgstr "link Steam" +#: src/rcgcdw.py:196 +msgid "New files" +msgstr "Nowych plików" -#: rcgcdw.py:71 -msgid "Discord handle" -msgstr "konto Discord" +#: src/rcgcdw.py:196 +msgid "Admin actions" +msgstr "Akcji administratorskich" -#: rcgcdw.py:71 -msgid "Battle.net handle" -msgstr "konto Battle.net" +#: src/rcgcdw.py:197 +msgid "Bytes changed" +msgstr "Zmienionych bajtów" -#: rcgcdw.py:172 rcgcdw.py:924 -msgid "Unknown" -msgstr "Nieznana" +#: src/rcgcdw.py:197 +msgid "New articles" +msgstr "Nowych artykułów" -#: rcgcdw.py:174 -msgid "unknown" -msgstr "nieznana sekcja" +#: src/rcgcdw.py:198 +msgid "Unique contributors" +msgstr "Unikalnych edytujących" -#: rcgcdw.py:244 +#: src/rcgcdw.py:199 +msgid "Most active hour" +msgid_plural "Most active hours" +msgstr[0] "Najbardziej aktywna godzina" +msgstr[1] "Najbardziej aktywne godziny" +msgstr[2] "Najbardziej aktywne godziny" + +#: src/rcgcdw.py:200 +msgid "Day score" +msgstr "Wynik dnia" + +#: src/rcgcdw.py:242 +msgid "director" +msgstr "Dyrektor" + +#: src/rcgcdw.py:242 +msgid "bot" +msgstr "Bot" + +#: src/rcgcdw.py:242 +msgid "editor" +msgstr "Redaktor" + +#: src/rcgcdw.py:242 +msgid "directors" +msgstr "Dyrektorzy" + +#: src/rcgcdw.py:242 +msgid "sysop" +msgstr "Administrator" + +#: src/rcgcdw.py:242 +msgid "bureaucrat" +msgstr "Biurokrata" + +#: src/rcgcdw.py:242 +msgid "reviewer" +msgstr "Przeglądający" + +#: src/rcgcdw.py:243 +msgid "autoreview" +msgstr "Automatycznie przeglądający" + +#: src/rcgcdw.py:243 +msgid "autopatrol" +msgstr "Automatycznie zatwierdzający" + +#: src/rcgcdw.py:243 +msgid "wiki_guardian" +msgstr "Strażnik wiki" + +#: src/rcgcdw.py:243 +msgid "second" +msgid_plural "seconds" +msgstr[0] "sekunda" +msgstr[1] "sekundy" +msgstr[2] "sekund" + +#: src/rcgcdw.py:243 +msgid "minute" +msgid_plural "minutes" +msgstr[0] "minuta" +msgstr[1] "minuty" +msgstr[2] "minut" + +#: src/rcgcdw.py:243 +msgid "hour" +msgid_plural "hours" +msgstr[0] "godzina" +msgstr[1] "godziny" +msgstr[2] "godzin" + +#: src/rcgcdw.py:243 +msgid "day" +msgid_plural "days" +msgstr[0] "dzień" +msgstr[1] "dni" +msgstr[2] "dni" + +#: src/rcgcdw.py:243 +msgid "week" +msgid_plural "weeks" +msgstr[0] "tydzień" +msgstr[1] "tygodnie" +msgstr[2] "tygodni" + +#: src/rcgcdw.py:243 +msgid "month" +msgid_plural "months" +msgstr[0] "miesiąc" +msgstr[1] "miesiące" +msgstr[2] "miesięcy" + +#: src/rcgcdw.py:243 +msgid "year" +msgid_plural "years" +msgstr[0] "rok" +msgstr[1] "lata" +msgstr[2] "lat" + +#: src/rcgcdw.py:243 +msgid "millennium" +msgid_plural "millennia" +msgstr[0] "tysiąclecie" +msgstr[1] "tysiąclecia" +msgstr[2] "tysiącleci" + +#: src/rcgcdw.py:243 +msgid "decade" +msgid_plural "decades" +msgstr[0] "dekada" +msgstr[1] "dekady" +msgstr[2] "dekad" + +#: src/rcgcdw.py:243 +msgid "century" +msgid_plural "centuries" +msgstr[0] "stulecie" +msgstr[1] "stulecia" +msgstr[2] "stuleci" + +#: src/rc_formatters.py:41 #, python-brace-format msgid "" "[{author}]({author_url}) edited [{article}]({edit_link}){comment} ({sign}" @@ -88,7 +240,7 @@ msgstr "" "[{author}]({author_url}) editował(-a) [{article}]({edit_link}){comment} " "({sign}{edit_size})" -#: rcgcdw.py:246 +#: src/rc_formatters.py:43 #, python-brace-format msgid "" "[{author}]({author_url}) created [{article}]({edit_link}){comment} ({sign}" @@ -97,19 +249,19 @@ msgstr "" "[{author}]({author_url}) stworzył(-a) [{article}]({edit_link}){comment} " "({sign}{edit_size})" -#: rcgcdw.py:249 +#: src/rc_formatters.py:46 #, python-brace-format msgid "[{author}]({author_url}) uploaded [{file}]({file_link}){comment}" msgstr "[{author}]({author_url}) przesłał(-a) [{file}]({file_link}){comment}" -#: rcgcdw.py:256 +#: src/rc_formatters.py:53 #, python-brace-format msgid "" "[{author}]({author_url}) reverted a version of [{file}]({file_link}){comment}" msgstr "" "[{author}]({author_url}) wycofał(-a) wersję [{file}]({file_link}){comment}" -#: rcgcdw.py:260 +#: src/rc_formatters.py:57 #, python-brace-format msgid "" "[{author}]({author_url}) uploaded a new version of [{file}]({file_link})" @@ -118,12 +270,12 @@ msgstr "" "[{author}]({author_url}) przesłał(-a) nową wersję [{file}]({file_link})" "{comment}" -#: rcgcdw.py:263 +#: src/rc_formatters.py:60 #, python-brace-format msgid "[{author}]({author_url}) deleted [{page}]({page_link}){comment}" msgstr "[{author}]({author_url}) usunął/usunęła [{page}]({page_link}){comment}" -#: rcgcdw.py:267 +#: src/rc_formatters.py:64 #, python-brace-format msgid "" "[{author}]({author_url}) deleted redirect by overwriting [{page}]" @@ -132,15 +284,15 @@ msgstr "" "[{author}]({author_url}) usunął/usunęła przekierowanie przez nadpisanie " "[{page}]({page_link}){comment}" -#: rcgcdw.py:271 rcgcdw.py:276 +#: src/rc_formatters.py:68 src/rc_formatters.py:73 msgid "without making a redirect" msgstr "bez utworzenia przekierowania przekierowania" -#: rcgcdw.py:271 rcgcdw.py:277 +#: src/rc_formatters.py:68 src/rc_formatters.py:74 msgid "with a redirect" msgstr "z przekierowaniem" -#: rcgcdw.py:272 +#: src/rc_formatters.py:69 #, python-brace-format msgid "" "[{author}]({author_url}) moved {redirect}*{article}* to [{target}]" @@ -149,7 +301,7 @@ msgstr "" "[{author}]({author_url}) przeniósł/przeniosła {redirect}*{article}* do " "[{target}]({target_url}) {made_a_redirect}{comment}" -#: rcgcdw.py:278 +#: src/rc_formatters.py:75 #, python-brace-format msgid "" "[{author}]({author_url}) moved {redirect}*{article}* over redirect to " @@ -158,7 +310,7 @@ msgstr "" "[{author}]({author_url}) przeniósł/przeniosła {redirect}*{article}* do " "przekierowania [{target}]({target_url}) {made_a_redirect}{comment}" -#: rcgcdw.py:283 +#: src/rc_formatters.py:80 #, python-brace-format msgid "" "[{author}]({author_url}) moved protection settings from {redirect}*{article}" @@ -167,32 +319,42 @@ msgstr "" "[{author}]({author_url}) przeniósł/przeniosła ustawienia zabezpieczeń z " "{redirect}*{article}* do [{target}]({target_url}){comment}" -#: rcgcdw.py:294 rcgcdw.py:699 -msgid "infinity and beyond" +#: src/rc_formatters.py:91 src/rc_formatters.py:512 +#, fuzzy +msgid "for infinity and beyond" msgstr "wieczność" -#: rcgcdw.py:311 +#: src/rc_formatters.py:100 src/rc_formatters.py:520 +#, python-brace-format +msgid "for {num} {translated_length}" +msgstr "" + +#: src/rc_formatters.py:106 src/rc_formatters.py:523 +msgid "until {}" +msgstr "" + +#: src/rc_formatters.py:110 msgid " on pages: " msgstr " na stronach: " -#: rcgcdw.py:318 rcgcdw.py:719 +#: src/rc_formatters.py:117 src/rc_formatters.py:534 msgid " and namespaces: " msgstr " oraz przestrzeniach nazw: " -#: rcgcdw.py:320 +#: src/rc_formatters.py:119 msgid " on namespaces: " msgstr " na przestrzeniach nazw: " -#: rcgcdw.py:332 -#, python-brace-format +#: src/rc_formatters.py:131 +#, fuzzy, python-brace-format msgid "" -"[{author}]({author_url}) blocked [{user}]({user_url}) for {time}" +"[{author}]({author_url}) blocked [{user}]({user_url}) {time}" "{restriction_desc}{comment}" msgstr "" "[{author}]({author_url}) zablokował(-a) [{user}]({user_url}) na {time}" "{restriction_desc}{comment}" -#: rcgcdw.py:336 +#: src/rc_formatters.py:135 #, python-brace-format msgid "" "[{author}]({author_url}) changed block settings for [{blocked_user}]" @@ -201,25 +363,25 @@ msgstr "" "[{author}]({author_url}) zmienił(-a) ustawienia blokady dla [{blocked_user}]" "({user_url}){comment}" -#: rcgcdw.py:340 +#: src/rc_formatters.py:139 #, python-brace-format msgid "" "[{author}]({author_url}) unblocked [{blocked_user}]({user_url}){comment}" msgstr "" "[{author}]({author_url}) odblokował(-a) [{blocked_user}]({user_url}){comment}" -#: rcgcdw.py:343 +#: src/rc_formatters.py:142 #, python-brace-format msgid "" "[{author}]({author_url}) left a [comment]({comment}) on {target} profile" msgstr "" "[{author}]({author_url}) pozostawił(-a) [komentarz]({comment}) na {target}" -#: rcgcdw.py:343 +#: src/rc_formatters.py:142 msgid "their own profile" msgstr "swoim własnym profilu" -#: rcgcdw.py:346 +#: src/rc_formatters.py:145 #, python-brace-format msgid "" "[{author}]({author_url}) replied to a [comment]({comment}) on {target} " @@ -228,54 +390,56 @@ msgstr "" "[{author}]({author_url}) odpowiedział(-a) na [komentarz]({comment}) na " "{target}" -#: rcgcdw.py:349 rcgcdw.py:355 rcgcdw.py:366 rcgcdw.py:370 +#: src/rc_formatters.py:148 src/rc_formatters.py:154 src/rc_formatters.py:165 +#: src/rc_formatters.py:169 msgid "their own" msgstr "swój własny" -#: rcgcdw.py:352 +#: src/rc_formatters.py:151 #, python-brace-format msgid "" "[{author}]({author_url}) edited a [comment]({comment}) on {target} profile" msgstr "" "[{author}]({author_url}) edytował(-a) [komentarz]({comment}) na {target}" -#: rcgcdw.py:358 +#: src/rc_formatters.py:157 #, python-brace-format msgid "[{author}]({author_url}) purged a comment on {target} profile" msgstr "" "[{author}]({author_url}) usunął/usunęła permanentnie komentarz na {target}" -#: rcgcdw.py:368 +#: src/rc_formatters.py:167 #, python-brace-format msgid "[{author}]({author_url}) deleted a comment on {target} profile" msgstr "[{author}]({author_url}) usunął/usunęła komentarz na {target}" -#: rcgcdw.py:374 +#: src/rc_formatters.py:173 #, python-brace-format msgid "[{target}]({target_url})'s" msgstr "na profilu użytkownika [{target}]({target_url})" -#: rcgcdw.py:374 +#: src/rc_formatters.py:173 #, python-brace-format msgid "[their own]({target_url})" msgstr "na [swoim własnym profilu użytkownika]({target_url})" -#: rcgcdw.py:375 +#: src/rc_formatters.py:174 #, python-brace-format msgid "" "[{author}]({author_url}) edited the {field} on {target} profile. *({desc})*" msgstr "" "[{author}]({author_url}) edytował(-a) pole {field} {target}. *({desc})*" -#: rcgcdw.py:389 rcgcdw.py:391 rcgcdw.py:800 rcgcdw.py:802 +#: src/rc_formatters.py:188 src/rc_formatters.py:190 src/rc_formatters.py:612 +#: src/rc_formatters.py:614 msgid "none" msgstr "brak" -#: rcgcdw.py:397 rcgcdw.py:787 +#: src/rc_formatters.py:196 src/rc_formatters.py:599 msgid "System" msgstr "System" -#: rcgcdw.py:402 +#: src/rc_formatters.py:201 #, python-brace-format msgid "" "[{author}]({author_url}) protected [{article}]({article_url}) with the " @@ -284,11 +448,12 @@ msgstr "" "[{author}]({author_url}) zabezpieczył(-a) [{article}]({article_url}) z " "następującymi ustawieniami: {settings}{comment}" -#: rcgcdw.py:404 rcgcdw.py:412 rcgcdw.py:810 rcgcdw.py:816 +#: src/rc_formatters.py:203 src/rc_formatters.py:211 src/rc_formatters.py:622 +#: src/rc_formatters.py:628 msgid " [cascading]" msgstr " [kaskadowo]" -#: rcgcdw.py:409 +#: src/rc_formatters.py:208 #, python-brace-format msgid "" "[{author}]({author_url}) modified protection settings of [{article}]" @@ -297,7 +462,7 @@ msgstr "" "[{author}]({author_url}) modyfikował(-a) ustawienia zabezpieczeń [{article}]" "({article_url}) na: {settings}{comment}" -#: rcgcdw.py:416 +#: src/rc_formatters.py:215 #, python-brace-format msgid "" "[{author}]({author_url}) removed protection from [{article}]({article_url})" @@ -306,7 +471,7 @@ msgstr "" "[{author}]({author_url}) usunął/usunęła zabezpieczenia z [{article}]" "({article_url}){comment}" -#: rcgcdw.py:420 +#: src/rc_formatters.py:219 #, python-brace-format msgid "" "[{author}]({author_url}) changed visibility of revision on page [{article}]" @@ -324,7 +489,7 @@ msgstr[2] "" "[{author}]({author_url}) zmienił(-a) widoczność {amount} wersji strony " "[{article}]({article_url}){comment}" -#: rcgcdw.py:425 +#: src/rc_formatters.py:224 #, python-brace-format msgid "" "[{author}]({author_url}) imported [{article}]({article_url}) with {count} " @@ -342,23 +507,23 @@ msgstr[2] "" "[{author}]({author_url}) zaimportował(-a) [{article}]({article_url}) {count} " "wersjami{comment}" -#: rcgcdw.py:430 +#: src/rc_formatters.py:229 #, python-brace-format msgid "[{author}]({author_url}) restored [{article}]({article_url}){comment}" msgstr "" "[{author}]({author_url}) przywrócił(-a) [{article}]({article_url}){comment}" -#: rcgcdw.py:432 +#: src/rc_formatters.py:231 #, python-brace-format msgid "[{author}]({author_url}) changed visibility of log events{comment}" msgstr "[{author}]({author_url}) zmienił(-a) widoczność wydarzeń{comment}" -#: rcgcdw.py:434 +#: src/rc_formatters.py:233 #, python-brace-format msgid "[{author}]({author_url}) imported interwiki{comment}" msgstr "[{author}]({author_url}) zaimportował(-a) interwiki{comment}" -#: rcgcdw.py:437 +#: src/rc_formatters.py:236 #, python-brace-format msgid "" "[{author}]({author_url}) edited abuse filter [number {number}]({filter_url})" @@ -366,7 +531,7 @@ msgstr "" "[{author}]({author_url}) edytował(-a) filtr nadużyć [numer {number}]" "({filter_url})" -#: rcgcdw.py:440 +#: src/rc_formatters.py:240 #, python-brace-format msgid "" "[{author}]({author_url}) created abuse filter [number {number}]({filter_url})" @@ -374,7 +539,7 @@ msgstr "" "[{author}]({author_url}) stworzył(-a) filtr nadużyć [numer {number}]" "({filter_url})" -#: rcgcdw.py:444 +#: src/rc_formatters.py:244 #, python-brace-format msgid "" "[{author}]({author_url}) merged revision histories of [{article}]" @@ -383,7 +548,32 @@ msgstr "" "[{author}]({author_url}) połączył(-a) historie zmian [{article}]" "({article_url}) z [{dest}]({dest_url}){comment}" -#: rcgcdw.py:448 +#: src/rc_formatters.py:248 +#, fuzzy, python-brace-format +msgid "Account [{author}]({author_url}) was created automatically" +msgstr "[{author}]({author_url}) utworzył(-a) tabelę Cargo \"{table}\"" + +#: src/rc_formatters.py:251 src/rc_formatters.py:260 +#, fuzzy, python-brace-format +msgid "Account [{author}]({author_url}) was created" +msgstr "[{author}]({author_url}) utworzył(-a) tabelę Cargo \"{table}\"" + +#: src/rc_formatters.py:254 +#, fuzzy, python-brace-format +msgid "" +"Account [{article}]({article_url}) was created by [{author}]({author_url})" +"{comment}" +msgstr "" +"[{author}]({author_url}) przywrócił(-a) [{article}]({article_url}){comment}" + +#: src/rc_formatters.py:257 +#, python-brace-format +msgid "" +"Account [{article}]({article_url}) was created by [{author}]({author_url}) " +"and password was sent by email{comment}" +msgstr "" + +#: src/rc_formatters.py:263 #, python-brace-format msgid "" "[{author}]({author_url}) added an entry to the [interwiki table]" @@ -392,7 +582,7 @@ msgstr "" "[{author}]({author_url}) dodał(-a) wpis do [tabeli interwiki]({table_url}), " "który prowadzi do {website} z prefixem {prefix}" -#: rcgcdw.py:454 +#: src/rc_formatters.py:269 #, python-brace-format msgid "" "[{author}]({author_url}) edited an entry in [interwiki table]({table_url}) " @@ -401,7 +591,7 @@ msgstr "" "[{author}]({author_url}) edytował(-a) wpis w [tabeli interwiki]" "({table_url}), który prowadzi do {website} z prefixem {prefix}" -#: rcgcdw.py:460 +#: src/rc_formatters.py:275 #, python-brace-format msgid "" "[{author}]({author_url}) deleted an entry in [interwiki table]({table_url})" @@ -409,7 +599,7 @@ msgstr "" "[{author}]({author_url}) usunął/usunęła wpis z [tabeli interwiki]" "({table_url})" -#: rcgcdw.py:463 +#: src/rc_formatters.py:278 #, python-brace-format msgid "" "[{author}]({author_url}) changed the content model of the page [{article}]" @@ -418,14 +608,14 @@ msgstr "" "[{author}]({author_url}) zmienił(-a) model zawartości [{article}]" "({article_url}) z {old} na {new}{comment}" -#: rcgcdw.py:467 +#: src/rc_formatters.py:282 #, python-brace-format msgid "" "[{author}]({author_url}) edited the sprite for [{article}]({article_url})" msgstr "" "[{author}]({author_url}) edytował(-a) sprite [{article}]({article_url})" -#: rcgcdw.py:470 +#: src/rc_formatters.py:285 #, python-brace-format msgid "" "[{author}]({author_url}) created the sprite sheet for [{article}]" @@ -433,114 +623,114 @@ msgid "" msgstr "" "[{author}]({author_url}) utworzył(-a) sprite sheet [{article}]({article_url})" -#: rcgcdw.py:473 +#: src/rc_formatters.py:288 #, python-brace-format msgid "" "[{author}]({author_url}) edited the slice for [{article}]({article_url})" msgstr "[{author}]({author_url}) edytował(-a) slice [{article}]({article_url})" -#: rcgcdw.py:478 +#: src/rc_formatters.py:293 #, python-brace-format msgid "[{author}]({author_url}) created the Cargo table \"{table}\"" msgstr "[{author}]({author_url}) utworzył(-a) tabelę Cargo \"{table}\"" -#: rcgcdw.py:480 +#: src/rc_formatters.py:295 #, python-brace-format msgid "[{author}]({author_url}) deleted the Cargo table \"{table}\"" msgstr "[{author}]({author_url}) usunęł(-a) tabelę Cargo \"{table}\"" -#: rcgcdw.py:485 +#: src/rc_formatters.py:300 #, python-brace-format msgid "[{author}]({author_url}) recreated the Cargo table \"{table}\"" msgstr "" "[{author}]({author_url}) utworzył(-a) ponownie tabelę Cargo \"{table}\"" -#: rcgcdw.py:490 +#: src/rc_formatters.py:305 #, python-brace-format msgid "[{author}]({author_url}) replaced the Cargo table \"{table}\"" msgstr "[{author}]({author_url}) zastąpił(-a) tabelę Cargo \"{table}\"" -#: rcgcdw.py:493 +#: src/rc_formatters.py:308 #, python-brace-format msgid "[{author}]({author_url}) created a [tag]({tag_url}) \"{tag}\"" msgstr "[{author}]({author_url}) utworzył(-a) [tag]({tag_url}) \"{tag}\"" -#: rcgcdw.py:497 +#: src/rc_formatters.py:312 #, python-brace-format msgid "[{author}]({author_url}) deleted a [tag]({tag_url}) \"{tag}\"" msgstr "[{author}]({author_url}) usunął/usunęła [tag]({tag_url}) \"{tag}\"" -#: rcgcdw.py:501 +#: src/rc_formatters.py:316 #, python-brace-format msgid "[{author}]({author_url}) activated a [tag]({tag_url}) \"{tag}\"" msgstr "[{author}]({author_url}) aktywował(-a) [tag]({tag_url}) \"{tag}\"" -#: rcgcdw.py:504 +#: src/rc_formatters.py:319 #, python-brace-format msgid "[{author}]({author_url}) deactivated a [tag]({tag_url}) \"{tag}\"" msgstr "[{author}]({author_url}) dezaktywował(-a) [tag]({tag_url}) \"{tag}\"" -#: rcgcdw.py:506 +#: src/rc_formatters.py:321 msgid "An action has been hidden by administration." msgstr "Akcja została ukryta przez administrację." -#: rcgcdw.py:515 rcgcdw.py:803 +#: src/rc_formatters.py:331 src/rc_formatters.py:615 msgid "No description provided" msgstr "Nie podano opisu zmian" -#: rcgcdw.py:563 +#: src/rc_formatters.py:378 msgid "(N!) " msgstr "(N!) " -#: rcgcdw.py:564 +#: src/rc_formatters.py:379 msgid "m" msgstr "d" -#: rcgcdw.py:564 +#: src/rc_formatters.py:379 msgid "b" msgstr "b" -#: rcgcdw.py:583 rcgcdw.py:588 +#: src/rc_formatters.py:396 src/rc_formatters.py:401 msgid "__Only whitespace__" msgstr "__Tylko znaki niedrukowane__" -#: rcgcdw.py:594 +#: src/rc_formatters.py:406 msgid "Removed" msgstr "Usunięto" -#: rcgcdw.py:597 +#: src/rc_formatters.py:408 msgid "Added" msgstr "Dodano" -#: rcgcdw.py:631 rcgcdw.py:669 +#: src/rc_formatters.py:442 src/rc_formatters.py:481 msgid "Options" msgstr "Opcje" -#: rcgcdw.py:631 +#: src/rc_formatters.py:442 #, python-brace-format msgid "([preview]({link}) | [undo]({undolink}))" msgstr "([podgląd]({link}) | [wycofaj]({undolink}))" -#: rcgcdw.py:634 +#: src/rc_formatters.py:447 #, python-brace-format msgid "Uploaded a new version of {name}" msgstr "Przesłał(a) nową wersję {name}" -#: rcgcdw.py:636 +#: src/rc_formatters.py:449 #, python-brace-format msgid "Reverted a version of {name}" msgstr "Wycofano wersję {name}" -#: rcgcdw.py:638 +#: src/rc_formatters.py:451 #, python-brace-format msgid "Uploaded {name}" msgstr "Przesłał(a) {name}" -#: rcgcdw.py:654 +#: src/rc_formatters.py:467 msgid "**No license!**" msgstr "**Brak licencji!**" -#: rcgcdw.py:666 +#: src/rc_formatters.py:479 msgid "" "\n" "License: {}" @@ -548,161 +738,161 @@ msgstr "" "\n" "Licencja: {}" -#: rcgcdw.py:669 +#: src/rc_formatters.py:481 #, python-brace-format msgid "([preview]({link}))" msgstr "([podgląd]({link}))" -#: rcgcdw.py:673 +#: src/rc_formatters.py:486 #, python-brace-format msgid "Deleted page {article}" msgstr "Usunął/usunęła {article}" -#: rcgcdw.py:676 +#: src/rc_formatters.py:489 #, python-brace-format msgid "Deleted redirect {article} by overwriting" msgstr "" "Usunął/usunęła przekierowanie ({article}) aby utworzyć miejsce dla " "przenoszonej strony" -#: rcgcdw.py:680 +#: src/rc_formatters.py:493 msgid "No redirect has been made" msgstr "Nie utworzono przekierowania" -#: rcgcdw.py:681 +#: src/rc_formatters.py:494 msgid "A redirect has been made" msgstr "Zostało utworzone przekierowanie" -#: rcgcdw.py:682 +#: src/rc_formatters.py:495 #, python-brace-format msgid "Moved {redirect}{article} to {target}" msgstr "Przeniósł/przeniosła {redirect}{article} do {target}" -#: rcgcdw.py:685 +#: src/rc_formatters.py:498 #, python-brace-format msgid "Moved {redirect}{article} to {title} over redirect" msgstr "" "Przeniósł/przeniosła {redirect}{article} do strony przekierowującej {title}" -#: rcgcdw.py:689 +#: src/rc_formatters.py:502 #, python-brace-format msgid "Moved protection settings from {redirect}{article} to {title}" msgstr "Przeniesiono ustawienia zabezpieczeń z {redirect}{article} do {title}" -#: rcgcdw.py:712 +#: src/rc_formatters.py:527 msgid "Blocked from editing the following pages: " msgstr "Blokada przed edytowaniem następujących stron: " -#: rcgcdw.py:721 +#: src/rc_formatters.py:536 msgid "Blocked from editing pages on following namespaces: " msgstr "Blokada przed edytowaniem stron na następujących przestrzeniach nazw: " -#: rcgcdw.py:735 +#: src/rc_formatters.py:547 msgid "Partial block details" msgstr "Szczegóły częściowej blokady" -#: rcgcdw.py:736 -#, python-brace-format -msgid "Blocked {blocked_user} for {time}" +#: src/rc_formatters.py:548 +#, fuzzy, python-brace-format +msgid "Blocked {blocked_user} {time}" msgstr "Zablokowano {blocked_user} na {time}" -#: rcgcdw.py:740 +#: src/rc_formatters.py:552 #, python-brace-format msgid "Changed block settings for {blocked_user}" msgstr "Zmienił ustawienia blokady {blocked_user}" -#: rcgcdw.py:744 +#: src/rc_formatters.py:556 #, python-brace-format msgid "Unblocked {blocked_user}" msgstr "Odblokował {blocked_user}" -#: rcgcdw.py:749 +#: src/rc_formatters.py:561 #, python-brace-format msgid "Left a comment on {target}'s profile" msgstr "Pozostawiono komentarz na profilu użytkownika {target}" -#: rcgcdw.py:751 +#: src/rc_formatters.py:563 msgid "Left a comment on their own profile" msgstr "Pozostawił(a) komentarz na swoim profilu" -#: rcgcdw.py:756 +#: src/rc_formatters.py:568 #, python-brace-format msgid "Replied to a comment on {target}'s profile" msgstr "Odpowiedziano na komentarz na profilu użytkownika {target}" -#: rcgcdw.py:758 +#: src/rc_formatters.py:570 msgid "Replied to a comment on their own profile" msgstr "Odpowiedział(a) na komentarz na swoim profilu" -#: rcgcdw.py:763 +#: src/rc_formatters.py:575 #, python-brace-format msgid "Edited a comment on {target}'s profile" msgstr "Edytowano komentarz na profilu użytkownika {target}" -#: rcgcdw.py:765 +#: src/rc_formatters.py:577 msgid "Edited a comment on their own profile" msgstr "Edytował(a) komentarz na swoim profilu" -#: rcgcdw.py:768 +#: src/rc_formatters.py:580 #, python-brace-format msgid "Edited {target}'s profile" msgstr "Edytowano profil użytkownika {target}" -#: rcgcdw.py:768 +#: src/rc_formatters.py:580 msgid "Edited their own profile" msgstr "Edytował(a) swój profil" -#: rcgcdw.py:770 +#: src/rc_formatters.py:582 #, python-brace-format msgid "Cleared the {field} field" msgstr "Wyczyszczono pole {field}" -#: rcgcdw.py:772 +#: src/rc_formatters.py:584 #, python-brace-format msgid "{field} field changed to: {desc}" msgstr "pole \"{field}\" zostało zmienione na: {desc}" -#: rcgcdw.py:775 +#: src/rc_formatters.py:587 #, python-brace-format msgid "Purged a comment on {target}'s profile" msgstr "Usunął permanentnie komentarz na profilu użytkownika {target}" -#: rcgcdw.py:781 +#: src/rc_formatters.py:593 #, python-brace-format msgid "Deleted a comment on {target}'s profile" msgstr "Usunął komentarz na profilu użytkownika {target}" -#: rcgcdw.py:785 +#: src/rc_formatters.py:597 #, python-brace-format msgid "Changed group membership for {target}" msgstr "Zmieniono przynależność do grup dla {target}" -#: rcgcdw.py:789 +#: src/rc_formatters.py:601 #, python-brace-format msgid "{target} got autopromoted to a new usergroup" msgstr "{target} automatycznie otrzymał nową grupę użytkownika" -#: rcgcdw.py:804 +#: src/rc_formatters.py:616 #, python-brace-format msgid "Groups changed from {old_groups} to {new_groups}{reason}" msgstr "Grupy zmienione z {old_groups} do {new_groups}{reason}" -#: rcgcdw.py:808 +#: src/rc_formatters.py:620 #, python-brace-format msgid "Protected {target}" msgstr "Zabezpieczono {target}" -#: rcgcdw.py:814 +#: src/rc_formatters.py:626 #, python-brace-format msgid "Changed protection level for {article}" msgstr "Zmieniono poziom zabezpieczeń {article}" -#: rcgcdw.py:820 +#: src/rc_formatters.py:632 #, python-brace-format msgid "Removed protection from {article}" msgstr "Usunięto zabezpieczenie {article}" -#: rcgcdw.py:824 +#: src/rc_formatters.py:636 #, python-brace-format msgid "Changed visibility of revision on page {article} " msgid_plural "Changed visibility of {amount} revisions on page {article} " @@ -710,7 +900,7 @@ msgstr[0] "Zmieniono widoczność wersji na stronie {article} " msgstr[1] "Zmieniono widoczność {amount} wersji na stronie {article} " msgstr[2] "Zmieniono widoczność {amount} wersji na stronie {article} " -#: rcgcdw.py:829 +#: src/rc_formatters.py:641 #, python-brace-format msgid "Imported {article} with {count} revision" msgid_plural "Imported {article} with {count} revisions" @@ -718,411 +908,168 @@ msgstr[0] "Zaimportowano {article} z {count} wersją" msgstr[1] "Zaimportowano {article} z {count} wersjami" msgstr[2] "Zaimportowano {article} z {count} wersjami" -#: rcgcdw.py:834 +#: src/rc_formatters.py:646 #, python-brace-format msgid "Restored {article}" msgstr "Przywrócono {article}" -#: rcgcdw.py:837 +#: src/rc_formatters.py:649 msgid "Changed visibility of log events" msgstr "Zmieniono widoczność logów" -#: rcgcdw.py:840 +#: src/rc_formatters.py:652 msgid "Imported interwiki" msgstr "Zaimportowano interwiki" -#: rcgcdw.py:843 +#: src/rc_formatters.py:655 #, python-brace-format msgid "Edited abuse filter number {number}" msgstr "Edytowano filtr nadużyć numer {number}" -#: rcgcdw.py:846 +#: src/rc_formatters.py:658 #, python-brace-format msgid "Created abuse filter number {number}" msgstr "Utworzono filtr nadużyć numer {number}" -#: rcgcdw.py:849 +#: src/rc_formatters.py:661 #, python-brace-format msgid "Merged revision histories of {article} into {dest}" msgstr "Połączono historie {article} z {dest}" -#: rcgcdw.py:853 +#: src/rc_formatters.py:665 +msgid "Created account automatically" +msgstr "" + +#: src/rc_formatters.py:668 src/rc_formatters.py:677 +msgid "Created account" +msgstr "" + +#: src/rc_formatters.py:671 +#, fuzzy, python-brace-format +msgid "Created account {article}" +msgstr "Usunął/usunęła {article}" + +#: src/rc_formatters.py:674 +#, python-brace-format +msgid "Created account {article} and password was sent by email" +msgstr "" + +#: src/rc_formatters.py:680 msgid "Added an entry to the interwiki table" msgstr "Dodano wpis do tabeli interwiki" -#: rcgcdw.py:854 rcgcdw.py:860 +#: src/rc_formatters.py:681 src/rc_formatters.py:687 #, python-brace-format msgid "Prefix: {prefix}, website: {website} | {desc}" msgstr "Prefix: {prefix}, strona: {website} | {desc}" -#: rcgcdw.py:859 +#: src/rc_formatters.py:686 msgid "Edited an entry in interwiki table" msgstr "Edytowano wpis interwiki" -#: rcgcdw.py:865 +#: src/rc_formatters.py:692 msgid "Deleted an entry in interwiki table" msgstr "Usunięto wpis interwiki" -#: rcgcdw.py:866 +#: src/rc_formatters.py:693 #, python-brace-format msgid "Prefix: {prefix} | {desc}" msgstr "Prefix: {prefix} | {desc}" -#: rcgcdw.py:869 +#: src/rc_formatters.py:696 #, python-brace-format msgid "Changed the content model of the page {article}" msgstr "Zmieniono model zawartości {article}" -#: rcgcdw.py:870 +#: src/rc_formatters.py:697 #, python-brace-format msgid "Model changed from {old} to {new}: {reason}" msgstr "Model został zmieniony z {old} na {new}: {reason}" -#: rcgcdw.py:875 +#: src/rc_formatters.py:702 #, python-brace-format msgid "Edited the sprite for {article}" msgstr "Edytowano sprite dla {article}" -#: rcgcdw.py:878 +#: src/rc_formatters.py:705 #, python-brace-format msgid "Created the sprite sheet for {article}" msgstr "Utworzono sprite sheet dla {article}" -#: rcgcdw.py:881 +#: src/rc_formatters.py:708 #, python-brace-format msgid "Edited the slice for {article}" msgstr "Edytowano część sprite dla {article}" -#: rcgcdw.py:887 +#: src/rc_formatters.py:714 #, python-brace-format msgid "Created the Cargo table \"{table}\"" msgstr "Utworzono tabelę Cargo \"{table}\"" -#: rcgcdw.py:891 +#: src/rc_formatters.py:718 #, python-brace-format msgid "Deleted the Cargo table \"{table}\"" msgstr "Usunięto tabelę Cargo \"{table}\"" -#: rcgcdw.py:898 +#: src/rc_formatters.py:725 #, python-brace-format msgid "Recreated the Cargo table \"{table}\"" msgstr "Utworzono ponownie tabelę Cargo \"{table}\"" -#: rcgcdw.py:905 +#: src/rc_formatters.py:732 #, python-brace-format msgid "Replaced the Cargo table \"{table}\"" msgstr "Zastąpiono tabelę Cargo \"{table}\"" -#: rcgcdw.py:909 +#: src/rc_formatters.py:736 #, python-brace-format msgid "Created a tag \"{tag}\"" msgstr "Utworzono tag \"{tag}\"" -#: rcgcdw.py:913 +#: src/rc_formatters.py:740 #, python-brace-format msgid "Deleted a tag \"{tag}\"" msgstr "Usunięto tag \"{tag}\"" -#: rcgcdw.py:917 +#: src/rc_formatters.py:744 #, python-brace-format msgid "Activated a tag \"{tag}\"" msgstr "Aktywowano tag \"{tag}\"" -#: rcgcdw.py:920 +#: src/rc_formatters.py:747 #, python-brace-format msgid "Deactivated a tag \"{tag}\"" msgstr "Dezaktywowano tag \"{tag}\"" -#: rcgcdw.py:923 -msgid "Action has been hidden by administration." +#: src/rc_formatters.py:750 +#, fuzzy +msgid "Action has been hidden by administration" msgstr "Akcja została ukryta przez administrację." -#: rcgcdw.py:951 +#: src/rc_formatters.py:751 +msgid "Unknown" +msgstr "Nieznana" + +#: src/rc_formatters.py:770 msgid "Tags" msgstr "Tagi" -#: rcgcdw.py:956 +#: src/rc_formatters.py:773 msgid "**Added**: " msgstr "**Dodane**: " -#: rcgcdw.py:956 +#: src/rc_formatters.py:773 msgid " and {} more\n" msgstr " oraz {} innych\n" -#: rcgcdw.py:957 +#: src/rc_formatters.py:774 msgid "**Removed**: " msgstr "**Usunięte**: " -#: rcgcdw.py:957 +#: src/rc_formatters.py:774 msgid " and {} more" msgstr " oraz {} innych" -#: rcgcdw.py:958 +#: src/rc_formatters.py:775 msgid "Changed categories" msgstr "Zmienione kategorie" - -#: rcgcdw.py:977 -msgid "~~hidden~~" -msgstr "~~ukryte~~" - -#: rcgcdw.py:983 -msgid "hidden" -msgstr "ukryte" - -#: rcgcdw.py:1050 rcgcdw.py:1052 rcgcdw.py:1054 rcgcdw.py:1056 rcgcdw.py:1058 -#: rcgcdw.py:1060 rcgcdw.py:1062 -#, python-brace-format -msgid "{value} (avg. {avg})" -msgstr "{value} (średnio {avg})" - -#: rcgcdw.py:1086 rcgcdw.py:1114 -msgid "Daily overview" -msgstr "Podsumowanie dnia" - -#: rcgcdw.py:1088 -msgid "No activity" -msgstr "Brak aktywności" - -#: rcgcdw.py:1123 -msgid " ({} action)" -msgid_plural " ({} actions)" -msgstr[0] " ({} akcja)" -msgstr[1] " ({} akcje)" -msgstr[2] " ({} akcji)" - -#: rcgcdw.py:1125 -msgid " ({} edit)" -msgid_plural " ({} edits)" -msgstr[0] " ({} edycja)" -msgstr[1] " ({} edycje)" -msgstr[2] " ({} edycji)" - -#: rcgcdw.py:1130 -msgid " UTC ({} action)" -msgid_plural " UTC ({} actions)" -msgstr[0] " UTC ({} akcja)" -msgstr[1] " UTC ({} akcje)" -msgstr[2] " UTC ({} akcji)" - -#: rcgcdw.py:1132 rcgcdw.py:1133 rcgcdw.py:1137 -msgid "But nobody came" -msgstr "Ale nikt nie przyszedł" - -#: rcgcdw.py:1141 -msgid "Most active user" -msgid_plural "Most active users" -msgstr[0] "Najbardziej aktywny użytkownik" -msgstr[1] "Najbardziej aktywni użytkownicy" -msgstr[2] "Najbardziej aktywni użytkownicy" - -#: rcgcdw.py:1142 -msgid "Most edited article" -msgid_plural "Most edited articles" -msgstr[0] "Najczęściej edytowany artykuł" -msgstr[1] "Najczęściej edytowane artykuły" -msgstr[2] "Najczęściej edytowane artykuły" - -#: rcgcdw.py:1143 -msgid "Edits made" -msgstr "Zrobionych edycji" - -#: rcgcdw.py:1143 -msgid "New files" -msgstr "Nowych plików" - -#: rcgcdw.py:1143 -msgid "Admin actions" -msgstr "Akcji administratorskich" - -#: rcgcdw.py:1144 -msgid "Bytes changed" -msgstr "Zmienionych bajtów" - -#: rcgcdw.py:1144 -msgid "New articles" -msgstr "Nowych artykułów" - -#: rcgcdw.py:1145 -msgid "Unique contributors" -msgstr "Unikalnych edytujących" - -#: rcgcdw.py:1146 -msgid "Most active hour" -msgid_plural "Most active hours" -msgstr[0] "Najbardziej aktywna godzina" -msgstr[1] "Najbardziej aktywne godziny" -msgstr[2] "Najbardziej aktywne godziny" - -#: rcgcdw.py:1147 -msgid "Day score" -msgstr "Wynik dnia" - -#: rcgcdw.py:1291 -#, python-brace-format -msgid "Connection to {wiki} seems to be stable now." -msgstr "Połączenie z {wiki} wygląda na stabilne." - -#: rcgcdw.py:1292 rcgcdw.py:1407 -msgid "Connection status" -msgstr "Problem z połączeniem" - -#: rcgcdw.py:1406 -#, python-brace-format -msgid "{wiki} seems to be down or unreachable." -msgstr "{wiki} nie działa lub jest nieosiągalna." - -#: rcgcdw.py:1465 -msgid "director" -msgstr "Dyrektor" - -#: rcgcdw.py:1465 -msgid "bot" -msgstr "Bot" - -#: rcgcdw.py:1465 -msgid "editor" -msgstr "Redaktor" - -#: rcgcdw.py:1465 -msgid "directors" -msgstr "Dyrektorzy" - -#: rcgcdw.py:1465 -msgid "sysop" -msgstr "Administrator" - -#: rcgcdw.py:1465 -msgid "bureaucrat" -msgstr "Biurokrata" - -#: rcgcdw.py:1465 -msgid "reviewer" -msgstr "Przeglądający" - -#: rcgcdw.py:1466 -msgid "autoreview" -msgstr "Automatycznie przeglądający" - -#: rcgcdw.py:1466 -msgid "autopatrol" -msgstr "Automatycznie zatwierdzający" - -#: rcgcdw.py:1466 -msgid "wiki_guardian" -msgstr "Strażnik wiki" - -#: rcgcdw.py:1466 -msgid "second" -msgid_plural "seconds" -msgstr[0] "sekunda" -msgstr[1] "sekundy" -msgstr[2] "sekund" - -#: rcgcdw.py:1466 -msgid "minute" -msgid_plural "minutes" -msgstr[0] "minuta" -msgstr[1] "minuty" -msgstr[2] "minut" - -#: rcgcdw.py:1466 -msgid "hour" -msgid_plural "hours" -msgstr[0] "godzina" -msgstr[1] "godziny" -msgstr[2] "godzin" - -#: rcgcdw.py:1466 -msgid "day" -msgid_plural "days" -msgstr[0] "dzień" -msgstr[1] "dni" -msgstr[2] "dni" - -#: rcgcdw.py:1466 -msgid "week" -msgid_plural "weeks" -msgstr[0] "tydzień" -msgstr[1] "tygodnie" -msgstr[2] "tygodni" - -#: rcgcdw.py:1466 -msgid "month" -msgid_plural "months" -msgstr[0] "miesiąc" -msgstr[1] "miesiące" -msgstr[2] "miesięcy" - -#: rcgcdw.py:1466 -msgid "year" -msgid_plural "years" -msgstr[0] "rok" -msgstr[1] "lata" -msgstr[2] "lat" - -#: rcgcdw.py:1466 -msgid "millennium" -msgid_plural "millennia" -msgstr[0] "tysiąclecie" -msgstr[1] "tysiąclecia" -msgstr[2] "tysiącleci" - -#: rcgcdw.py:1466 -msgid "decade" -msgid_plural "decades" -msgstr[0] "dekada" -msgstr[1] "dekady" -msgstr[2] "dekad" - -#: rcgcdw.py:1466 -msgid "century" -msgid_plural "centuries" -msgstr[0] "stulecie" -msgstr[1] "stulecia" -msgstr[2] "stuleci" - -#~ msgid "Comment content" -#~ msgstr "Zawartość komentarza" - -#~ msgid "" -#~ "[{author}]({author_url}) moved {redirect}*{article}* over redirect to " -#~ "[{target}]({target_url}){comment}" -#~ msgstr "" -#~ "[{author}]({author_url}) przeniósł/przeniosła {redirect}*{article}* " -#~ "nadpisując przekierowanie do [{target}]({target_url}){comment}" - -#~ msgid "Unable to process the event" -#~ msgstr "Nie udało się odczytać wydarzenia" - -#~ msgid "error" -#~ msgstr "błąd" - -#~ msgid "{wiki} is back up!" -#~ msgstr "{wiki} jest ponownie osiągalna!" - -#~ msgid "Moved {article} to redirect page ({title})" -#~ msgstr "Przeniesiono {article} do przekierowania ({title})" - -#~ msgid "Removed the block on {blocked_user}" -#~ msgstr "Usunięto blokadę na {blocked_user}" - -#~ msgid "Removed a comment on {target}'s profile" -#~ msgstr "Usunięto komentarz na profilu użytkownika {target}" - -#~ msgid "Changed {target}'s user groups" -#~ msgstr "Zmieniono grupy użytkownika {target}" - -#~ msgid "Modified protection settings for {article}" -#~ msgstr "Zmodyfikowano ustawienia zabezpieczeń dla {article}" - -#~ msgid "Removed revision(s) from public view for {article}" -#~ msgstr "Usunięto edycje z widoku publicznego dla {article}" - -#~ msgid "Removed events" -#~ msgstr "Usunięto wydarzenia" - -#~ msgid "Added interwiki entry" -#~ msgstr "Dodano intwrwiki" - -#~ msgid "https://i.imgur.com/2jWQEt1.png" -#~ msgstr "https://i.imgur.com/2jWQEt1.png" diff --git a/locale/pl/LC_MESSAGES/rcgcdw.mo b/locale/pl/LC_MESSAGES/rcgcdw.mo deleted file mode 100644 index 81f477ba01b238d9f4a482286e732c4ac1f9f441..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 21130 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 diff --git a/locale/pt-br/LC_MESSAGES/discussion_formatters.po b/locale/pt-br/LC_MESSAGES/discussion_formatters.po new file mode 100644 index 0000000..1e6ad2c --- /dev/null +++ b/locale/pt-br/LC_MESSAGES/discussion_formatters.po @@ -0,0 +1,132 @@ +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# +# Frisk , 2020. +msgid "" +msgstr "" +"Project-Id-Version: \n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2020-08-08 22:56+0200\n" +"PO-Revision-Date: 2020-08-10 01:55+0200\n" +"Last-Translator: Eduaddad \n" +"Language-Team: Portuguese (Brazil) \n" +"Language: pt_BR\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"X-Generator: Poedit 2.3.1\n" + +#: src/discussion_formatters.py:38 +#, 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 "" +"[Responder](<{url}f/p/{threadId}/r/{postId}>) por [{author}](<{url}f/u/" +"{creatorId}>) do [{title}](<{url}f/p/{threadId}>) do {forumName}" + +#: src/discussion_formatters.py:40 src/discussion_formatters.py:49 +#: src/discussion_formatters.py:104 src/discussion_formatters.py:117 +msgid "unknown" +msgstr "desconhecido" + +#: src/discussion_formatters.py:44 +#, 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 "" +"[{author}](<{url}f/u/{creatorId}>) criou [{title}](<{wikiurl}wiki/" +"Message_Wall:{user_wall}?threadId={threadid}>) no mural de mensagens de " +"{user}" + +#: src/discussion_formatters.py:46 +#, 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 "" +"[{author}](<{url}f/u/{creatorId}>) respondeu [{title}](<{wikiurl}wiki/" +"Message_Wall:{user_wall}?threadId={threadid}#{replyId}>) no mural de " +"mensagens de {user}" + +#: src/discussion_formatters.py:51 +#, python-brace-format +msgid "" +"[{author}]({author_url}) created a [comment](<{url}wiki/{article}?" +"commentId={commentId}>) on [{article}](<{url}wiki/{article}>)" +msgstr "" + +#: src/discussion_formatters.py:53 +#, python-brace-format +msgid "" +"[{author}]({author_url}) created a [reply](<{url}wiki/{article}?" +"threadId={threadId}) to a [comment](<{url}wiki/{article}?" +"commentId={commentId}&replyId={replyId}>) on [{article}](<{url}wiki/{article}" +">)" +msgstr "" + +#: src/discussion_formatters.py:82 +#, python-brace-format +msgid "Created \"{title}\"" +msgstr "Criado \"{title}\"" + +#: src/discussion_formatters.py:87 +#, fuzzy, python-brace-format +msgid "Created a poll \"{title}\"" +msgstr "Criou uma enquete intitulada \"{title}\"" + +#: src/discussion_formatters.py:92 +msgid "Option {}" +msgstr "Option {}" + +#: src/discussion_formatters.py:93 +#, python-brace-format +msgid "__[View image]({image_url})__" +msgstr "__[Ver imagem]({image_url})__" + +#: src/discussion_formatters.py:101 +#, python-brace-format +msgid "Replied to \"{title}\"" +msgstr "Respondido o \"{title}\"" + +#: src/discussion_formatters.py:110 +#, python-brace-format +msgid "Created \"{title}\" on {user}'s Message Wall" +msgstr "Criado \"{title}\" no mural de mensagem de {user}" + +#: src/discussion_formatters.py:114 +#, python-brace-format +msgid "Replied to \"{title}\" on {user}'s Message Wall" +msgstr "Respondeu a \"{title}\" no mural de mensagem de {user}" + +#: src/discussion_formatters.py:121 +#, fuzzy, python-brace-format +msgid "Commented on {article}" +msgstr "Criado \"{title}\"" + +#: src/discussion_formatters.py:125 +#, fuzzy, python-brace-format +msgid "Replied to a comment on {article}" +msgstr "Respondido o \"{title}\"" + +#, python-brace-format +#~ msgid "" +#~ "[{author}](<{url}f/u/{creatorId}>) created [{title}](<{url}f/p/{threadId}" +#~ ">) in {forumName}" +#~ msgstr "" +#~ "Criado [{title}](<{url}f/p/{threadId}>) por [{author}](<{url}f/u/" +#~ "{creatorId}>) no {forumName}" + +#, python-brace-format +#~ msgid "" +#~ "[{author}](<{url}f/u/{creatorId}>) created a poll [{title}](<{url}f/p/" +#~ "{threadId}>) in {forumName}" +#~ msgstr "" +#~ "[{author}](<{url}f/u/{creatorId}>)criou uma enquete [{title}](<{url}f/p/" +#~ "{threadId}>) no {forumName}" diff --git a/locale/pt-br/LC_MESSAGES/discussions.mo b/locale/pt-br/LC_MESSAGES/discussions.mo deleted file mode 100644 index b766170f09e1ae7598dca441576e6134beab8578..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1274 zcmb7CPjAyO95pZo3LF3-E^siruz}oU-2@|BC$zDlN))Qm!Nm9@lX$IJVn?Fq;8WnraYB}`zX?8v^X>^keDDYGCGZ#UEciS41$can zkau7KJ`4T@MtQH-NpQJJjR+Hz^wv1OXy0GUMsO!$I#D?3649L?|3s)(w8*V6-D{RM zgtfda=o6kKWKCp=M6uID^#=w2-(s`ix$9`teLlHRZ@GHqRd3NCw8CAr#G`mG{O zqhE{2v3krN3uC2LA@%TH+Bnv*Z5gwrylq)aBiww**2EiGCb7HtMIo&Q)qn-JSTIY2 z=`gr`1LwfI&#hxE!<9|SCkyGSk#?IdWKugLc4lYpWJWu!QZAE9)LBGD}lGHl@kh6b~DIuV#oPe!ljz0QHL8VTy4Fz%H{@nrJ5~a z*oumDELA(CbFZZHnn`YW!dA6OZAewtJK9=xp7yu3Nky;L==9XQx54fSB~1TDO)X;S zXtgrq!JU%F!*=^SK$WIxIfurArb3l&P0M}X!tkukw2CE~47b?}i=6U-mq+#5n?2GF o_`&eZNTZkI{xI;qD03KJ9&!loJyI`nhIPckMp|`5ghwO40py^H8~^|S diff --git a/locale/pt-br/LC_MESSAGES/discussions.po b/locale/pt-br/LC_MESSAGES/discussions.po deleted file mode 100644 index d9bc866..0000000 --- a/locale/pt-br/LC_MESSAGES/discussions.po +++ /dev/null @@ -1,106 +0,0 @@ -# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER -# This file is distributed under the same license as the PACKAGE package. -# -# Frisk , 2020. -msgid "" -msgstr "" -"Project-Id-Version: \n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2020-07-04 00:58+0200\n" -"PO-Revision-Date: 2020-07-04 01:09+0200\n" -"Last-Translator: Frisk \n" -"Language-Team: \n" -"Language: en_US\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" -"X-Generator: Poedit 2.3\n" - -#: discussions.py:56 -#, python-brace-format -msgid "Replied to \"{title}\"" -msgstr "Respondido o \"{title}\"" - -#: discussions.py:63 discussions.py:79 discussions.py:127 discussions.py:143 -msgid "unknown" -msgstr "desconhecido" - -#: discussions.py:68 -#, python-brace-format -msgid "Replied to \"{title}\" on {user}'s Message Wall" -msgstr "Respondeu a \"{title}\" no mural de mensagem de {user}" - -#: discussions.py:72 -#, python-brace-format -msgid "Created \"{title}\"" -msgstr "Criado \"{title}\"" - -#: discussions.py:86 -#, python-brace-format -msgid "Created \"{title}\" on {user}'s Message Wall" -msgstr "Criado \"{title}\" no mural de mensagem de {user}" - -#: discussions.py:99 -#, python-brace-format -msgid "Created a poll titled \"{title}\"" -msgstr "" - -#: discussions.py:104 -msgid "Option {}" -msgstr "" - -#: discussions.py:105 -#, python-brace-format -msgid "__[View image]({image_url})__" -msgstr "" - -#: discussions.py:121 -#, python-brace-format -msgid "" -"[{author}](<{url}f/u/{creatorId}>) created [{title}](<{url}f/p/{threadId}>) " -"in {forumName}" -msgstr "" -"Criado [{title}](<{url}f/p/{threadId}>) por [{author}](<{url}f/u/{creatorId}" -">) no {forumName}" - -#: discussions.py:130 -#, fuzzy, python-brace-format -#| msgid "" -#| "[{author}](<{url}f/u/{creatorId}>) created [{title}](<{url}f/p/{threadId}" -#| ">) in {forumName}" -msgid "" -"[{author}](<{url}f/u/{creatorId}>) created [{title}](<{wikiurl}wiki/" -"Message_Wall:{user_wall}?threadId={threadid}>) on {user}'s Message Wall" -msgstr "" -"Criado [{title}](<{url}f/p/{threadId}>) por [{author}](<{url}f/u/{creatorId}" -">) no {forumName}" - -#: discussions.py:136 -#, python-brace-format -msgid "" -"[{author}](<{url}f/u/{creatorId}>) created a [reply](<{url}f/p/{threadId}/r/" -"{postId}>) to [{title}](<{url}f/p/{threadId}>) in {forumName}" -msgstr "" -"[Responder](<{url}f/p/{threadId}/r/{postId}>) por [{author}](<{url}f/u/" -"{creatorId}>) do [{title}](<{url}f/p/{threadId}>) do {forumName}" - -#: discussions.py:147 -#, fuzzy, python-brace-format -#| msgid "" -#| "[{author}](<{url}f/u/{creatorId}>) created [{title}](<{url}f/p/{threadId}" -#| ">) in {forumName}" -msgid "" -"[{author}](<{url}f/u/{creatorId}>) replied to [{title}](<{wikiurl}wiki/" -"Message_Wall:{user_wall}?threadId={threadid}#{replyId}>) on {user}'s Message " -"Wall" -msgstr "" -"Criado [{title}](<{url}f/p/{threadId}>) por [{author}](<{url}f/u/{creatorId}" -">) no {forumName}" - -#: discussions.py:153 -#, python-brace-format -msgid "" -"[{author}](<{url}f/u/{creatorId}>) created a poll [{title}](<{url}f/p/" -"{threadId}>) in {forumName}" -msgstr "" diff --git a/locale/pt-br/LC_MESSAGES/misc.mo b/locale/pt-br/LC_MESSAGES/misc.mo deleted file mode 100644 index b6dd34028ed13efd63e8e6dbb58a3c4633505ecf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 438 zcmZ9I!Ab)$5QbOL%ZeAz9&%K4Y7!7@Y6Y#WC@rpK6>m%Ij_b-cS&~%rL3{}x%4c!5 z3l{vzM<&TXlVN^#HohX#I{{wdC~3zM_C zb(m#Q;_MsF0^H>Ah|ZVRC>Bq#wl2WL7iA8Yi^4-{={mVfVc<{)a>11jsF>v96!4VA5WVmWWba*_lCZGwBe%AC` zz>jcLSGqJkHhb01W9UDmBj~PtP8SvU8JnR\n" +"Language-Team: Portuguese (Brazil) \n" +"Language: pt_BR\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Generator: Poedit 2.2.1\n" -"Last-Translator: \n" -"Plural-Forms: nplurals=2; plural=(n > 1);\n" -"Language: pt\n" +"Plural-Forms: nplurals=2; plural=n > 1;\n" +"X-Generator: Poedit 2.3.1\n" -#: misc.py:76 +#: src/misc.py:42 +msgid "Location" +msgstr "Localização" + +#: src/misc.py:42 +msgid "About me" +msgstr "Sobre mim" + +#: src/misc.py:42 +msgid "Google link" +msgstr "Link do Google" + +#: src/misc.py:42 +msgid "Facebook link" +msgstr "Facebook link" + +#: src/misc.py:42 +msgid "Twitter link" +msgstr "Link do Twitter" + +#: src/misc.py:42 +msgid "Reddit link" +msgstr "Link do Reddit" + +#: src/misc.py:42 +msgid "Twitch link" +msgstr "Link do Twitch" + +#: src/misc.py:42 +msgid "PSN link" +msgstr "Link do PSN" + +#: src/misc.py:42 +msgid "VK link" +msgstr "Link do VK" + +#: src/misc.py:42 +msgid "XBL link" +msgstr "Link do XBL" + +#: src/misc.py:42 +msgid "Steam link" +msgstr "Link do Steam" + +#: src/misc.py:42 +msgid "Discord handle" +msgstr "Link do Discord" + +#: src/misc.py:42 +msgid "Battle.net handle" +msgstr "Link do Battle.net" + +#: src/misc.py:142 msgid "" "\n" "__And more__" msgstr "" "\n" "__E mais__" + +#: src/misc.py:423 +msgid "Unknown" +msgstr "Desconhecido" + +#: src/misc.py:425 +msgid "unknown" +msgstr "desconhecido" diff --git a/locale/pt-br/LC_MESSAGES/rcgcdw.po b/locale/pt-br/LC_MESSAGES/rc_formatters.po similarity index 58% rename from locale/pt-br/LC_MESSAGES/rcgcdw.po rename to locale/pt-br/LC_MESSAGES/rc_formatters.po index 8a0507c..e2fb9f2 100644 --- a/locale/pt-br/LC_MESSAGES/rcgcdw.po +++ b/locale/pt-br/LC_MESSAGES/rc_formatters.po @@ -7,298 +7,470 @@ msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2020-03-17 20:53+0100\n" -"PO-Revision-Date: 2020-03-18 13:37+0100\n" -"Last-Translator: Frisk \n" -"Language-Team: \n" +"POT-Creation-Date: 2020-08-08 17:21+0200\n" +"PO-Revision-Date: 2020-08-10 01:55+0200\n" +"Last-Translator: Eduaddad \n" +"Language-Team: Portuguese (Brazil) \n" "Language: pt_BR\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=2; plural=(n > 1);\n" -"X-Generator: Poedit 2.3\n" +"Plural-Forms: nplurals=2; plural=n > 1;\n" +"X-Generator: Poedit 2.3.1\n" +"Project-Id-Version: \n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2020-08-08 22:56+0200\n" +"PO-Revision-Date: 2020-08-04 09:51+0000\n" +"Last-Translator: Eduaddad \n" +"Language-Team: Portuguese (Brazil) \n" +"Language: pt-br\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=n > 1;\n" +"X-Generator: Weblate 4.1.1\n" -#: rcgcdw.py:71 -msgid "Location" -msgstr "Localização" +#: src/rcgcdw.py:113 src/rcgcdw.py:115 src/rcgcdw.py:117 src/rcgcdw.py:119 +#: src/rcgcdw.py:121 src/rcgcdw.py:123 src/rcgcdw.py:125 +#, python-brace-format +msgid "{value} (avg. {avg})" +msgstr "{value} (med. {avg})" -#: rcgcdw.py:71 -msgid "About me" -msgstr "Sobre mim" +#: src/rcgcdw.py:145 +msgid "Daily overview" +msgstr "Visão geral diária" -#: rcgcdw.py:71 -msgid "Google link" -msgstr "Link do Google" +#: src/rcgcdw.py:153 +msgid "No activity" +msgstr "Sem atividade" -#: rcgcdw.py:71 -msgid "Facebook link" -msgstr "Facebook link" +#: src/rcgcdw.py:177 +msgid " ({} action)" +msgid_plural " ({} actions)" +msgstr[0] " ({} açao)" +msgstr[1] " ({} ações)" -#: rcgcdw.py:71 -msgid "Twitter link" -msgstr "Link do Twitter" +#: src/rcgcdw.py:179 +msgid " ({} edit)" +msgid_plural " ({} edits)" +msgstr[0] " ({} editado)" +msgstr[1] " ({} edições)" -#: rcgcdw.py:71 -msgid "Reddit link" -msgstr "Link do Reddit" +#: src/rcgcdw.py:184 +msgid " UTC ({} action)" +msgid_plural " UTC ({} actions)" +msgstr[0] " UTC ({} ação)" +msgstr[1] " UTC ({} ações)" -#: rcgcdw.py:71 -msgid "Twitch link" -msgstr "Link do Twitch" +#: src/rcgcdw.py:186 src/rcgcdw.py:187 src/rcgcdw.py:191 +msgid "But nobody came" +msgstr "Mas ninguém veio" -#: rcgcdw.py:71 -msgid "PSN link" -msgstr "Link do PSN" +#: src/rcgcdw.py:194 +msgid "Most active user" +msgid_plural "Most active users" +msgstr[0] "Usuário mais ativo" +msgstr[1] "Usuários mais ativos" -#: rcgcdw.py:71 -msgid "VK link" -msgstr "Link do VK" +#: src/rcgcdw.py:195 +msgid "Most edited article" +msgid_plural "Most edited articles" +msgstr[0] "Artigo mais editado" +msgstr[1] "Artigos mais editados" -#: rcgcdw.py:71 -msgid "XBL link" -msgstr "Link do XBL" +#: src/rcgcdw.py:196 +msgid "Edits made" +msgstr "Edições feitas" -#: rcgcdw.py:71 -msgid "Steam link" -msgstr "Link do Steam" +#: src/rcgcdw.py:196 +msgid "New files" +msgstr "Novos arquivos" -#: rcgcdw.py:71 -msgid "Discord handle" -msgstr "" +#: src/rcgcdw.py:196 +msgid "Admin actions" +msgstr "Ações de administração" -#: rcgcdw.py:71 -msgid "Battle.net handle" -msgstr "" +#: src/rcgcdw.py:197 +msgid "Bytes changed" +msgstr "Bytes alterados" -#: rcgcdw.py:172 rcgcdw.py:924 -msgid "Unknown" -msgstr "Desconhecido" +#: src/rcgcdw.py:197 +msgid "New articles" +msgstr "Novos artigos" -#: rcgcdw.py:174 -#, fuzzy -#| msgid "Unknown" -msgid "unknown" -msgstr "Desconhecido" +#: src/rcgcdw.py:198 +msgid "Unique contributors" +msgstr "Contribuidores exclusivos" -#: rcgcdw.py:244 +#: src/rcgcdw.py:199 +msgid "Most active hour" +msgid_plural "Most active hours" +msgstr[0] "Hora mais ativa" +msgstr[1] "Horas mais ativas" + +#: src/rcgcdw.py:200 +msgid "Day score" +msgstr "Pontuação do dia" + +#: src/rcgcdw.py:242 +msgid "director" +msgstr "diretor" + +#: src/rcgcdw.py:242 +msgid "bot" +msgstr "robô" + +#: src/rcgcdw.py:242 +msgid "editor" +msgstr "editor" + +#: src/rcgcdw.py:242 +msgid "directors" +msgstr "diretores" + +#: src/rcgcdw.py:242 +msgid "sysop" +msgstr "administrador" + +#: src/rcgcdw.py:242 +msgid "bureaucrat" +msgstr "burocrata" + +#: src/rcgcdw.py:242 +msgid "reviewer" +msgstr "revisor" + +#: src/rcgcdw.py:243 +msgid "autoreview" +msgstr "revisão automática" + +#: src/rcgcdw.py:243 +msgid "autopatrol" +msgstr "patrulha automatica" + +#: src/rcgcdw.py:243 +msgid "wiki_guardian" +msgstr "guardião_wiki" + +#: src/rcgcdw.py:243 +msgid "second" +msgid_plural "seconds" +msgstr[0] "segundo" +msgstr[1] "segundos" + +#: src/rcgcdw.py:243 +msgid "minute" +msgid_plural "minutes" +msgstr[0] "minuto" +msgstr[1] "minutos" + +#: src/rcgcdw.py:243 +msgid "hour" +msgid_plural "hours" +msgstr[0] "hora" +msgstr[1] "horas" + +#: src/rcgcdw.py:243 +msgid "day" +msgid_plural "days" +msgstr[0] "dia" +msgstr[1] "dias" + +#: src/rcgcdw.py:243 +msgid "week" +msgid_plural "weeks" +msgstr[0] "semana" +msgstr[1] "semanas" + +#: src/rcgcdw.py:243 +msgid "month" +msgid_plural "months" +msgstr[0] "mês" +msgstr[1] "meses" + +#: src/rcgcdw.py:243 +msgid "year" +msgid_plural "years" +msgstr[0] "ano" +msgstr[1] "anos" + +#: src/rcgcdw.py:243 +msgid "millennium" +msgid_plural "millennia" +msgstr[0] "milénio" +msgstr[1] "milénios" + +#: src/rcgcdw.py:243 +msgid "decade" +msgid_plural "decades" +msgstr[0] "década" +msgstr[1] "décadas" + +#: src/rcgcdw.py:243 +msgid "century" +msgid_plural "centuries" +msgstr[0] "século" +msgstr[1] "séculos" + +#: src/rc_formatters.py:41 #, python-brace-format msgid "" "[{author}]({author_url}) edited [{article}]({edit_link}){comment} ({sign}" "{edit_size})" msgstr "" +"[{author}]({author_url}) editou [{article}]({edit_link}){comment} ({sign}" +"{edit_size})" -#: rcgcdw.py:246 +#: src/rc_formatters.py:43 #, python-brace-format msgid "" "[{author}]({author_url}) created [{article}]({edit_link}){comment} ({sign}" "{edit_size})" msgstr "" +"[{author}]({author_url}) criou [{article}]({edit_link}){comment} ({sign}" +"{edit_size})" -#: rcgcdw.py:249 +#: src/rc_formatters.py:46 #, python-brace-format msgid "[{author}]({author_url}) uploaded [{file}]({file_link}){comment}" -msgstr "" +msgstr "[{author}]({author_url}) carregou [{file}]({file_link}){comment}" -#: rcgcdw.py:256 +#: src/rc_formatters.py:53 #, python-brace-format msgid "" "[{author}]({author_url}) reverted a version of [{file}]({file_link}){comment}" msgstr "" "[{author}]({author_url}) reverteu a versão do [{file}]({file_link}){comment}" -#: rcgcdw.py:260 +#: src/rc_formatters.py:57 #, python-brace-format msgid "" "[{author}]({author_url}) uploaded a new version of [{file}]({file_link})" "{comment}" msgstr "" +"[{author}]({author_url}) carregou a nova versão de [{file}]({file_link})" +"{comment}" -#: rcgcdw.py:263 +#: src/rc_formatters.py:60 #, python-brace-format msgid "[{author}]({author_url}) deleted [{page}]({page_link}){comment}" -msgstr "" +msgstr "[{author}]({author_url}) excluiu [{page}]({page_link}){comment}" -#: rcgcdw.py:267 +#: src/rc_formatters.py:64 #, python-brace-format msgid "" "[{author}]({author_url}) deleted redirect by overwriting [{page}]" "({page_link}){comment}" msgstr "" +"[{author}]({author_url}) excluiu o redirecionamento substituindo [{page}]" +"({page_link}){comment}" -#: rcgcdw.py:271 rcgcdw.py:276 +#: src/rc_formatters.py:68 src/rc_formatters.py:73 msgid "without making a redirect" -msgstr "" +msgstr "sem fazer um redirecionamento" -#: rcgcdw.py:271 rcgcdw.py:277 +#: src/rc_formatters.py:68 src/rc_formatters.py:74 msgid "with a redirect" -msgstr "" +msgstr "com um redirecionamento" -#: rcgcdw.py:272 +#: src/rc_formatters.py:69 #, python-brace-format msgid "" "[{author}]({author_url}) moved {redirect}*{article}* to [{target}]" "({target_url}) {made_a_redirect}{comment}" msgstr "" +"[{author}]({author_url}) moveu {redirect}*{article}* para [{target}]" +"({target_url}) {made_a_redirect}{comment}" -#: rcgcdw.py:278 +#: src/rc_formatters.py:75 #, python-brace-format msgid "" "[{author}]({author_url}) moved {redirect}*{article}* over redirect to " "[{target}]({target_url}) {made_a_redirect}{comment}" msgstr "" +"[{author}]({author_url}) moveu {redirect}*{article}* sobre o " +"redirecionamento para [{target}]({target_url}) {made_a_redirect}{comment}" -#: rcgcdw.py:283 -#, fuzzy, python-brace-format -#| msgid "Moved protection settings from {redirect}{article} to {title}" +#: src/rc_formatters.py:80 +#, python-brace-format msgid "" "[{author}]({author_url}) moved protection settings from {redirect}*{article}" "* to [{target}]({target_url}){comment}" -msgstr "Configurações de proteção movidos de {redirect}{article} para {title}" +msgstr "" +"[{author}]({author_url}) moveu as configurações de proteção de {redirect}" +"*{article}* para [{target}]({target_url}){comment}" -#: rcgcdw.py:294 rcgcdw.py:699 -msgid "infinity and beyond" +#: src/rc_formatters.py:91 src/rc_formatters.py:512 +#, fuzzy +msgid "for infinity and beyond" msgstr "infinito e além" -#: rcgcdw.py:311 +#: src/rc_formatters.py:100 src/rc_formatters.py:520 +#, python-brace-format +msgid "for {num} {translated_length}" +msgstr "" + +#: src/rc_formatters.py:106 src/rc_formatters.py:523 +msgid "until {}" +msgstr "" + +#: src/rc_formatters.py:110 msgid " on pages: " msgstr " nas páginas: " -#: rcgcdw.py:318 rcgcdw.py:719 +#: src/rc_formatters.py:117 src/rc_formatters.py:534 msgid " and namespaces: " msgstr " e espaços nominais: " -#: rcgcdw.py:320 +#: src/rc_formatters.py:119 msgid " on namespaces: " msgstr " nos espaços nominais: " -#: rcgcdw.py:332 +#: src/rc_formatters.py:131 #, fuzzy, python-brace-format -#| msgid "Changed block settings for {blocked_user}" msgid "" -"[{author}]({author_url}) blocked [{user}]({user_url}) for {time}" +"[{author}]({author_url}) blocked [{user}]({user_url}) {time}" +"{restriction_desc}{comment}" +msgstr "" +"[{author}]({author_url}) bloqueou [{user}]({user_url}) por {time}" "{restriction_desc}{comment}" -msgstr "Configurações de bloqueio alteradas para {blocked_user}" -#: rcgcdw.py:336 -#, fuzzy, python-brace-format -#| msgid "Changed block settings for {blocked_user}" +#: src/rc_formatters.py:135 +#, python-brace-format msgid "" "[{author}]({author_url}) changed block settings for [{blocked_user}]" "({user_url}){comment}" -msgstr "Configurações de bloqueio alteradas para {blocked_user}" +msgstr "" +"[{author}]({author_url}) mudou as configurações de bloqueio para " +"[{blocked_user}]({user_url}){comment}" -#: rcgcdw.py:340 +#: src/rc_formatters.py:139 #, python-brace-format msgid "" "[{author}]({author_url}) unblocked [{blocked_user}]({user_url}){comment}" msgstr "" +"[{author}]({author_url}) desbloqueou [{blocked_user}]({user_url}){comment}" -#: rcgcdw.py:343 -#, fuzzy, python-brace-format -#| msgid "Left a comment on {target}'s profile" +#: src/rc_formatters.py:142 +#, python-brace-format msgid "" "[{author}]({author_url}) left a [comment]({comment}) on {target} profile" -msgstr "Deixou um comentário no perfil de {target}" +msgstr "" +"[{author}]({author_url}) deixou um [comentário]({comment}) no perfil de " +"{target}" -#: rcgcdw.py:343 -#, fuzzy -#| msgid "Edited their own profile" +#: src/rc_formatters.py:142 msgid "their own profile" -msgstr "Editou seu próprio perfil" +msgstr "seu próprio perfil" -#: rcgcdw.py:346 -#, fuzzy, python-brace-format -#| msgid "Replied to a comment on {target}'s profile" +#: src/rc_formatters.py:145 +#, python-brace-format msgid "" "[{author}]({author_url}) replied to a [comment]({comment}) on {target} " "profile" -msgstr "Respondeu a um comentário no perfil de {target}" - -#: rcgcdw.py:349 rcgcdw.py:355 rcgcdw.py:366 rcgcdw.py:370 -msgid "their own" msgstr "" +"[{author}]({author_url}) respondeu a um [comentário]({comment}) no perfil de " +"{target}" -#: rcgcdw.py:352 -#, fuzzy, python-brace-format -#| msgid "Edited a comment on {target}'s profile" +#: src/rc_formatters.py:148 src/rc_formatters.py:154 src/rc_formatters.py:165 +#: src/rc_formatters.py:169 +msgid "their own" +msgstr "próprio" + +#: src/rc_formatters.py:151 +#, python-brace-format msgid "" "[{author}]({author_url}) edited a [comment]({comment}) on {target} profile" -msgstr "Editou um comentário no perfil de {target}" +msgstr "" +"[{author}]({author_url}) editou um [comentário]({comment}) no perfil de " +"{target}" -#: rcgcdw.py:358 +#: src/rc_formatters.py:157 #, python-brace-format msgid "[{author}]({author_url}) purged a comment on {target} profile" msgstr "[{author}]({author_url}) limpou um comentário no perfil {target}" -#: rcgcdw.py:368 -#, fuzzy, python-brace-format -#| msgid "Deleted a comment on {target}'s profile" +#: src/rc_formatters.py:167 +#, python-brace-format msgid "[{author}]({author_url}) deleted a comment on {target} profile" -msgstr "Excluiu um comentário no perfil de {target}" +msgstr "[{author}]({author_url}) excluiu um comentário no perfil de {target}" -#: rcgcdw.py:374 +#: src/rc_formatters.py:173 #, python-brace-format msgid "[{target}]({target_url})'s" -msgstr "" +msgstr "[{target}]({target_url})" -#: rcgcdw.py:374 +#: src/rc_formatters.py:173 #, python-brace-format msgid "[their own]({target_url})" -msgstr "" +msgstr "[seu próprio]({target_url})" -#: rcgcdw.py:375 +#: src/rc_formatters.py:174 #, python-brace-format msgid "" "[{author}]({author_url}) edited the {field} on {target} profile. *({desc})*" msgstr "" +"[{author}]({author_url}) editou o {field} no perfil de {target}. *({desc})*" -#: rcgcdw.py:389 rcgcdw.py:391 rcgcdw.py:800 rcgcdw.py:802 +#: src/rc_formatters.py:188 src/rc_formatters.py:190 src/rc_formatters.py:612 +#: src/rc_formatters.py:614 msgid "none" msgstr "nenhum" -#: rcgcdw.py:397 rcgcdw.py:787 +#: src/rc_formatters.py:196 src/rc_formatters.py:599 msgid "System" msgstr "Sistema" -#: rcgcdw.py:402 +#: src/rc_formatters.py:201 #, python-brace-format msgid "" "[{author}]({author_url}) protected [{article}]({article_url}) with the " "following settings: {settings}{comment}" msgstr "" +"[{author}]({author_url})protegeu [{article}]({article_url}) com as seguintes " +"configurações: {settings}{comment}" -#: rcgcdw.py:404 rcgcdw.py:412 rcgcdw.py:810 rcgcdw.py:816 +#: src/rc_formatters.py:203 src/rc_formatters.py:211 src/rc_formatters.py:622 +#: src/rc_formatters.py:628 msgid " [cascading]" msgstr " [em cascata]" -#: rcgcdw.py:409 +#: src/rc_formatters.py:208 #, python-brace-format msgid "" "[{author}]({author_url}) modified protection settings of [{article}]" "({article_url}) to: {settings}{comment}" msgstr "" +"[{author}]({author_url}) modificou as configurações de proteção de " +"[{article}]({article_url}) para: {settings}{comment}" -#: rcgcdw.py:416 +#: src/rc_formatters.py:215 #, python-brace-format msgid "" "[{author}]({author_url}) removed protection from [{article}]({article_url})" "{comment}" msgstr "" +"[{author}]({author_url}) removeu a proteção para [{article}]({article_url})" +"{comment}" -#: rcgcdw.py:420 -#, fuzzy, python-brace-format -#| msgid "Changed visibility of revision on page {article} " -#| msgid_plural "Changed visibility of {amount} revisions on page {article} " +#: src/rc_formatters.py:219 +#, python-brace-format msgid "" "[{author}]({author_url}) changed visibility of revision on page [{article}]" "({article_url}){comment}" msgid_plural "" "[{author}]({author_url}) changed visibility of {amount} revisions on page " "[{article}]({article_url}){comment}" -msgstr[0] "Visibilidade alterada da revisão na página {article} " -msgstr[1] "Visibilidade alterada de {amount} revisões na página {article} " +msgstr[0] "" +"[{author}]({author_url}) mudou a visibilidade da revisão na página[{article}]" +"({article_url}){comment}" +msgstr[1] "" +"[{author}]({author_url}) mudou a visibilidade da revisão {amount} na página " +"[{article}]({article_url}){comment}" -#: rcgcdw.py:425 +#: src/rc_formatters.py:224 #, python-brace-format msgid "" "[{author}]({author_url}) imported [{article}]({article_url}) with {count} " @@ -307,194 +479,236 @@ msgid_plural "" "[{author}]({author_url}) imported [{article}]({article_url}) with {count} " "revisions{comment}" msgstr[0] "" +"[{author}]({author_url}) importou [{article}]({article_url}) com {count} " +"revisão{comment}" msgstr[1] "" +"[{author}]({author_url}) importou [{article}]({article_url}) com {count} " +"revisões{comment}" -#: rcgcdw.py:430 +#: src/rc_formatters.py:229 #, python-brace-format msgid "[{author}]({author_url}) restored [{article}]({article_url}){comment}" -msgstr "" +msgstr "[{author}]({author_url}) restaurou [{article}]({article_url}){comment}" -#: rcgcdw.py:432 -#, fuzzy, python-brace-format -#| msgid "Changed visibility of log events" +#: src/rc_formatters.py:231 +#, python-brace-format msgid "[{author}]({author_url}) changed visibility of log events{comment}" -msgstr "Visibilidade alterada de eventos de registros" +msgstr "" +"[{author}]({author_url}) mudou a visibilidade dos eventos de " +"registro{comment}" -#: rcgcdw.py:434 +#: src/rc_formatters.py:233 #, python-brace-format msgid "[{author}]({author_url}) imported interwiki{comment}" -msgstr "" +msgstr "[{author}]({author_url}) importou a interwiki{comment}" -#: rcgcdw.py:437 -#, fuzzy, python-brace-format -#| msgid "Edited abuse filter number {number}" +#: src/rc_formatters.py:236 +#, python-brace-format msgid "" "[{author}]({author_url}) edited abuse filter [number {number}]({filter_url})" -msgstr "Número de filtro de abuso editado {number}" +msgstr "" +"[{author}]({author_url}) editou o filtro de abuso [number {number}]" +"({filter_url})" -#: rcgcdw.py:440 -#, fuzzy, python-brace-format -#| msgid "Created abuse filter number {number}" +#: src/rc_formatters.py:240 +#, python-brace-format msgid "" "[{author}]({author_url}) created abuse filter [number {number}]({filter_url})" -msgstr "Criado filtro de abuso número {number}" +msgstr "" +"[{author}]({author_url}) criou o filtro de abuso [number {number}]" +"({filter_url})" -#: rcgcdw.py:444 +#: src/rc_formatters.py:244 #, python-brace-format msgid "" "[{author}]({author_url}) merged revision histories of [{article}]" "({article_url}) into [{dest}]({dest_url}){comment}" msgstr "" +"[{author}]({author_url}) mesclou o histórico de revisão de [{article}]" +"({article_url}) para [{dest}]({dest_url}){comment}" -#: rcgcdw.py:448 +#: src/rc_formatters.py:248 +#, fuzzy, python-brace-format +msgid "Account [{author}]({author_url}) was created automatically" +msgstr "[{author}]({author_url}) criou tabela no Cargo \"{table}\"" + +#: src/rc_formatters.py:251 src/rc_formatters.py:260 +#, fuzzy, python-brace-format +msgid "Account [{author}]({author_url}) was created" +msgstr "[{author}]({author_url}) criou tabela no Cargo \"{table}\"" + +#: src/rc_formatters.py:254 +#, fuzzy, python-brace-format +msgid "" +"Account [{article}]({article_url}) was created by [{author}]({author_url})" +"{comment}" +msgstr "[{author}]({author_url}) restaurou [{article}]({article_url}){comment}" + +#: src/rc_formatters.py:257 +#, python-brace-format +msgid "" +"Account [{article}]({article_url}) was created by [{author}]({author_url}) " +"and password was sent by email{comment}" +msgstr "" + +#: src/rc_formatters.py:263 #, python-brace-format msgid "" "[{author}]({author_url}) added an entry to the [interwiki table]" "({table_url}) pointing to {website} with {prefix} prefix" msgstr "" +"[{author}]({author_url}) adicionou uma entrada à [tabela de interwiki]" +"({table_url}) apontando para {website} com o prefixo {prefix}" -#: rcgcdw.py:454 +#: src/rc_formatters.py:269 #, python-brace-format msgid "" "[{author}]({author_url}) edited an entry in [interwiki table]({table_url}) " "pointing to {website} with {prefix} prefix" msgstr "" +"[{author}]({author_url}) editou uma entrada na [tabela de Interwiki]" +"({table_url}) apontando para {website} com o prefixo {prefix}" -#: rcgcdw.py:460 -#, fuzzy, python-brace-format -#| msgid "Deleted an entry in interwiki table" +#: src/rc_formatters.py:275 +#, python-brace-format msgid "" "[{author}]({author_url}) deleted an entry in [interwiki table]({table_url})" -msgstr "Excluiu uma entrada na tabela interwiki" +msgstr "" +"[{author}]({author_url}) excluiu uma entrada na [tabela de Interwiki]" +"({table_url})" -#: rcgcdw.py:463 +#: src/rc_formatters.py:278 #, python-brace-format msgid "" "[{author}]({author_url}) changed the content model of the page [{article}]" "({article_url}) from {old} to {new}{comment}" msgstr "" +"[{author}]({author_url}) mudou o modelo de conteúdo da página [{article}]" +"({article_url}) de {old} para {new}{comment}" -#: rcgcdw.py:467 +#: src/rc_formatters.py:282 #, python-brace-format msgid "" "[{author}]({author_url}) edited the sprite for [{article}]({article_url})" msgstr "" +"[{author}]({author_url}) editou o sprite para [{article}]({article_url})" -#: rcgcdw.py:470 -#, fuzzy, python-brace-format -#| msgid "Created the sprite sheet for {article}" +#: src/rc_formatters.py:285 +#, python-brace-format msgid "" "[{author}]({author_url}) created the sprite sheet for [{article}]" "({article_url})" -msgstr "Criou a folha de sprites para {article}" +msgstr "" +"[{author}]({author_url})criou a folha de sprite para [{article}]" +"({article_url})" -#: rcgcdw.py:473 +#: src/rc_formatters.py:288 #, python-brace-format msgid "" "[{author}]({author_url}) edited the slice for [{article}]({article_url})" -msgstr "" +msgstr "[{author}]({author_url}) editou a peça para [{article}]({article_url})" -#: rcgcdw.py:478 +#: src/rc_formatters.py:293 #, python-brace-format msgid "[{author}]({author_url}) created the Cargo table \"{table}\"" msgstr "[{author}]({author_url}) criou tabela no Cargo \"{table}\"" -#: rcgcdw.py:480 +#: src/rc_formatters.py:295 #, python-brace-format msgid "[{author}]({author_url}) deleted the Cargo table \"{table}\"" -msgstr "[{author}]({author_url}) excluiu a tabela no Cargo \"{table}\"" +msgstr "[{author}]({author_url}) excluiu a tabela no Cargo \"{table}\"" -#: rcgcdw.py:485 +#: src/rc_formatters.py:300 #, python-brace-format msgid "[{author}]({author_url}) recreated the Cargo table \"{table}\"" -msgstr "[{author}]({author_url}) recriou a tabela no Cargo \"{table}\"" +msgstr "[{author}]({author_url}) recriou a tabela no Cargo \"{table}\"" -#: rcgcdw.py:490 +#: src/rc_formatters.py:305 #, python-brace-format msgid "[{author}]({author_url}) replaced the Cargo table \"{table}\"" -msgstr "[{author}]({author_url}) substituiu a tabela no Cargo \"{table}\"" +msgstr "[{author}]({author_url}) substituiu a tabela no Cargo \"{table}\"" -#: rcgcdw.py:493 +#: src/rc_formatters.py:308 #, python-brace-format msgid "[{author}]({author_url}) created a [tag]({tag_url}) \"{tag}\"" -msgstr "" +msgstr "[{author}]({author_url}) criou a [marcação]({tag_url}) \"{tag}\"" -#: rcgcdw.py:497 +#: src/rc_formatters.py:312 #, python-brace-format msgid "[{author}]({author_url}) deleted a [tag]({tag_url}) \"{tag}\"" -msgstr "" +msgstr "[{author}]({author_url}) excluiu a [marcação]({tag_url}) \"{tag}\"" -#: rcgcdw.py:501 +#: src/rc_formatters.py:316 #, python-brace-format msgid "[{author}]({author_url}) activated a [tag]({tag_url}) \"{tag}\"" -msgstr "" +msgstr "[{author}]({author_url}) ativou a [marcação]({tag_url}) \"{tag}\"" -#: rcgcdw.py:504 +#: src/rc_formatters.py:319 #, python-brace-format msgid "[{author}]({author_url}) deactivated a [tag]({tag_url}) \"{tag}\"" -msgstr "" +msgstr "[{author}]({author_url}) desativou a [marcação]({tag_url}) \"{tag}\"" -#: rcgcdw.py:506 +#: src/rc_formatters.py:321 msgid "An action has been hidden by administration." -msgstr "" +msgstr "Uma ação foi ocultada pela administração." -#: rcgcdw.py:515 rcgcdw.py:803 +#: src/rc_formatters.py:331 src/rc_formatters.py:615 msgid "No description provided" msgstr "Nenhuma descrição fornecida" -#: rcgcdw.py:563 +#: src/rc_formatters.py:378 msgid "(N!) " msgstr "(N!) " -#: rcgcdw.py:564 +#: src/rc_formatters.py:379 msgid "m" msgstr "m" -#: rcgcdw.py:564 +#: src/rc_formatters.py:379 msgid "b" msgstr "b" -#: rcgcdw.py:583 rcgcdw.py:588 +#: src/rc_formatters.py:396 src/rc_formatters.py:401 msgid "__Only whitespace__" msgstr "__Apenas espaço em branco__" -#: rcgcdw.py:594 +#: src/rc_formatters.py:406 msgid "Removed" msgstr "Removido" -#: rcgcdw.py:597 +#: src/rc_formatters.py:408 msgid "Added" msgstr "Adicionado" -#: rcgcdw.py:631 rcgcdw.py:669 +#: src/rc_formatters.py:442 src/rc_formatters.py:481 msgid "Options" msgstr "Opções" -#: rcgcdw.py:631 +#: src/rc_formatters.py:442 #, python-brace-format msgid "([preview]({link}) | [undo]({undolink}))" msgstr "([visualização]({link}) | [desfazer]({undolink}))" -#: rcgcdw.py:634 +#: src/rc_formatters.py:447 #, python-brace-format msgid "Uploaded a new version of {name}" msgstr "Carregou uma nova versão de {name}" -#: rcgcdw.py:636 +#: src/rc_formatters.py:449 #, python-brace-format msgid "Reverted a version of {name}" msgstr "Reverteu uma versão do {name}" -#: rcgcdw.py:638 +#: src/rc_formatters.py:451 #, python-brace-format msgid "Uploaded {name}" msgstr "Carregado {name}" -#: rcgcdw.py:654 +#: src/rc_formatters.py:467 msgid "**No license!**" msgstr "* * Sem licença!* *" -#: rcgcdw.py:666 +#: src/rc_formatters.py:479 msgid "" "\n" "License: {}" @@ -502,520 +716,333 @@ msgstr "" "\n" "Licença: {}" -#: rcgcdw.py:669 +#: src/rc_formatters.py:481 #, python-brace-format msgid "([preview]({link}))" msgstr "([visualização]({link}))" -#: rcgcdw.py:673 +#: src/rc_formatters.py:486 #, python-brace-format msgid "Deleted page {article}" msgstr "Página {article} excluída" -#: rcgcdw.py:676 +#: src/rc_formatters.py:489 #, python-brace-format msgid "Deleted redirect {article} by overwriting" msgstr "Redirecionado {article} excluído por sobrescrevendo" -#: rcgcdw.py:680 +#: src/rc_formatters.py:493 msgid "No redirect has been made" msgstr "Nenhum redirecionamento foi feito" -#: rcgcdw.py:681 +#: src/rc_formatters.py:494 msgid "A redirect has been made" msgstr "Foi feito um redirecionamento" -#: rcgcdw.py:682 +#: src/rc_formatters.py:495 #, python-brace-format msgid "Moved {redirect}{article} to {target}" msgstr "Movido {redirect}{article} para {target}" -#: rcgcdw.py:685 +#: src/rc_formatters.py:498 #, python-brace-format msgid "Moved {redirect}{article} to {title} over redirect" msgstr "Movido {redirect}{article} para {title} ao redirecionar" -#: rcgcdw.py:689 +#: src/rc_formatters.py:502 #, python-brace-format msgid "Moved protection settings from {redirect}{article} to {title}" msgstr "Configurações de proteção movidos de {redirect}{article} para {title}" -#: rcgcdw.py:712 +#: src/rc_formatters.py:527 msgid "Blocked from editing the following pages: " msgstr "Bloqueado de editar as seguintes páginas: " -#: rcgcdw.py:721 +#: src/rc_formatters.py:536 msgid "Blocked from editing pages on following namespaces: " msgstr "Bloqueado de editar páginas nos seguintes espaços nominais: " -#: rcgcdw.py:735 +#: src/rc_formatters.py:547 msgid "Partial block details" msgstr "Detalhes do bloqueio parcial" -#: rcgcdw.py:736 -#, python-brace-format -msgid "Blocked {blocked_user} for {time}" +#: src/rc_formatters.py:548 +#, fuzzy, python-brace-format +msgid "Blocked {blocked_user} {time}" msgstr "Bloqueado {blocked_user} por {time}" -#: rcgcdw.py:740 +#: src/rc_formatters.py:552 #, python-brace-format msgid "Changed block settings for {blocked_user}" msgstr "Configurações de bloqueio alteradas para {blocked_user}" -#: rcgcdw.py:744 +#: src/rc_formatters.py:556 #, python-brace-format msgid "Unblocked {blocked_user}" msgstr "Desbloqueado {blocked_user}" -#: rcgcdw.py:749 +#: src/rc_formatters.py:561 #, python-brace-format msgid "Left a comment on {target}'s profile" msgstr "Deixou um comentário no perfil de {target}" -#: rcgcdw.py:751 +#: src/rc_formatters.py:563 msgid "Left a comment on their own profile" msgstr "Deixou um comentário em seu próprio perfil" -#: rcgcdw.py:756 +#: src/rc_formatters.py:568 #, python-brace-format msgid "Replied to a comment on {target}'s profile" msgstr "Respondeu a um comentário no perfil de {target}" -#: rcgcdw.py:758 +#: src/rc_formatters.py:570 msgid "Replied to a comment on their own profile" msgstr "Respondeu a um comentário em seu próprio perfil" -#: rcgcdw.py:763 +#: src/rc_formatters.py:575 #, python-brace-format msgid "Edited a comment on {target}'s profile" msgstr "Editou um comentário no perfil de {target}" -#: rcgcdw.py:765 +#: src/rc_formatters.py:577 msgid "Edited a comment on their own profile" msgstr "Editou um comentário em seu próprio perfil" -#: rcgcdw.py:768 +#: src/rc_formatters.py:580 #, python-brace-format msgid "Edited {target}'s profile" msgstr "Editado perfil {target}" -#: rcgcdw.py:768 +#: src/rc_formatters.py:580 msgid "Edited their own profile" msgstr "Editou seu próprio perfil" -#: rcgcdw.py:770 +#: src/rc_formatters.py:582 #, python-brace-format msgid "Cleared the {field} field" -msgstr "" +msgstr "Limpo o campo {field}" -#: rcgcdw.py:772 +#: src/rc_formatters.py:584 #, python-brace-format msgid "{field} field changed to: {desc}" msgstr "campo {field} alterado para: {desc}" -#: rcgcdw.py:775 +#: src/rc_formatters.py:587 #, python-brace-format msgid "Purged a comment on {target}'s profile" msgstr "Eliminou um comentário no perfil de {target}" -#: rcgcdw.py:781 +#: src/rc_formatters.py:593 #, python-brace-format msgid "Deleted a comment on {target}'s profile" msgstr "Excluiu um comentário no perfil de {target}" -#: rcgcdw.py:785 +#: src/rc_formatters.py:597 #, python-brace-format msgid "Changed group membership for {target}" msgstr "Alterado grupo do membro de {target}" -#: rcgcdw.py:789 +#: src/rc_formatters.py:601 #, python-brace-format msgid "{target} got autopromoted to a new usergroup" msgstr "{target} recebeu um promovido para um novo grupo de usuários" -#: rcgcdw.py:804 +#: src/rc_formatters.py:616 #, python-brace-format msgid "Groups changed from {old_groups} to {new_groups}{reason}" msgstr "Grupos alterados de {old_groups} para {new_groups} {reason}" -#: rcgcdw.py:808 +#: src/rc_formatters.py:620 #, python-brace-format msgid "Protected {target}" msgstr "Protegido {target}" -#: rcgcdw.py:814 +#: src/rc_formatters.py:626 #, python-brace-format msgid "Changed protection level for {article}" msgstr "Nível de proteção alterado para {article}" -#: rcgcdw.py:820 +#: src/rc_formatters.py:632 #, python-brace-format msgid "Removed protection from {article}" msgstr "Removida a proteção de {article}" -#: rcgcdw.py:824 +#: src/rc_formatters.py:636 #, python-brace-format msgid "Changed visibility of revision on page {article} " msgid_plural "Changed visibility of {amount} revisions on page {article} " msgstr[0] "Visibilidade alterada da revisão na página {article} " msgstr[1] "Visibilidade alterada de {amount} revisões na página {article} " -#: rcgcdw.py:829 +#: src/rc_formatters.py:641 #, python-brace-format msgid "Imported {article} with {count} revision" msgid_plural "Imported {article} with {count} revisions" msgstr[0] "Importou {article} com {count} revisão" msgstr[1] "{article} importado com {count} revisões" -#: rcgcdw.py:834 +#: src/rc_formatters.py:646 #, python-brace-format msgid "Restored {article}" msgstr "Página {article} excluída" -#: rcgcdw.py:837 +#: src/rc_formatters.py:649 msgid "Changed visibility of log events" msgstr "Visibilidade alterada de eventos de registros" -#: rcgcdw.py:840 +#: src/rc_formatters.py:652 msgid "Imported interwiki" msgstr "Interwiki importado" -#: rcgcdw.py:843 +#: src/rc_formatters.py:655 #, python-brace-format msgid "Edited abuse filter number {number}" msgstr "Número de filtro de abuso editado {number}" -#: rcgcdw.py:846 +#: src/rc_formatters.py:658 #, python-brace-format msgid "Created abuse filter number {number}" msgstr "Criado filtro de abuso número {number}" -#: rcgcdw.py:849 +#: src/rc_formatters.py:661 #, python-brace-format msgid "Merged revision histories of {article} into {dest}" msgstr "Históricos de revisão mesclados de {article} em {dest}" -#: rcgcdw.py:853 +#: src/rc_formatters.py:665 +msgid "Created account automatically" +msgstr "" + +#: src/rc_formatters.py:668 src/rc_formatters.py:677 +msgid "Created account" +msgstr "" + +#: src/rc_formatters.py:671 +#, fuzzy, python-brace-format +msgid "Created account {article}" +msgstr "Página {article} excluída" + +#: src/rc_formatters.py:674 +#, python-brace-format +msgid "Created account {article} and password was sent by email" +msgstr "" + +#: src/rc_formatters.py:680 msgid "Added an entry to the interwiki table" msgstr "Adicionado uma entrada para a tabela interwiki" -#: rcgcdw.py:854 rcgcdw.py:860 +#: src/rc_formatters.py:681 src/rc_formatters.py:687 #, python-brace-format msgid "Prefix: {prefix}, website: {website} | {desc}" msgstr "Prefixo: {prefix}, site: {website} | {desc}" -#: rcgcdw.py:859 +#: src/rc_formatters.py:686 msgid "Edited an entry in interwiki table" msgstr "Editou uma entrada na tabela interwiki" -#: rcgcdw.py:865 +#: src/rc_formatters.py:692 msgid "Deleted an entry in interwiki table" msgstr "Excluiu uma entrada na tabela interwiki" -#: rcgcdw.py:866 +#: src/rc_formatters.py:693 #, python-brace-format msgid "Prefix: {prefix} | {desc}" msgstr "Prefixo: {prefix} | {desc}" -#: rcgcdw.py:869 +#: src/rc_formatters.py:696 #, python-brace-format msgid "Changed the content model of the page {article}" msgstr "Alterou o modelo de conteúdo da página {article}" -#: rcgcdw.py:870 +#: src/rc_formatters.py:697 #, python-brace-format msgid "Model changed from {old} to {new}: {reason}" msgstr "Modelo alterado de {old} para {new}: {reason}" -#: rcgcdw.py:875 +#: src/rc_formatters.py:702 #, python-brace-format msgid "Edited the sprite for {article}" msgstr "Editou o sprite para {article}" -#: rcgcdw.py:878 +#: src/rc_formatters.py:705 #, python-brace-format msgid "Created the sprite sheet for {article}" msgstr "Criou a folha de sprites para {article}" -#: rcgcdw.py:881 +#: src/rc_formatters.py:708 #, python-brace-format msgid "Edited the slice for {article}" msgstr "Editou a fatia de {article}" -#: rcgcdw.py:887 +#: src/rc_formatters.py:714 #, python-brace-format msgid "Created the Cargo table \"{table}\"" msgstr "Criou a tabela no Cargo \"{table}\"" -#: rcgcdw.py:891 +#: src/rc_formatters.py:718 #, python-brace-format msgid "Deleted the Cargo table \"{table}\"" msgstr "Excluiu a tabela no Cargo \"{table}\"" -#: rcgcdw.py:898 +#: src/rc_formatters.py:725 #, python-brace-format msgid "Recreated the Cargo table \"{table}\"" msgstr "Recriou a tabela no Cargo \"{table}\"" -#: rcgcdw.py:905 +#: src/rc_formatters.py:732 #, python-brace-format msgid "Replaced the Cargo table \"{table}\"" msgstr "Substituiu a tabela no Cargo \"{table}\"" -#: rcgcdw.py:909 +#: src/rc_formatters.py:736 #, python-brace-format msgid "Created a tag \"{tag}\"" msgstr "Criei uma etiqueta \"{tag}\"" -#: rcgcdw.py:913 +#: src/rc_formatters.py:740 #, python-brace-format msgid "Deleted a tag \"{tag}\"" msgstr "Excluiu uma etiqueta \"{tag}\"" -#: rcgcdw.py:917 +#: src/rc_formatters.py:744 #, python-brace-format msgid "Activated a tag \"{tag}\"" msgstr "Ativou uma etiqueta \"{tag}\"" -#: rcgcdw.py:920 +#: src/rc_formatters.py:747 #, python-brace-format msgid "Deactivated a tag \"{tag}\"" msgstr "Desativou uma etiqueta \"{tag}\"" -#: rcgcdw.py:923 -msgid "Action has been hidden by administration." -msgstr "" +#: src/rc_formatters.py:750 +#, fuzzy +msgid "Action has been hidden by administration" +msgstr "A ação foi ocultada pela administração." -#: rcgcdw.py:951 +#: src/rc_formatters.py:751 +msgid "Unknown" +msgstr "Desconhecido" + +#: src/rc_formatters.py:770 msgid "Tags" msgstr "Etiquetas" -#: rcgcdw.py:956 +#: src/rc_formatters.py:773 msgid "**Added**: " msgstr "**Adicionado**: " -#: rcgcdw.py:956 +#: src/rc_formatters.py:773 msgid " and {} more\n" msgstr " e {} mais\n" -#: rcgcdw.py:957 +#: src/rc_formatters.py:774 msgid "**Removed**: " msgstr "**Removida**: " -#: rcgcdw.py:957 +#: src/rc_formatters.py:774 msgid " and {} more" msgstr " e {} mais" -#: rcgcdw.py:958 +#: src/rc_formatters.py:775 msgid "Changed categories" msgstr "Mudanças de categorias" - -#: rcgcdw.py:977 -msgid "~~hidden~~" -msgstr "" - -#: rcgcdw.py:983 -msgid "hidden" -msgstr "" - -#: rcgcdw.py:1050 rcgcdw.py:1052 rcgcdw.py:1054 rcgcdw.py:1056 rcgcdw.py:1058 -#: rcgcdw.py:1060 rcgcdw.py:1062 -#, python-brace-format -msgid "{value} (avg. {avg})" -msgstr "" - -#: rcgcdw.py:1086 rcgcdw.py:1114 -msgid "Daily overview" -msgstr "Visão geral diária" - -#: rcgcdw.py:1088 -msgid "No activity" -msgstr "Sem atividade" - -#: rcgcdw.py:1123 -msgid " ({} action)" -msgid_plural " ({} actions)" -msgstr[0] " ({} açao)" -msgstr[1] " ({} ações)" - -#: rcgcdw.py:1125 -msgid " ({} edit)" -msgid_plural " ({} edits)" -msgstr[0] " ({} editado)" -msgstr[1] " ({} edições)" - -#: rcgcdw.py:1130 -msgid " UTC ({} action)" -msgid_plural " UTC ({} actions)" -msgstr[0] " UTC ({} ação)" -msgstr[1] " UTC ({} ações)" - -#: rcgcdw.py:1132 rcgcdw.py:1133 rcgcdw.py:1137 -msgid "But nobody came" -msgstr "Mas ninguém veio" - -#: rcgcdw.py:1141 -msgid "Most active user" -msgid_plural "Most active users" -msgstr[0] "Usuário mais ativo" -msgstr[1] "Usuários mais ativos" - -#: rcgcdw.py:1142 -msgid "Most edited article" -msgid_plural "Most edited articles" -msgstr[0] "Artigo mais editado" -msgstr[1] "Artigos mais editados" - -#: rcgcdw.py:1143 -msgid "Edits made" -msgstr "Edições feitas" - -#: rcgcdw.py:1143 -msgid "New files" -msgstr "Novos arquivos" - -#: rcgcdw.py:1143 -msgid "Admin actions" -msgstr "Ações de administração" - -#: rcgcdw.py:1144 -msgid "Bytes changed" -msgstr "Bytes alterados" - -#: rcgcdw.py:1144 -msgid "New articles" -msgstr "Novos artigos" - -#: rcgcdw.py:1145 -msgid "Unique contributors" -msgstr "Contribuidores exclusivos" - -#: rcgcdw.py:1146 -msgid "Most active hour" -msgid_plural "Most active hours" -msgstr[0] "Hora mais ativa" -msgstr[1] "Horas mais ativas" - -#: rcgcdw.py:1147 -msgid "Day score" -msgstr "Pontuação do dia" - -#: rcgcdw.py:1291 -#, python-brace-format -msgid "Connection to {wiki} seems to be stable now." -msgstr "A conexão com {wiki} parece estar estável agora." - -#: rcgcdw.py:1292 rcgcdw.py:1407 -msgid "Connection status" -msgstr "Status da conexão" - -#: rcgcdw.py:1406 -#, python-brace-format -msgid "{wiki} seems to be down or unreachable." -msgstr "{wiki} parece estar inativo ou inacessível." - -#: rcgcdw.py:1465 -msgid "director" -msgstr "diretor" - -#: rcgcdw.py:1465 -msgid "bot" -msgstr "robô" - -#: rcgcdw.py:1465 -msgid "editor" -msgstr "editor" - -#: rcgcdw.py:1465 -msgid "directors" -msgstr "diretores" - -#: rcgcdw.py:1465 -msgid "sysop" -msgstr "administrador" - -#: rcgcdw.py:1465 -msgid "bureaucrat" -msgstr "burocrata" - -#: rcgcdw.py:1465 -msgid "reviewer" -msgstr "revisor" - -#: rcgcdw.py:1466 -msgid "autoreview" -msgstr "revisão automática" - -#: rcgcdw.py:1466 -msgid "autopatrol" -msgstr "patrulha automatica" - -#: rcgcdw.py:1466 -msgid "wiki_guardian" -msgstr "guardião_wiki" - -#: rcgcdw.py:1466 -msgid "second" -msgid_plural "seconds" -msgstr[0] "segundo" -msgstr[1] "segundos" - -#: rcgcdw.py:1466 -msgid "minute" -msgid_plural "minutes" -msgstr[0] "minuto" -msgstr[1] "minutos" - -#: rcgcdw.py:1466 -msgid "hour" -msgid_plural "hours" -msgstr[0] "hora" -msgstr[1] "horas" - -#: rcgcdw.py:1466 -msgid "day" -msgid_plural "days" -msgstr[0] "dia" -msgstr[1] "dias" - -#: rcgcdw.py:1466 -msgid "week" -msgid_plural "weeks" -msgstr[0] "semana" -msgstr[1] "semanas" - -#: rcgcdw.py:1466 -msgid "month" -msgid_plural "months" -msgstr[0] "" -msgstr[1] "" - -#: rcgcdw.py:1466 -msgid "year" -msgid_plural "years" -msgstr[0] "ano" -msgstr[1] "anos" - -#: rcgcdw.py:1466 -msgid "millennium" -msgid_plural "millennia" -msgstr[0] "milénio" -msgstr[1] "milénios" - -#: rcgcdw.py:1466 -msgid "decade" -msgid_plural "decades" -msgstr[0] "década" -msgstr[1] "décadas" - -#: rcgcdw.py:1466 -msgid "century" -msgid_plural "centuries" -msgstr[0] "século" -msgstr[1] "séculos" - -#~ msgid "Unable to process the event" -#~ msgstr "Não é possível processar o evento" - -#~ msgid "error" -#~ msgstr "erro" diff --git a/locale/pt-br/LC_MESSAGES/rcgcdw.mo b/locale/pt-br/LC_MESSAGES/rcgcdw.mo deleted file mode 100644 index faca48a56ab77c22cbea806c7a3a5095124ee090..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11239 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 diff --git a/locale/pt-br/LC_MESSAGES/wiki.po b/locale/pt-br/LC_MESSAGES/wiki.po new file mode 100644 index 0000000..563cb2a --- /dev/null +++ b/locale/pt-br/LC_MESSAGES/wiki.po @@ -0,0 +1,42 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +msgid "" +msgstr "" +"Project-Id-Version: \n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2020-08-08 17:22+0200\n" +"PO-Revision-Date: 2020-08-10 01:55+0200\n" +"Last-Translator: Eduaddad \n" +"Language-Team: Portuguese (Brazil) \n" +"Language: pt_BR\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=n > 1;\n" +"X-Generator: Poedit 2.3.1\n" + +#: src/rc.py:150 +#, python-brace-format +msgid "Connection to {wiki} seems to be stable now." +msgstr "A conexão com {wiki} parece estar estável agora." + +#: src/rc.py:151 src/rc.py:266 +msgid "Connection status" +msgstr "Status da conexão" + +#: src/rc.py:265 +#, python-brace-format +msgid "{wiki} seems to be down or unreachable." +msgstr "{wiki} parece estar inativo ou inacessível." + +#: src/rc.py:334 +msgid "~~hidden~~" +msgstr "~~ocultado~~" + +#: src/rc.py:340 +msgid "hidden" +msgstr "oculto" diff --git a/locale/pt-br/LC_MESSAGES/.gitkeep b/scripts/generate_translations.sh similarity index 100% rename from locale/pt-br/LC_MESSAGES/.gitkeep rename to scripts/generate_translations.sh diff --git a/src/bot.py b/src/bot.py index aa71c6d..4089ffd 100644 --- a/src/bot.py +++ b/src/bot.py @@ -116,7 +116,7 @@ class RcQueue: except ValueError: pass try: - current_domain = self[domain] + current_domain: dict = self[domain] if not db_wiki["ROWID"] < current_domain["last_rowid"]: current_domain["query"].append(QueuedWiki(db_wiki["wiki"], 20)) except KeyError: diff --git a/src/discord.py b/src/discord.py index d1ebae9..41e3d91 100644 --- a/src/discord.py +++ b/src/discord.py @@ -23,7 +23,7 @@ async def wiki_removal(wiki_url, status): for observer in db_cursor.execute('SELECT webhook, lang FROM rcgcdw WHERE wiki = ?', (wiki_url,)): def _(string: str) -> str: """Our own translation string to make it compatible with async""" - return langs[observer["lang"]].gettext(string) + return langs[observer["lang"]]["discord"].gettext(string) reasons = {410: _("wiki deletion"), 404: _("wiki deletion"), 401: _("wiki becoming inaccessible"), 402: _("wiki becoming inaccessible"), 403: _("wiki becoming inaccessible")} reason = reasons.get(status, _("unknown error")) diff --git a/src/formatters/discussions.py b/src/formatters/discussions.py index 2de2f1e..b6e3cc9 100644 --- a/src/formatters/discussions.py +++ b/src/formatters/discussions.py @@ -6,12 +6,14 @@ from src.config import settings from src.misc import link_formatter, create_article_path, escape_formatting from src.discord import DiscordMessage from src.msgqueue import send_to_discord +from src.i18n import langs logger = logging.getLogger("rcgcdw.discussion_formatters") -async def feeds_compact_formatter(post_type, post, message_target, wiki, _): +async def feeds_compact_formatter(post_type, post, message_target, wiki): """Compact formatter for Fandom discussions.""" + _ = langs[message_target[0][0]]["discussion_formatters"].gettext message = None if post_type == "FORUM": if not post["isReply"]: @@ -47,8 +49,9 @@ async def feeds_compact_formatter(post_type, post, message_target, wiki, _): await send_to_discord(DiscordMessage("compact", "discussion", message_target[1], content=message, wiki=wiki)) -async def feeds_embed_formatter(post_type, post, message_target, wiki, _): +async def feeds_embed_formatter(post_type, post, message_target, wiki): """Embed formatter for Fandom discussions.""" + _ = langs[message_target[0][0]]["discussion_formatters"].gettext embed = DiscordMessage("embed", "discussion", message_target[1], wiki=wiki) if post_type == "FORUM": embed.set_author(post["createdBy"]["name"], "{url}f/u/{creatorId}".format(url=wiki, creatorId=post["creatorId"]), icon_url=post["createdBy"]["avatarUrl"]) diff --git a/src/formatters/rc.py b/src/formatters/rc.py index 786b052..73b7248 100644 --- a/src/formatters/rc.py +++ b/src/formatters/rc.py @@ -9,6 +9,7 @@ from src.config import settings from src.misc import link_formatter, create_article_path, parse_link, profile_field_name, ContentParser from src.discord import DiscordMessage from src.msgqueue import send_to_discord +from src.i18n import langs from bs4 import BeautifulSoup @@ -18,9 +19,11 @@ if 1 == 2: # additional translation strings in unreachable code print(_("director"), _("bot"), _("editor"), _("directors"), _("sysop"), _("bureaucrat"), _("reviewer"), _("autoreview"), _("autopatrol"), _("wiki_guardian"), ngettext("second", "seconds", 1), ngettext("minute", "minutes", 1), ngettext("hour", "hours", 1), ngettext("day", "days", 1), ngettext("week", "weeks", 1), ngettext("month", "months",1), ngettext("year", "years", 1), ngettext("millennium", "millennia", 1), ngettext("decade", "decades", 1), ngettext("century", "centuries", 1)) -async def compact_formatter(action, change, parsed_comment, categories, recent_changes, message_target, _, ngettext, paths, rate_limiter, +async def compact_formatter(action, change, parsed_comment, categories, recent_changes, message_target, paths, rate_limiter, additional_data=None): """Recent Changes compact formatter, part of RcGcDw""" + _ = langs[message_target[0][0]]["rc_formatters"].gettext + ngettext = langs[message_target[0][0]]["rc_formatters"].ngettext if additional_data is None: additional_data = {"namespaces": {}, "tags": {}} WIKI_API_PATH = paths[0] @@ -185,7 +188,7 @@ async def compact_formatter(action, change, parsed_comment, categories, recent_c content = _("[{author}]({author_url}) edited the {field} on {target} profile. *({desc})*").format(author=author, author_url=author_url, target=target, - field=profile_field_name(change["logparams"]['4:section'], False, _), + field=profile_field_name(change["logparams"]['4:section'], False, message_target[0][0]), desc=BeautifulSoup(change["parsedcomment"], "lxml").get_text()) elif action in ("rights/rights", "rights/autopromote"): link = link_formatter(create_article_path("User:{user}".format(user=change["title"].split(":")[1]), WIKI_ARTICLE_PATH)) @@ -330,8 +333,10 @@ async def compact_formatter(action, change, parsed_comment, categories, recent_c await send_to_discord(DiscordMessage("compact", action, message_target[1], content=content, wiki=WIKI_SCRIPT_PATH)) -async def embed_formatter(action, change, parsed_comment, categories, recent_changes, message_target, _, ngettext, paths, rate_limiter, additional_data=None): +async def embed_formatter(action, change, parsed_comment, categories, recent_changes, message_target, paths, rate_limiter, additional_data=None): """Recent Changes embed formatter, part of RcGcDw""" + _ = langs[message_target[0][0]]["rc_formatters"].gettext + ngettext = langs[message_target[0][0]]["rc_formatters"].ngettext if additional_data is None: additional_data = {"namespaces": {}, "tags": {}} WIKI_API_PATH = paths[0] @@ -381,7 +386,7 @@ async def embed_formatter(action, change, parsed_comment, categories, recent_cha wiki=WIKI_API_PATH, diff=change["revid"],oldrev=change["old_revid"] ), rate_limiter, "compare", "*") if changed_content: - EditDiff = ContentParser(_) + EditDiff = ContentParser(message_target[0][0]) EditDiff.feed(changed_content) if EditDiff.small_prev_del: if EditDiff.small_prev_del.replace("~~", "").isspace(): @@ -543,9 +548,9 @@ async def embed_formatter(action, change, parsed_comment, categories, recent_cha link = create_article_path("UserProfile:{target}".format(target=change["title"].split(':')[1]), WIKI_ARTICLE_PATH) embed["title"] = _("Edited {target}'s profile").format(target=change["title"].split(':')[1]) if change["user"] != change["title"].split(':')[1] else _("Edited their own profile") if not change["parsedcomment"]: # If the field is empty - parsed_comment = _("Cleared the {field} field").format(field=profile_field_name(change["logparams"]['4:section'], True, _)) + parsed_comment = _("Cleared the {field} field").format(field=profile_field_name(change["logparams"]['4:section'], True, message_target[0][0])) else: - parsed_comment = _("{field} field changed to: {desc}").format(field=profile_field_name(change["logparams"]['4:section'], True, _), desc=BeautifulSoup(change["parsedcomment"], "lxml").get_text()) + parsed_comment = _("{field} field changed to: {desc}").format(field=profile_field_name(change["logparams"]['4:section'], True, message_target[0][0]), desc=BeautifulSoup(change["parsedcomment"], "lxml").get_text()) elif action == "curseprofile/comment-purged": link = create_article_path("Special:CommentPermalink/{commentid}".format(commentid=change["logparams"]["4:comment_id"]), WIKI_ARTICLE_PATH) embed["title"] = _("Purged a comment on {target}'s profile").format(target=change["title"].split(':')[1]) diff --git a/src/i18n.py b/src/i18n.py index b7b96dd..8bdfe3d 100644 --- a/src/i18n.py +++ b/src/i18n.py @@ -1,19 +1,20 @@ import sys, logging, gettext +from collections import defaultdict logger = logging.getLogger("rcgcdb.i18n") +supported_languages = ('de', 'pl', 'pt-br') +translated_files = ('wiki', 'misc', 'discord', 'rc_formatters', 'discussion_formatters') try: - en = gettext.translation('rcgcdw', localedir='locale', languages=["en"]) - de = gettext.translation('rcgcdw', localedir='locale', languages=["de"]) - pl = gettext.translation('rcgcdw', localedir='locale', languages=["pl"]) - pt = gettext.translation('rcgcdw', localedir='locale', languages=["pt-br"]) - #ru = gettext.translation('rcgcdw', localedir='locale', languages=["ru"]) - #uk = gettext.translation('rcgcdw', localedir='locale', languages=["uk"]) - #fr = gettext.translation('rcgcdw', localedir='locale', languages=["fr"]) - langs = {"en": en, "de": de, "pl": pl, "pt": pt} - #langs = {"en": en, "de": de, "pl": pl, "pt": pt, "ru": ru, "uk": uk, "fr": fr} + langs = defaultdict(dict) + for lang in supported_languages: + for file in translated_files: + langs[lang][file] = gettext.translation(file, localedir='locale', languages=[lang]) + for file in translated_files: + langs["en"][file] = gettext.NullTranslations() except FileNotFoundError: logger.critical("No language files have been found. Make sure locale folder is located in the directory.") + raise sys.exit(1) #ngettext = en.ngettext \ No newline at end of file diff --git a/src/misc.py b/src/misc.py index a041066..eea1814 100644 --- a/src/misc.py +++ b/src/misc.py @@ -3,6 +3,7 @@ import base64, re import logging from urllib.parse import urlparse, urlunparse +from src.i18n import langs logger = logging.getLogger("rcgcdw.misc") @@ -90,7 +91,8 @@ def create_article_path(article: str, WIKI_ARTICLE_PATH: str) -> str: return WIKI_ARTICLE_PATH.replace("$1", article) -def profile_field_name(name, embed, _): +def profile_field_name(name, embed, lang): + _ = langs[lang]["misc"].gettext profile_fields = {"profile-location": _("Location"), "profile-aboutme": _("About me"), "profile-link-google": _("Google link"), "profile-link-facebook": _("Facebook link"), "profile-link-twitter": _("Twitter link"), "profile-link-reddit": _("Reddit link"), @@ -114,9 +116,9 @@ class ContentParser(HTMLParser): small_prev_del = "" added = False - def __init__(self, _): + def __init__(self, lang): super().__init__() - self.more = _("\n__And more__") + self.more = langs[lang]["misc"].gettext("\n__And more__") self.ins_length = len(self.more) self.del_length = len(self.more) diff --git a/src/wiki.py b/src/wiki.py index e59bdc4..346bcd5 100644 --- a/src/wiki.py +++ b/src/wiki.py @@ -193,18 +193,13 @@ async def process_mwmsgs(wiki_response: dict, local_wiki: Wiki, mw_msgs: dict): async def essential_info(change: dict, changed_categories, local_wiki: Wiki, target: tuple, paths: tuple, request: dict, rate_limiter: RateLimiter): """Prepares essential information for both embed and compact message format.""" - def _(string: str) -> str: - """Our own translation string to make it compatible with async""" - return lang.gettext(string) - - lang = langs[target[0][0]] - ngettext = lang.ngettext + _ = langs[target[0][0]]["wiki"].gettext # recent_changes = RecentChangesClass() # TODO Look into replacing RecentChangesClass with local_wiki changed_categories = changed_categories.get(change["revid"], None) logger.debug("List of categories in essential_info: {}".format(changed_categories)) appearance_mode = embed_formatter if target[0][1] > 0 else compact_formatter if "actionhidden" in change or "suppressed" in change: # if event is hidden using suppression - await appearance_mode("suppressed", change, "", changed_categories, local_wiki, target, _, ngettext, paths, rate_limiter) + await appearance_mode("suppressed", change, "", changed_categories, local_wiki, target, paths, rate_limiter) return if "commenthidden" not in change: parsed_comment = parse_link(paths[3], change["parsedcomment"]) @@ -228,16 +223,11 @@ async def essential_info(change: dict, changed_categories, local_wiki: Wiki, tar additional_data["tags"][tag["name"]] = (BeautifulSoup(tag["displayname"], "lxml")).get_text() except KeyError: additional_data["tags"][tag["name"]] = None # Tags with no displ - await appearance_mode(identification_string, change, parsed_comment, changed_categories, local_wiki, target, _, ngettext, paths, rate_limiter, additional_data=additional_data) + await appearance_mode(identification_string, change, parsed_comment, changed_categories, local_wiki, target, paths, rate_limiter, additional_data=additional_data) async def essential_feeds(change: dict, db_wiki: tuple, target: tuple): """Prepares essential information for both embed and compact message format.""" - def _(string: str) -> str: - """Our own translation string to make it compatible with async""" - return lang.gettext(string) - - lang = langs[target[0][0]] appearance_mode = feeds_embed_formatter if target[0][1] > 0 else feeds_compact_formatter identification_string = change["_embedded"]["thread"][0]["containerType"] - await appearance_mode(identification_string, change, target, db_wiki["wiki"], _) + await appearance_mode(identification_string, change, target, db_wiki["wiki"]) From b05608a02495aca4decaefa666cadac06b24e4ff Mon Sep 17 00:00:00 2001 From: Frisk Date: Mon, 10 Aug 2020 02:23:09 +0200 Subject: [PATCH 19/21] Fixed translation of discussions.py --- src/formatters/discussions.py | 6 +++--- src/i18n.py | 3 --- 2 files changed, 3 insertions(+), 6 deletions(-) diff --git a/src/formatters/discussions.py b/src/formatters/discussions.py index b6e3cc9..c45c55f 100644 --- a/src/formatters/discussions.py +++ b/src/formatters/discussions.py @@ -18,12 +18,12 @@ async def feeds_compact_formatter(post_type, post, message_target, wiki): if post_type == "FORUM": if not post["isReply"]: thread_funnel = post.get("funnel") - msg_text = "[{author}](<{url}f/u/{creatorId}>) created [{title}](<{url}f/p/{threadId}>) in {forumName}" + msg_text = _("[{author}](<{url}f/u/{creatorId}>) created [{title}](<{url}f/p/{threadId}>) in {forumName}") if thread_funnel == "POLL": - msg_text = "[{author}](<{url}f/u/{creatorId}>) created a poll [{title}](<{url}f/p/{threadId}>) in {forumName}" + msg_text = _("[{author}](<{url}f/u/{creatorId}>) created a poll [{title}](<{url}f/p/{threadId}>) in {forumName}") elif thread_funnel != "TEXT": logger.warning("No entry for {event} with params: {params}".format(event=thread_funnel, params=post)) - message = _(msg_text).format(author=post["createdBy"]["name"], url=wiki, creatorId=post["creatorId"], title=post["title"], threadId=post["threadId"], forumName=post["forumName"]) + message = msg_text.format(author=post["createdBy"]["name"], url=wiki, creatorId=post["creatorId"], title=post["title"], threadId=post["threadId"], forumName=post["forumName"]) else: message = _("[{author}](<{url}f/u/{creatorId}>) created a [reply](<{url}f/p/{threadId}/r/{postId}>) to [{title}](<{url}f/p/{threadId}>) in {forumName}").format(author=post["createdBy"]["name"], url=wiki, creatorId=post["creatorId"], threadId=post["threadId"], postId=post["id"], title=post["_embedded"]["thread"][0]["title"], forumName=post["forumName"]) elif post_type == "WALL": diff --git a/src/i18n.py b/src/i18n.py index 8bdfe3d..d8af4ed 100644 --- a/src/i18n.py +++ b/src/i18n.py @@ -14,7 +14,4 @@ try: langs["en"][file] = gettext.NullTranslations() except FileNotFoundError: logger.critical("No language files have been found. Make sure locale folder is located in the directory.") - raise sys.exit(1) - -#ngettext = en.ngettext \ No newline at end of file From 03adf6fb9ae246956570c45385a8fd556bf69fef Mon Sep 17 00:00:00 2001 From: Frisk Date: Mon, 10 Aug 2020 16:14:07 +0200 Subject: [PATCH 20/21] Merge changes --- locale/de/LC_MESSAGES/discord.mo | Bin 0 -> 354 bytes locale/de/LC_MESSAGES/discord.po | 35 +++++++++++++++ .../de/LC_MESSAGES/discussion_formatters.mo | Bin 0 -> 898 bytes locale/de/LC_MESSAGES/misc.mo | Bin 0 -> 1248 bytes locale/de/LC_MESSAGES/rc_formatters.mo | Bin 0 -> 19637 bytes locale/de/LC_MESSAGES/wiki.mo | Bin 0 -> 885 bytes locale/pl/LC_MESSAGES/discord.mo | Bin 0 -> 411 bytes locale/pl/LC_MESSAGES/discord.po | 35 +++++++++++++++ locale/pl/LC_MESSAGES/wiki.mo | Bin 0 -> 836 bytes locale/pl/LC_MESSAGES/wiki.po | 42 ++++++++++++++++++ locale/pt-br/LC_MESSAGES/discord.mo | Bin 0 -> 356 bytes locale/pt-br/LC_MESSAGES/discord.po | 35 +++++++++++++++ .../LC_MESSAGES/discussion_formatters.mo | Bin 0 -> 979 bytes locale/pt-br/LC_MESSAGES/misc.mo | Bin 0 -> 1193 bytes locale/pt-br/LC_MESSAGES/rc_formatters.mo | Bin 0 -> 19321 bytes locale/pt-br/LC_MESSAGES/wiki.mo | Bin 0 -> 823 bytes scripts/generate_translations.sh | 14 ++++++ 17 files changed, 161 insertions(+) create mode 100644 locale/de/LC_MESSAGES/discord.mo create mode 100644 locale/de/LC_MESSAGES/discord.po create mode 100644 locale/de/LC_MESSAGES/discussion_formatters.mo create mode 100644 locale/de/LC_MESSAGES/misc.mo create mode 100644 locale/de/LC_MESSAGES/rc_formatters.mo create mode 100644 locale/de/LC_MESSAGES/wiki.mo create mode 100644 locale/pl/LC_MESSAGES/discord.mo create mode 100644 locale/pl/LC_MESSAGES/discord.po create mode 100644 locale/pl/LC_MESSAGES/wiki.mo create mode 100644 locale/pl/LC_MESSAGES/wiki.po create mode 100644 locale/pt-br/LC_MESSAGES/discord.mo create mode 100644 locale/pt-br/LC_MESSAGES/discord.po create mode 100644 locale/pt-br/LC_MESSAGES/discussion_formatters.mo create mode 100644 locale/pt-br/LC_MESSAGES/misc.mo create mode 100644 locale/pt-br/LC_MESSAGES/rc_formatters.mo create mode 100644 locale/pt-br/LC_MESSAGES/wiki.mo diff --git a/locale/de/LC_MESSAGES/discord.mo b/locale/de/LC_MESSAGES/discord.mo new file mode 100644 index 0000000000000000000000000000000000000000..0130fc1bcca440ed8968fabb96797b3812cb8462 GIT binary patch literal 354 zcmYL^&q~8U5XLKd+M{O=BY3Fj)J;T)TXNC59f>fpwWrm3anW!6i!L<|*+BO^A5SFCZJhxmd zr~5aOkremNMzRsh?~b=b`ifUwtBoB)^{#!Om_L;>%=SL7ZFnP(Q(L*(*hWG2YNB|- zIa%^LI, YEAR. +# +msgid "" +msgstr "" +"Project-Id-Version: RcGcDd\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2020-08-10 01:44+0200\n" +"PO-Revision-Date: 2020-08-10 01:50+0200\n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Poedit 2.3.1\n" +"Last-Translator: \n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"Language: de\n" + +#: src/discord.py:27 +msgid "wiki deletion" +msgstr "" + +#: src/discord.py:27 src/discord.py:28 +msgid "wiki becoming inaccessible" +msgstr "" + +#: src/discord.py:29 +msgid "unknown error" +msgstr "" + +#: src/discord.py:30 +msgid "The webhook for {} has been removed due to {}." +msgstr "" diff --git a/locale/de/LC_MESSAGES/discussion_formatters.mo b/locale/de/LC_MESSAGES/discussion_formatters.mo new file mode 100644 index 0000000000000000000000000000000000000000..89a6dd442feae36596cd21054925ad9759277240 GIT binary patch literal 898 zcma))(P|Sx6oyBwRo5F8p*MH0@|8Np|PQ+wV)EF*^^}KWH!#sHZ390 zm+&t56yghbqt76C(I@cQEB{TzMry?a|9*SU*>ld!&V0Kv^NzvJL)V~J&_!qjrS=)R z41Iy_KwqH?(CjJ3u7a090p0?ygU`Wp;9D>Q?L%|$N2eJpfgixM{yUh?`vE=z=gu&8 z1Ka}B{2qwX@w#Tgv}bB(A*9AOgD1)-wq!|qig;$=mDe=PuwxM(8$L)J+2L)+tK^() z6MrGKW@|mK(&Uh>Q%@_j@$porzXeZj)@Z!kRMh9Hi~g_Y2V*u8tA`7X220G2iTj4t zZ2X3rUaUl7ldQw|A`dVqwq8_STSa0qX**Gm5w5L?b=p*XJABwObav=|M z#fJ~>!ViO0>Aa|0X`Gfmwy0c{rk!9JqE50q`3d#mpAImqHy$GI;%xiR7^9DlxY`vVO#lNOFSh*cCv_COp)?DpS_>W z1vQ;msl{?^yROJhZ|u5qzQiZ5<$1$zmU(WW6tIeQp0xJF4-ek|I@ZI3(MfSGlNPpR z`7_z%cD~=S(cYh!J)JZ=!zK@?x$ft#Wj`&ydzvkc)EGixGPaj(?L+02u*f86) IBaQLwCmk;atpET3 literal 0 HcmV?d00001 diff --git a/locale/de/LC_MESSAGES/misc.mo b/locale/de/LC_MESSAGES/misc.mo new file mode 100644 index 0000000000000000000000000000000000000000..e1ab7ff3c59a8d7e73d74249e92c887161e53b2f GIT binary patch literal 1248 zcmYk4&ub(_6vtbQzuI4`2!be-f+ww>ndnOB>?|hc2a6dUlF1sp3^mL1|E?@M(Y3#vcwy{h->RrUAJ=hnWAFrLMH z3G-Xb7ck#=03VFcz^A~^!N(58u%#qa?jU5&X>LaHuxKIZi3v$^J`J`BKRu!3^)e4&IIK3k3jCD1i7vUx!xyz z{8Nzo_@ehOK+gXTd>s4%{C5y-T%PeT$Tc3pyoSkxYw+Nn_&n}`2iLe7 zxI*+0CQ4lnK8Mfb_l)BCd`st|F_z}@Xlr3QFB*!rmG?Czn!G5L&TEQxDwi3XU%7iK zqlGa`QCE5y?Hg0n6zl_&DPI{KO^@CWkweP!$_M+%lWKxFJFR?Hu53>>ILCUa&8d!V zzZd+I?So)+{le6mk16x=RxWRobvP^)@gcRwdO2}LmCNm}aB^l4o_-(?>2AfF6%6U1nO1oNlV^c9vcGzp#vpu=7+Q%2ULsstU z%;c3WQn9h9d_1i?t7^GtY~xa)+e_Dt*EdBl$6CBH7NgDhMDCL&8=hinh=1UE@@6u^ z3jVN>N2aqGv8`&fl+%1?H|}!?Kj1tS?Ri0-drjJNF-opqrB1nHyl{;=^Ol`?Yhsq- zF-wt33n|{e_w~;g3rM1=vhx1D3%Rv$S*a`U|0hm)!0PLz8JsI&1}_LR*dLlwLm{lo q5D2;q_N6X^8Faa_q08VL>jf>9)*i|Xk&}fvgLN10z>ReOZTJ_Bi95*v literal 0 HcmV?d00001 diff --git a/locale/de/LC_MESSAGES/rc_formatters.mo b/locale/de/LC_MESSAGES/rc_formatters.mo new file mode 100644 index 0000000000000000000000000000000000000000..c1d56510b2757364e85e7dd7bc1524fadcc1a76a GIT binary patch literal 19637 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 Lu2LJ$j;8z{@%`#j literal 0 HcmV?d00001 diff --git a/locale/de/LC_MESSAGES/wiki.mo b/locale/de/LC_MESSAGES/wiki.mo new file mode 100644 index 0000000000000000000000000000000000000000..11997431640c1f4174df249339833b38625464a9 GIT binary patch literal 885 zcmZva&2AGh5XTJ^Bo=Xi3l|Op7eL_MO=zWR+f)deR+SPFm4LWa&U(6Wvum$xZ`1IR zx8NP%8F&t^oVju3$T;bj1S9=+{4xL8u{}TUu6$u+H;DU0kGMsAB7%J-?hxOIXT*0R z#Qq{45xVV&qGtbzl4h#GSZK6G zk&lBUX7l+{FrTx5HAnPgz9;!Rw2lhMAlk>;SkL>eP?EoF3de_rmItr-J|3$O#J7dV z4BBZs<>@+arI5C=wbiFIPoti2o)4|it`y$b4En-O8n4t?kCaEGs7#D#+#qUBwk8>w`W z!TLz~Xizp*lzhk7%4MMI#ng4$8?YR9G(6})Ya@EkcTuBVUd6zmR36&#^SDJjJ(C;$ z#xyp^Fcu}1B=KOo8=Y#99$=P1JuA?MTH|^Kt$6KBItUfh4VRSXpbnFR+C+?=a-_6u zbm30h>8v&KF)Hn0s!*Z@v=&u99tjH{8tN{kV|Gk!;4z^70`TSf& GE%g_B-vn6z literal 0 HcmV?d00001 diff --git a/locale/pl/LC_MESSAGES/discord.mo b/locale/pl/LC_MESSAGES/discord.mo new file mode 100644 index 0000000000000000000000000000000000000000..f55b4429e8543cc0d3caafc844683ae4ff3f2dae GIT binary patch literal 411 zcmYLEO-lnY5LNWFN6#MSpru8pCfgR)v|B;@LBZluR`D8lCMhBmj+Py1_W1X42)P;cP zt@ObwPL), YEAR. +# +msgid "" +msgstr "" +"Project-Id-Version: RcGcDd\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2020-08-10 01:44+0200\n" +"PO-Revision-Date: 2020-08-10 01:55+0200\n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Poedit 2.3.1\n" +"Last-Translator: \n" +"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : 2);\n" +"Language: pl\n" + +#: src/discord.py:27 +msgid "wiki deletion" +msgstr "" + +#: src/discord.py:27 src/discord.py:28 +msgid "wiki becoming inaccessible" +msgstr "" + +#: src/discord.py:29 +msgid "unknown error" +msgstr "" + +#: src/discord.py:30 +msgid "The webhook for {} has been removed due to {}." +msgstr "" diff --git a/locale/pl/LC_MESSAGES/wiki.mo b/locale/pl/LC_MESSAGES/wiki.mo new file mode 100644 index 0000000000000000000000000000000000000000..ba5317a62c8477c084a73a06dada6824d4a0cfb2 GIT binary patch literal 836 zcmZva&2H2%5XTJ^kb;B+mtHuGkSHz1A=&LpC2b0VeyCC_R@H*IdXpjRHfu+=!*-Wt z50&}|+&RKCaHM?-B+lG;1;*P}?SYYg8IS#+cx=z_`!in{*)8G$u|wP;#)P+T#699W z@s#*Mcz|V+>C|TEdy^pP z)V%(xk(9C5S}Dw&)C#N%w6Iji?dvXqm?mL~+t;Em9l>JHk5NF+$l=IBgQxG}0cxY9+NZc(~Mj zSsCrL>I+$hS#OOJR8flpc?U(GHoAxtsLEh>dw1iq!Z?fqx-y4~wis4agTq7jtSW_6 zD?rCI7G3(bv&ok)b-t7jX!wT8bS_nqz;ai*U<(x*ItQI`NLvjHbpB^yHH0{91@HN} zz#pNlF_#V+VKa<_c3B%y@=a~}HUU*lLz^~Ns9wL4&Z{(y;RQrM%a7t{Ep5Qu+;q5_ zF8SfSpN>}P;>P3Yyw^kvloL}?4xx+liJFY<3f~5_zpSCp$_>6UwG@@ literal 0 HcmV?d00001 diff --git a/locale/pl/LC_MESSAGES/wiki.po b/locale/pl/LC_MESSAGES/wiki.po new file mode 100644 index 0000000..39502f3 --- /dev/null +++ b/locale/pl/LC_MESSAGES/wiki.po @@ -0,0 +1,42 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR ORGANIZATION +# FIRST AUTHOR , YEAR. +# +msgid "" +msgstr "" +"Project-Id-Version: RcGcDw\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2020-08-08 17:22+0200\n" +"PO-Revision-Date: 2020-08-10 01:55+0200\n" +"Last-Translator: Frisk \n" +"Language-Team: \n" +"Language: pl\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: pygettext.py 1.5\n" +"X-Generator: Poedit 2.3.1\n" +"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 " +"|| n%100>=20) ? 1 : 2);\n" + +#: src/rc.py:150 +#, python-brace-format +msgid "Connection to {wiki} seems to be stable now." +msgstr "Połączenie z {wiki} wygląda na stabilne." + +#: src/rc.py:151 src/rc.py:266 +msgid "Connection status" +msgstr "Problem z połączeniem" + +#: src/rc.py:265 +#, python-brace-format +msgid "{wiki} seems to be down or unreachable." +msgstr "{wiki} nie działa lub jest nieosiągalna." + +#: src/rc.py:334 +msgid "~~hidden~~" +msgstr "~~ukryte~~" + +#: src/rc.py:340 +msgid "hidden" +msgstr "ukryte" diff --git a/locale/pt-br/LC_MESSAGES/discord.mo b/locale/pt-br/LC_MESSAGES/discord.mo new file mode 100644 index 0000000000000000000000000000000000000000..5d4a608b7cd11b455957a6909bea5c48c087e802 GIT binary patch literal 356 zcmYL@O-sW-5QZyy+M{O=d+^}b)J=*IH^f8j2L+2EMDZqTGRBp3H|%bU{t*A3zr~4# z_JxO;Vcz-pJwEywkPe6w;*>Zfu83X&8QAC1?2~6u8m76(%a6)VmsAV(piHw?4MK@(MRUu= za=O0}4F$WmCZGvWes{Db;8(crTBS|Os}JQohU}@FL9+KbW&Arjn3~Gg+BA|UZ#u9S zn4>|bf_0MT7Hb`NJRA)p`oYuseyrVgS>CRlYGG#G%1ds#|I%l1%C~8DX80YC&ePrh Ll6T>CT(H3(s9Ivy literal 0 HcmV?d00001 diff --git a/locale/pt-br/LC_MESSAGES/discord.po b/locale/pt-br/LC_MESSAGES/discord.po new file mode 100644 index 0000000..d03b1fb --- /dev/null +++ b/locale/pt-br/LC_MESSAGES/discord.po @@ -0,0 +1,35 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the RcGcDd package. +# FIRST AUTHOR , YEAR. +# +msgid "" +msgstr "" +"Project-Id-Version: RcGcDd\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2020-08-10 01:44+0200\n" +"PO-Revision-Date: 2020-08-10 01:53+0200\n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Poedit 2.3.1\n" +"Last-Translator: \n" +"Plural-Forms: nplurals=2; plural=(n > 1);\n" +"Language: pt_BR\n" + +#: src/discord.py:27 +msgid "wiki deletion" +msgstr "" + +#: src/discord.py:27 src/discord.py:28 +msgid "wiki becoming inaccessible" +msgstr "" + +#: src/discord.py:29 +msgid "unknown error" +msgstr "" + +#: src/discord.py:30 +msgid "The webhook for {} has been removed due to {}." +msgstr "" diff --git a/locale/pt-br/LC_MESSAGES/discussion_formatters.mo b/locale/pt-br/LC_MESSAGES/discussion_formatters.mo new file mode 100644 index 0000000000000000000000000000000000000000..1b96714a200318a32d07e577beef3fbd1afeceea GIT binary patch literal 979 zcmaiy(P|Vi6oyBwRYxyc5w8?tL2Q-m?5-Bdv@6ouO2MVex>mu;l1@&iu`|h-WL#_6 z#}IFP0G~wk83doje|8I7tzzJxFFBL^CuipTygKzUz_oo1wTQD&+H#XEdBU9brbZqtcNb-f^r=&WV)R3z22P zR^e6kau{@}$P{e6IpOrT;J?lK{a4$H22ADfe?5ORV!yQ6aG~E1N`0WsKnERb-caKC zrsUgX9n!}vL?UB7Z@W}UzFMY^_YA_FE#9Sfs@lXKqso{y>&-f^FY!j5)f@5R;ytYE z;Zxx}?^&T;CcLpRTbHGfQb@KU%j4;zG#4tXB_@A}{W>jiN!}xo$E<_gWm=LWHot1c z2bC?bm3{9E7e~>6c411jJ*(V7%@rb{s2JDaBAcX%97IyNq;%CaT~zq~YB!qXh}kF- zwl~}BlZqR)dbnn^Cyk3A7O2eAdmj~?WBzBJia6}U&1uj|A}rPG)# z?J6I3veJr-Zy1}qnCW7)bgkwx8&6yFn%!!##=>&=l0P9$cKne#hNSYWS-W3rgy^89jlh1o^-+TMs=KEu6;x)m!hMf93Jtpo93|+@Cl~$XWQ4;7Ram z&g-D9cXR(P_!2b>pzZ(V7$K*@Z{QU86TATa0qvZ}C$hONf!4nU+PY#MpUdNGx&H{X z^&Qa8vkTfepMkdSRUUr}VvOt^pv^gfJBe$Lt+mJYvh&+od+awlI9P#TOoCR!WB0bZ z*zZZ4R%=mm+EZGzT4b@UQbT)!RG2ZbC`e&whe;j_vJ@qO()_?(W`Src)unMHyJSVF zFcz6zQvoxPlBB-zAd55v=aI?m4I@}DGn<3R1f8*MgwC8z*_CP_$<|utZ&zxWk>(HT zT0ItlaaXy!C3J$9`P6BMzS72BPr``1l{8G;rb4*>&~1n(kxg=!m=QiL7t2MrIOCRz zv{>?|r*FY8IyIIUx2c&-VrG=~X_cppbH?c$PjmBL*kevlzY`7%sdDBLC%@@XCK zPQz3rg5IcTwim@W>0HN{e&T!HK(x_R6n1o!bPGuz-_Gl2J0zYC!hjDvbe3Mj6 z+}x+bh_k-BULCJmDiodjN*W@O~NF) literal 0 HcmV?d00001 diff --git a/locale/pt-br/LC_MESSAGES/rc_formatters.mo b/locale/pt-br/LC_MESSAGES/rc_formatters.mo new file mode 100644 index 0000000000000000000000000000000000000000..c65d770c0f81c673bfe33f96bd219726479901a1 GIT binary patch literal 19321 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 LQT0pt@rwTgT77Ca literal 0 HcmV?d00001 diff --git a/locale/pt-br/LC_MESSAGES/wiki.mo b/locale/pt-br/LC_MESSAGES/wiki.mo new file mode 100644 index 0000000000000000000000000000000000000000..40b333cd264e7ac7ccd4521ba111078c739b62ed GIT binary patch literal 823 zcmZvaJC74F5XTK16blX4&`^wMczSmebW*groFI@xCtXAo0-{6CdTwKG*IwD)QKD_hgdkE`50^6I7iTC7P5(w5;gmeN}8Dl zW1-R(MLMZdLN=eT66SL@u;w{!%=aXJg4WRi5(tJ^8tZxAWlHjHl{r2#v^;pohd5QW zh~F0;6KKZGn8z*Nh#_tyTU$429tZovc|Nj2yIgo<6X?lGNGT+2%j!>fCo6=?!_*Wz zq}N#`GUOu^MFIobyUHqb2-mt+yj1yh*q(S_x+IEbIHsZ)9$4iLLsyCvqjGfz7uhsR z`| zTI=eY9iZhsof@fhmOyK)d@#r>D{{VTY~d2n<#Ose%{HvUj)om*w1cPo0cy0Xrx_TO z%0n}}9X0~?X!-9!3P_E{qs0fq?*0uaD2^MU6c$qiq$aTSxOhLs97JZU2$@N%+?(TW d_(!U=@M>znR6t>h&MiJuX5A9YEFldw#c%)9@!0?X literal 0 HcmV?d00001 diff --git a/scripts/generate_translations.sh b/scripts/generate_translations.sh index e69de29..2908d4e 100644 --- a/scripts/generate_translations.sh +++ b/scripts/generate_translations.sh @@ -0,0 +1,14 @@ +xgettext -L Python --package-name=RcGcDw -o locale/templates/discussion_formatters.pot src/formatters/discussions.py +xgettext -L Python --package-name=RcGcDw -o locale/templates/rc_formatters.pot src/formatters/rc.py +xgettext -L Python --package-name=RcGcDw -o locale/templates/wiki.pot src/wiki.py +xgettext -L Python --package-name=RcGcDw -o locale/templates/discord.pot src/formatters/discord.py +xgettext -L Python --package-name=RcGcDw -o locale/templates/misc.pot src/misc.py + +cd .. +declare -a StringArray=("discussion_formatters" "rc_formatters" "discord" "wiki" "misc") +for language in de pl pt-br +do + for file in ${StringArray[@]}; do + msgmerge -U locale/$language/LC_MESSAGES/$file.po locale/templates/$file.pot + done +done From cc637be8b14bad8daeb8a6c2aa5f526cd3c0507b Mon Sep 17 00:00:00 2001 From: Frisk Date: Mon, 10 Aug 2020 18:46:47 +0200 Subject: [PATCH 21/21] Updated translations --- locale/de/LC_MESSAGES/discord.po | 14 +- .../de/LC_MESSAGES/discussion_formatters.po | 155 +++-- locale/de/LC_MESSAGES/misc.po | 50 +- locale/de/LC_MESSAGES/rc_formatters.po | 595 +++++++++-------- locale/de/LC_MESSAGES/wiki.po | 35 +- locale/pl/LC_MESSAGES/discord.po | 17 +- .../pl/LC_MESSAGES/discussion_formatters.po | 160 +++-- locale/pl/LC_MESSAGES/misc.po | 50 +- locale/pl/LC_MESSAGES/rc_formatters.po | 615 +++++++++--------- locale/pl/LC_MESSAGES/wiki.po | 35 +- locale/pt-br/LC_MESSAGES/discord.po | 14 +- .../LC_MESSAGES/discussion_formatters.po | 148 +++-- locale/pt-br/LC_MESSAGES/misc.po | 52 +- locale/pt-br/LC_MESSAGES/rc_formatters.po | 590 ++++++++--------- locale/pt-br/LC_MESSAGES/wiki.po | 37 +- scripts/generate_translations.sh | 16 +- src/discord.py | 4 +- 17 files changed, 1328 insertions(+), 1259 deletions(-) diff --git a/locale/de/LC_MESSAGES/discord.po b/locale/de/LC_MESSAGES/discord.po index cb76d89..723dd77 100644 --- a/locale/de/LC_MESSAGES/discord.po +++ b/locale/de/LC_MESSAGES/discord.po @@ -7,29 +7,29 @@ msgid "" msgstr "" "Project-Id-Version: RcGcDd\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2020-08-10 01:44+0200\n" +"POT-Creation-Date: 2020-08-10 16:46+0200\n" "PO-Revision-Date: 2020-08-10 01:50+0200\n" +"Last-Translator: \n" "Language-Team: \n" +"Language: de\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Poedit 2.3.1\n" -"Last-Translator: \n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -"Language: de\n" -#: src/discord.py:27 +#: src/discord.py:25 msgid "wiki deletion" msgstr "" -#: src/discord.py:27 src/discord.py:28 +#: src/discord.py:25 src/discord.py:26 msgid "wiki becoming inaccessible" msgstr "" -#: src/discord.py:29 +#: src/discord.py:27 msgid "unknown error" msgstr "" -#: src/discord.py:30 +#: src/discord.py:28 msgid "The webhook for {} has been removed due to {}." msgstr "" diff --git a/locale/de/LC_MESSAGES/discussion_formatters.po b/locale/de/LC_MESSAGES/discussion_formatters.po index 94e923a..a17f821 100644 --- a/locale/de/LC_MESSAGES/discussion_formatters.po +++ b/locale/de/LC_MESSAGES/discussion_formatters.po @@ -7,126 +7,165 @@ msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2020-08-08 22:56+0200\n" -"PO-Revision-Date: 2020-08-10 01:54+0200\n" -"Last-Translator: \n" -"Language-Team: \n" +"POT-Creation-Date: 2020-08-10 16:45+0200\n" +"PO-Revision-Date: 2020-08-10 16:41+0000\n" +"Last-Translator: MarkusRost \n" +"Language-Team: German \n" "Language: de\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Generator: Poedit 2.3.1\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Weblate 4.1.1\n" -#: src/discussion_formatters.py:38 +#: src/formatters/discussions.py:21 #, 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}" +"[{author}](<{url}f/u/{creatorId}>) created [{title}](<{url}f/p/{threadId}>) " +"in {forumName}" msgstr "" -"[{author}](<{url}f/u/{creatorId}>) erstellte eine [Antwork](<{url}f/p/" -"{threadId}/r/{postId}>) zu [{title}](<{url}f/p/{threadId}>) in {forumName}" +"[{author}]({author_url}) erstellte [{title}](<{url}f/p/{threadId}>) in " +"{forumName}" -#: src/discussion_formatters.py:40 src/discussion_formatters.py:49 -#: src/discussion_formatters.py:104 src/discussion_formatters.py:117 +#: src/formatters/discussions.py:23 +#, fuzzy, python-brace-format +msgid "" +"[{author}](<{url}f/u/{creatorId}>) 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/formatters/discussions.py:28 +#, fuzzy, python-brace-format +msgid "" +"[{author}](<{url}f/u/{creatorId}>) created a [reply](<{url}f/p/{threadId}/r/" +"{postId}>) to [{title}](<{url}f/p/{threadId}>) in {forumName}" +msgstr "" +"[{author}]({author_url}) erstellte eine [Antwork](<{url}f/p/{threadId}/r/" +"{postId}>) zu [{title}](<{url}f/p/{threadId}>) in {forumName}" + +#: src/formatters/discussions.py:30 src/formatters/discussions.py:38 +#: src/formatters/discussions.py:96 src/formatters/discussions.py:108 msgid "unknown" msgstr "Unbekannt" -#: src/discussion_formatters.py:44 +#: src/formatters/discussions.py:34 #, fuzzy, python-brace-format msgid "" -"[{author}]({author_url}) created [{title}](<{url}wiki/Message_Wall:" +"[{author}](<{url}f/u/{creatorId}>) created [{title}](<{url}wiki/Message_Wall:" "{user_wall}?threadId={threadId}>) on [{user}'s Message Wall](<{url}wiki/" "Message_Wall:{user_wall}>)" msgstr "" -"[{author}](<{url}f/u/{creatorId}>) erstellte [{title}](<{wikiurl}wiki/" -"Message_Wall:{user_wall}?threadId={threadid}>) auf der Nachrichtenseite von " -"{user}" +"[{author}]({author_url}) erstellte [{title}](<{wikiurl}wiki/Message_Wall:" +"{user_wall}?threadId={threadId}>) auf der [Nachrichtenseite von {user}]" +"(<{url}wiki/Message_Wall:{user_wall}>)" -#: src/discussion_formatters.py:46 +#: src/formatters/discussions.py:36 #, fuzzy, python-brace-format msgid "" -"[{author}]({author_url}) created a [reply](<{url}wiki/Message_Wall:" +"[{author}](<{url}f/u/{creatorId}>) 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]" +"Message_Wall:{user_wall}?threadId={threadId}) on [{user}'s Message Wall]" "(<{url}wiki/Message_Wall:{user_wall}>)" msgstr "" -"[{author}](<{url}f/u/{creatorId}>) antwortete auf [{title}](<{wikiurl}wiki/" -"Message_Wall:{user_wall}?threadId={threadid}#{replyId}>) auf der " -"Nachrichtenseite von {user}" +"[{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:51 -#, python-brace-format +#: src/formatters/discussions.py:40 +#, fuzzy, python-brace-format msgid "" -"[{author}]({author_url}) created a [comment](<{url}wiki/{article}?" -"commentId={commentId}>) on [{article}](<{url}wiki/{article}>)" +"[{author}](<{url}f/u/{creatorId}>) created a [comment](<{url}wiki/{article}?" +"threadId={threadId}>) on [{article}](<{url}wiki/{article}>)" msgstr "" +"[{author}]({author_url}) erstellte ein [Kommentar](<{url}wiki/{article}?" +"commentId={commentId}>) zu [{article}](<{url}wiki/{article}>)" -#: src/discussion_formatters.py:53 -#, python-brace-format +#: src/formatters/discussions.py:42 +#, fuzzy, python-brace-format msgid "" -"[{author}]({author_url}) created a [reply](<{url}wiki/{article}?" -"threadId={threadId}) to a [comment](<{url}wiki/{article}?" -"commentId={commentId}&replyId={replyId}>) on [{article}](<{url}wiki/{article}" +"[{author}](<{url}f/u/{creatorId}>) created a [reply](<{url}wiki/{article}?" +"threadId={threadId}) to a [comment](<{url}wiki/{article}?threadId={threadId}" +"#{replyId}>) on [{article}](<{url}wiki/{article}>)" +msgstr "" +"[{author}]({author_url}) erstellte eine [Antwort](<{url}wiki/{article}?" +"threadId={threadId}>) auf ein [Kommentar](<{url}wiki/{article}?" +"commentId={commentId}&replyId={replyId}>) zu [{article}](<{url}wiki/{article}" ">)" -msgstr "" -#: src/discussion_formatters.py:82 +#: src/formatters/discussions.py:48 +#, 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/formatters/discussions.py:74 #, python-brace-format msgid "Created \"{title}\"" msgstr "Erstellte „{title}“" -#: src/discussion_formatters.py:87 -#, fuzzy, python-brace-format +#: src/formatters/discussions.py:79 +#, python-brace-format msgid "Created a poll \"{title}\"" msgstr "Erstellte eine Umfrage „{title}“" -#: src/discussion_formatters.py:92 +#: src/formatters/discussions.py:84 msgid "Option {}" msgstr "Option {}" -#: src/discussion_formatters.py:93 +#: src/formatters/discussions.py:85 #, python-brace-format msgid "__[View image]({image_url})__" msgstr "__[Bild öffnen]({image_url})__" -#: src/discussion_formatters.py:101 +#: src/formatters/discussions.py:93 #, python-brace-format msgid "Replied to \"{title}\"" msgstr "Antwortete auf „{title}“" -#: src/discussion_formatters.py:110 +#: src/formatters/discussions.py:102 #, python-brace-format msgid "Created \"{title}\" on {user}'s Message Wall" msgstr "Erstellte „{title}“ auf der Nachrichtenseite von {user}" -#: src/discussion_formatters.py:114 +#: src/formatters/discussions.py:106 #, 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:121 -#, fuzzy, python-brace-format +#: src/formatters/discussions.py:112 +#, python-brace-format msgid "Commented on {article}" -msgstr "Erstellte „{title}“" +msgstr "Kommentierte zu „{article}“" -#: src/discussion_formatters.py:125 -#, fuzzy, python-brace-format +#: src/formatters/discussions.py:116 +#, python-brace-format msgid "Replied to a comment on {article}" -msgstr "Antwortete auf „{title}“" +msgstr "Antwortete auf ein Kommentar zu „{article}“" + +#: src/formatters/discussions.py:120 +#, python-brace-format +msgid "Unknown event `{event}`" +msgstr "Unbekanntes Event `{event}`" + +#: src/formatters/discussions.py:125 src/formatters/discussions.py:127 +msgid "Report this on the support server" +msgstr "Melde es auf dem Support-Server" #, python-brace-format #~ msgid "" -#~ "[{author}](<{url}f/u/{creatorId}>) created [{title}](<{url}f/p/{threadId}" +#~ "[{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}" -#~ msgstr "" -#~ "[{author}](<{url}f/u/{creatorId}>) erstellte [{title}](<{url}f/p/" -#~ "{threadId}>) in {forumName}" #, python-brace-format -#~ msgid "" -#~ "[{author}](<{url}f/u/{creatorId}>) created a poll [{title}](<{url}f/p/" -#~ "{threadId}>) in {forumName}" -#~ msgstr "" -#~ "[{author}](<{url}f/u/{creatorId}>) erstellte eine Umfrage [{title}](<{url}" -#~ "f/p/{threadId}>) in {forumName}" +#~ msgid "Created a quiz \"{title}\"" +#~ msgstr "Erstellte ein Quiz „{title}“" diff --git a/locale/de/LC_MESSAGES/misc.po b/locale/de/LC_MESSAGES/misc.po index ce05f97..abc7653 100644 --- a/locale/de/LC_MESSAGES/misc.po +++ b/locale/de/LC_MESSAGES/misc.po @@ -2,8 +2,8 @@ msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2020-08-08 14:00+0200\n" -"PO-Revision-Date: 2020-08-10 01:54+0200\n" +"POT-Creation-Date: 2020-08-10 00:59+0200\n" +"PO-Revision-Date: 2020-08-03 13:44+0000\n" "Last-Translator: MarkusRost \n" "Language-Team: German \n" @@ -12,75 +12,75 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Poedit 2.3.1\n" +"X-Generator: Weblate 4.1.1\n" "X-Loco-Source-Locale: de_DE\n" "Generated-By: pygettext.py 1.5\n" "X-Loco-Parser: loco_parse_po\n" -#: src/misc.py:42 +#: src/misc.py:96 msgid "Location" msgstr "Wohnort" -#: src/misc.py:42 +#: src/misc.py:96 msgid "About me" msgstr "„Über mich“-Abschnitt" -#: src/misc.py:42 +#: src/misc.py:97 msgid "Google link" msgstr "Google-Link" -#: src/misc.py:42 +#: src/misc.py:97 msgid "Facebook link" msgstr "Facebook-Link" -#: src/misc.py:42 +#: src/misc.py:98 msgid "Twitter link" msgstr "Twitter-Link" -#: src/misc.py:42 +#: src/misc.py:98 msgid "Reddit link" msgstr "Reddit-Link" -#: src/misc.py:42 +#: src/misc.py:99 msgid "Twitch link" msgstr "Twitch-Link" -#: src/misc.py:42 +#: src/misc.py:99 msgid "PSN link" msgstr "PSN-Link" -#: src/misc.py:42 +#: src/misc.py:100 msgid "VK link" msgstr "VK-Link" -#: src/misc.py:42 +#: src/misc.py:100 msgid "XBL link" msgstr "Xbox-Live-Link" -#: src/misc.py:42 +#: src/misc.py:101 msgid "Steam link" msgstr "Steam-Link" -#: src/misc.py:42 +#: src/misc.py:101 msgid "Discord handle" msgstr "Discord-Link" -#: src/misc.py:42 +#: src/misc.py:102 msgid "Battle.net handle" msgstr "Battle.net-Link" -#: src/misc.py:142 +#: src/misc.py:108 +msgid "Unknown" +msgstr "Unbekannt" + +#: src/misc.py:110 +msgid "unknown" +msgstr "unbekannt" + +#: src/misc.py:121 msgid "" "\n" "__And more__" msgstr "" "\n" "__Und mehr__" - -#: src/misc.py:423 -msgid "Unknown" -msgstr "Unbekannt" - -#: src/misc.py:425 -msgid "unknown" -msgstr "unbekannt" diff --git a/locale/de/LC_MESSAGES/rc_formatters.po b/locale/de/LC_MESSAGES/rc_formatters.po index f1a5f69..4e8e39c 100644 --- a/locale/de/LC_MESSAGES/rc_formatters.po +++ b/locale/de/LC_MESSAGES/rc_formatters.po @@ -2,27 +2,11 @@ msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2020-08-08 17:21+0200\n" -"PO-Revision-Date: 2020-08-10 01:54+0200\n" +"POT-Creation-Date: 2020-08-10 16:45+0200\n" +"PO-Revision-Date: 2020-08-10 16:41+0000\n" "Last-Translator: MarkusRost \n" -"Language-Team: German \n" -"Language: de\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Poedit 2.3.1\n" -"X-Loco-Source-Locale: de_DE\n" -"Generated-By: pygettext.py 1.5\n" -"X-Loco-Parser: loco_parse_po\n" -"Project-Id-Version: \n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2020-08-08 22:56+0200\n" -"PO-Revision-Date: 2020-08-03 13:44+0000\n" -"Last-Translator: MarkusRost \n" -"Language-Team: German \n" +"Language-Team: German \n" "Language: de\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -33,189 +17,107 @@ msgstr "" "Generated-By: pygettext.py 1.5\n" "X-Loco-Parser: loco_parse_po\n" -#: src/rcgcdw.py:113 src/rcgcdw.py:115 src/rcgcdw.py:117 src/rcgcdw.py:119 -#: src/rcgcdw.py:121 src/rcgcdw.py:123 src/rcgcdw.py:125 -#, python-brace-format -msgid "{value} (avg. {avg})" -msgstr "{value} (vgl. {avg})" - -#: src/rcgcdw.py:145 -msgid "Daily overview" -msgstr "Tägliche Übersicht" - -#: src/rcgcdw.py:153 -msgid "No activity" -msgstr "Keine Aktivität" - -#: src/rcgcdw.py:177 -msgid " ({} action)" -msgid_plural " ({} actions)" -msgstr[0] " (eine Aktion)" -msgstr[1] " ({} Aktionen)" - -#: src/rcgcdw.py:179 -msgid " ({} edit)" -msgid_plural " ({} edits)" -msgstr[0] " (eine Änderung)" -msgstr[1] " ({} Änderungen)" - -#: src/rcgcdw.py:184 -msgid " UTC ({} action)" -msgid_plural " UTC ({} actions)" -msgstr[0] " UTC (eine Aktion)" -msgstr[1] " UTC ({} Aktionen)" - -#: src/rcgcdw.py:186 src/rcgcdw.py:187 src/rcgcdw.py:191 -msgid "But nobody came" -msgstr "Keine Aktivität" - -#: src/rcgcdw.py:194 -msgid "Most active user" -msgid_plural "Most active users" -msgstr[0] "Aktivster Benutzer" -msgstr[1] "Aktivste Benutzer" - -#: src/rcgcdw.py:195 -msgid "Most edited article" -msgid_plural "Most edited articles" -msgstr[0] "Meist bearbeiteter Artikel" -msgstr[1] "Meist bearbeitete Artikel" - -#: src/rcgcdw.py:196 -msgid "Edits made" -msgstr "Bearbeitungen" - -#: src/rcgcdw.py:196 -msgid "New files" -msgstr "Neue Dateien" - -#: src/rcgcdw.py:196 -msgid "Admin actions" -msgstr "Admin-Aktionen" - -#: src/rcgcdw.py:197 -msgid "Bytes changed" -msgstr "Bytes geändert" - -#: src/rcgcdw.py:197 -msgid "New articles" -msgstr "Neue Artikel" - -#: src/rcgcdw.py:198 -msgid "Unique contributors" -msgstr "Einzelne Autoren" - -#: src/rcgcdw.py:199 -msgid "Most active hour" -msgid_plural "Most active hours" -msgstr[0] "Aktivste Stunde" -msgstr[1] "Aktivste Stunden" - -#: src/rcgcdw.py:200 -msgid "Day score" -msgstr "Tageswert" - -#: src/rcgcdw.py:242 +#: src/formatters/rc.py:19 msgid "director" msgstr "Direktor" -#: src/rcgcdw.py:242 +#: src/formatters/rc.py:19 msgid "bot" msgstr "Bot" -#: src/rcgcdw.py:242 +#: src/formatters/rc.py:19 msgid "editor" msgstr "editor" -#: src/rcgcdw.py:242 +#: src/formatters/rc.py:19 msgid "directors" msgstr "Direktor" -#: src/rcgcdw.py:242 +#: src/formatters/rc.py:19 msgid "sysop" msgstr "Administrator" -#: src/rcgcdw.py:242 +#: src/formatters/rc.py:19 msgid "bureaucrat" msgstr "Bürokrat" -#: src/rcgcdw.py:242 +#: src/formatters/rc.py:19 msgid "reviewer" msgstr "Prüfer" -#: src/rcgcdw.py:243 +#: src/formatters/rc.py:20 msgid "autoreview" msgstr "Passive Sichter" -#: src/rcgcdw.py:243 +#: src/formatters/rc.py:20 msgid "autopatrol" msgstr "autopatrol" -#: src/rcgcdw.py:243 +#: src/formatters/rc.py:20 msgid "wiki_guardian" msgstr "Wiki Guardian" -#: src/rcgcdw.py:243 +#: src/formatters/rc.py:20 msgid "second" msgid_plural "seconds" msgstr[0] "Sekunde" msgstr[1] "Sekunden" -#: src/rcgcdw.py:243 +#: src/formatters/rc.py:20 msgid "minute" msgid_plural "minutes" msgstr[0] "Minute" msgstr[1] "Minuten" -#: src/rcgcdw.py:243 +#: src/formatters/rc.py:20 msgid "hour" msgid_plural "hours" msgstr[0] "Stunde" msgstr[1] "Stunden" -#: src/rcgcdw.py:243 +#: src/formatters/rc.py:20 msgid "day" msgid_plural "days" msgstr[0] "Tag" msgstr[1] "Tage" -#: src/rcgcdw.py:243 +#: src/formatters/rc.py:20 msgid "week" msgid_plural "weeks" msgstr[0] "Woche" msgstr[1] "Wochen" -#: src/rcgcdw.py:243 +#: src/formatters/rc.py:20 msgid "month" msgid_plural "months" msgstr[0] "Monat" msgstr[1] "Monate" -#: src/rcgcdw.py:243 +#: src/formatters/rc.py:20 msgid "year" msgid_plural "years" msgstr[0] "Jahr" msgstr[1] "Jahre" -#: src/rcgcdw.py:243 +#: src/formatters/rc.py:20 msgid "millennium" msgid_plural "millennia" msgstr[0] "Jahrtausend" msgstr[1] "Jahrtausende" -#: src/rcgcdw.py:243 +#: src/formatters/rc.py:20 msgid "decade" msgid_plural "decades" msgstr[0] "Jahrzehnt" msgstr[1] "Jahrzehnte" -#: src/rcgcdw.py:243 +#: src/formatters/rc.py:20 msgid "century" msgid_plural "centuries" msgstr[0] "Jahrhundert" msgstr[1] "Jahrhunderte" -#: src/rc_formatters.py:41 +#: src/formatters/rc.py:52 #, python-brace-format msgid "" "[{author}]({author_url}) edited [{article}]({edit_link}){comment} ({sign}" @@ -224,7 +126,7 @@ msgstr "" "[{author}]({author_url}) bearbeitete [{article}]({edit_link}){comment} " "({sign}{edit_size})" -#: src/rc_formatters.py:43 +#: src/formatters/rc.py:54 #, python-brace-format msgid "" "[{author}]({author_url}) created [{article}]({edit_link}){comment} ({sign}" @@ -233,12 +135,12 @@ msgstr "" "[{author}]({author_url}) erstellte [{article}]({edit_link}){comment} ({sign}" "{edit_size})" -#: src/rc_formatters.py:46 +#: src/formatters/rc.py:57 #, python-brace-format msgid "[{author}]({author_url}) uploaded [{file}]({file_link}){comment}" msgstr "[{author}]({author_url}) lud [{file}]({file_link}) hoch{comment}" -#: src/rc_formatters.py:53 +#: src/formatters/rc.py:64 #, python-brace-format msgid "" "[{author}]({author_url}) reverted a version of [{file}]({file_link}){comment}" @@ -246,7 +148,7 @@ msgstr "" "[{author}]({author_url}) setzte [{file}]({file_link}) auf eine alte Version " "zurück{comment}" -#: src/rc_formatters.py:57 +#: src/formatters/rc.py:68 #, python-brace-format msgid "" "[{author}]({author_url}) uploaded a new version of [{file}]({file_link})" @@ -255,12 +157,12 @@ msgstr "" "[{author}]({author_url}) lud eine neue Version von [{file}]({file_link}) " "hoch{comment}" -#: src/rc_formatters.py:60 +#: src/formatters/rc.py:71 #, python-brace-format msgid "[{author}]({author_url}) deleted [{page}]({page_link}){comment}" msgstr "[{author}]({author_url}) löschte [{page}]({page_link}){comment}" -#: src/rc_formatters.py:64 +#: src/formatters/rc.py:75 #, python-brace-format msgid "" "[{author}]({author_url}) deleted redirect by overwriting [{page}]" @@ -269,15 +171,15 @@ msgstr "" "[{author}]({author_url}) löschte die Weiterleitung [{page}]({page_link}) " "durch Überschreiben{comment}" -#: src/rc_formatters.py:68 src/rc_formatters.py:73 +#: src/formatters/rc.py:79 src/formatters/rc.py:84 msgid "without making a redirect" msgstr "ohne eine Weiterleitung zu erstellen" -#: src/rc_formatters.py:68 src/rc_formatters.py:74 +#: src/formatters/rc.py:79 src/formatters/rc.py:85 msgid "with a redirect" msgstr "und erstellte eine Weiterleitung" -#: src/rc_formatters.py:69 +#: src/formatters/rc.py:80 #, python-brace-format msgid "" "[{author}]({author_url}) moved {redirect}*{article}* to [{target}]" @@ -286,7 +188,7 @@ msgstr "" "[{author}]({author_url}) verschob {redirect}*{article}* nach [{target}]" "({target_url}) {made_a_redirect}{comment}" -#: src/rc_formatters.py:75 +#: src/formatters/rc.py:86 #, python-brace-format msgid "" "[{author}]({author_url}) moved {redirect}*{article}* over redirect to " @@ -295,7 +197,7 @@ msgstr "" "[{author}]({author_url}) verschob {redirect}*{article}* nach [{target}]" "({target_url}) und überschrieb eine Weiterleitung {made_a_redirect}{comment}" -#: src/rc_formatters.py:80 +#: src/formatters/rc.py:91 #, python-brace-format msgid "" "[{author}]({author_url}) moved protection settings from {redirect}*{article}" @@ -304,42 +206,41 @@ msgstr "" "[{author}]({author_url}) verschob die Schutzeinstellungen von {redirect}" "*{article}* nach [{target}]({target_url}){comment}" -#: src/rc_formatters.py:91 src/rc_formatters.py:512 -#, fuzzy +#: src/formatters/rc.py:102 src/formatters/rc.py:481 msgid "for infinity and beyond" -msgstr "alle Ewigkeit" +msgstr "für alle Ewigkeit" -#: src/rc_formatters.py:100 src/rc_formatters.py:520 +#: src/formatters/rc.py:112 src/formatters/rc.py:489 #, python-brace-format msgid "for {num} {translated_length}" -msgstr "" +msgstr "für {num} {translated_length}" -#: src/rc_formatters.py:106 src/rc_formatters.py:523 +#: src/formatters/rc.py:120 src/formatters/rc.py:492 msgid "until {}" -msgstr "" +msgstr "bis {}" -#: src/rc_formatters.py:110 +#: src/formatters/rc.py:124 msgid " on pages: " msgstr " auf Seiten: " -#: src/rc_formatters.py:117 src/rc_formatters.py:534 +#: src/formatters/rc.py:131 src/formatters/rc.py:503 msgid " and namespaces: " msgstr " und Namensräumen: " -#: src/rc_formatters.py:119 +#: src/formatters/rc.py:133 msgid " on namespaces: " msgstr " in Namensräumen: " -#: src/rc_formatters.py:131 -#, fuzzy, python-brace-format +#: src/formatters/rc.py:145 +#, python-brace-format msgid "" "[{author}]({author_url}) blocked [{user}]({user_url}) {time}" "{restriction_desc}{comment}" msgstr "" -"[{author}]({author_url}) sperrte [{user}]({user_url}) für {time}" +"[{author}]({author_url}) sperrte [{user}]({user_url}) {time}" "{restriction_desc}{comment}" -#: src/rc_formatters.py:135 +#: src/formatters/rc.py:149 #, python-brace-format msgid "" "[{author}]({author_url}) changed block settings for [{blocked_user}]" @@ -348,7 +249,7 @@ msgstr "" "[{author}]({author_url}) änderte die Sperreinstellungen für [{blocked_user}]" "({user_url}){comment}" -#: src/rc_formatters.py:139 +#: src/formatters/rc.py:153 #, python-brace-format msgid "" "[{author}]({author_url}) unblocked [{blocked_user}]({user_url}){comment}" @@ -356,7 +257,7 @@ msgstr "" "[{author}]({author_url}) hob die Sperre von [{blocked_user}]({user_url}) " "auf{comment}" -#: src/rc_formatters.py:142 +#: src/formatters/rc.py:156 #, python-brace-format msgid "" "[{author}]({author_url}) left a [comment]({comment}) on {target} profile" @@ -364,11 +265,11 @@ msgstr "" "[{author}]({author_url}) hinterließ ein [Kommentar]({comment}) auf dem " "Profil von {target}" -#: src/rc_formatters.py:142 +#: src/formatters/rc.py:156 msgid "their own profile" msgstr "das eigene Profil" -#: src/rc_formatters.py:145 +#: src/formatters/rc.py:159 #, python-brace-format msgid "" "[{author}]({author_url}) replied to a [comment]({comment}) on {target} " @@ -377,12 +278,12 @@ msgstr "" "[{author}]({author_url}) antwortete auf ein [Kommentar]({comment}) auf dem " "Profil von {target}" -#: src/rc_formatters.py:148 src/rc_formatters.py:154 src/rc_formatters.py:165 -#: src/rc_formatters.py:169 +#: src/formatters/rc.py:162 src/formatters/rc.py:168 src/formatters/rc.py:179 +#: src/formatters/rc.py:183 msgid "their own" msgstr "sich selbst" -#: src/rc_formatters.py:151 +#: src/formatters/rc.py:165 #, python-brace-format msgid "" "[{author}]({author_url}) edited a [comment]({comment}) on {target} profile" @@ -390,46 +291,46 @@ msgstr "" "[{author}]({author_url}) bearbeitete ein [Kommentar]({comment}) auf dem " "Profil von {target}" -#: src/rc_formatters.py:157 +#: src/formatters/rc.py:171 #, python-brace-format msgid "[{author}]({author_url}) purged a comment on {target} profile" msgstr "" "[{author}]({author_url}) löschte ein Kommentar auf dem Profil von {target} " "dauerhaft" -#: src/rc_formatters.py:167 +#: src/formatters/rc.py:181 #, python-brace-format msgid "[{author}]({author_url}) deleted a comment on {target} profile" msgstr "" "[{author}]({author_url}) löschte ein Kommentar auf dem Profil von {target}" -#: src/rc_formatters.py:173 +#: src/formatters/rc.py:187 #, python-brace-format msgid "[{target}]({target_url})'s" msgstr "dem Profil von [{target}]({target_url})" -#: src/rc_formatters.py:173 +#: src/formatters/rc.py:187 #, python-brace-format msgid "[their own]({target_url})" msgstr "dem [eigenen Profil]({target_url})" -#: src/rc_formatters.py:174 +#: src/formatters/rc.py:188 #, python-brace-format msgid "" "[{author}]({author_url}) edited the {field} on {target} profile. *({desc})*" msgstr "" "[{author}]({author_url}) bearbeitete den {field} auf {target}. *({desc})*" -#: src/rc_formatters.py:188 src/rc_formatters.py:190 src/rc_formatters.py:612 -#: src/rc_formatters.py:614 +#: src/formatters/rc.py:202 src/formatters/rc.py:204 src/formatters/rc.py:581 +#: src/formatters/rc.py:583 msgid "none" msgstr "keine" -#: src/rc_formatters.py:196 src/rc_formatters.py:599 +#: src/formatters/rc.py:210 src/formatters/rc.py:568 msgid "System" msgstr "System" -#: src/rc_formatters.py:201 +#: src/formatters/rc.py:215 #, python-brace-format msgid "" "[{author}]({author_url}) protected [{article}]({article_url}) with the " @@ -438,12 +339,12 @@ msgstr "" "[{author}]({author_url}) schützte [{article}]({article_url}) {settings}" "{comment}" -#: src/rc_formatters.py:203 src/rc_formatters.py:211 src/rc_formatters.py:622 -#: src/rc_formatters.py:628 +#: src/formatters/rc.py:217 src/formatters/rc.py:225 src/formatters/rc.py:591 +#: src/formatters/rc.py:597 msgid " [cascading]" msgstr " [kaskadierend]" -#: src/rc_formatters.py:208 +#: src/formatters/rc.py:222 #, python-brace-format msgid "" "[{author}]({author_url}) modified protection settings of [{article}]" @@ -452,7 +353,7 @@ msgstr "" "[{author}]({author_url}) änderte den Schutzstatus von [{article}]" "({article_url}) {settings}{comment}" -#: src/rc_formatters.py:215 +#: src/formatters/rc.py:229 #, python-brace-format msgid "" "[{author}]({author_url}) removed protection from [{article}]({article_url})" @@ -461,7 +362,7 @@ msgstr "" "[{author}]({author_url}) entfernte den Schutz von [{article}]({article_url})" "{comment}" -#: src/rc_formatters.py:219 +#: src/formatters/rc.py:233 #, python-brace-format msgid "" "[{author}]({author_url}) changed visibility of revision on page [{article}]" @@ -476,7 +377,7 @@ msgstr[1] "" "[{author}]({author_url}) änderte die Sichtbarkeit von {amount} Versionen von " "[{article}]({article_url}){comment}" -#: src/rc_formatters.py:224 +#: src/formatters/rc.py:238 #, python-brace-format msgid "" "[{author}]({author_url}) imported [{article}]({article_url}) with {count} " @@ -491,40 +392,40 @@ msgstr[1] "" "[{author}]({author_url}) importierte [{article}]({article_url}) mit {count} " "Versionen{comment}" -#: src/rc_formatters.py:229 +#: src/formatters/rc.py:243 #, python-brace-format msgid "[{author}]({author_url}) restored [{article}]({article_url}){comment}" msgstr "" "[{author}]({author_url}) stellte [{article}]({article_url}) wieder " "her{comment}" -#: src/rc_formatters.py:231 +#: src/formatters/rc.py:245 #, python-brace-format msgid "[{author}]({author_url}) changed visibility of log events{comment}" msgstr "" "[{author}]({author_url}) änderte die Sichtbarkeit eines " "Logbucheintrags{comment}" -#: src/rc_formatters.py:233 +#: src/formatters/rc.py:247 #, python-brace-format msgid "[{author}]({author_url}) imported interwiki{comment}" msgstr "[{author}]({author_url}) importierte Interwiki{comment}" -#: src/rc_formatters.py:236 +#: src/formatters/rc.py:250 #, python-brace-format msgid "" "[{author}]({author_url}) edited abuse filter [number {number}]({filter_url})" msgstr "" "[{author}]({author_url}) änderte [Missbrauchsfilter {number}]({filter_url})" -#: src/rc_formatters.py:240 +#: src/formatters/rc.py:254 #, python-brace-format msgid "" "[{author}]({author_url}) created abuse filter [number {number}]({filter_url})" msgstr "" "[{author}]({author_url}) erstellte [Missbrauchsfilter {number}]({filter_url})" -#: src/rc_formatters.py:244 +#: src/formatters/rc.py:258 #, python-brace-format msgid "" "[{author}]({author_url}) merged revision histories of [{article}]" @@ -533,33 +434,35 @@ msgstr "" "[{author}]({author_url}) vereinigte Versionen von [{article}]({article_url}) " "in [{dest}]({dest_url}){comment}" -#: src/rc_formatters.py:248 -#, fuzzy, python-brace-format +#: src/formatters/rc.py:261 +#, python-brace-format msgid "Account [{author}]({author_url}) was created automatically" -msgstr "[{author}]({author_url}) erstellte die Cargo-Tabelle „{table}“" +msgstr "Konto [{author}]({author_url}) wurde automtisch erstellt" -#: src/rc_formatters.py:251 src/rc_formatters.py:260 -#, fuzzy, python-brace-format +#: src/formatters/rc.py:263 src/formatters/rc.py:271 +#, python-brace-format msgid "Account [{author}]({author_url}) was created" -msgstr "[{author}]({author_url}) erstellte die Cargo-Tabelle „{table}“" +msgstr "Konto [{author}]({author_url}) wurde erstellt" -#: src/rc_formatters.py:254 -#, fuzzy, python-brace-format +#: src/formatters/rc.py:266 +#, python-brace-format msgid "" "Account [{article}]({article_url}) was created by [{author}]({author_url})" "{comment}" msgstr "" -"[{author}]({author_url}) stellte [{article}]({article_url}) wieder " -"her{comment}" +"Konto [{article}]({article_url}) wurde von [{author}]({author_url}) " +"erstellt{comment}" -#: src/rc_formatters.py:257 +#: src/formatters/rc.py:269 #, python-brace-format msgid "" "Account [{article}]({article_url}) was created by [{author}]({author_url}) " "and password was sent by email{comment}" msgstr "" +"Konto [{article}]({article_url}) wurde von [{author}]({author_url}) erstellt " +"und das Passwort wurde per E-Mail zugesandt{comment}" -#: src/rc_formatters.py:263 +#: src/formatters/rc.py:274 #, python-brace-format msgid "" "[{author}]({author_url}) added an entry to the [interwiki table]" @@ -568,7 +471,7 @@ msgstr "" "[{author}]({author_url}) erstellte den [Interwiki-Präfix]({table_url}) " "{prefix} nach {website}" -#: src/rc_formatters.py:269 +#: src/formatters/rc.py:280 #, python-brace-format msgid "" "[{author}]({author_url}) edited an entry in [interwiki table]({table_url}) " @@ -577,13 +480,13 @@ msgstr "" "[{author}]({author_url}) bearbeitete den [Interwiki-Präfix]({table_url}) " "{prefix} nach {website}" -#: src/rc_formatters.py:275 +#: src/formatters/rc.py:286 #, python-brace-format msgid "" "[{author}]({author_url}) deleted an entry in [interwiki table]({table_url})" msgstr "[{author}]({author_url}) entfernte ein [Interwiki-Präfix]({table_url})" -#: src/rc_formatters.py:278 +#: src/formatters/rc.py:289 #, python-brace-format msgid "" "[{author}]({author_url}) changed the content model of the page [{article}]" @@ -592,14 +495,14 @@ msgstr "" "[{author}]({author_url}) änderte das Inhaltsmodell der Seite [{article}]" "({article_url}) von {old} zu {new}{comment}" -#: src/rc_formatters.py:282 +#: src/formatters/rc.py:293 #, python-brace-format msgid "" "[{author}]({author_url}) edited the sprite for [{article}]({article_url})" msgstr "" "[{author}]({author_url}) änderte das Sprite für [{article}]({article_url})" -#: src/rc_formatters.py:285 +#: src/formatters/rc.py:296 #, python-brace-format msgid "" "[{author}]({author_url}) created the sprite sheet for [{article}]" @@ -608,453 +511,535 @@ msgstr "" "[{author}]({author_url}) erstellte das Sprite-sheet für [{article}]" "({article_url})" -#: src/rc_formatters.py:288 +#: src/formatters/rc.py:299 #, python-brace-format msgid "" "[{author}]({author_url}) edited the slice for [{article}]({article_url})" msgstr "" "[{author}]({author_url}) änderte das Stück für [{article}]({article_url})" -#: src/rc_formatters.py:293 +#: src/formatters/rc.py:302 #, python-brace-format msgid "[{author}]({author_url}) created the Cargo table \"{table}\"" msgstr "[{author}]({author_url}) erstellte die Cargo-Tabelle „{table}“" -#: src/rc_formatters.py:295 +#: src/formatters/rc.py:304 #, python-brace-format msgid "[{author}]({author_url}) deleted the Cargo table \"{table}\"" msgstr "[{author}]({author_url}) löschte die Cargo-Tabelle „{table}“" -#: src/rc_formatters.py:300 +#: src/formatters/rc.py:307 #, python-brace-format msgid "[{author}]({author_url}) recreated the Cargo table \"{table}\"" msgstr "[{author}]({author_url}) erstellte die Cargo-Tabelle „{table}“ neu" -#: src/rc_formatters.py:305 +#: src/formatters/rc.py:310 #, python-brace-format msgid "[{author}]({author_url}) replaced the Cargo table \"{table}\"" msgstr "[{author}]({author_url}) ersetzte die Cargo-Tabelle „{table}“" -#: src/rc_formatters.py:308 +#: src/formatters/rc.py:313 #, python-brace-format msgid "[{author}]({author_url}) created a [tag]({tag_url}) \"{tag}\"" msgstr "" "[{author}]({author_url}) erstellte eine [Markierung]({tag_url}) „{tag}“" -#: src/rc_formatters.py:312 +#: src/formatters/rc.py:317 #, python-brace-format msgid "[{author}]({author_url}) deleted a [tag]({tag_url}) \"{tag}\"" msgstr "[{author}]({author_url}) löschte eine [Markierung]({tag_url}) „{tag}“" -#: src/rc_formatters.py:316 +#: src/formatters/rc.py:321 #, python-brace-format msgid "[{author}]({author_url}) activated a [tag]({tag_url}) \"{tag}\"" msgstr "" "[{author}]({author_url}) aktivierte eine [Markierung]({tag_url}) „{tag}“" -#: src/rc_formatters.py:319 +#: src/formatters/rc.py:324 #, python-brace-format msgid "[{author}]({author_url}) deactivated a [tag]({tag_url}) \"{tag}\"" msgstr "" "[{author}]({author_url}) deaktivierte eine [Markierung]({tag_url}) „{tag}“" -#: src/rc_formatters.py:321 +#: src/formatters/rc.py:326 msgid "An action has been hidden by administration." msgstr "Eine Aktion wurde versteckt." -#: src/rc_formatters.py:331 src/rc_formatters.py:615 +#: src/formatters/rc.py:332 +#, 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/formatters/rc.py:348 src/formatters/rc.py:584 msgid "No description provided" msgstr "Keine Zusammenfassung angegeben" -#: src/rc_formatters.py:378 +#: src/formatters/rc.py:375 msgid "(N!) " msgstr "(N!) " -#: src/rc_formatters.py:379 +#: src/formatters/rc.py:376 msgid "m" msgstr "K" -#: src/rc_formatters.py:379 +#: src/formatters/rc.py:376 msgid "b" msgstr "B" -#: src/rc_formatters.py:396 src/rc_formatters.py:401 +#: src/formatters/rc.py:393 src/formatters/rc.py:398 msgid "__Only whitespace__" msgstr "__Nur Leerraum__" -#: src/rc_formatters.py:406 +#: src/formatters/rc.py:403 msgid "Removed" msgstr "Entfernt" -#: src/rc_formatters.py:408 +#: src/formatters/rc.py:405 msgid "Added" msgstr "Hinzugefügt" -#: src/rc_formatters.py:442 src/rc_formatters.py:481 +#: src/formatters/rc.py:439 src/formatters/rc.py:450 msgid "Options" msgstr "Optionen" -#: src/rc_formatters.py:442 +#: src/formatters/rc.py:439 #, python-brace-format msgid "([preview]({link}) | [undo]({undolink}))" msgstr "([Vorschau]({link}) | [zurücksetzen]({undolink}))" -#: src/rc_formatters.py:447 +#: src/formatters/rc.py:444 #, python-brace-format msgid "Uploaded a new version of {name}" msgstr "Neue Dateiversion {name}" -#: src/rc_formatters.py:449 +#: src/formatters/rc.py:446 #, python-brace-format msgid "Reverted a version of {name}" msgstr "Setzte {name} auf eine alte Version zurück" -#: src/rc_formatters.py:451 +#: src/formatters/rc.py:448 #, python-brace-format msgid "Uploaded {name}" msgstr "Neue Datei {name}" -#: src/rc_formatters.py:467 -msgid "**No license!**" -msgstr "**Keine Lizenz!**" - -#: src/rc_formatters.py:479 -msgid "" -"\n" -"License: {}" -msgstr "" -"\n" -"Lizenz: {}" - -#: src/rc_formatters.py:481 +#: src/formatters/rc.py:450 #, python-brace-format msgid "([preview]({link}))" msgstr "([Vorschau]({link}))" -#: src/rc_formatters.py:486 +#: src/formatters/rc.py:455 #, python-brace-format msgid "Deleted page {article}" msgstr "Löschte {article}" -#: src/rc_formatters.py:489 +#: src/formatters/rc.py:458 #, python-brace-format msgid "Deleted redirect {article} by overwriting" msgstr "Löschte die Weiterleitung {article} um Platz zu machen" -#: src/rc_formatters.py:493 +#: src/formatters/rc.py:462 msgid "No redirect has been made" msgstr "Die Erstellung einer Weiterleitung wurde unterdrückt" -#: src/rc_formatters.py:494 +#: src/formatters/rc.py:463 msgid "A redirect has been made" msgstr "Eine Weiterleitung wurde erstellt" -#: src/rc_formatters.py:495 +#: src/formatters/rc.py:464 #, python-brace-format msgid "Moved {redirect}{article} to {target}" msgstr "Verschob {redirect}{article} nach {target}" -#: src/rc_formatters.py:498 +#: src/formatters/rc.py:467 #, python-brace-format msgid "Moved {redirect}{article} to {title} over redirect" msgstr "" "Verschob {redirect}{article} nach {title} und überschrieb eine Weiterleitung" -#: src/rc_formatters.py:502 +#: src/formatters/rc.py:471 #, python-brace-format msgid "Moved protection settings from {redirect}{article} to {title}" msgstr "Verschob die Schutzeinstellungen von {redirect}{article} nach {title}" -#: src/rc_formatters.py:527 +#: src/formatters/rc.py:496 msgid "Blocked from editing the following pages: " msgstr "Bearbeiten von folgenden Seiten gesperrt: " -#: src/rc_formatters.py:536 +#: src/formatters/rc.py:505 msgid "Blocked from editing pages on following namespaces: " msgstr "Bearbeiten von Seiten in folgenden Namensräumen gesperrt: " -#: src/rc_formatters.py:547 +#: src/formatters/rc.py:516 msgid "Partial block details" msgstr "Teilweise Sperre" -#: src/rc_formatters.py:548 -#, fuzzy, python-brace-format +#: src/formatters/rc.py:517 +#, python-brace-format msgid "Blocked {blocked_user} {time}" -msgstr "Sperrte {blocked_user} für {time}" +msgstr "Sperrte {blocked_user} {time}" -#: src/rc_formatters.py:552 +#: src/formatters/rc.py:521 #, python-brace-format msgid "Changed block settings for {blocked_user}" msgstr "Änderte die Sperreinstellungen für {blocked_user}" -#: src/rc_formatters.py:556 +#: src/formatters/rc.py:525 #, python-brace-format msgid "Unblocked {blocked_user}" msgstr "Hob die Sperre von {blocked_user} auf" -#: src/rc_formatters.py:561 +#: src/formatters/rc.py:530 #, python-brace-format msgid "Left a comment on {target}'s profile" msgstr "Hinterließ ein Kommentar auf dem Profil von {target}" -#: src/rc_formatters.py:563 +#: src/formatters/rc.py:532 msgid "Left a comment on their own profile" msgstr "Hinterließ ein Kommentar auf dem eigenen Profil" -#: src/rc_formatters.py:568 +#: src/formatters/rc.py:537 #, python-brace-format msgid "Replied to a comment on {target}'s profile" msgstr "Antwortete auf ein Kommentar auf dem Profil von {target}" -#: src/rc_formatters.py:570 +#: src/formatters/rc.py:539 msgid "Replied to a comment on their own profile" msgstr "Antwortete auf ein Kommentar auf dem eigenen Profil" -#: src/rc_formatters.py:575 +#: src/formatters/rc.py:544 #, python-brace-format msgid "Edited a comment on {target}'s profile" msgstr "Bearbeitete ein Kommentar auf dem Profil von {target}" -#: src/rc_formatters.py:577 +#: src/formatters/rc.py:546 msgid "Edited a comment on their own profile" msgstr "Bearbeitete ein Kommentar auf dem eigenen Profil" -#: src/rc_formatters.py:580 +#: src/formatters/rc.py:549 #, python-brace-format msgid "Edited {target}'s profile" msgstr "Bearbeitete das Profil von {target}" -#: src/rc_formatters.py:580 +#: src/formatters/rc.py:549 msgid "Edited their own profile" msgstr "Bearbeitete das eigene Profil" -#: src/rc_formatters.py:582 +#: src/formatters/rc.py:551 #, python-brace-format msgid "Cleared the {field} field" msgstr "Entfernte den {field}" -#: src/rc_formatters.py:584 +#: src/formatters/rc.py:553 #, python-brace-format msgid "{field} field changed to: {desc}" msgstr "{field} geändert zu: {desc}" -#: src/rc_formatters.py:587 +#: src/formatters/rc.py:556 #, python-brace-format msgid "Purged a comment on {target}'s profile" msgstr "Löschte ein Kommentar auf dem Profil von {target} dauerhaft" -#: src/rc_formatters.py:593 +#: src/formatters/rc.py:562 #, python-brace-format msgid "Deleted a comment on {target}'s profile" msgstr "Löschte ein Kommentar auf dem Profil von {target}" -#: src/rc_formatters.py:597 +#: src/formatters/rc.py:566 #, python-brace-format msgid "Changed group membership for {target}" msgstr "Änderte die Gruppenzugehörigkeit von {target}" -#: src/rc_formatters.py:601 +#: src/formatters/rc.py:570 #, python-brace-format msgid "{target} got autopromoted to a new usergroup" msgstr "{target} wurde automatisch einer neuen Benutzergruppe zugeordnet" -#: src/rc_formatters.py:616 +#: src/formatters/rc.py:585 #, python-brace-format msgid "Groups changed from {old_groups} to {new_groups}{reason}" msgstr "" "Änderte die Gruppenzugehörigkeit von {old_groups} auf {new_groups}{reason}" -#: src/rc_formatters.py:620 +#: src/formatters/rc.py:589 #, python-brace-format msgid "Protected {target}" msgstr "Schützte {target}" -#: src/rc_formatters.py:626 +#: src/formatters/rc.py:595 #, python-brace-format msgid "Changed protection level for {article}" msgstr "Änderte den Schutzstatus von {article}" -#: src/rc_formatters.py:632 +#: src/formatters/rc.py:601 #, python-brace-format msgid "Removed protection from {article}" msgstr "Entfernte den Schutz von {article}" -#: src/rc_formatters.py:636 +#: src/formatters/rc.py:605 #, python-brace-format msgid "Changed visibility of revision on page {article} " msgid_plural "Changed visibility of {amount} revisions on page {article} " msgstr[0] "Änderte die Sichtbarkeit einer Versionen von {article} " msgstr[1] "Änderte die Sichtbarkeit von {amount} Versionen von {article} " -#: src/rc_formatters.py:641 +#: src/formatters/rc.py:610 #, python-brace-format msgid "Imported {article} with {count} revision" msgid_plural "Imported {article} with {count} revisions" msgstr[0] "Importierte {article} mit einer Version" msgstr[1] "Importierte {article} mit {count} Versionen" -#: src/rc_formatters.py:646 +#: src/formatters/rc.py:615 #, python-brace-format msgid "Restored {article}" msgstr "Stellte {article} wieder her" -#: src/rc_formatters.py:649 +#: src/formatters/rc.py:618 msgid "Changed visibility of log events" msgstr "Änderte die Sichtbarkeit eines Logbucheintrags" -#: src/rc_formatters.py:652 +#: src/formatters/rc.py:621 msgid "Imported interwiki" msgstr "Importierte Interwiki" -#: src/rc_formatters.py:655 +#: src/formatters/rc.py:624 #, python-brace-format msgid "Edited abuse filter number {number}" msgstr "Änderte Missbrauchsfilter {number}" -#: src/rc_formatters.py:658 +#: src/formatters/rc.py:627 #, python-brace-format msgid "Created abuse filter number {number}" msgstr "Erstellte Missbrauchsfilter {number}" -#: src/rc_formatters.py:661 +#: src/formatters/rc.py:630 #, python-brace-format msgid "Merged revision histories of {article} into {dest}" msgstr "Vereinigte Versionen von {article} in {dest}" -#: src/rc_formatters.py:665 +#: src/formatters/rc.py:634 msgid "Created account automatically" -msgstr "" +msgstr "Erstellte Konto automatisch" -#: src/rc_formatters.py:668 src/rc_formatters.py:677 +#: src/formatters/rc.py:637 src/formatters/rc.py:646 msgid "Created account" -msgstr "" +msgstr "Erstellte Konto" -#: src/rc_formatters.py:671 -#, fuzzy, python-brace-format +#: src/formatters/rc.py:640 +#, python-brace-format msgid "Created account {article}" -msgstr "Löschte {article}" +msgstr "Erstellte Konto {article}" -#: src/rc_formatters.py:674 +#: src/formatters/rc.py:643 #, python-brace-format msgid "Created account {article} and password was sent by email" -msgstr "" +msgstr "Erstellte Konto {article} und das Passwort wurde per E-Mail zugesandt" -#: src/rc_formatters.py:680 +#: src/formatters/rc.py:649 msgid "Added an entry to the interwiki table" msgstr "Fügte ein Interwiki-Präfix hinzu" -#: src/rc_formatters.py:681 src/rc_formatters.py:687 +#: src/formatters/rc.py:650 src/formatters/rc.py:656 #, python-brace-format msgid "Prefix: {prefix}, website: {website} | {desc}" msgstr "Präfix: {prefix}, URL: {website} | {desc}" -#: src/rc_formatters.py:686 +#: src/formatters/rc.py:655 msgid "Edited an entry in interwiki table" msgstr "Änderte ein Interwiki-Präfix" -#: src/rc_formatters.py:692 +#: src/formatters/rc.py:661 msgid "Deleted an entry in interwiki table" msgstr "Entfernte ein Interwiki-Präfix" -#: src/rc_formatters.py:693 +#: src/formatters/rc.py:662 #, python-brace-format msgid "Prefix: {prefix} | {desc}" msgstr "Präfix: {prefix} | {desc}" -#: src/rc_formatters.py:696 +#: src/formatters/rc.py:665 #, python-brace-format msgid "Changed the content model of the page {article}" msgstr "Änderte das Inhaltsmodell von {article}" -#: src/rc_formatters.py:697 +#: src/formatters/rc.py:666 #, python-brace-format msgid "Model changed from {old} to {new}: {reason}" msgstr "Modell geändert von {old} zu {new}: {reason}" -#: src/rc_formatters.py:702 +#: src/formatters/rc.py:671 #, python-brace-format msgid "Edited the sprite for {article}" msgstr "Änderte das Sprite für {article}" -#: src/rc_formatters.py:705 +#: src/formatters/rc.py:674 #, python-brace-format msgid "Created the sprite sheet for {article}" msgstr "Erstellte das Sprite-sheet für {article}" -#: src/rc_formatters.py:708 +#: src/formatters/rc.py:677 #, python-brace-format msgid "Edited the slice for {article}" msgstr "Änderte das Stück für {article}" -#: src/rc_formatters.py:714 +#: src/formatters/rc.py:681 #, python-brace-format msgid "Created the Cargo table \"{table}\"" msgstr "Erstellte die Cargo-Tabelle „{table}“" -#: src/rc_formatters.py:718 +#: src/formatters/rc.py:685 #, python-brace-format msgid "Deleted the Cargo table \"{table}\"" msgstr "Löschte die Cargo-Tabelle „{table}“" -#: src/rc_formatters.py:725 +#: src/formatters/rc.py:690 #, python-brace-format msgid "Recreated the Cargo table \"{table}\"" msgstr "Erstellte die Cargo-Tabelle „{table}“ neu" -#: src/rc_formatters.py:732 +#: src/formatters/rc.py:695 #, python-brace-format msgid "Replaced the Cargo table \"{table}\"" msgstr "Ersetzte die Cargo-Tabelle „{table}“" -#: src/rc_formatters.py:736 +#: src/formatters/rc.py:699 #, python-brace-format msgid "Created a tag \"{tag}\"" msgstr "Erstellte die Markierung „{tag}“" -#: src/rc_formatters.py:740 +#: src/formatters/rc.py:703 #, python-brace-format msgid "Deleted a tag \"{tag}\"" msgstr "Löschte die Markierung „{tag}“" -#: src/rc_formatters.py:744 +#: src/formatters/rc.py:707 #, python-brace-format msgid "Activated a tag \"{tag}\"" msgstr "Aktivierte die Markierung „{tag}“" -#: src/rc_formatters.py:747 +#: src/formatters/rc.py:710 #, python-brace-format msgid "Deactivated a tag \"{tag}\"" msgstr "Deaktivierte die Markierung „{tag}“" -#: src/rc_formatters.py:750 +#: src/formatters/rc.py:713 #, fuzzy -msgid "Action has been hidden by administration" +msgid "Action has been hidden by administration." msgstr "Aktion wurde versteckt" -#: src/rc_formatters.py:751 +#: src/formatters/rc.py:714 msgid "Unknown" msgstr "Unbekannt" -#: src/rc_formatters.py:770 +#: src/formatters/rc.py:718 +#, python-brace-format +msgid "Unknown event `{event}`" +msgstr "Unbekanntes Event `{event}`" + +#: src/formatters/rc.py:723 src/formatters/rc.py:725 +msgid "Report this on the support server" +msgstr "Melde es auf dem Support-Server" + +#: src/formatters/rc.py:742 msgid "Tags" msgstr "Markierungen" -#: src/rc_formatters.py:773 +#: src/formatters/rc.py:745 msgid "**Added**: " msgstr "**Hinzugefügt:** " -#: src/rc_formatters.py:773 +#: src/formatters/rc.py:745 msgid " and {} more\n" msgstr " und {} mehr\n" -#: src/rc_formatters.py:774 +#: src/formatters/rc.py:746 msgid "**Removed**: " msgstr "**Entfernt:** " -#: src/rc_formatters.py:774 +#: src/formatters/rc.py:746 msgid " and {} more" msgstr " und {} mehr" -#: src/rc_formatters.py:775 +#: src/formatters/rc.py:747 msgid "Changed categories" msgstr "Geänderte Kategorien" + +#, python-brace-format +msgid "{value} (avg. {avg})" +msgstr "{value} (vgl. {avg})" + +msgid "Daily overview" +msgstr "Tägliche Übersicht" + +msgid "No activity" +msgstr "Keine Aktivität" + +msgid " ({} action)" +msgid_plural " ({} actions)" +msgstr[0] " (eine Aktion)" +msgstr[1] " ({} Aktionen)" + +msgid " ({} edit)" +msgid_plural " ({} edits)" +msgstr[0] " (eine Änderung)" +msgstr[1] " ({} Änderungen)" + +msgid " UTC ({} action)" +msgid_plural " UTC ({} actions)" +msgstr[0] " UTC (eine Aktion)" +msgstr[1] " UTC ({} Aktionen)" + +msgid "But nobody came" +msgstr "Keine Aktivität" + +msgid "Most active user" +msgid_plural "Most active users" +msgstr[0] "Aktivster Benutzer" +msgstr[1] "Aktivste Benutzer" + +msgid "Edits made" +msgstr "Bearbeitungen" + +msgid "New files" +msgstr "Neue Dateien" + +msgid "Admin actions" +msgstr "Admin-Aktionen" + +msgid "Bytes changed" +msgstr "Bytes geändert" + +msgid "Unique contributors" +msgstr "Einzelne Autoren" + +msgid "Most active hour" +msgid_plural "Most active hours" +msgstr[0] "Aktivste Stunde" +msgstr[1] "Aktivste Stunden" + +msgid "Day score" +msgstr "Tageswert" + +#, fuzzy +#~ msgid "Most edited article" +#~ msgid_plural "Most edited articles" +#~ msgstr[0] "Stellte {article} wieder her" +#~ msgstr[1] "Stellte {article} wieder her" + +#, fuzzy +#~ msgid "New articles" +#~ msgstr "Stellte {article} wieder her" + +#~ msgid "**No license!**" +#~ msgstr "**Keine Lizenz!**" + +#~ msgid "" +#~ "\n" +#~ "License: {}" +#~ msgstr "" +#~ "\n" +#~ "Lizenz: {}" diff --git a/locale/de/LC_MESSAGES/wiki.po b/locale/de/LC_MESSAGES/wiki.po index 8695017..4ddbe58 100644 --- a/locale/de/LC_MESSAGES/wiki.po +++ b/locale/de/LC_MESSAGES/wiki.po @@ -2,8 +2,8 @@ msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2020-08-08 17:22+0200\n" -"PO-Revision-Date: 2020-08-10 01:54+0200\n" +"POT-Creation-Date: 2020-08-10 01:01+0200\n" +"PO-Revision-Date: 2020-08-03 13:44+0000\n" "Last-Translator: MarkusRost \n" "Language-Team: German \n" @@ -12,29 +12,26 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Poedit 2.3.1\n" +"X-Generator: Weblate 4.1.1\n" "X-Loco-Source-Locale: de_DE\n" "Generated-By: pygettext.py 1.5\n" "X-Loco-Parser: loco_parse_po\n" -#: src/rc.py:150 -#, python-brace-format -msgid "Connection to {wiki} seems to be stable now." -msgstr "{wiki} scheint wieder erreichbar zu sein." - -#: src/rc.py:151 src/rc.py:266 -msgid "Connection status" -msgstr "Verbindungsstatus" - -#: src/rc.py:265 -#, python-brace-format -msgid "{wiki} seems to be down or unreachable." -msgstr "Das {wiki} scheint unerreichbar zu sein." - -#: src/rc.py:334 +#: src/wiki.py:207 msgid "~~hidden~~" msgstr "~~versteckt~~" -#: src/rc.py:340 +#: src/wiki.py:212 msgid "hidden" msgstr "versteckt" + +#, python-brace-format +#~ msgid "Connection to {wiki} seems to be stable now." +#~ msgstr "{wiki} scheint wieder erreichbar zu sein." + +#~ msgid "Connection status" +#~ msgstr "Verbindungsstatus" + +#, python-brace-format +#~ msgid "{wiki} seems to be down or unreachable." +#~ msgstr "Das {wiki} scheint unerreichbar zu sein." diff --git a/locale/pl/LC_MESSAGES/discord.po b/locale/pl/LC_MESSAGES/discord.po index 33a98ed..99db503 100644 --- a/locale/pl/LC_MESSAGES/discord.po +++ b/locale/pl/LC_MESSAGES/discord.po @@ -7,29 +7,30 @@ msgid "" msgstr "" "Project-Id-Version: RcGcDd\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2020-08-10 01:44+0200\n" +"POT-Creation-Date: 2020-08-10 16:46+0200\n" "PO-Revision-Date: 2020-08-10 01:55+0200\n" +"Last-Translator: \n" "Language-Team: \n" +"Language: pl\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Poedit 2.3.1\n" -"Last-Translator: \n" -"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : 2);\n" -"Language: pl\n" +"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 " +"|| n%100>14) ? 1 : 2);\n" -#: src/discord.py:27 +#: src/discord.py:25 msgid "wiki deletion" msgstr "" -#: src/discord.py:27 src/discord.py:28 +#: src/discord.py:25 src/discord.py:26 msgid "wiki becoming inaccessible" msgstr "" -#: src/discord.py:29 +#: src/discord.py:27 msgid "unknown error" msgstr "" -#: src/discord.py:30 +#: src/discord.py:28 msgid "The webhook for {} has been removed due to {}." msgstr "" diff --git a/locale/pl/LC_MESSAGES/discussion_formatters.po b/locale/pl/LC_MESSAGES/discussion_formatters.po index e355047..3ca5f59 100644 --- a/locale/pl/LC_MESSAGES/discussion_formatters.po +++ b/locale/pl/LC_MESSAGES/discussion_formatters.po @@ -7,131 +7,169 @@ msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2020-08-08 22:56+0200\n" -"PO-Revision-Date: 2020-08-10 01:55+0200\n" -"Last-Translator: \n" -"Language-Team: \n" +"POT-Creation-Date: 2020-08-10 16:45+0200\n" +"PO-Revision-Date: 2020-08-10 16:41+0000\n" +"Last-Translator: Frisk The Evil Goat Overlord \n" +"Language-Team: Polish \n" "Language: pl\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Generator: Poedit 2.3.1\n" -"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 " -"|| n%100>14) ? 1 : 2);\n" +"Plural-Forms: nplurals=3; plural=n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 " +"|| n%100>=20) ? 1 : 2;\n" +"X-Generator: Weblate 4.1.1\n" -#: src/discussion_formatters.py:38 +#: src/formatters/discussions.py:21 #, 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}" +"[{author}](<{url}f/u/{creatorId}>) created [{title}](<{url}f/p/{threadId}>) " +"in {forumName}" msgstr "" -"[{author}](<{url}f/u/{creatorId}>) utworzył(a) [odpowiedź](<{url}f/p/" -"{threadId}/r/{postId}>) pod tematem [{title}](<{url}f/p/{threadId}>) w " +"[{author}]({author_url}) utworzył(a) [{title}](<{url}f/p/{threadId}>) w " "{forumName}" -#: src/discussion_formatters.py:40 src/discussion_formatters.py:49 -#: src/discussion_formatters.py:104 src/discussion_formatters.py:117 +#: src/formatters/discussions.py:23 +#, fuzzy, python-brace-format +msgid "" +"[{author}](<{url}f/u/{creatorId}>) created a poll [{title}](<{url}f/p/" +"{threadId}>) in {forumName}" +msgstr "" +"[{author}]({author_url}) utworzył(a) ankietę [{title}](<{url}f/p/{threadId}" +">) w {forumName}" + +#: src/formatters/discussions.py:28 +#, fuzzy, python-brace-format +msgid "" +"[{author}](<{url}f/u/{creatorId}>) created a [reply](<{url}f/p/{threadId}/r/" +"{postId}>) to [{title}](<{url}f/p/{threadId}>) in {forumName}" +msgstr "" +"[{author}]({author_url}) utworzył(a) [odpowiedź](<{url}f/p/{threadId}/r/" +"{postId}>) pod tematem [{title}](<{url}f/p/{threadId}>) w {forumName}" + +#: src/formatters/discussions.py:30 src/formatters/discussions.py:38 +#: src/formatters/discussions.py:96 src/formatters/discussions.py:108 msgid "unknown" msgstr "nieznany" -#: src/discussion_formatters.py:44 +#: src/formatters/discussions.py:34 #, fuzzy, python-brace-format msgid "" -"[{author}]({author_url}) created [{title}](<{url}wiki/Message_Wall:" +"[{author}](<{url}f/u/{creatorId}>) created [{title}](<{url}wiki/Message_Wall:" "{user_wall}?threadId={threadId}>) on [{user}'s Message Wall](<{url}wiki/" "Message_Wall:{user_wall}>)" msgstr "" -"[{author}](<{url}f/u/{creatorId}>) utworzył(a) [{title}](<{wikiurl}wiki/" -"Message_Wall:{user_wall}?threadId={threadid}>) na tablicy wiadomości " -"użytkownika/użytkowniczki {user}" +"[{author}]({author_url}) utworzył(a) [{title}](<{url}wiki/Message_Wall:" +"{user_wall}?threadId={threadId}>) na [tablicy wiadomości użytkownika/" +"użytkowniczki {user}](<{url}wiki/Message_Wall:{user_wall}>)" -#: src/discussion_formatters.py:46 +#: src/formatters/discussions.py:36 #, fuzzy, python-brace-format msgid "" -"[{author}]({author_url}) created a [reply](<{url}wiki/Message_Wall:" +"[{author}](<{url}f/u/{creatorId}>) 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]" +"Message_Wall:{user_wall}?threadId={threadId}) on [{user}'s Message Wall]" "(<{url}wiki/Message_Wall:{user_wall}>)" msgstr "" -"[{author}](<{url}f/u/{creatorId}>) odpowiedział(a) na[{title}](<{wikiurl}" -"wiki/Message_Wall:{user_wall}?threadId={threadid}#{replyId}>) na tablicy " -"wiadomości użytkownika/użytkowniczki {user}" +"[{author}]({author_url}) stworzył(-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:51 +#: src/formatters/discussions.py:40 +#, fuzzy, python-brace-format +msgid "" +"[{author}](<{url}f/u/{creatorId}>) created a [comment](<{url}wiki/{article}?" +"threadId={threadId}>) on [{article}](<{url}wiki/{article}>)" +msgstr "" +"[{author}]({author_url}) utworzył(-a) [komentarz](<{url}wiki/{article}?" +"commentId={commentId}>) w [{article}](<{url}wiki/{article}>)" + +#: src/formatters/discussions.py:42 +#, fuzzy, python-brace-format +msgid "" +"[{author}](<{url}f/u/{creatorId}>) created a [reply](<{url}wiki/{article}?" +"threadId={threadId}) to a [comment](<{url}wiki/{article}?threadId={threadId}" +"#{replyId}>) on [{article}](<{url}wiki/{article}>)" +msgstr "" +"[{author}]({author_url}) utworzył(-a) [odpowiedź](<{url}wiki/{article}?" +"threadId={threadId}) na [komentarz](<{url}wiki/{article}?" +"commentId={commentId}&replyId={replyId}>) w artykule [{article}](<{url}wiki/" +"{article}>)" + +#: src/formatters/discussions.py:48 #, python-brace-format msgid "" -"[{author}]({author_url}) created a [comment](<{url}wiki/{article}?" -"commentId={commentId}>) on [{article}](<{url}wiki/{article}>)" +"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:53 -#, python-brace-format -msgid "" -"[{author}]({author_url}) created a [reply](<{url}wiki/{article}?" -"threadId={threadId}) to a [comment](<{url}wiki/{article}?" -"commentId={commentId}&replyId={replyId}>) on [{article}](<{url}wiki/{article}" -">)" -msgstr "" - -#: src/discussion_formatters.py:82 +#: src/formatters/discussions.py:74 #, python-brace-format msgid "Created \"{title}\"" msgstr "Utworzył(a) „{title}”" -#: src/discussion_formatters.py:87 -#, fuzzy, python-brace-format +#: src/formatters/discussions.py:79 +#, python-brace-format msgid "Created a poll \"{title}\"" msgstr "Utworzył(a) ankietę zatytułowaną „{title}”" -#: src/discussion_formatters.py:92 +#: src/formatters/discussions.py:84 msgid "Option {}" msgstr "Opcja {}" -#: src/discussion_formatters.py:93 +#: src/formatters/discussions.py:85 #, python-brace-format msgid "__[View image]({image_url})__" msgstr "__[Zobacz zdjęcie]({image_url})__" -#: src/discussion_formatters.py:101 +#: src/formatters/discussions.py:93 #, python-brace-format msgid "Replied to \"{title}\"" msgstr "Odpowiedział(a) w „{title}”" -#: src/discussion_formatters.py:110 +#: src/formatters/discussions.py:102 #, python-brace-format msgid "Created \"{title}\" on {user}'s Message Wall" msgstr "" "Utworzył(a) „{title}” na tablicy wiadomości użytkownika/użytkowniczki {user}" -#: src/discussion_formatters.py:114 +#: src/formatters/discussions.py:106 #, python-brace-format msgid "Replied to \"{title}\" on {user}'s Message Wall" msgstr "" "Odpowiedział(a) na „{title}” z tablicy wiadomości użytkownika/użytkowniczki " "{user}" -#: src/discussion_formatters.py:121 -#, fuzzy, python-brace-format +#: src/formatters/discussions.py:112 +#, python-brace-format msgid "Commented on {article}" -msgstr "Utworzył(a) „{title}”" +msgstr "Skomentował(a) „{article}”" -#: src/discussion_formatters.py:125 -#, fuzzy, python-brace-format +#: src/formatters/discussions.py:116 +#, python-brace-format msgid "Replied to a comment on {article}" -msgstr "Odpowiedział(a) w „{title}”" +msgstr "Odpowiedział(a) na komentarz w „{article}”" + +#: src/formatters/discussions.py:120 +#, python-brace-format +msgid "Unknown event `{event}`" +msgstr "Nieznane wydarzenie `{event}`" + +#: src/formatters/discussions.py:125 src/formatters/discussions.py:127 +msgid "Report this on the support server" +msgstr "Zgłoś to na serwerze wsparcia" #, python-brace-format #~ msgid "" -#~ "[{author}](<{url}f/u/{creatorId}>) created [{title}](<{url}f/p/{threadId}" -#~ ">) in {forumName}" +#~ "[{author}]({author_url}) created a quiz [{title}](<{url}f/p/{threadId}>) " +#~ "in {forumName}" #~ msgstr "" -#~ "[{author}](<{url}f/u/{creatorId}>) utworzył(a) [{title}](<{url}f/p/" -#~ "{threadId}>) w {forumName}" +#~ "[{author}]({author_url}) utworzył(a) quiz [{title}](<{url}f/p/{threadId}" +#~ ">) w {forumName}" #, python-brace-format -#~ msgid "" -#~ "[{author}](<{url}f/u/{creatorId}>) created a poll [{title}](<{url}f/p/" -#~ "{threadId}>) in {forumName}" -#~ msgstr "" -#~ "[{author}](<{url}f/u/{creatorId}>) utworzył(a) ankietę [{title}](<{url}f/" -#~ "p/{threadId}>) w {forumName}" +#~ msgid "Created a quiz \"{title}\"" +#~ msgstr "Utworzył(a) quiz „{title}”" diff --git a/locale/pl/LC_MESSAGES/misc.po b/locale/pl/LC_MESSAGES/misc.po index 1e61275..265758a 100644 --- a/locale/pl/LC_MESSAGES/misc.po +++ b/locale/pl/LC_MESSAGES/misc.po @@ -6,8 +6,8 @@ msgid "" msgstr "" "Project-Id-Version: RcGcDw\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2020-08-08 14:00+0200\n" -"PO-Revision-Date: 2020-08-10 01:55+0200\n" +"POT-Creation-Date: 2020-08-10 00:59+0200\n" +"PO-Revision-Date: 2020-03-17 20:57+0100\n" "Last-Translator: Frisk \n" "Language-Team: \n" "Language: pl\n" @@ -15,74 +15,74 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Generated-By: pygettext.py 1.5\n" -"X-Generator: Poedit 2.3.1\n" +"X-Generator: Poedit 2.3\n" "Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 " "|| n%100>=20) ? 1 : 2);\n" -#: src/misc.py:42 +#: src/misc.py:96 msgid "Location" msgstr "Lokacja" -#: src/misc.py:42 +#: src/misc.py:96 msgid "About me" msgstr "O mnie" -#: src/misc.py:42 +#: src/misc.py:97 msgid "Google link" msgstr "link Google" -#: src/misc.py:42 +#: src/misc.py:97 msgid "Facebook link" msgstr "link Facebook" -#: src/misc.py:42 +#: src/misc.py:98 msgid "Twitter link" msgstr "link Twitter" -#: src/misc.py:42 +#: src/misc.py:98 msgid "Reddit link" msgstr "link Reddit" -#: src/misc.py:42 +#: src/misc.py:99 msgid "Twitch link" msgstr "link Twitch" -#: src/misc.py:42 +#: src/misc.py:99 msgid "PSN link" msgstr "link PSN" -#: src/misc.py:42 +#: src/misc.py:100 msgid "VK link" msgstr "link VK" -#: src/misc.py:42 +#: src/misc.py:100 msgid "XBL link" msgstr "link XBL" -#: src/misc.py:42 +#: src/misc.py:101 msgid "Steam link" msgstr "link Steam" -#: src/misc.py:42 +#: src/misc.py:101 msgid "Discord handle" msgstr "konto Discord" -#: src/misc.py:42 +#: src/misc.py:102 msgid "Battle.net handle" msgstr "konto Battle.net" -#: src/misc.py:142 +#: src/misc.py:108 +msgid "Unknown" +msgstr "Nieznana" + +#: src/misc.py:110 +msgid "unknown" +msgstr "nieznana sekcja" + +#: src/misc.py:121 msgid "" "\n" "__And more__" msgstr "" "\n" "__Oraz więcej__" - -#: src/misc.py:423 -msgid "Unknown" -msgstr "Nieznana" - -#: src/misc.py:425 -msgid "unknown" -msgstr "nieznana sekcja" diff --git a/locale/pl/LC_MESSAGES/rc_formatters.po b/locale/pl/LC_MESSAGES/rc_formatters.po index ccabe72..c7be713 100644 --- a/locale/pl/LC_MESSAGES/rc_formatters.po +++ b/locale/pl/LC_MESSAGES/rc_formatters.po @@ -6,232 +6,131 @@ msgid "" msgstr "" "Project-Id-Version: RcGcDw\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2020-08-08 17:21+0200\n" -"PO-Revision-Date: 2020-08-10 01:55+0200\n" -"Last-Translator: Frisk \n" -"Language-Team: \n" +"POT-Creation-Date: 2020-08-10 16:45+0200\n" +"PO-Revision-Date: 2020-08-10 16:41+0000\n" +"Last-Translator: Frisk The Evil Goat Overlord \n" +"Language-Team: Polish \n" "Language: pl\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=3; plural=n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 " +"|| n%100>=20) ? 1 : 2;\n" +"X-Generator: Weblate 4.1.1\n" "Generated-By: pygettext.py 1.5\n" -"X-Generator: Poedit 2.3.1\n" -"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 " -"|| n%100>=20) ? 1 : 2);\n" -"Project-Id-Version: RcGcDw\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2020-08-08 22:56+0200\n" -"PO-Revision-Date: 2020-03-17 20:57+0100\n" -"Last-Translator: Frisk \n" -"Language-Team: \n" -"Language: pl\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Generated-By: pygettext.py 1.5\n" -"X-Generator: Poedit 2.3\n" -"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 " -"|| n%100>=20) ? 1 : 2);\n" -#: src/rcgcdw.py:113 src/rcgcdw.py:115 src/rcgcdw.py:117 src/rcgcdw.py:119 -#: src/rcgcdw.py:121 src/rcgcdw.py:123 src/rcgcdw.py:125 -#, python-brace-format -msgid "{value} (avg. {avg})" -msgstr "{value} (średnio {avg})" - -#: src/rcgcdw.py:145 -msgid "Daily overview" -msgstr "Podsumowanie dnia" - -#: src/rcgcdw.py:153 -msgid "No activity" -msgstr "Brak aktywności" - -#: src/rcgcdw.py:177 -msgid " ({} action)" -msgid_plural " ({} actions)" -msgstr[0] " ({} akcja)" -msgstr[1] " ({} akcje)" -msgstr[2] " ({} akcji)" - -#: src/rcgcdw.py:179 -msgid " ({} edit)" -msgid_plural " ({} edits)" -msgstr[0] " ({} edycja)" -msgstr[1] " ({} edycje)" -msgstr[2] " ({} edycji)" - -#: src/rcgcdw.py:184 -msgid " UTC ({} action)" -msgid_plural " UTC ({} actions)" -msgstr[0] " UTC ({} akcja)" -msgstr[1] " UTC ({} akcje)" -msgstr[2] " UTC ({} akcji)" - -#: src/rcgcdw.py:186 src/rcgcdw.py:187 src/rcgcdw.py:191 -msgid "But nobody came" -msgstr "Ale nikt nie przyszedł" - -#: src/rcgcdw.py:194 -msgid "Most active user" -msgid_plural "Most active users" -msgstr[0] "Najbardziej aktywny użytkownik" -msgstr[1] "Najbardziej aktywni użytkownicy" -msgstr[2] "Najbardziej aktywni użytkownicy" - -#: src/rcgcdw.py:195 -msgid "Most edited article" -msgid_plural "Most edited articles" -msgstr[0] "Najczęściej edytowany artykuł" -msgstr[1] "Najczęściej edytowane artykuły" -msgstr[2] "Najczęściej edytowane artykuły" - -#: src/rcgcdw.py:196 -msgid "Edits made" -msgstr "Zrobionych edycji" - -#: src/rcgcdw.py:196 -msgid "New files" -msgstr "Nowych plików" - -#: src/rcgcdw.py:196 -msgid "Admin actions" -msgstr "Akcji administratorskich" - -#: src/rcgcdw.py:197 -msgid "Bytes changed" -msgstr "Zmienionych bajtów" - -#: src/rcgcdw.py:197 -msgid "New articles" -msgstr "Nowych artykułów" - -#: src/rcgcdw.py:198 -msgid "Unique contributors" -msgstr "Unikalnych edytujących" - -#: src/rcgcdw.py:199 -msgid "Most active hour" -msgid_plural "Most active hours" -msgstr[0] "Najbardziej aktywna godzina" -msgstr[1] "Najbardziej aktywne godziny" -msgstr[2] "Najbardziej aktywne godziny" - -#: src/rcgcdw.py:200 -msgid "Day score" -msgstr "Wynik dnia" - -#: src/rcgcdw.py:242 +#: src/formatters/rc.py:19 msgid "director" msgstr "Dyrektor" -#: src/rcgcdw.py:242 +#: src/formatters/rc.py:19 msgid "bot" msgstr "Bot" -#: src/rcgcdw.py:242 +#: src/formatters/rc.py:19 msgid "editor" msgstr "Redaktor" -#: src/rcgcdw.py:242 +#: src/formatters/rc.py:19 msgid "directors" msgstr "Dyrektorzy" -#: src/rcgcdw.py:242 +#: src/formatters/rc.py:19 msgid "sysop" msgstr "Administrator" -#: src/rcgcdw.py:242 +#: src/formatters/rc.py:19 msgid "bureaucrat" msgstr "Biurokrata" -#: src/rcgcdw.py:242 +#: src/formatters/rc.py:19 msgid "reviewer" msgstr "Przeglądający" -#: src/rcgcdw.py:243 +#: src/formatters/rc.py:20 msgid "autoreview" msgstr "Automatycznie przeglądający" -#: src/rcgcdw.py:243 +#: src/formatters/rc.py:20 msgid "autopatrol" msgstr "Automatycznie zatwierdzający" -#: src/rcgcdw.py:243 +#: src/formatters/rc.py:20 msgid "wiki_guardian" msgstr "Strażnik wiki" -#: src/rcgcdw.py:243 +#: src/formatters/rc.py:20 msgid "second" msgid_plural "seconds" msgstr[0] "sekunda" msgstr[1] "sekundy" msgstr[2] "sekund" -#: src/rcgcdw.py:243 +#: src/formatters/rc.py:20 msgid "minute" msgid_plural "minutes" msgstr[0] "minuta" msgstr[1] "minuty" msgstr[2] "minut" -#: src/rcgcdw.py:243 +#: src/formatters/rc.py:20 msgid "hour" msgid_plural "hours" msgstr[0] "godzina" msgstr[1] "godziny" msgstr[2] "godzin" -#: src/rcgcdw.py:243 +#: src/formatters/rc.py:20 msgid "day" msgid_plural "days" msgstr[0] "dzień" msgstr[1] "dni" msgstr[2] "dni" -#: src/rcgcdw.py:243 +#: src/formatters/rc.py:20 msgid "week" msgid_plural "weeks" msgstr[0] "tydzień" msgstr[1] "tygodnie" msgstr[2] "tygodni" -#: src/rcgcdw.py:243 +#: src/formatters/rc.py:20 msgid "month" msgid_plural "months" msgstr[0] "miesiąc" msgstr[1] "miesiące" msgstr[2] "miesięcy" -#: src/rcgcdw.py:243 +#: src/formatters/rc.py:20 msgid "year" msgid_plural "years" msgstr[0] "rok" msgstr[1] "lata" msgstr[2] "lat" -#: src/rcgcdw.py:243 +#: src/formatters/rc.py:20 msgid "millennium" msgid_plural "millennia" msgstr[0] "tysiąclecie" msgstr[1] "tysiąclecia" msgstr[2] "tysiącleci" -#: src/rcgcdw.py:243 +#: src/formatters/rc.py:20 msgid "decade" msgid_plural "decades" msgstr[0] "dekada" msgstr[1] "dekady" msgstr[2] "dekad" -#: src/rcgcdw.py:243 +#: src/formatters/rc.py:20 msgid "century" msgid_plural "centuries" msgstr[0] "stulecie" msgstr[1] "stulecia" msgstr[2] "stuleci" -#: src/rc_formatters.py:41 +#: src/formatters/rc.py:52 #, python-brace-format msgid "" "[{author}]({author_url}) edited [{article}]({edit_link}){comment} ({sign}" @@ -240,7 +139,7 @@ msgstr "" "[{author}]({author_url}) editował(-a) [{article}]({edit_link}){comment} " "({sign}{edit_size})" -#: src/rc_formatters.py:43 +#: src/formatters/rc.py:54 #, python-brace-format msgid "" "[{author}]({author_url}) created [{article}]({edit_link}){comment} ({sign}" @@ -249,19 +148,19 @@ msgstr "" "[{author}]({author_url}) stworzył(-a) [{article}]({edit_link}){comment} " "({sign}{edit_size})" -#: src/rc_formatters.py:46 +#: src/formatters/rc.py:57 #, python-brace-format msgid "[{author}]({author_url}) uploaded [{file}]({file_link}){comment}" msgstr "[{author}]({author_url}) przesłał(-a) [{file}]({file_link}){comment}" -#: src/rc_formatters.py:53 +#: src/formatters/rc.py:64 #, python-brace-format msgid "" "[{author}]({author_url}) reverted a version of [{file}]({file_link}){comment}" msgstr "" "[{author}]({author_url}) wycofał(-a) wersję [{file}]({file_link}){comment}" -#: src/rc_formatters.py:57 +#: src/formatters/rc.py:68 #, python-brace-format msgid "" "[{author}]({author_url}) uploaded a new version of [{file}]({file_link})" @@ -270,12 +169,12 @@ msgstr "" "[{author}]({author_url}) przesłał(-a) nową wersję [{file}]({file_link})" "{comment}" -#: src/rc_formatters.py:60 +#: src/formatters/rc.py:71 #, python-brace-format msgid "[{author}]({author_url}) deleted [{page}]({page_link}){comment}" msgstr "[{author}]({author_url}) usunął/usunęła [{page}]({page_link}){comment}" -#: src/rc_formatters.py:64 +#: src/formatters/rc.py:75 #, python-brace-format msgid "" "[{author}]({author_url}) deleted redirect by overwriting [{page}]" @@ -284,15 +183,15 @@ msgstr "" "[{author}]({author_url}) usunął/usunęła przekierowanie przez nadpisanie " "[{page}]({page_link}){comment}" -#: src/rc_formatters.py:68 src/rc_formatters.py:73 +#: src/formatters/rc.py:79 src/formatters/rc.py:84 msgid "without making a redirect" -msgstr "bez utworzenia przekierowania przekierowania" +msgstr "bez utworzenia przekierowania" -#: src/rc_formatters.py:68 src/rc_formatters.py:74 +#: src/formatters/rc.py:79 src/formatters/rc.py:85 msgid "with a redirect" msgstr "z przekierowaniem" -#: src/rc_formatters.py:69 +#: src/formatters/rc.py:80 #, python-brace-format msgid "" "[{author}]({author_url}) moved {redirect}*{article}* to [{target}]" @@ -301,7 +200,7 @@ msgstr "" "[{author}]({author_url}) przeniósł/przeniosła {redirect}*{article}* do " "[{target}]({target_url}) {made_a_redirect}{comment}" -#: src/rc_formatters.py:75 +#: src/formatters/rc.py:86 #, python-brace-format msgid "" "[{author}]({author_url}) moved {redirect}*{article}* over redirect to " @@ -310,7 +209,7 @@ msgstr "" "[{author}]({author_url}) przeniósł/przeniosła {redirect}*{article}* do " "przekierowania [{target}]({target_url}) {made_a_redirect}{comment}" -#: src/rc_formatters.py:80 +#: src/formatters/rc.py:91 #, python-brace-format msgid "" "[{author}]({author_url}) moved protection settings from {redirect}*{article}" @@ -319,42 +218,41 @@ msgstr "" "[{author}]({author_url}) przeniósł/przeniosła ustawienia zabezpieczeń z " "{redirect}*{article}* do [{target}]({target_url}){comment}" -#: src/rc_formatters.py:91 src/rc_formatters.py:512 -#, fuzzy +#: src/formatters/rc.py:102 src/formatters/rc.py:481 msgid "for infinity and beyond" -msgstr "wieczność" +msgstr "na wieczność" -#: src/rc_formatters.py:100 src/rc_formatters.py:520 +#: src/formatters/rc.py:112 src/formatters/rc.py:489 #, python-brace-format msgid "for {num} {translated_length}" -msgstr "" +msgstr "na {num} {translated_length}" -#: src/rc_formatters.py:106 src/rc_formatters.py:523 +#: src/formatters/rc.py:120 src/formatters/rc.py:492 msgid "until {}" -msgstr "" +msgstr "do {}" -#: src/rc_formatters.py:110 +#: src/formatters/rc.py:124 msgid " on pages: " msgstr " na stronach: " -#: src/rc_formatters.py:117 src/rc_formatters.py:534 +#: src/formatters/rc.py:131 src/formatters/rc.py:503 msgid " and namespaces: " msgstr " oraz przestrzeniach nazw: " -#: src/rc_formatters.py:119 +#: src/formatters/rc.py:133 msgid " on namespaces: " msgstr " na przestrzeniach nazw: " -#: src/rc_formatters.py:131 -#, fuzzy, python-brace-format +#: src/formatters/rc.py:145 +#, python-brace-format msgid "" "[{author}]({author_url}) blocked [{user}]({user_url}) {time}" "{restriction_desc}{comment}" msgstr "" -"[{author}]({author_url}) zablokował(-a) [{user}]({user_url}) na {time}" +"[{author}]({author_url}) zablokował(-a) [{user}]({user_url}) {time}" "{restriction_desc}{comment}" -#: src/rc_formatters.py:135 +#: src/formatters/rc.py:149 #, python-brace-format msgid "" "[{author}]({author_url}) changed block settings for [{blocked_user}]" @@ -363,25 +261,25 @@ msgstr "" "[{author}]({author_url}) zmienił(-a) ustawienia blokady dla [{blocked_user}]" "({user_url}){comment}" -#: src/rc_formatters.py:139 +#: src/formatters/rc.py:153 #, python-brace-format msgid "" "[{author}]({author_url}) unblocked [{blocked_user}]({user_url}){comment}" msgstr "" "[{author}]({author_url}) odblokował(-a) [{blocked_user}]({user_url}){comment}" -#: src/rc_formatters.py:142 +#: src/formatters/rc.py:156 #, python-brace-format msgid "" "[{author}]({author_url}) left a [comment]({comment}) on {target} profile" msgstr "" "[{author}]({author_url}) pozostawił(-a) [komentarz]({comment}) na {target}" -#: src/rc_formatters.py:142 +#: src/formatters/rc.py:156 msgid "their own profile" msgstr "swoim własnym profilu" -#: src/rc_formatters.py:145 +#: src/formatters/rc.py:159 #, python-brace-format msgid "" "[{author}]({author_url}) replied to a [comment]({comment}) on {target} " @@ -390,56 +288,56 @@ msgstr "" "[{author}]({author_url}) odpowiedział(-a) na [komentarz]({comment}) na " "{target}" -#: src/rc_formatters.py:148 src/rc_formatters.py:154 src/rc_formatters.py:165 -#: src/rc_formatters.py:169 +#: src/formatters/rc.py:162 src/formatters/rc.py:168 src/formatters/rc.py:179 +#: src/formatters/rc.py:183 msgid "their own" msgstr "swój własny" -#: src/rc_formatters.py:151 +#: src/formatters/rc.py:165 #, python-brace-format msgid "" "[{author}]({author_url}) edited a [comment]({comment}) on {target} profile" msgstr "" "[{author}]({author_url}) edytował(-a) [komentarz]({comment}) na {target}" -#: src/rc_formatters.py:157 +#: src/formatters/rc.py:171 #, python-brace-format msgid "[{author}]({author_url}) purged a comment on {target} profile" msgstr "" "[{author}]({author_url}) usunął/usunęła permanentnie komentarz na {target}" -#: src/rc_formatters.py:167 +#: src/formatters/rc.py:181 #, python-brace-format msgid "[{author}]({author_url}) deleted a comment on {target} profile" msgstr "[{author}]({author_url}) usunął/usunęła komentarz na {target}" -#: src/rc_formatters.py:173 +#: src/formatters/rc.py:187 #, python-brace-format msgid "[{target}]({target_url})'s" msgstr "na profilu użytkownika [{target}]({target_url})" -#: src/rc_formatters.py:173 +#: src/formatters/rc.py:187 #, python-brace-format msgid "[their own]({target_url})" msgstr "na [swoim własnym profilu użytkownika]({target_url})" -#: src/rc_formatters.py:174 +#: src/formatters/rc.py:188 #, python-brace-format msgid "" "[{author}]({author_url}) edited the {field} on {target} profile. *({desc})*" msgstr "" "[{author}]({author_url}) edytował(-a) pole {field} {target}. *({desc})*" -#: src/rc_formatters.py:188 src/rc_formatters.py:190 src/rc_formatters.py:612 -#: src/rc_formatters.py:614 +#: src/formatters/rc.py:202 src/formatters/rc.py:204 src/formatters/rc.py:581 +#: src/formatters/rc.py:583 msgid "none" msgstr "brak" -#: src/rc_formatters.py:196 src/rc_formatters.py:599 +#: src/formatters/rc.py:210 src/formatters/rc.py:568 msgid "System" msgstr "System" -#: src/rc_formatters.py:201 +#: src/formatters/rc.py:215 #, python-brace-format msgid "" "[{author}]({author_url}) protected [{article}]({article_url}) with the " @@ -448,12 +346,12 @@ msgstr "" "[{author}]({author_url}) zabezpieczył(-a) [{article}]({article_url}) z " "następującymi ustawieniami: {settings}{comment}" -#: src/rc_formatters.py:203 src/rc_formatters.py:211 src/rc_formatters.py:622 -#: src/rc_formatters.py:628 +#: src/formatters/rc.py:217 src/formatters/rc.py:225 src/formatters/rc.py:591 +#: src/formatters/rc.py:597 msgid " [cascading]" msgstr " [kaskadowo]" -#: src/rc_formatters.py:208 +#: src/formatters/rc.py:222 #, python-brace-format msgid "" "[{author}]({author_url}) modified protection settings of [{article}]" @@ -462,7 +360,7 @@ msgstr "" "[{author}]({author_url}) modyfikował(-a) ustawienia zabezpieczeń [{article}]" "({article_url}) na: {settings}{comment}" -#: src/rc_formatters.py:215 +#: src/formatters/rc.py:229 #, python-brace-format msgid "" "[{author}]({author_url}) removed protection from [{article}]({article_url})" @@ -471,7 +369,7 @@ msgstr "" "[{author}]({author_url}) usunął/usunęła zabezpieczenia z [{article}]" "({article_url}){comment}" -#: src/rc_formatters.py:219 +#: src/formatters/rc.py:233 #, python-brace-format msgid "" "[{author}]({author_url}) changed visibility of revision on page [{article}]" @@ -489,7 +387,7 @@ msgstr[2] "" "[{author}]({author_url}) zmienił(-a) widoczność {amount} wersji strony " "[{article}]({article_url}){comment}" -#: src/rc_formatters.py:224 +#: src/formatters/rc.py:238 #, python-brace-format msgid "" "[{author}]({author_url}) imported [{article}]({article_url}) with {count} " @@ -507,23 +405,23 @@ msgstr[2] "" "[{author}]({author_url}) zaimportował(-a) [{article}]({article_url}) {count} " "wersjami{comment}" -#: src/rc_formatters.py:229 +#: src/formatters/rc.py:243 #, python-brace-format msgid "[{author}]({author_url}) restored [{article}]({article_url}){comment}" msgstr "" "[{author}]({author_url}) przywrócił(-a) [{article}]({article_url}){comment}" -#: src/rc_formatters.py:231 +#: src/formatters/rc.py:245 #, python-brace-format msgid "[{author}]({author_url}) changed visibility of log events{comment}" msgstr "[{author}]({author_url}) zmienił(-a) widoczność wydarzeń{comment}" -#: src/rc_formatters.py:233 +#: src/formatters/rc.py:247 #, python-brace-format msgid "[{author}]({author_url}) imported interwiki{comment}" msgstr "[{author}]({author_url}) zaimportował(-a) interwiki{comment}" -#: src/rc_formatters.py:236 +#: src/formatters/rc.py:250 #, python-brace-format msgid "" "[{author}]({author_url}) edited abuse filter [number {number}]({filter_url})" @@ -531,7 +429,7 @@ msgstr "" "[{author}]({author_url}) edytował(-a) filtr nadużyć [numer {number}]" "({filter_url})" -#: src/rc_formatters.py:240 +#: src/formatters/rc.py:254 #, python-brace-format msgid "" "[{author}]({author_url}) created abuse filter [number {number}]({filter_url})" @@ -539,7 +437,7 @@ msgstr "" "[{author}]({author_url}) stworzył(-a) filtr nadużyć [numer {number}]" "({filter_url})" -#: src/rc_formatters.py:244 +#: src/formatters/rc.py:258 #, python-brace-format msgid "" "[{author}]({author_url}) merged revision histories of [{article}]" @@ -548,32 +446,35 @@ msgstr "" "[{author}]({author_url}) połączył(-a) historie zmian [{article}]" "({article_url}) z [{dest}]({dest_url}){comment}" -#: src/rc_formatters.py:248 -#, fuzzy, python-brace-format +#: src/formatters/rc.py:261 +#, python-brace-format msgid "Account [{author}]({author_url}) was created automatically" -msgstr "[{author}]({author_url}) utworzył(-a) tabelę Cargo \"{table}\"" +msgstr "Konto [{author}]({author_url}) zostało utworzone automatycznie" -#: src/rc_formatters.py:251 src/rc_formatters.py:260 -#, fuzzy, python-brace-format +#: src/formatters/rc.py:263 src/formatters/rc.py:271 +#, python-brace-format msgid "Account [{author}]({author_url}) was created" -msgstr "[{author}]({author_url}) utworzył(-a) tabelę Cargo \"{table}\"" +msgstr "Konto [{author}]({author_url}) zostało utworzone" -#: src/rc_formatters.py:254 -#, fuzzy, python-brace-format +#: src/formatters/rc.py:266 +#, python-brace-format msgid "" "Account [{article}]({article_url}) was created by [{author}]({author_url})" "{comment}" msgstr "" -"[{author}]({author_url}) przywrócił(-a) [{article}]({article_url}){comment}" +"Konto [{article}]({article_url}) zostało utworzone przez [{author}]" +"({author_url}){comment}" -#: src/rc_formatters.py:257 +#: src/formatters/rc.py:269 #, python-brace-format msgid "" "Account [{article}]({article_url}) was created by [{author}]({author_url}) " "and password was sent by email{comment}" msgstr "" +"Konto [{article}]({article_url}) zostało utworzone przez [{author}]" +"({author_url}) oraz hasło do konta zostało przesłane przez email {comment}" -#: src/rc_formatters.py:263 +#: src/formatters/rc.py:274 #, python-brace-format msgid "" "[{author}]({author_url}) added an entry to the [interwiki table]" @@ -582,7 +483,7 @@ msgstr "" "[{author}]({author_url}) dodał(-a) wpis do [tabeli interwiki]({table_url}), " "który prowadzi do {website} z prefixem {prefix}" -#: src/rc_formatters.py:269 +#: src/formatters/rc.py:280 #, python-brace-format msgid "" "[{author}]({author_url}) edited an entry in [interwiki table]({table_url}) " @@ -591,7 +492,7 @@ msgstr "" "[{author}]({author_url}) edytował(-a) wpis w [tabeli interwiki]" "({table_url}), który prowadzi do {website} z prefixem {prefix}" -#: src/rc_formatters.py:275 +#: src/formatters/rc.py:286 #, python-brace-format msgid "" "[{author}]({author_url}) deleted an entry in [interwiki table]({table_url})" @@ -599,7 +500,7 @@ msgstr "" "[{author}]({author_url}) usunął/usunęła wpis z [tabeli interwiki]" "({table_url})" -#: src/rc_formatters.py:278 +#: src/formatters/rc.py:289 #, python-brace-format msgid "" "[{author}]({author_url}) changed the content model of the page [{article}]" @@ -608,14 +509,14 @@ msgstr "" "[{author}]({author_url}) zmienił(-a) model zawartości [{article}]" "({article_url}) z {old} na {new}{comment}" -#: src/rc_formatters.py:282 +#: src/formatters/rc.py:293 #, python-brace-format msgid "" "[{author}]({author_url}) edited the sprite for [{article}]({article_url})" msgstr "" "[{author}]({author_url}) edytował(-a) sprite [{article}]({article_url})" -#: src/rc_formatters.py:285 +#: src/formatters/rc.py:296 #, python-brace-format msgid "" "[{author}]({author_url}) created the sprite sheet for [{article}]" @@ -623,276 +524,273 @@ msgid "" msgstr "" "[{author}]({author_url}) utworzył(-a) sprite sheet [{article}]({article_url})" -#: src/rc_formatters.py:288 +#: src/formatters/rc.py:299 #, python-brace-format msgid "" "[{author}]({author_url}) edited the slice for [{article}]({article_url})" msgstr "[{author}]({author_url}) edytował(-a) slice [{article}]({article_url})" -#: src/rc_formatters.py:293 +#: src/formatters/rc.py:302 #, python-brace-format msgid "[{author}]({author_url}) created the Cargo table \"{table}\"" msgstr "[{author}]({author_url}) utworzył(-a) tabelę Cargo \"{table}\"" -#: src/rc_formatters.py:295 +#: src/formatters/rc.py:304 #, python-brace-format msgid "[{author}]({author_url}) deleted the Cargo table \"{table}\"" msgstr "[{author}]({author_url}) usunęł(-a) tabelę Cargo \"{table}\"" -#: src/rc_formatters.py:300 +#: src/formatters/rc.py:307 #, python-brace-format msgid "[{author}]({author_url}) recreated the Cargo table \"{table}\"" msgstr "" "[{author}]({author_url}) utworzył(-a) ponownie tabelę Cargo \"{table}\"" -#: src/rc_formatters.py:305 +#: src/formatters/rc.py:310 #, python-brace-format msgid "[{author}]({author_url}) replaced the Cargo table \"{table}\"" msgstr "[{author}]({author_url}) zastąpił(-a) tabelę Cargo \"{table}\"" -#: src/rc_formatters.py:308 +#: src/formatters/rc.py:313 #, python-brace-format msgid "[{author}]({author_url}) created a [tag]({tag_url}) \"{tag}\"" msgstr "[{author}]({author_url}) utworzył(-a) [tag]({tag_url}) \"{tag}\"" -#: src/rc_formatters.py:312 +#: src/formatters/rc.py:317 #, python-brace-format msgid "[{author}]({author_url}) deleted a [tag]({tag_url}) \"{tag}\"" msgstr "[{author}]({author_url}) usunął/usunęła [tag]({tag_url}) \"{tag}\"" -#: src/rc_formatters.py:316 +#: src/formatters/rc.py:321 #, python-brace-format msgid "[{author}]({author_url}) activated a [tag]({tag_url}) \"{tag}\"" msgstr "[{author}]({author_url}) aktywował(-a) [tag]({tag_url}) \"{tag}\"" -#: src/rc_formatters.py:319 +#: src/formatters/rc.py:324 #, python-brace-format msgid "[{author}]({author_url}) deactivated a [tag]({tag_url}) \"{tag}\"" msgstr "[{author}]({author_url}) dezaktywował(-a) [tag]({tag_url}) \"{tag}\"" -#: src/rc_formatters.py:321 +#: src/formatters/rc.py:326 msgid "An action has been hidden by administration." msgstr "Akcja została ukryta przez administrację." -#: src/rc_formatters.py:331 src/rc_formatters.py:615 +#: src/formatters/rc.py:332 +#, 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/formatters/rc.py:348 src/formatters/rc.py:584 msgid "No description provided" msgstr "Nie podano opisu zmian" -#: src/rc_formatters.py:378 +#: src/formatters/rc.py:375 msgid "(N!) " msgstr "(N!) " -#: src/rc_formatters.py:379 +#: src/formatters/rc.py:376 msgid "m" msgstr "d" -#: src/rc_formatters.py:379 +#: src/formatters/rc.py:376 msgid "b" msgstr "b" -#: src/rc_formatters.py:396 src/rc_formatters.py:401 +#: src/formatters/rc.py:393 src/formatters/rc.py:398 msgid "__Only whitespace__" msgstr "__Tylko znaki niedrukowane__" -#: src/rc_formatters.py:406 +#: src/formatters/rc.py:403 msgid "Removed" msgstr "Usunięto" -#: src/rc_formatters.py:408 +#: src/formatters/rc.py:405 msgid "Added" msgstr "Dodano" -#: src/rc_formatters.py:442 src/rc_formatters.py:481 +#: src/formatters/rc.py:439 src/formatters/rc.py:450 msgid "Options" msgstr "Opcje" -#: src/rc_formatters.py:442 +#: src/formatters/rc.py:439 #, python-brace-format msgid "([preview]({link}) | [undo]({undolink}))" msgstr "([podgląd]({link}) | [wycofaj]({undolink}))" -#: src/rc_formatters.py:447 +#: src/formatters/rc.py:444 #, python-brace-format msgid "Uploaded a new version of {name}" msgstr "Przesłał(a) nową wersję {name}" -#: src/rc_formatters.py:449 +#: src/formatters/rc.py:446 #, python-brace-format msgid "Reverted a version of {name}" msgstr "Wycofano wersję {name}" -#: src/rc_formatters.py:451 +#: src/formatters/rc.py:448 #, python-brace-format msgid "Uploaded {name}" msgstr "Przesłał(a) {name}" -#: src/rc_formatters.py:467 -msgid "**No license!**" -msgstr "**Brak licencji!**" - -#: src/rc_formatters.py:479 -msgid "" -"\n" -"License: {}" -msgstr "" -"\n" -"Licencja: {}" - -#: src/rc_formatters.py:481 +#: src/formatters/rc.py:450 #, python-brace-format msgid "([preview]({link}))" msgstr "([podgląd]({link}))" -#: src/rc_formatters.py:486 +#: src/formatters/rc.py:455 #, python-brace-format msgid "Deleted page {article}" msgstr "Usunął/usunęła {article}" -#: src/rc_formatters.py:489 +#: src/formatters/rc.py:458 #, python-brace-format msgid "Deleted redirect {article} by overwriting" msgstr "" "Usunął/usunęła przekierowanie ({article}) aby utworzyć miejsce dla " "przenoszonej strony" -#: src/rc_formatters.py:493 +#: src/formatters/rc.py:462 msgid "No redirect has been made" msgstr "Nie utworzono przekierowania" -#: src/rc_formatters.py:494 +#: src/formatters/rc.py:463 msgid "A redirect has been made" msgstr "Zostało utworzone przekierowanie" -#: src/rc_formatters.py:495 +#: src/formatters/rc.py:464 #, python-brace-format msgid "Moved {redirect}{article} to {target}" msgstr "Przeniósł/przeniosła {redirect}{article} do {target}" -#: src/rc_formatters.py:498 +#: src/formatters/rc.py:467 #, python-brace-format msgid "Moved {redirect}{article} to {title} over redirect" msgstr "" "Przeniósł/przeniosła {redirect}{article} do strony przekierowującej {title}" -#: src/rc_formatters.py:502 +#: src/formatters/rc.py:471 #, python-brace-format msgid "Moved protection settings from {redirect}{article} to {title}" msgstr "Przeniesiono ustawienia zabezpieczeń z {redirect}{article} do {title}" -#: src/rc_formatters.py:527 +#: src/formatters/rc.py:496 msgid "Blocked from editing the following pages: " msgstr "Blokada przed edytowaniem następujących stron: " -#: src/rc_formatters.py:536 +#: src/formatters/rc.py:505 msgid "Blocked from editing pages on following namespaces: " msgstr "Blokada przed edytowaniem stron na następujących przestrzeniach nazw: " -#: src/rc_formatters.py:547 +#: src/formatters/rc.py:516 msgid "Partial block details" msgstr "Szczegóły częściowej blokady" -#: src/rc_formatters.py:548 -#, fuzzy, python-brace-format +#: src/formatters/rc.py:517 +#, python-brace-format msgid "Blocked {blocked_user} {time}" -msgstr "Zablokowano {blocked_user} na {time}" +msgstr "Zablokowano {blocked_user} {time}" -#: src/rc_formatters.py:552 +#: src/formatters/rc.py:521 #, python-brace-format msgid "Changed block settings for {blocked_user}" msgstr "Zmienił ustawienia blokady {blocked_user}" -#: src/rc_formatters.py:556 +#: src/formatters/rc.py:525 #, python-brace-format msgid "Unblocked {blocked_user}" msgstr "Odblokował {blocked_user}" -#: src/rc_formatters.py:561 +#: src/formatters/rc.py:530 #, python-brace-format msgid "Left a comment on {target}'s profile" msgstr "Pozostawiono komentarz na profilu użytkownika {target}" -#: src/rc_formatters.py:563 +#: src/formatters/rc.py:532 msgid "Left a comment on their own profile" msgstr "Pozostawił(a) komentarz na swoim profilu" -#: src/rc_formatters.py:568 +#: src/formatters/rc.py:537 #, python-brace-format msgid "Replied to a comment on {target}'s profile" msgstr "Odpowiedziano na komentarz na profilu użytkownika {target}" -#: src/rc_formatters.py:570 +#: src/formatters/rc.py:539 msgid "Replied to a comment on their own profile" msgstr "Odpowiedział(a) na komentarz na swoim profilu" -#: src/rc_formatters.py:575 +#: src/formatters/rc.py:544 #, python-brace-format msgid "Edited a comment on {target}'s profile" msgstr "Edytowano komentarz na profilu użytkownika {target}" -#: src/rc_formatters.py:577 +#: src/formatters/rc.py:546 msgid "Edited a comment on their own profile" msgstr "Edytował(a) komentarz na swoim profilu" -#: src/rc_formatters.py:580 +#: src/formatters/rc.py:549 #, python-brace-format msgid "Edited {target}'s profile" msgstr "Edytowano profil użytkownika {target}" -#: src/rc_formatters.py:580 +#: src/formatters/rc.py:549 msgid "Edited their own profile" msgstr "Edytował(a) swój profil" -#: src/rc_formatters.py:582 +#: src/formatters/rc.py:551 #, python-brace-format msgid "Cleared the {field} field" msgstr "Wyczyszczono pole {field}" -#: src/rc_formatters.py:584 +#: src/formatters/rc.py:553 #, python-brace-format msgid "{field} field changed to: {desc}" msgstr "pole \"{field}\" zostało zmienione na: {desc}" -#: src/rc_formatters.py:587 +#: src/formatters/rc.py:556 #, python-brace-format msgid "Purged a comment on {target}'s profile" msgstr "Usunął permanentnie komentarz na profilu użytkownika {target}" -#: src/rc_formatters.py:593 +#: src/formatters/rc.py:562 #, python-brace-format msgid "Deleted a comment on {target}'s profile" msgstr "Usunął komentarz na profilu użytkownika {target}" -#: src/rc_formatters.py:597 +#: src/formatters/rc.py:566 #, python-brace-format msgid "Changed group membership for {target}" msgstr "Zmieniono przynależność do grup dla {target}" -#: src/rc_formatters.py:601 +#: src/formatters/rc.py:570 #, python-brace-format msgid "{target} got autopromoted to a new usergroup" msgstr "{target} automatycznie otrzymał nową grupę użytkownika" -#: src/rc_formatters.py:616 +#: src/formatters/rc.py:585 #, python-brace-format msgid "Groups changed from {old_groups} to {new_groups}{reason}" msgstr "Grupy zmienione z {old_groups} do {new_groups}{reason}" -#: src/rc_formatters.py:620 +#: src/formatters/rc.py:589 #, python-brace-format msgid "Protected {target}" msgstr "Zabezpieczono {target}" -#: src/rc_formatters.py:626 +#: src/formatters/rc.py:595 #, python-brace-format msgid "Changed protection level for {article}" msgstr "Zmieniono poziom zabezpieczeń {article}" -#: src/rc_formatters.py:632 +#: src/formatters/rc.py:601 #, python-brace-format msgid "Removed protection from {article}" msgstr "Usunięto zabezpieczenie {article}" -#: src/rc_formatters.py:636 +#: src/formatters/rc.py:605 #, python-brace-format msgid "Changed visibility of revision on page {article} " msgid_plural "Changed visibility of {amount} revisions on page {article} " @@ -900,7 +798,7 @@ msgstr[0] "Zmieniono widoczność wersji na stronie {article} " msgstr[1] "Zmieniono widoczność {amount} wersji na stronie {article} " msgstr[2] "Zmieniono widoczność {amount} wersji na stronie {article} " -#: src/rc_formatters.py:641 +#: src/formatters/rc.py:610 #, python-brace-format msgid "Imported {article} with {count} revision" msgid_plural "Imported {article} with {count} revisions" @@ -908,168 +806,259 @@ msgstr[0] "Zaimportowano {article} z {count} wersją" msgstr[1] "Zaimportowano {article} z {count} wersjami" msgstr[2] "Zaimportowano {article} z {count} wersjami" -#: src/rc_formatters.py:646 +#: src/formatters/rc.py:615 #, python-brace-format msgid "Restored {article}" msgstr "Przywrócono {article}" -#: src/rc_formatters.py:649 +#: src/formatters/rc.py:618 msgid "Changed visibility of log events" msgstr "Zmieniono widoczność logów" -#: src/rc_formatters.py:652 +#: src/formatters/rc.py:621 msgid "Imported interwiki" msgstr "Zaimportowano interwiki" -#: src/rc_formatters.py:655 +#: src/formatters/rc.py:624 #, python-brace-format msgid "Edited abuse filter number {number}" msgstr "Edytowano filtr nadużyć numer {number}" -#: src/rc_formatters.py:658 +#: src/formatters/rc.py:627 #, python-brace-format msgid "Created abuse filter number {number}" msgstr "Utworzono filtr nadużyć numer {number}" -#: src/rc_formatters.py:661 +#: src/formatters/rc.py:630 #, python-brace-format msgid "Merged revision histories of {article} into {dest}" msgstr "Połączono historie {article} z {dest}" -#: src/rc_formatters.py:665 +#: src/formatters/rc.py:634 msgid "Created account automatically" -msgstr "" +msgstr "Konto zostało utworzone automatycznie" -#: src/rc_formatters.py:668 src/rc_formatters.py:677 +#: src/formatters/rc.py:637 src/formatters/rc.py:646 msgid "Created account" -msgstr "" +msgstr "Stworzono konto" -#: src/rc_formatters.py:671 -#, fuzzy, python-brace-format +#: src/formatters/rc.py:640 +#, python-brace-format msgid "Created account {article}" -msgstr "Usunął/usunęła {article}" +msgstr "Utworzono konto {article}" -#: src/rc_formatters.py:674 +#: src/formatters/rc.py:643 #, python-brace-format msgid "Created account {article} and password was sent by email" -msgstr "" +msgstr "Utworzono konto {article} oraz wysłano hasło z użyciem e-maila" -#: src/rc_formatters.py:680 +#: src/formatters/rc.py:649 msgid "Added an entry to the interwiki table" msgstr "Dodano wpis do tabeli interwiki" -#: src/rc_formatters.py:681 src/rc_formatters.py:687 +#: src/formatters/rc.py:650 src/formatters/rc.py:656 #, python-brace-format msgid "Prefix: {prefix}, website: {website} | {desc}" msgstr "Prefix: {prefix}, strona: {website} | {desc}" -#: src/rc_formatters.py:686 +#: src/formatters/rc.py:655 msgid "Edited an entry in interwiki table" msgstr "Edytowano wpis interwiki" -#: src/rc_formatters.py:692 +#: src/formatters/rc.py:661 msgid "Deleted an entry in interwiki table" msgstr "Usunięto wpis interwiki" -#: src/rc_formatters.py:693 +#: src/formatters/rc.py:662 #, python-brace-format msgid "Prefix: {prefix} | {desc}" msgstr "Prefix: {prefix} | {desc}" -#: src/rc_formatters.py:696 +#: src/formatters/rc.py:665 #, python-brace-format msgid "Changed the content model of the page {article}" msgstr "Zmieniono model zawartości {article}" -#: src/rc_formatters.py:697 +#: src/formatters/rc.py:666 #, python-brace-format msgid "Model changed from {old} to {new}: {reason}" msgstr "Model został zmieniony z {old} na {new}: {reason}" -#: src/rc_formatters.py:702 +#: src/formatters/rc.py:671 #, python-brace-format msgid "Edited the sprite for {article}" msgstr "Edytowano sprite dla {article}" -#: src/rc_formatters.py:705 +#: src/formatters/rc.py:674 #, python-brace-format msgid "Created the sprite sheet for {article}" msgstr "Utworzono sprite sheet dla {article}" -#: src/rc_formatters.py:708 +#: src/formatters/rc.py:677 #, python-brace-format msgid "Edited the slice for {article}" msgstr "Edytowano część sprite dla {article}" -#: src/rc_formatters.py:714 +#: src/formatters/rc.py:681 #, python-brace-format msgid "Created the Cargo table \"{table}\"" msgstr "Utworzono tabelę Cargo \"{table}\"" -#: src/rc_formatters.py:718 +#: src/formatters/rc.py:685 #, python-brace-format msgid "Deleted the Cargo table \"{table}\"" msgstr "Usunięto tabelę Cargo \"{table}\"" -#: src/rc_formatters.py:725 +#: src/formatters/rc.py:690 #, python-brace-format msgid "Recreated the Cargo table \"{table}\"" msgstr "Utworzono ponownie tabelę Cargo \"{table}\"" -#: src/rc_formatters.py:732 +#: src/formatters/rc.py:695 #, python-brace-format msgid "Replaced the Cargo table \"{table}\"" msgstr "Zastąpiono tabelę Cargo \"{table}\"" -#: src/rc_formatters.py:736 +#: src/formatters/rc.py:699 #, python-brace-format msgid "Created a tag \"{tag}\"" msgstr "Utworzono tag \"{tag}\"" -#: src/rc_formatters.py:740 +#: src/formatters/rc.py:703 #, python-brace-format msgid "Deleted a tag \"{tag}\"" msgstr "Usunięto tag \"{tag}\"" -#: src/rc_formatters.py:744 +#: src/formatters/rc.py:707 #, python-brace-format msgid "Activated a tag \"{tag}\"" msgstr "Aktywowano tag \"{tag}\"" -#: src/rc_formatters.py:747 +#: src/formatters/rc.py:710 #, python-brace-format msgid "Deactivated a tag \"{tag}\"" msgstr "Dezaktywowano tag \"{tag}\"" -#: src/rc_formatters.py:750 +#: src/formatters/rc.py:713 #, fuzzy -msgid "Action has been hidden by administration" -msgstr "Akcja została ukryta przez administrację." +msgid "Action has been hidden by administration." +msgstr "Akcja została ukryta przez administrację" -#: src/rc_formatters.py:751 +#: src/formatters/rc.py:714 msgid "Unknown" msgstr "Nieznana" -#: src/rc_formatters.py:770 +#: src/formatters/rc.py:718 +#, python-brace-format +msgid "Unknown event `{event}`" +msgstr "Nieznane wydarzenie `{event}`" + +#: src/formatters/rc.py:723 src/formatters/rc.py:725 +msgid "Report this on the support server" +msgstr "Zgłoś to na serwerze wsparcia" + +#: src/formatters/rc.py:742 msgid "Tags" msgstr "Tagi" -#: src/rc_formatters.py:773 +#: src/formatters/rc.py:745 msgid "**Added**: " msgstr "**Dodane**: " -#: src/rc_formatters.py:773 +#: src/formatters/rc.py:745 msgid " and {} more\n" msgstr " oraz {} innych\n" -#: src/rc_formatters.py:774 +#: src/formatters/rc.py:746 msgid "**Removed**: " msgstr "**Usunięte**: " -#: src/rc_formatters.py:774 +#: src/formatters/rc.py:746 msgid " and {} more" msgstr " oraz {} innych" -#: src/rc_formatters.py:775 +#: src/formatters/rc.py:747 msgid "Changed categories" msgstr "Zmienione kategorie" + +#, python-brace-format +msgid "{value} (avg. {avg})" +msgstr "{value} (średnio {avg})" + +msgid "Daily overview" +msgstr "Podsumowanie dnia" + +msgid "No activity" +msgstr "Brak aktywności" + +msgid " ({} action)" +msgid_plural " ({} actions)" +msgstr[0] " ({} akcja)" +msgstr[1] " ({} akcje)" +msgstr[2] " ({} akcji)" + +msgid " ({} edit)" +msgid_plural " ({} edits)" +msgstr[0] " ({} edycja)" +msgstr[1] " ({} edycje)" +msgstr[2] " ({} edycji)" + +msgid " UTC ({} action)" +msgid_plural " UTC ({} actions)" +msgstr[0] " UTC ({} akcja)" +msgstr[1] " UTC ({} akcje)" +msgstr[2] " UTC ({} akcji)" + +msgid "But nobody came" +msgstr "Ale nikt nie przyszedł" + +msgid "Most active user" +msgid_plural "Most active users" +msgstr[0] "Najbardziej aktywny użytkownik" +msgstr[1] "Najbardziej aktywni użytkownicy" +msgstr[2] "Najbardziej aktywni użytkownicy" + +msgid "Edits made" +msgstr "Zrobionych edycji" + +msgid "New files" +msgstr "Nowych plików" + +msgid "Admin actions" +msgstr "Akcji administratorskich" + +msgid "Bytes changed" +msgstr "Zmienionych bajtów" + +msgid "Unique contributors" +msgstr "Unikalnych edytujących" + +msgid "Most active hour" +msgid_plural "Most active hours" +msgstr[0] "Najbardziej aktywna godzina" +msgstr[1] "Najbardziej aktywne godziny" +msgstr[2] "Najbardziej aktywne godziny" + +msgid "Day score" +msgstr "Wynik dnia" + +#, fuzzy +#~ msgid "Most edited article" +#~ msgid_plural "Most edited articles" +#~ msgstr[0] "Przywrócono {article}" +#~ msgstr[1] "Przywrócono {article}" +#~ msgstr[2] "Przywrócono {article}" + +#, fuzzy +#~ msgid "New articles" +#~ msgstr "Przywrócono {article}" + +#~ msgid "**No license!**" +#~ msgstr "**Brak licencji!**" + +#~ msgid "" +#~ "\n" +#~ "License: {}" +#~ msgstr "" +#~ "\n" +#~ "Licencja: {}" diff --git a/locale/pl/LC_MESSAGES/wiki.po b/locale/pl/LC_MESSAGES/wiki.po index 39502f3..101c514 100644 --- a/locale/pl/LC_MESSAGES/wiki.po +++ b/locale/pl/LC_MESSAGES/wiki.po @@ -6,8 +6,8 @@ msgid "" msgstr "" "Project-Id-Version: RcGcDw\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2020-08-08 17:22+0200\n" -"PO-Revision-Date: 2020-08-10 01:55+0200\n" +"POT-Creation-Date: 2020-08-10 01:01+0200\n" +"PO-Revision-Date: 2020-03-17 20:57+0100\n" "Last-Translator: Frisk \n" "Language-Team: \n" "Language: pl\n" @@ -15,28 +15,25 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Generated-By: pygettext.py 1.5\n" -"X-Generator: Poedit 2.3.1\n" +"X-Generator: Poedit 2.3\n" "Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 " "|| n%100>=20) ? 1 : 2);\n" -#: src/rc.py:150 -#, python-brace-format -msgid "Connection to {wiki} seems to be stable now." -msgstr "Połączenie z {wiki} wygląda na stabilne." - -#: src/rc.py:151 src/rc.py:266 -msgid "Connection status" -msgstr "Problem z połączeniem" - -#: src/rc.py:265 -#, python-brace-format -msgid "{wiki} seems to be down or unreachable." -msgstr "{wiki} nie działa lub jest nieosiągalna." - -#: src/rc.py:334 +#: src/wiki.py:207 msgid "~~hidden~~" msgstr "~~ukryte~~" -#: src/rc.py:340 +#: src/wiki.py:212 msgid "hidden" msgstr "ukryte" + +#, python-brace-format +#~ msgid "Connection to {wiki} seems to be stable now." +#~ msgstr "Połączenie z {wiki} wygląda na stabilne." + +#~ msgid "Connection status" +#~ msgstr "Problem z połączeniem" + +#, python-brace-format +#~ msgid "{wiki} seems to be down or unreachable." +#~ msgstr "{wiki} nie działa lub jest nieosiągalna." diff --git a/locale/pt-br/LC_MESSAGES/discord.po b/locale/pt-br/LC_MESSAGES/discord.po index d03b1fb..4e619ed 100644 --- a/locale/pt-br/LC_MESSAGES/discord.po +++ b/locale/pt-br/LC_MESSAGES/discord.po @@ -7,29 +7,29 @@ msgid "" msgstr "" "Project-Id-Version: RcGcDd\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2020-08-10 01:44+0200\n" +"POT-Creation-Date: 2020-08-10 16:46+0200\n" "PO-Revision-Date: 2020-08-10 01:53+0200\n" +"Last-Translator: \n" "Language-Team: \n" +"Language: pt_BR\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Poedit 2.3.1\n" -"Last-Translator: \n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" -"Language: pt_BR\n" -#: src/discord.py:27 +#: src/discord.py:25 msgid "wiki deletion" msgstr "" -#: src/discord.py:27 src/discord.py:28 +#: src/discord.py:25 src/discord.py:26 msgid "wiki becoming inaccessible" msgstr "" -#: src/discord.py:29 +#: src/discord.py:27 msgid "unknown error" msgstr "" -#: src/discord.py:30 +#: src/discord.py:28 msgid "The webhook for {} has been removed due to {}." msgstr "" diff --git a/locale/pt-br/LC_MESSAGES/discussion_formatters.po b/locale/pt-br/LC_MESSAGES/discussion_formatters.po index 1e6ad2c..d32ff91 100644 --- a/locale/pt-br/LC_MESSAGES/discussion_formatters.po +++ b/locale/pt-br/LC_MESSAGES/discussion_formatters.po @@ -6,127 +6,163 @@ msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2020-08-08 22:56+0200\n" -"PO-Revision-Date: 2020-08-10 01:55+0200\n" +"POT-Creation-Date: 2020-08-10 16:45+0200\n" +"PO-Revision-Date: 2020-08-10 14:11+0000\n" "Last-Translator: Eduaddad \n" "Language-Team: Portuguese (Brazil) \n" -"Language: pt_BR\n" +"rcgcdw/discussion_formatters-1/pt_BR/>\n" +"Language: pt-br\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -"X-Generator: Poedit 2.3.1\n" +"X-Generator: Weblate 4.1.1\n" -#: src/discussion_formatters.py:38 +#: src/formatters/discussions.py:21 #, 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}" +"[{author}](<{url}f/u/{creatorId}>) created [{title}](<{url}f/p/{threadId}>) " +"in {forumName}" msgstr "" -"[Responder](<{url}f/p/{threadId}/r/{postId}>) por [{author}](<{url}f/u/" -"{creatorId}>) do [{title}](<{url}f/p/{threadId}>) do {forumName}" +"Criado [{title}](<{url}f/p/{threadId}>) por [{author}](<{url}f/u/{creatorId}" +">) no {forumName}" -#: src/discussion_formatters.py:40 src/discussion_formatters.py:49 -#: src/discussion_formatters.py:104 src/discussion_formatters.py:117 +#: src/formatters/discussions.py:23 +#, fuzzy, python-brace-format +msgid "" +"[{author}](<{url}f/u/{creatorId}>) created a poll [{title}](<{url}f/p/" +"{threadId}>) in {forumName}" +msgstr "" +"[{author}](<{url}f/u/{creatorId}>)criou uma enquete [{title}](<{url}f/p/" +"{threadId}>) no {forumName}" + +#: src/formatters/discussions.py:28 +#, fuzzy, python-brace-format +msgid "" +"[{author}](<{url}f/u/{creatorId}>) created a [reply](<{url}f/p/{threadId}/r/" +"{postId}>) to [{title}](<{url}f/p/{threadId}>) in {forumName}" +msgstr "" +"[{author}]({author_url}) criou uma [resposta](<{url}f/p/{threadId}/r/{postId}" +">) para [{title}](<{url}f/p/{threadId}>) em {forumName}" + +#: src/formatters/discussions.py:30 src/formatters/discussions.py:38 +#: src/formatters/discussions.py:96 src/formatters/discussions.py:108 msgid "unknown" msgstr "desconhecido" -#: src/discussion_formatters.py:44 +#: src/formatters/discussions.py:34 #, fuzzy, python-brace-format msgid "" -"[{author}]({author_url}) created [{title}](<{url}wiki/Message_Wall:" +"[{author}](<{url}f/u/{creatorId}>) created [{title}](<{url}wiki/Message_Wall:" "{user_wall}?threadId={threadId}>) on [{user}'s Message Wall](<{url}wiki/" "Message_Wall:{user_wall}>)" msgstr "" -"[{author}](<{url}f/u/{creatorId}>) criou [{title}](<{wikiurl}wiki/" -"Message_Wall:{user_wall}?threadId={threadid}>) no mural de mensagens de " -"{user}" +"[{author}]({author_url}) criou [{title}](<{url}wiki/Message_Wall:{user_wall}?" +"threadId={threadId}>) no mural de mensagens de [{user}(<{url}wiki/" +"Message_Wall:{user_wall}>)" -#: src/discussion_formatters.py:46 +#: src/formatters/discussions.py:36 #, fuzzy, python-brace-format msgid "" -"[{author}]({author_url}) created a [reply](<{url}wiki/Message_Wall:" +"[{author}](<{url}f/u/{creatorId}>) 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]" +"Message_Wall:{user_wall}?threadId={threadId}) on [{user}'s Message Wall]" "(<{url}wiki/Message_Wall:{user_wall}>)" msgstr "" -"[{author}](<{url}f/u/{creatorId}>) respondeu [{title}](<{wikiurl}wiki/" -"Message_Wall:{user_wall}?threadId={threadid}#{replyId}>) no mural de " -"mensagens de {user}" +"[{author}]({author_url}) criou uma [resposta](<{url}wiki/Message_Wall:" +"{user_wall}?threadId={threadId}#{replyId}>) para [{title}](<{url}wiki/" +"Message_Wall:{user_wall}?threadId={threadId}>) no mural de mensagens de " +"[{user}](<{url}wiki/Message_Wall:{user_wall}>)" -#: src/discussion_formatters.py:51 -#, python-brace-format +#: src/formatters/discussions.py:40 +#, fuzzy, python-brace-format msgid "" -"[{author}]({author_url}) created a [comment](<{url}wiki/{article}?" -"commentId={commentId}>) on [{article}](<{url}wiki/{article}>)" +"[{author}](<{url}f/u/{creatorId}>) created a [comment](<{url}wiki/{article}?" +"threadId={threadId}>) on [{article}](<{url}wiki/{article}>)" msgstr "" +"[{author}]({author_url})criou um [comentário](<{url}wiki/{article}?" +"commentId={commentId}>) no [{article}](<{url}wiki/{article}>)" -#: src/discussion_formatters.py:53 -#, python-brace-format +#: src/formatters/discussions.py:42 +#, fuzzy, python-brace-format msgid "" -"[{author}]({author_url}) created a [reply](<{url}wiki/{article}?" -"threadId={threadId}) to a [comment](<{url}wiki/{article}?" -"commentId={commentId}&replyId={replyId}>) on [{article}](<{url}wiki/{article}" +"[{author}](<{url}f/u/{creatorId}>) created a [reply](<{url}wiki/{article}?" +"threadId={threadId}) to a [comment](<{url}wiki/{article}?threadId={threadId}" +"#{replyId}>) on [{article}](<{url}wiki/{article}>)" +msgstr "" +"[{author}]({author_url}) criou uma [resposta](<{url}wiki/{article}?" +"threadId={threadId}) para um [comentário](<{url}wiki/{article}?" +"commentId={commentId}&replyId={replyId}>) no [{article}](<{url}wiki/{article}" ">)" + +#: src/formatters/discussions.py:48 +#, python-brace-format +msgid "" +"Unknown event `{event}` by [{author}]({author_url}), report it on the " +"[support server](<{support}>)." msgstr "" -#: src/discussion_formatters.py:82 +#: src/formatters/discussions.py:74 #, python-brace-format msgid "Created \"{title}\"" msgstr "Criado \"{title}\"" -#: src/discussion_formatters.py:87 -#, fuzzy, python-brace-format +#: src/formatters/discussions.py:79 +#, python-brace-format msgid "Created a poll \"{title}\"" -msgstr "Criou uma enquete intitulada \"{title}\"" +msgstr "Criou uma enquete \"{title}\"" -#: src/discussion_formatters.py:92 +#: src/formatters/discussions.py:84 msgid "Option {}" msgstr "Option {}" -#: src/discussion_formatters.py:93 +#: src/formatters/discussions.py:85 #, python-brace-format msgid "__[View image]({image_url})__" msgstr "__[Ver imagem]({image_url})__" -#: src/discussion_formatters.py:101 +#: src/formatters/discussions.py:93 #, python-brace-format msgid "Replied to \"{title}\"" msgstr "Respondido o \"{title}\"" -#: src/discussion_formatters.py:110 +#: src/formatters/discussions.py:102 #, python-brace-format msgid "Created \"{title}\" on {user}'s Message Wall" msgstr "Criado \"{title}\" no mural de mensagem de {user}" -#: src/discussion_formatters.py:114 +#: src/formatters/discussions.py:106 #, python-brace-format msgid "Replied to \"{title}\" on {user}'s Message Wall" msgstr "Respondeu a \"{title}\" no mural de mensagem de {user}" -#: src/discussion_formatters.py:121 -#, fuzzy, python-brace-format +#: src/formatters/discussions.py:112 +#, python-brace-format msgid "Commented on {article}" -msgstr "Criado \"{title}\"" +msgstr "Comentou em {article}" -#: src/discussion_formatters.py:125 -#, fuzzy, python-brace-format +#: src/formatters/discussions.py:116 +#, python-brace-format msgid "Replied to a comment on {article}" -msgstr "Respondido o \"{title}\"" +msgstr "Respondeu a um comentário em {article}" +#: src/formatters/discussions.py:120 #, python-brace-format -#~ msgid "" -#~ "[{author}](<{url}f/u/{creatorId}>) created [{title}](<{url}f/p/{threadId}" -#~ ">) in {forumName}" -#~ msgstr "" -#~ "Criado [{title}](<{url}f/p/{threadId}>) por [{author}](<{url}f/u/" -#~ "{creatorId}>) no {forumName}" +msgid "Unknown event `{event}`" +msgstr "" -#, python-brace-format +#: src/formatters/discussions.py:125 src/formatters/discussions.py:127 +msgid "Report this on the support server" +msgstr "" + +#, fuzzy, python-brace-format #~ msgid "" -#~ "[{author}](<{url}f/u/{creatorId}>) created a poll [{title}](<{url}f/p/" -#~ "{threadId}>) in {forumName}" +#~ "[{author}]({author_url}) created a quiz [{title}](<{url}f/p/{threadId}>) " +#~ "in {forumName}" #~ msgstr "" #~ "[{author}](<{url}f/u/{creatorId}>)criou uma enquete [{title}](<{url}f/p/" #~ "{threadId}>) no {forumName}" + +#, python-brace-format +#~ msgid "Created a quiz \"{title}\"" +#~ msgstr "Criou uma enquete \"{title}\"" diff --git a/locale/pt-br/LC_MESSAGES/misc.po b/locale/pt-br/LC_MESSAGES/misc.po index efca8dc..a043ccc 100644 --- a/locale/pt-br/LC_MESSAGES/misc.po +++ b/locale/pt-br/LC_MESSAGES/misc.po @@ -7,82 +7,82 @@ msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2020-08-08 14:00+0200\n" -"PO-Revision-Date: 2020-08-10 01:55+0200\n" +"POT-Creation-Date: 2020-08-10 00:59+0200\n" +"PO-Revision-Date: 2020-08-04 09:51+0000\n" "Last-Translator: Eduaddad \n" "Language-Team: Portuguese (Brazil) \n" -"Language: pt_BR\n" +"Language: pt-br\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n > 1;\n" -"X-Generator: Poedit 2.3.1\n" +"X-Generator: Weblate 4.1.1\n" -#: src/misc.py:42 +#: src/misc.py:96 msgid "Location" msgstr "Localização" -#: src/misc.py:42 +#: src/misc.py:96 msgid "About me" msgstr "Sobre mim" -#: src/misc.py:42 +#: src/misc.py:97 msgid "Google link" msgstr "Link do Google" -#: src/misc.py:42 +#: src/misc.py:97 msgid "Facebook link" msgstr "Facebook link" -#: src/misc.py:42 +#: src/misc.py:98 msgid "Twitter link" msgstr "Link do Twitter" -#: src/misc.py:42 +#: src/misc.py:98 msgid "Reddit link" msgstr "Link do Reddit" -#: src/misc.py:42 +#: src/misc.py:99 msgid "Twitch link" msgstr "Link do Twitch" -#: src/misc.py:42 +#: src/misc.py:99 msgid "PSN link" msgstr "Link do PSN" -#: src/misc.py:42 +#: src/misc.py:100 msgid "VK link" msgstr "Link do VK" -#: src/misc.py:42 +#: src/misc.py:100 msgid "XBL link" msgstr "Link do XBL" -#: src/misc.py:42 +#: src/misc.py:101 msgid "Steam link" msgstr "Link do Steam" -#: src/misc.py:42 +#: src/misc.py:101 msgid "Discord handle" msgstr "Link do Discord" -#: src/misc.py:42 +#: src/misc.py:102 msgid "Battle.net handle" msgstr "Link do Battle.net" -#: src/misc.py:142 +#: src/misc.py:108 +msgid "Unknown" +msgstr "Desconhecido" + +#: src/misc.py:110 +msgid "unknown" +msgstr "desconhecido" + +#: src/misc.py:121 msgid "" "\n" "__And more__" msgstr "" "\n" "__E mais__" - -#: src/misc.py:423 -msgid "Unknown" -msgstr "Desconhecido" - -#: src/misc.py:425 -msgid "unknown" -msgstr "desconhecido" diff --git a/locale/pt-br/LC_MESSAGES/rc_formatters.po b/locale/pt-br/LC_MESSAGES/rc_formatters.po index e2fb9f2..720775d 100644 --- a/locale/pt-br/LC_MESSAGES/rc_formatters.po +++ b/locale/pt-br/LC_MESSAGES/rc_formatters.po @@ -7,24 +7,11 @@ msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2020-08-08 17:21+0200\n" -"PO-Revision-Date: 2020-08-10 01:55+0200\n" +"POT-Creation-Date: 2020-08-10 16:45+0200\n" +"PO-Revision-Date: 2020-08-10 00:04+0000\n" "Last-Translator: Eduaddad \n" "Language-Team: Portuguese (Brazil) \n" -"Language: pt_BR\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=2; plural=n > 1;\n" -"X-Generator: Poedit 2.3.1\n" -"Project-Id-Version: \n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2020-08-08 22:56+0200\n" -"PO-Revision-Date: 2020-08-04 09:51+0000\n" -"Last-Translator: Eduaddad \n" -"Language-Team: Portuguese (Brazil) \n" +"rcgcdw/rc_formatters/pt_BR/>\n" "Language: pt-br\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -32,189 +19,107 @@ msgstr "" "Plural-Forms: nplurals=2; plural=n > 1;\n" "X-Generator: Weblate 4.1.1\n" -#: src/rcgcdw.py:113 src/rcgcdw.py:115 src/rcgcdw.py:117 src/rcgcdw.py:119 -#: src/rcgcdw.py:121 src/rcgcdw.py:123 src/rcgcdw.py:125 -#, python-brace-format -msgid "{value} (avg. {avg})" -msgstr "{value} (med. {avg})" - -#: src/rcgcdw.py:145 -msgid "Daily overview" -msgstr "Visão geral diária" - -#: src/rcgcdw.py:153 -msgid "No activity" -msgstr "Sem atividade" - -#: src/rcgcdw.py:177 -msgid " ({} action)" -msgid_plural " ({} actions)" -msgstr[0] " ({} açao)" -msgstr[1] " ({} ações)" - -#: src/rcgcdw.py:179 -msgid " ({} edit)" -msgid_plural " ({} edits)" -msgstr[0] " ({} editado)" -msgstr[1] " ({} edições)" - -#: src/rcgcdw.py:184 -msgid " UTC ({} action)" -msgid_plural " UTC ({} actions)" -msgstr[0] " UTC ({} ação)" -msgstr[1] " UTC ({} ações)" - -#: src/rcgcdw.py:186 src/rcgcdw.py:187 src/rcgcdw.py:191 -msgid "But nobody came" -msgstr "Mas ninguém veio" - -#: src/rcgcdw.py:194 -msgid "Most active user" -msgid_plural "Most active users" -msgstr[0] "Usuário mais ativo" -msgstr[1] "Usuários mais ativos" - -#: src/rcgcdw.py:195 -msgid "Most edited article" -msgid_plural "Most edited articles" -msgstr[0] "Artigo mais editado" -msgstr[1] "Artigos mais editados" - -#: src/rcgcdw.py:196 -msgid "Edits made" -msgstr "Edições feitas" - -#: src/rcgcdw.py:196 -msgid "New files" -msgstr "Novos arquivos" - -#: src/rcgcdw.py:196 -msgid "Admin actions" -msgstr "Ações de administração" - -#: src/rcgcdw.py:197 -msgid "Bytes changed" -msgstr "Bytes alterados" - -#: src/rcgcdw.py:197 -msgid "New articles" -msgstr "Novos artigos" - -#: src/rcgcdw.py:198 -msgid "Unique contributors" -msgstr "Contribuidores exclusivos" - -#: src/rcgcdw.py:199 -msgid "Most active hour" -msgid_plural "Most active hours" -msgstr[0] "Hora mais ativa" -msgstr[1] "Horas mais ativas" - -#: src/rcgcdw.py:200 -msgid "Day score" -msgstr "Pontuação do dia" - -#: src/rcgcdw.py:242 +#: src/formatters/rc.py:19 msgid "director" msgstr "diretor" -#: src/rcgcdw.py:242 +#: src/formatters/rc.py:19 msgid "bot" msgstr "robô" -#: src/rcgcdw.py:242 +#: src/formatters/rc.py:19 msgid "editor" msgstr "editor" -#: src/rcgcdw.py:242 +#: src/formatters/rc.py:19 msgid "directors" msgstr "diretores" -#: src/rcgcdw.py:242 +#: src/formatters/rc.py:19 msgid "sysop" msgstr "administrador" -#: src/rcgcdw.py:242 +#: src/formatters/rc.py:19 msgid "bureaucrat" msgstr "burocrata" -#: src/rcgcdw.py:242 +#: src/formatters/rc.py:19 msgid "reviewer" msgstr "revisor" -#: src/rcgcdw.py:243 +#: src/formatters/rc.py:20 msgid "autoreview" msgstr "revisão automática" -#: src/rcgcdw.py:243 +#: src/formatters/rc.py:20 msgid "autopatrol" msgstr "patrulha automatica" -#: src/rcgcdw.py:243 +#: src/formatters/rc.py:20 msgid "wiki_guardian" msgstr "guardião_wiki" -#: src/rcgcdw.py:243 +#: src/formatters/rc.py:20 msgid "second" msgid_plural "seconds" msgstr[0] "segundo" msgstr[1] "segundos" -#: src/rcgcdw.py:243 +#: src/formatters/rc.py:20 msgid "minute" msgid_plural "minutes" msgstr[0] "minuto" msgstr[1] "minutos" -#: src/rcgcdw.py:243 +#: src/formatters/rc.py:20 msgid "hour" msgid_plural "hours" msgstr[0] "hora" msgstr[1] "horas" -#: src/rcgcdw.py:243 +#: src/formatters/rc.py:20 msgid "day" msgid_plural "days" msgstr[0] "dia" msgstr[1] "dias" -#: src/rcgcdw.py:243 +#: src/formatters/rc.py:20 msgid "week" msgid_plural "weeks" msgstr[0] "semana" msgstr[1] "semanas" -#: src/rcgcdw.py:243 +#: src/formatters/rc.py:20 msgid "month" msgid_plural "months" msgstr[0] "mês" msgstr[1] "meses" -#: src/rcgcdw.py:243 +#: src/formatters/rc.py:20 msgid "year" msgid_plural "years" msgstr[0] "ano" msgstr[1] "anos" -#: src/rcgcdw.py:243 +#: src/formatters/rc.py:20 msgid "millennium" msgid_plural "millennia" msgstr[0] "milénio" msgstr[1] "milénios" -#: src/rcgcdw.py:243 +#: src/formatters/rc.py:20 msgid "decade" msgid_plural "decades" msgstr[0] "década" msgstr[1] "décadas" -#: src/rcgcdw.py:243 +#: src/formatters/rc.py:20 msgid "century" msgid_plural "centuries" msgstr[0] "século" msgstr[1] "séculos" -#: src/rc_formatters.py:41 +#: src/formatters/rc.py:52 #, python-brace-format msgid "" "[{author}]({author_url}) edited [{article}]({edit_link}){comment} ({sign}" @@ -223,7 +128,7 @@ msgstr "" "[{author}]({author_url}) editou [{article}]({edit_link}){comment} ({sign}" "{edit_size})" -#: src/rc_formatters.py:43 +#: src/formatters/rc.py:54 #, python-brace-format msgid "" "[{author}]({author_url}) created [{article}]({edit_link}){comment} ({sign}" @@ -232,19 +137,19 @@ msgstr "" "[{author}]({author_url}) criou [{article}]({edit_link}){comment} ({sign}" "{edit_size})" -#: src/rc_formatters.py:46 +#: src/formatters/rc.py:57 #, python-brace-format msgid "[{author}]({author_url}) uploaded [{file}]({file_link}){comment}" msgstr "[{author}]({author_url}) carregou [{file}]({file_link}){comment}" -#: src/rc_formatters.py:53 +#: src/formatters/rc.py:64 #, python-brace-format msgid "" "[{author}]({author_url}) reverted a version of [{file}]({file_link}){comment}" msgstr "" "[{author}]({author_url}) reverteu a versão do [{file}]({file_link}){comment}" -#: src/rc_formatters.py:57 +#: src/formatters/rc.py:68 #, python-brace-format msgid "" "[{author}]({author_url}) uploaded a new version of [{file}]({file_link})" @@ -253,12 +158,12 @@ msgstr "" "[{author}]({author_url}) carregou a nova versão de [{file}]({file_link})" "{comment}" -#: src/rc_formatters.py:60 +#: src/formatters/rc.py:71 #, python-brace-format msgid "[{author}]({author_url}) deleted [{page}]({page_link}){comment}" msgstr "[{author}]({author_url}) excluiu [{page}]({page_link}){comment}" -#: src/rc_formatters.py:64 +#: src/formatters/rc.py:75 #, python-brace-format msgid "" "[{author}]({author_url}) deleted redirect by overwriting [{page}]" @@ -267,15 +172,15 @@ msgstr "" "[{author}]({author_url}) excluiu o redirecionamento substituindo [{page}]" "({page_link}){comment}" -#: src/rc_formatters.py:68 src/rc_formatters.py:73 +#: src/formatters/rc.py:79 src/formatters/rc.py:84 msgid "without making a redirect" msgstr "sem fazer um redirecionamento" -#: src/rc_formatters.py:68 src/rc_formatters.py:74 +#: src/formatters/rc.py:79 src/formatters/rc.py:85 msgid "with a redirect" msgstr "com um redirecionamento" -#: src/rc_formatters.py:69 +#: src/formatters/rc.py:80 #, python-brace-format msgid "" "[{author}]({author_url}) moved {redirect}*{article}* to [{target}]" @@ -284,7 +189,7 @@ msgstr "" "[{author}]({author_url}) moveu {redirect}*{article}* para [{target}]" "({target_url}) {made_a_redirect}{comment}" -#: src/rc_formatters.py:75 +#: src/formatters/rc.py:86 #, python-brace-format msgid "" "[{author}]({author_url}) moved {redirect}*{article}* over redirect to " @@ -293,7 +198,7 @@ msgstr "" "[{author}]({author_url}) moveu {redirect}*{article}* sobre o " "redirecionamento para [{target}]({target_url}) {made_a_redirect}{comment}" -#: src/rc_formatters.py:80 +#: src/formatters/rc.py:91 #, python-brace-format msgid "" "[{author}]({author_url}) moved protection settings from {redirect}*{article}" @@ -302,42 +207,41 @@ msgstr "" "[{author}]({author_url}) moveu as configurações de proteção de {redirect}" "*{article}* para [{target}]({target_url}){comment}" -#: src/rc_formatters.py:91 src/rc_formatters.py:512 -#, fuzzy +#: src/formatters/rc.py:102 src/formatters/rc.py:481 msgid "for infinity and beyond" -msgstr "infinito e além" +msgstr "para o infinito e além" -#: src/rc_formatters.py:100 src/rc_formatters.py:520 +#: src/formatters/rc.py:112 src/formatters/rc.py:489 #, python-brace-format msgid "for {num} {translated_length}" -msgstr "" +msgstr "para {num} {translated_length}" -#: src/rc_formatters.py:106 src/rc_formatters.py:523 +#: src/formatters/rc.py:120 src/formatters/rc.py:492 msgid "until {}" -msgstr "" +msgstr "até {}" -#: src/rc_formatters.py:110 +#: src/formatters/rc.py:124 msgid " on pages: " msgstr " nas páginas: " -#: src/rc_formatters.py:117 src/rc_formatters.py:534 +#: src/formatters/rc.py:131 src/formatters/rc.py:503 msgid " and namespaces: " msgstr " e espaços nominais: " -#: src/rc_formatters.py:119 +#: src/formatters/rc.py:133 msgid " on namespaces: " msgstr " nos espaços nominais: " -#: src/rc_formatters.py:131 -#, fuzzy, python-brace-format +#: src/formatters/rc.py:145 +#, python-brace-format msgid "" "[{author}]({author_url}) blocked [{user}]({user_url}) {time}" "{restriction_desc}{comment}" msgstr "" -"[{author}]({author_url}) bloqueou [{user}]({user_url}) por {time}" +"[{author}]({author_url}) bloqueou [{user}]({user_url}) {time}" "{restriction_desc}{comment}" -#: src/rc_formatters.py:135 +#: src/formatters/rc.py:149 #, python-brace-format msgid "" "[{author}]({author_url}) changed block settings for [{blocked_user}]" @@ -346,14 +250,14 @@ msgstr "" "[{author}]({author_url}) mudou as configurações de bloqueio para " "[{blocked_user}]({user_url}){comment}" -#: src/rc_formatters.py:139 +#: src/formatters/rc.py:153 #, python-brace-format msgid "" "[{author}]({author_url}) unblocked [{blocked_user}]({user_url}){comment}" msgstr "" "[{author}]({author_url}) desbloqueou [{blocked_user}]({user_url}){comment}" -#: src/rc_formatters.py:142 +#: src/formatters/rc.py:156 #, python-brace-format msgid "" "[{author}]({author_url}) left a [comment]({comment}) on {target} profile" @@ -361,11 +265,11 @@ msgstr "" "[{author}]({author_url}) deixou um [comentário]({comment}) no perfil de " "{target}" -#: src/rc_formatters.py:142 +#: src/formatters/rc.py:156 msgid "their own profile" msgstr "seu próprio perfil" -#: src/rc_formatters.py:145 +#: src/formatters/rc.py:159 #, python-brace-format msgid "" "[{author}]({author_url}) replied to a [comment]({comment}) on {target} " @@ -374,12 +278,12 @@ msgstr "" "[{author}]({author_url}) respondeu a um [comentário]({comment}) no perfil de " "{target}" -#: src/rc_formatters.py:148 src/rc_formatters.py:154 src/rc_formatters.py:165 -#: src/rc_formatters.py:169 +#: src/formatters/rc.py:162 src/formatters/rc.py:168 src/formatters/rc.py:179 +#: src/formatters/rc.py:183 msgid "their own" msgstr "próprio" -#: src/rc_formatters.py:151 +#: src/formatters/rc.py:165 #, python-brace-format msgid "" "[{author}]({author_url}) edited a [comment]({comment}) on {target} profile" @@ -387,43 +291,43 @@ msgstr "" "[{author}]({author_url}) editou um [comentário]({comment}) no perfil de " "{target}" -#: src/rc_formatters.py:157 +#: src/formatters/rc.py:171 #, python-brace-format msgid "[{author}]({author_url}) purged a comment on {target} profile" msgstr "[{author}]({author_url}) limpou um comentário no perfil {target}" -#: src/rc_formatters.py:167 +#: src/formatters/rc.py:181 #, python-brace-format msgid "[{author}]({author_url}) deleted a comment on {target} profile" msgstr "[{author}]({author_url}) excluiu um comentário no perfil de {target}" -#: src/rc_formatters.py:173 +#: src/formatters/rc.py:187 #, python-brace-format msgid "[{target}]({target_url})'s" msgstr "[{target}]({target_url})" -#: src/rc_formatters.py:173 +#: src/formatters/rc.py:187 #, python-brace-format msgid "[their own]({target_url})" msgstr "[seu próprio]({target_url})" -#: src/rc_formatters.py:174 +#: src/formatters/rc.py:188 #, python-brace-format msgid "" "[{author}]({author_url}) edited the {field} on {target} profile. *({desc})*" msgstr "" "[{author}]({author_url}) editou o {field} no perfil de {target}. *({desc})*" -#: src/rc_formatters.py:188 src/rc_formatters.py:190 src/rc_formatters.py:612 -#: src/rc_formatters.py:614 +#: src/formatters/rc.py:202 src/formatters/rc.py:204 src/formatters/rc.py:581 +#: src/formatters/rc.py:583 msgid "none" msgstr "nenhum" -#: src/rc_formatters.py:196 src/rc_formatters.py:599 +#: src/formatters/rc.py:210 src/formatters/rc.py:568 msgid "System" msgstr "Sistema" -#: src/rc_formatters.py:201 +#: src/formatters/rc.py:215 #, python-brace-format msgid "" "[{author}]({author_url}) protected [{article}]({article_url}) with the " @@ -432,12 +336,12 @@ msgstr "" "[{author}]({author_url})protegeu [{article}]({article_url}) com as seguintes " "configurações: {settings}{comment}" -#: src/rc_formatters.py:203 src/rc_formatters.py:211 src/rc_formatters.py:622 -#: src/rc_formatters.py:628 +#: src/formatters/rc.py:217 src/formatters/rc.py:225 src/formatters/rc.py:591 +#: src/formatters/rc.py:597 msgid " [cascading]" msgstr " [em cascata]" -#: src/rc_formatters.py:208 +#: src/formatters/rc.py:222 #, python-brace-format msgid "" "[{author}]({author_url}) modified protection settings of [{article}]" @@ -446,7 +350,7 @@ msgstr "" "[{author}]({author_url}) modificou as configurações de proteção de " "[{article}]({article_url}) para: {settings}{comment}" -#: src/rc_formatters.py:215 +#: src/formatters/rc.py:229 #, python-brace-format msgid "" "[{author}]({author_url}) removed protection from [{article}]({article_url})" @@ -455,7 +359,7 @@ msgstr "" "[{author}]({author_url}) removeu a proteção para [{article}]({article_url})" "{comment}" -#: src/rc_formatters.py:219 +#: src/formatters/rc.py:233 #, python-brace-format msgid "" "[{author}]({author_url}) changed visibility of revision on page [{article}]" @@ -470,7 +374,7 @@ msgstr[1] "" "[{author}]({author_url}) mudou a visibilidade da revisão {amount} na página " "[{article}]({article_url}){comment}" -#: src/rc_formatters.py:224 +#: src/formatters/rc.py:238 #, python-brace-format msgid "" "[{author}]({author_url}) imported [{article}]({article_url}) with {count} " @@ -485,24 +389,24 @@ msgstr[1] "" "[{author}]({author_url}) importou [{article}]({article_url}) com {count} " "revisões{comment}" -#: src/rc_formatters.py:229 +#: src/formatters/rc.py:243 #, python-brace-format msgid "[{author}]({author_url}) restored [{article}]({article_url}){comment}" msgstr "[{author}]({author_url}) restaurou [{article}]({article_url}){comment}" -#: src/rc_formatters.py:231 +#: src/formatters/rc.py:245 #, python-brace-format msgid "[{author}]({author_url}) changed visibility of log events{comment}" msgstr "" "[{author}]({author_url}) mudou a visibilidade dos eventos de " "registro{comment}" -#: src/rc_formatters.py:233 +#: src/formatters/rc.py:247 #, python-brace-format msgid "[{author}]({author_url}) imported interwiki{comment}" msgstr "[{author}]({author_url}) importou a interwiki{comment}" -#: src/rc_formatters.py:236 +#: src/formatters/rc.py:250 #, python-brace-format msgid "" "[{author}]({author_url}) edited abuse filter [number {number}]({filter_url})" @@ -510,7 +414,7 @@ msgstr "" "[{author}]({author_url}) editou o filtro de abuso [number {number}]" "({filter_url})" -#: src/rc_formatters.py:240 +#: src/formatters/rc.py:254 #, python-brace-format msgid "" "[{author}]({author_url}) created abuse filter [number {number}]({filter_url})" @@ -518,7 +422,7 @@ msgstr "" "[{author}]({author_url}) criou o filtro de abuso [number {number}]" "({filter_url})" -#: src/rc_formatters.py:244 +#: src/formatters/rc.py:258 #, python-brace-format msgid "" "[{author}]({author_url}) merged revision histories of [{article}]" @@ -527,31 +431,35 @@ msgstr "" "[{author}]({author_url}) mesclou o histórico de revisão de [{article}]" "({article_url}) para [{dest}]({dest_url}){comment}" -#: src/rc_formatters.py:248 -#, fuzzy, python-brace-format +#: src/formatters/rc.py:261 +#, python-brace-format msgid "Account [{author}]({author_url}) was created automatically" -msgstr "[{author}]({author_url}) criou tabela no Cargo \"{table}\"" +msgstr "Conta [{author}]({author_url}) foi criada automaticamente" -#: src/rc_formatters.py:251 src/rc_formatters.py:260 -#, fuzzy, python-brace-format +#: src/formatters/rc.py:263 src/formatters/rc.py:271 +#, python-brace-format msgid "Account [{author}]({author_url}) was created" -msgstr "[{author}]({author_url}) criou tabela no Cargo \"{table}\"" +msgstr "Conta [{author}]({author_url}) foi criada" -#: src/rc_formatters.py:254 -#, fuzzy, python-brace-format +#: src/formatters/rc.py:266 +#, python-brace-format msgid "" "Account [{article}]({article_url}) was created by [{author}]({author_url})" "{comment}" -msgstr "[{author}]({author_url}) restaurou [{article}]({article_url}){comment}" +msgstr "" +"Conta [{article}]({article_url}) foi criada por [{author}]({author_url})" +"{comment}" -#: src/rc_formatters.py:257 +#: src/formatters/rc.py:269 #, python-brace-format msgid "" "Account [{article}]({article_url}) was created by [{author}]({author_url}) " "and password was sent by email{comment}" msgstr "" +"Conta [{article}]({article_url}) foi criada por [{author}]({author_url}) e a " +"senha foi enviada por e-mail{comment}" -#: src/rc_formatters.py:263 +#: src/formatters/rc.py:274 #, python-brace-format msgid "" "[{author}]({author_url}) added an entry to the [interwiki table]" @@ -560,7 +468,7 @@ msgstr "" "[{author}]({author_url}) adicionou uma entrada à [tabela de interwiki]" "({table_url}) apontando para {website} com o prefixo {prefix}" -#: src/rc_formatters.py:269 +#: src/formatters/rc.py:280 #, python-brace-format msgid "" "[{author}]({author_url}) edited an entry in [interwiki table]({table_url}) " @@ -569,7 +477,7 @@ msgstr "" "[{author}]({author_url}) editou uma entrada na [tabela de Interwiki]" "({table_url}) apontando para {website} com o prefixo {prefix}" -#: src/rc_formatters.py:275 +#: src/formatters/rc.py:286 #, python-brace-format msgid "" "[{author}]({author_url}) deleted an entry in [interwiki table]({table_url})" @@ -577,7 +485,7 @@ msgstr "" "[{author}]({author_url}) excluiu uma entrada na [tabela de Interwiki]" "({table_url})" -#: src/rc_formatters.py:278 +#: src/formatters/rc.py:289 #, python-brace-format msgid "" "[{author}]({author_url}) changed the content model of the page [{article}]" @@ -586,14 +494,14 @@ msgstr "" "[{author}]({author_url}) mudou o modelo de conteúdo da página [{article}]" "({article_url}) de {old} para {new}{comment}" -#: src/rc_formatters.py:282 +#: src/formatters/rc.py:293 #, python-brace-format msgid "" "[{author}]({author_url}) edited the sprite for [{article}]({article_url})" msgstr "" "[{author}]({author_url}) editou o sprite para [{article}]({article_url})" -#: src/rc_formatters.py:285 +#: src/formatters/rc.py:296 #, python-brace-format msgid "" "[{author}]({author_url}) created the sprite sheet for [{article}]" @@ -602,447 +510,527 @@ msgstr "" "[{author}]({author_url})criou a folha de sprite para [{article}]" "({article_url})" -#: src/rc_formatters.py:288 +#: src/formatters/rc.py:299 #, python-brace-format msgid "" "[{author}]({author_url}) edited the slice for [{article}]({article_url})" msgstr "[{author}]({author_url}) editou a peça para [{article}]({article_url})" -#: src/rc_formatters.py:293 +#: src/formatters/rc.py:302 #, python-brace-format msgid "[{author}]({author_url}) created the Cargo table \"{table}\"" msgstr "[{author}]({author_url}) criou tabela no Cargo \"{table}\"" -#: src/rc_formatters.py:295 +#: src/formatters/rc.py:304 #, python-brace-format msgid "[{author}]({author_url}) deleted the Cargo table \"{table}\"" msgstr "[{author}]({author_url}) excluiu a tabela no Cargo \"{table}\"" -#: src/rc_formatters.py:300 +#: src/formatters/rc.py:307 #, python-brace-format msgid "[{author}]({author_url}) recreated the Cargo table \"{table}\"" msgstr "[{author}]({author_url}) recriou a tabela no Cargo \"{table}\"" -#: src/rc_formatters.py:305 +#: src/formatters/rc.py:310 #, python-brace-format msgid "[{author}]({author_url}) replaced the Cargo table \"{table}\"" msgstr "[{author}]({author_url}) substituiu a tabela no Cargo \"{table}\"" -#: src/rc_formatters.py:308 +#: src/formatters/rc.py:313 #, python-brace-format msgid "[{author}]({author_url}) created a [tag]({tag_url}) \"{tag}\"" msgstr "[{author}]({author_url}) criou a [marcação]({tag_url}) \"{tag}\"" -#: src/rc_formatters.py:312 +#: src/formatters/rc.py:317 #, python-brace-format msgid "[{author}]({author_url}) deleted a [tag]({tag_url}) \"{tag}\"" msgstr "[{author}]({author_url}) excluiu a [marcação]({tag_url}) \"{tag}\"" -#: src/rc_formatters.py:316 +#: src/formatters/rc.py:321 #, python-brace-format msgid "[{author}]({author_url}) activated a [tag]({tag_url}) \"{tag}\"" msgstr "[{author}]({author_url}) ativou a [marcação]({tag_url}) \"{tag}\"" -#: src/rc_formatters.py:319 +#: src/formatters/rc.py:324 #, python-brace-format msgid "[{author}]({author_url}) deactivated a [tag]({tag_url}) \"{tag}\"" msgstr "[{author}]({author_url}) desativou a [marcação]({tag_url}) \"{tag}\"" -#: src/rc_formatters.py:321 +#: src/formatters/rc.py:326 msgid "An action has been hidden by administration." msgstr "Uma ação foi ocultada pela administração." -#: src/rc_formatters.py:331 src/rc_formatters.py:615 +#: src/formatters/rc.py:332 +#, python-brace-format +msgid "" +"Unknown event `{event}` by [{author}]({author_url}), report it on the " +"[support server](<{support}>)." +msgstr "" + +#: src/formatters/rc.py:348 src/formatters/rc.py:584 msgid "No description provided" msgstr "Nenhuma descrição fornecida" -#: src/rc_formatters.py:378 +#: src/formatters/rc.py:375 msgid "(N!) " msgstr "(N!) " -#: src/rc_formatters.py:379 +#: src/formatters/rc.py:376 msgid "m" msgstr "m" -#: src/rc_formatters.py:379 +#: src/formatters/rc.py:376 msgid "b" msgstr "b" -#: src/rc_formatters.py:396 src/rc_formatters.py:401 +#: src/formatters/rc.py:393 src/formatters/rc.py:398 msgid "__Only whitespace__" msgstr "__Apenas espaço em branco__" -#: src/rc_formatters.py:406 +#: src/formatters/rc.py:403 msgid "Removed" msgstr "Removido" -#: src/rc_formatters.py:408 +#: src/formatters/rc.py:405 msgid "Added" msgstr "Adicionado" -#: src/rc_formatters.py:442 src/rc_formatters.py:481 +#: src/formatters/rc.py:439 src/formatters/rc.py:450 msgid "Options" msgstr "Opções" -#: src/rc_formatters.py:442 +#: src/formatters/rc.py:439 #, python-brace-format msgid "([preview]({link}) | [undo]({undolink}))" msgstr "([visualização]({link}) | [desfazer]({undolink}))" -#: src/rc_formatters.py:447 +#: src/formatters/rc.py:444 #, python-brace-format msgid "Uploaded a new version of {name}" msgstr "Carregou uma nova versão de {name}" -#: src/rc_formatters.py:449 +#: src/formatters/rc.py:446 #, python-brace-format msgid "Reverted a version of {name}" msgstr "Reverteu uma versão do {name}" -#: src/rc_formatters.py:451 +#: src/formatters/rc.py:448 #, python-brace-format msgid "Uploaded {name}" msgstr "Carregado {name}" -#: src/rc_formatters.py:467 -msgid "**No license!**" -msgstr "* * Sem licença!* *" - -#: src/rc_formatters.py:479 -msgid "" -"\n" -"License: {}" -msgstr "" -"\n" -"Licença: {}" - -#: src/rc_formatters.py:481 +#: src/formatters/rc.py:450 #, python-brace-format msgid "([preview]({link}))" msgstr "([visualização]({link}))" -#: src/rc_formatters.py:486 +#: src/formatters/rc.py:455 #, python-brace-format msgid "Deleted page {article}" msgstr "Página {article} excluída" -#: src/rc_formatters.py:489 +#: src/formatters/rc.py:458 #, python-brace-format msgid "Deleted redirect {article} by overwriting" msgstr "Redirecionado {article} excluído por sobrescrevendo" -#: src/rc_formatters.py:493 +#: src/formatters/rc.py:462 msgid "No redirect has been made" msgstr "Nenhum redirecionamento foi feito" -#: src/rc_formatters.py:494 +#: src/formatters/rc.py:463 msgid "A redirect has been made" msgstr "Foi feito um redirecionamento" -#: src/rc_formatters.py:495 +#: src/formatters/rc.py:464 #, python-brace-format msgid "Moved {redirect}{article} to {target}" msgstr "Movido {redirect}{article} para {target}" -#: src/rc_formatters.py:498 +#: src/formatters/rc.py:467 #, python-brace-format msgid "Moved {redirect}{article} to {title} over redirect" msgstr "Movido {redirect}{article} para {title} ao redirecionar" -#: src/rc_formatters.py:502 +#: src/formatters/rc.py:471 #, python-brace-format msgid "Moved protection settings from {redirect}{article} to {title}" msgstr "Configurações de proteção movidos de {redirect}{article} para {title}" -#: src/rc_formatters.py:527 +#: src/formatters/rc.py:496 msgid "Blocked from editing the following pages: " msgstr "Bloqueado de editar as seguintes páginas: " -#: src/rc_formatters.py:536 +#: src/formatters/rc.py:505 msgid "Blocked from editing pages on following namespaces: " msgstr "Bloqueado de editar páginas nos seguintes espaços nominais: " -#: src/rc_formatters.py:547 +#: src/formatters/rc.py:516 msgid "Partial block details" msgstr "Detalhes do bloqueio parcial" -#: src/rc_formatters.py:548 -#, fuzzy, python-brace-format +#: src/formatters/rc.py:517 +#, python-brace-format msgid "Blocked {blocked_user} {time}" -msgstr "Bloqueado {blocked_user} por {time}" +msgstr "Bloqueado {blocked_user} {time}" -#: src/rc_formatters.py:552 +#: src/formatters/rc.py:521 #, python-brace-format msgid "Changed block settings for {blocked_user}" msgstr "Configurações de bloqueio alteradas para {blocked_user}" -#: src/rc_formatters.py:556 +#: src/formatters/rc.py:525 #, python-brace-format msgid "Unblocked {blocked_user}" msgstr "Desbloqueado {blocked_user}" -#: src/rc_formatters.py:561 +#: src/formatters/rc.py:530 #, python-brace-format msgid "Left a comment on {target}'s profile" msgstr "Deixou um comentário no perfil de {target}" -#: src/rc_formatters.py:563 +#: src/formatters/rc.py:532 msgid "Left a comment on their own profile" msgstr "Deixou um comentário em seu próprio perfil" -#: src/rc_formatters.py:568 +#: src/formatters/rc.py:537 #, python-brace-format msgid "Replied to a comment on {target}'s profile" msgstr "Respondeu a um comentário no perfil de {target}" -#: src/rc_formatters.py:570 +#: src/formatters/rc.py:539 msgid "Replied to a comment on their own profile" msgstr "Respondeu a um comentário em seu próprio perfil" -#: src/rc_formatters.py:575 +#: src/formatters/rc.py:544 #, python-brace-format msgid "Edited a comment on {target}'s profile" msgstr "Editou um comentário no perfil de {target}" -#: src/rc_formatters.py:577 +#: src/formatters/rc.py:546 msgid "Edited a comment on their own profile" msgstr "Editou um comentário em seu próprio perfil" -#: src/rc_formatters.py:580 +#: src/formatters/rc.py:549 #, python-brace-format msgid "Edited {target}'s profile" msgstr "Editado perfil {target}" -#: src/rc_formatters.py:580 +#: src/formatters/rc.py:549 msgid "Edited their own profile" msgstr "Editou seu próprio perfil" -#: src/rc_formatters.py:582 +#: src/formatters/rc.py:551 #, python-brace-format msgid "Cleared the {field} field" msgstr "Limpo o campo {field}" -#: src/rc_formatters.py:584 +#: src/formatters/rc.py:553 #, python-brace-format msgid "{field} field changed to: {desc}" msgstr "campo {field} alterado para: {desc}" -#: src/rc_formatters.py:587 +#: src/formatters/rc.py:556 #, python-brace-format msgid "Purged a comment on {target}'s profile" msgstr "Eliminou um comentário no perfil de {target}" -#: src/rc_formatters.py:593 +#: src/formatters/rc.py:562 #, python-brace-format msgid "Deleted a comment on {target}'s profile" msgstr "Excluiu um comentário no perfil de {target}" -#: src/rc_formatters.py:597 +#: src/formatters/rc.py:566 #, python-brace-format msgid "Changed group membership for {target}" msgstr "Alterado grupo do membro de {target}" -#: src/rc_formatters.py:601 +#: src/formatters/rc.py:570 #, python-brace-format msgid "{target} got autopromoted to a new usergroup" msgstr "{target} recebeu um promovido para um novo grupo de usuários" -#: src/rc_formatters.py:616 +#: src/formatters/rc.py:585 #, python-brace-format msgid "Groups changed from {old_groups} to {new_groups}{reason}" msgstr "Grupos alterados de {old_groups} para {new_groups} {reason}" -#: src/rc_formatters.py:620 +#: src/formatters/rc.py:589 #, python-brace-format msgid "Protected {target}" msgstr "Protegido {target}" -#: src/rc_formatters.py:626 +#: src/formatters/rc.py:595 #, python-brace-format msgid "Changed protection level for {article}" msgstr "Nível de proteção alterado para {article}" -#: src/rc_formatters.py:632 +#: src/formatters/rc.py:601 #, python-brace-format msgid "Removed protection from {article}" msgstr "Removida a proteção de {article}" -#: src/rc_formatters.py:636 +#: src/formatters/rc.py:605 #, python-brace-format msgid "Changed visibility of revision on page {article} " msgid_plural "Changed visibility of {amount} revisions on page {article} " msgstr[0] "Visibilidade alterada da revisão na página {article} " msgstr[1] "Visibilidade alterada de {amount} revisões na página {article} " -#: src/rc_formatters.py:641 +#: src/formatters/rc.py:610 #, python-brace-format msgid "Imported {article} with {count} revision" msgid_plural "Imported {article} with {count} revisions" msgstr[0] "Importou {article} com {count} revisão" msgstr[1] "{article} importado com {count} revisões" -#: src/rc_formatters.py:646 +#: src/formatters/rc.py:615 #, python-brace-format msgid "Restored {article}" msgstr "Página {article} excluída" -#: src/rc_formatters.py:649 +#: src/formatters/rc.py:618 msgid "Changed visibility of log events" msgstr "Visibilidade alterada de eventos de registros" -#: src/rc_formatters.py:652 +#: src/formatters/rc.py:621 msgid "Imported interwiki" msgstr "Interwiki importado" -#: src/rc_formatters.py:655 +#: src/formatters/rc.py:624 #, python-brace-format msgid "Edited abuse filter number {number}" msgstr "Número de filtro de abuso editado {number}" -#: src/rc_formatters.py:658 +#: src/formatters/rc.py:627 #, python-brace-format msgid "Created abuse filter number {number}" msgstr "Criado filtro de abuso número {number}" -#: src/rc_formatters.py:661 +#: src/formatters/rc.py:630 #, python-brace-format msgid "Merged revision histories of {article} into {dest}" msgstr "Históricos de revisão mesclados de {article} em {dest}" -#: src/rc_formatters.py:665 +#: src/formatters/rc.py:634 msgid "Created account automatically" -msgstr "" +msgstr "Conta criada automaticamente" -#: src/rc_formatters.py:668 src/rc_formatters.py:677 +#: src/formatters/rc.py:637 src/formatters/rc.py:646 msgid "Created account" -msgstr "" +msgstr "Conta criada" -#: src/rc_formatters.py:671 -#, fuzzy, python-brace-format +#: src/formatters/rc.py:640 +#, python-brace-format msgid "Created account {article}" -msgstr "Página {article} excluída" +msgstr "Conta criada {article}" -#: src/rc_formatters.py:674 +#: src/formatters/rc.py:643 #, python-brace-format msgid "Created account {article} and password was sent by email" -msgstr "" +msgstr "Conta criada {article} e a senha foi enviada por e-mail" -#: src/rc_formatters.py:680 +#: src/formatters/rc.py:649 msgid "Added an entry to the interwiki table" msgstr "Adicionado uma entrada para a tabela interwiki" -#: src/rc_formatters.py:681 src/rc_formatters.py:687 +#: src/formatters/rc.py:650 src/formatters/rc.py:656 #, python-brace-format msgid "Prefix: {prefix}, website: {website} | {desc}" msgstr "Prefixo: {prefix}, site: {website} | {desc}" -#: src/rc_formatters.py:686 +#: src/formatters/rc.py:655 msgid "Edited an entry in interwiki table" msgstr "Editou uma entrada na tabela interwiki" -#: src/rc_formatters.py:692 +#: src/formatters/rc.py:661 msgid "Deleted an entry in interwiki table" msgstr "Excluiu uma entrada na tabela interwiki" -#: src/rc_formatters.py:693 +#: src/formatters/rc.py:662 #, python-brace-format msgid "Prefix: {prefix} | {desc}" msgstr "Prefixo: {prefix} | {desc}" -#: src/rc_formatters.py:696 +#: src/formatters/rc.py:665 #, python-brace-format msgid "Changed the content model of the page {article}" msgstr "Alterou o modelo de conteúdo da página {article}" -#: src/rc_formatters.py:697 +#: src/formatters/rc.py:666 #, python-brace-format msgid "Model changed from {old} to {new}: {reason}" msgstr "Modelo alterado de {old} para {new}: {reason}" -#: src/rc_formatters.py:702 +#: src/formatters/rc.py:671 #, python-brace-format msgid "Edited the sprite for {article}" msgstr "Editou o sprite para {article}" -#: src/rc_formatters.py:705 +#: src/formatters/rc.py:674 #, python-brace-format msgid "Created the sprite sheet for {article}" msgstr "Criou a folha de sprites para {article}" -#: src/rc_formatters.py:708 +#: src/formatters/rc.py:677 #, python-brace-format msgid "Edited the slice for {article}" msgstr "Editou a fatia de {article}" -#: src/rc_formatters.py:714 +#: src/formatters/rc.py:681 #, python-brace-format msgid "Created the Cargo table \"{table}\"" msgstr "Criou a tabela no Cargo \"{table}\"" -#: src/rc_formatters.py:718 +#: src/formatters/rc.py:685 #, python-brace-format msgid "Deleted the Cargo table \"{table}\"" msgstr "Excluiu a tabela no Cargo \"{table}\"" -#: src/rc_formatters.py:725 +#: src/formatters/rc.py:690 #, python-brace-format msgid "Recreated the Cargo table \"{table}\"" msgstr "Recriou a tabela no Cargo \"{table}\"" -#: src/rc_formatters.py:732 +#: src/formatters/rc.py:695 #, python-brace-format msgid "Replaced the Cargo table \"{table}\"" msgstr "Substituiu a tabela no Cargo \"{table}\"" -#: src/rc_formatters.py:736 +#: src/formatters/rc.py:699 #, python-brace-format msgid "Created a tag \"{tag}\"" msgstr "Criei uma etiqueta \"{tag}\"" -#: src/rc_formatters.py:740 +#: src/formatters/rc.py:703 #, python-brace-format msgid "Deleted a tag \"{tag}\"" msgstr "Excluiu uma etiqueta \"{tag}\"" -#: src/rc_formatters.py:744 +#: src/formatters/rc.py:707 #, python-brace-format msgid "Activated a tag \"{tag}\"" msgstr "Ativou uma etiqueta \"{tag}\"" -#: src/rc_formatters.py:747 +#: src/formatters/rc.py:710 #, python-brace-format msgid "Deactivated a tag \"{tag}\"" msgstr "Desativou uma etiqueta \"{tag}\"" -#: src/rc_formatters.py:750 +#: src/formatters/rc.py:713 #, fuzzy -msgid "Action has been hidden by administration" -msgstr "A ação foi ocultada pela administração." +msgid "Action has been hidden by administration." +msgstr "A ação foi ocultada pela administração" -#: src/rc_formatters.py:751 +#: src/formatters/rc.py:714 msgid "Unknown" msgstr "Desconhecido" -#: src/rc_formatters.py:770 +#: src/formatters/rc.py:718 +#, python-brace-format +msgid "Unknown event `{event}`" +msgstr "" + +#: src/formatters/rc.py:723 src/formatters/rc.py:725 +msgid "Report this on the support server" +msgstr "" + +#: src/formatters/rc.py:742 msgid "Tags" msgstr "Etiquetas" -#: src/rc_formatters.py:773 +#: src/formatters/rc.py:745 msgid "**Added**: " msgstr "**Adicionado**: " -#: src/rc_formatters.py:773 +#: src/formatters/rc.py:745 msgid " and {} more\n" msgstr " e {} mais\n" -#: src/rc_formatters.py:774 +#: src/formatters/rc.py:746 msgid "**Removed**: " msgstr "**Removida**: " -#: src/rc_formatters.py:774 +#: src/formatters/rc.py:746 msgid " and {} more" msgstr " e {} mais" -#: src/rc_formatters.py:775 +#: src/formatters/rc.py:747 msgid "Changed categories" msgstr "Mudanças de categorias" + +#, python-brace-format +msgid "{value} (avg. {avg})" +msgstr "{value} (med. {avg})" + +msgid "Daily overview" +msgstr "Visão geral diária" + +msgid "No activity" +msgstr "Sem atividade" + +msgid " ({} action)" +msgid_plural " ({} actions)" +msgstr[0] " ({} açao)" +msgstr[1] " ({} ações)" + +msgid " ({} edit)" +msgid_plural " ({} edits)" +msgstr[0] " ({} editado)" +msgstr[1] " ({} edições)" + +msgid " UTC ({} action)" +msgid_plural " UTC ({} actions)" +msgstr[0] " UTC ({} ação)" +msgstr[1] " UTC ({} ações)" + +msgid "But nobody came" +msgstr "Mas ninguém veio" + +msgid "Most active user" +msgid_plural "Most active users" +msgstr[0] "Usuário mais ativo" +msgstr[1] "Usuários mais ativos" + +msgid "Edits made" +msgstr "Edições feitas" + +msgid "New files" +msgstr "Novos arquivos" + +msgid "Admin actions" +msgstr "Ações de administração" + +msgid "Bytes changed" +msgstr "Bytes alterados" + +msgid "Unique contributors" +msgstr "Contribuidores exclusivos" + +msgid "Most active hour" +msgid_plural "Most active hours" +msgstr[0] "Hora mais ativa" +msgstr[1] "Horas mais ativas" + +msgid "Day score" +msgstr "Pontuação do dia" + +#, fuzzy +#~ msgid "Most edited article" +#~ msgid_plural "Most edited articles" +#~ msgstr[0] "Página {article} excluída" +#~ msgstr[1] "Página {article} excluída" + +#, fuzzy +#~ msgid "New articles" +#~ msgstr "Página {article} excluída" + +#~ msgid "**No license!**" +#~ msgstr "* * Sem licença!* *" + +#~ msgid "" +#~ "\n" +#~ "License: {}" +#~ msgstr "" +#~ "\n" +#~ "Licença: {}" diff --git a/locale/pt-br/LC_MESSAGES/wiki.po b/locale/pt-br/LC_MESSAGES/wiki.po index 563cb2a..d79181f 100644 --- a/locale/pt-br/LC_MESSAGES/wiki.po +++ b/locale/pt-br/LC_MESSAGES/wiki.po @@ -7,36 +7,33 @@ msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2020-08-08 17:22+0200\n" -"PO-Revision-Date: 2020-08-10 01:55+0200\n" +"POT-Creation-Date: 2020-08-10 01:01+0200\n" +"PO-Revision-Date: 2020-08-04 09:51+0000\n" "Last-Translator: Eduaddad \n" "Language-Team: Portuguese (Brazil) \n" -"Language: pt_BR\n" +"Language: pt-br\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n > 1;\n" -"X-Generator: Poedit 2.3.1\n" +"X-Generator: Weblate 4.1.1\n" -#: src/rc.py:150 -#, python-brace-format -msgid "Connection to {wiki} seems to be stable now." -msgstr "A conexão com {wiki} parece estar estável agora." - -#: src/rc.py:151 src/rc.py:266 -msgid "Connection status" -msgstr "Status da conexão" - -#: src/rc.py:265 -#, python-brace-format -msgid "{wiki} seems to be down or unreachable." -msgstr "{wiki} parece estar inativo ou inacessível." - -#: src/rc.py:334 +#: src/wiki.py:207 msgid "~~hidden~~" msgstr "~~ocultado~~" -#: src/rc.py:340 +#: src/wiki.py:212 msgid "hidden" msgstr "oculto" + +#, python-brace-format +#~ msgid "Connection to {wiki} seems to be stable now." +#~ msgstr "A conexão com {wiki} parece estar estável agora." + +#~ msgid "Connection status" +#~ msgstr "Status da conexão" + +#, python-brace-format +#~ msgid "{wiki} seems to be down or unreachable." +#~ msgstr "{wiki} parece estar inativo ou inacessível." diff --git a/scripts/generate_translations.sh b/scripts/generate_translations.sh index 2908d4e..94d500a 100644 --- a/scripts/generate_translations.sh +++ b/scripts/generate_translations.sh @@ -1,14 +1,18 @@ -xgettext -L Python --package-name=RcGcDw -o locale/templates/discussion_formatters.pot src/formatters/discussions.py -xgettext -L Python --package-name=RcGcDw -o locale/templates/rc_formatters.pot src/formatters/rc.py -xgettext -L Python --package-name=RcGcDw -o locale/templates/wiki.pot src/wiki.py -xgettext -L Python --package-name=RcGcDw -o locale/templates/discord.pot src/formatters/discord.py -xgettext -L Python --package-name=RcGcDw -o locale/templates/misc.pot src/misc.py - cd .. +xgettext -L Python --package-name=RcGcDb -o locale/templates/discussion_formatters.pot src/formatters/discussions.py +xgettext -L Python --package-name=RcGcDb -o locale/templates/rc_formatters.pot src/formatters/rc.py +xgettext -L Python --package-name=RcGcDb -o locale/templates/wiki.pot src/wiki.py +xgettext -L Python --package-name=RcGcDb -o locale/templates/discord.pot src/discord.py +xgettext -L Python --package-name=RcGcDb -o locale/templates/misc.pot src/misc.py + declare -a StringArray=("discussion_formatters" "rc_formatters" "discord" "wiki" "misc") for language in de pl pt-br do for file in ${StringArray[@]}; do msgmerge -U locale/$language/LC_MESSAGES/$file.po locale/templates/$file.pot done + msgmerge -o locale/$language/LC_MESSAGES/discussion_formatters.po ~/PycharmProjects/RcGcDw/locale/$language/LC_MESSAGES/discussion_formatters.po locale/$language/LC_MESSAGES/discussion_formatters.po + msgmerge -o locale/$language/LC_MESSAGES/rc_formatters.po ~/PycharmProjects/RcGcDw/locale/$language/LC_MESSAGES/rc_formatters.po locale/$language/LC_MESSAGES/rc_formatters.po + msgmerge -o locale/$language/LC_MESSAGES/wiki.po ~/PycharmProjects/RcGcDw/locale/$language/LC_MESSAGES/rc.po locale/$language/LC_MESSAGES/wiki.po + msgmerge -o locale/$language/LC_MESSAGES/misc.po ~/PycharmProjects/RcGcDw/locale/$language/LC_MESSAGES/misc.po locale/$language/LC_MESSAGES/misc.po done diff --git a/src/discord.py b/src/discord.py index 41e3d91..a58083d 100644 --- a/src/discord.py +++ b/src/discord.py @@ -21,9 +21,7 @@ default_header["X-RateLimit-Precision"] = "millisecond" # User facing webhook functions async def wiki_removal(wiki_url, status): for observer in db_cursor.execute('SELECT webhook, lang FROM rcgcdw WHERE wiki = ?', (wiki_url,)): - def _(string: str) -> str: - """Our own translation string to make it compatible with async""" - return langs[observer["lang"]]["discord"].gettext(string) + _ = langs[observer["lang"]]["discord"].gettext reasons = {410: _("wiki deletion"), 404: _("wiki deletion"), 401: _("wiki becoming inaccessible"), 402: _("wiki becoming inaccessible"), 403: _("wiki becoming inaccessible")} reason = reasons.get(status, _("unknown error"))