From ccb65807b6e557fc61c60b2716df0be21b00f61d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Auzi?= Date: Mon, 10 Nov 2025 14:54:50 +0100 Subject: [PATCH 01/49] 'Fix unknown string escape sequences' --- Mailnag/common/imaplib2.py | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/Mailnag/common/imaplib2.py b/Mailnag/common/imaplib2.py index 70fa8d3..7996685 100644 --- a/Mailnag/common/imaplib2.py +++ b/Mailnag/common/imaplib2.py @@ -52,7 +52,8 @@ Fix for correct Python 3 exception handling by Tobias Brink August 2015. Fix to allow interruptible IDLE command by Tim Peoples September 2015. Add support for TLS levels by Ben Boeckel September 2015. -Fix for shutown exception by Sebastien Gross November 2015.""" +Fix for shutown exception by Sebastien Gross November 2015. +Fix unknown string escape sequences by André Auzi November 2025.""" __author__ = "Piers Lauder " __URL__ = "http://imaplib2.sourceforge.net" __license__ = "Python License" @@ -2466,7 +2467,7 @@ def ParseFlags(resp): ('select', ('imaplib2_test2',)), ('search', (None, 'SUBJECT', '"IMAP4 test"')), ('fetch', ('1:*', '(FLAGS INTERNALDATE RFC822)')), - ('store', ('1', 'FLAGS', r'(\Deleted)')), + ('store', ('1', 'FLAGS', '(\\Deleted)')), ('namespace', ()), ('expunge', ()), ('recent', ()), @@ -2571,7 +2572,7 @@ def run(cmd, args, cb=True): if not uid: continue run('uid', ('FETCH', uid[-1], '(FLAGS INTERNALDATE RFC822.SIZE RFC822.HEADER RFC822.TEXT)')) - run('uid', ('STORE', uid[-1], 'FLAGS', r'(\Deleted)')) + run('uid', ('STORE', uid[-1], 'FLAGS', '(\\Deleted)')) run('expunge', ()) if 'IDLE' in M.capabilities: @@ -2585,10 +2586,10 @@ def run(cmd, args, cb=True): dat = run('fetch', (num, '(FLAGS INTERNALDATE RFC822)'), cb=False) M._mesg('fetch %s => %s' % (num, repr(dat))) run('idle', (2,)) - run('store', (num, '-FLAGS', r'(\Seen)'), cb=False), + run('store', (num, '-FLAGS', '(\\Seen)'), cb=False), dat = run('fetch', (num, '(FLAGS INTERNALDATE RFC822)'), cb=False) M._mesg('fetch %s => %s' % (num, repr(dat))) - run('uid', ('STORE', num, 'FLAGS', r'(\Deleted)')) + run('uid', ('STORE', num, 'FLAGS', '(\\Deleted)')) run('expunge', ()) if idle_intr: M._mesg('HIT CTRL-C to interrupt IDLE') From a1aece84326b48e3e6f500840377a9c3942994a4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Auzi?= Date: Mon, 10 Nov 2025 14:56:34 +0100 Subject: [PATCH 02/49] Fix SHEBANG --- gen_locales | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gen_locales b/gen_locales index a9613e2..d804799 100755 --- a/gen_locales +++ b/gen_locales @@ -1,4 +1,4 @@ -#/bin/bash +#!/bin/bash # # script to generate mailnagger locales From c582d37f26957d4fab90ef809e7927f995e0a3a4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Auzi?= Date: Mon, 10 Nov 2025 15:00:01 +0100 Subject: [PATCH 03/49] Add debug strlimit and dbgindent utils functions for logging.debug --- Mailnag/common/utils.py | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/Mailnag/common/utils.py b/Mailnag/common/utils.py index 6317a8e..2b8b68f 100644 --- a/Mailnag/common/utils.py +++ b/Mailnag/common/utils.py @@ -1,3 +1,4 @@ +# Copyright 2025 André Auzi # Copyright 2024 Timo Kankare # Copyright 2011 - 2019 Patrick Ulbrich # Copyright 2007 Marco Ferragina @@ -100,3 +101,13 @@ def shutdown_existing_instance(wait_for_completion: bool = True) -> None: print('OK') except: print('FAILED') + + +def strlimit(txt: str) -> str: + txt = str(txt) + return txt[:min(80, len(txt))] + '...' + + +def dbgindent(txt: str) -> str: + txt = strlimit(str(txt).strip()) + return ' ' + '\n '.join(txt.splitlines()) From 559e43b1c63bc3936e6348d4c55b12673de2f4b4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Auzi?= Date: Mon, 10 Nov 2025 15:03:22 +0100 Subject: [PATCH 04/49] Allow to fetch the body text --- Mailnag/backends/imap.py | 36 ++++++++++++++++++++++++++++-------- 1 file changed, 28 insertions(+), 8 deletions(-) diff --git a/Mailnag/backends/imap.py b/Mailnag/backends/imap.py index 72a8dcd..edcca1b 100644 --- a/Mailnag/backends/imap.py +++ b/Mailnag/backends/imap.py @@ -1,3 +1,4 @@ +# Copyright 2025 André Auzi # Copyright 2011 - 2021 Patrick Ulbrich # Copyright 2020 Andreas Angerer # Copyright 2016, 2024 Timo Kankare @@ -36,6 +37,7 @@ from Mailnag.common.exceptions import InvalidOperationException from Mailnag.common.mutf7 import encode_mutf7, decode_mutf7 from Mailnag.daemon.mails import Mail +from Mailnag.common.utils import dbgindent class IMAPMailboxBackend(MailboxBackend): @@ -85,7 +87,9 @@ def is_open(self) -> bool: return self._conn != None - def list_messages(self) -> Iterator[tuple[str, Message, dict[str, Any]]]: + def list_messages(self, + with_body_text:bool = True + ) -> Iterator[tuple[str, Message, dict[str, Any]]]: self._ensure_open() assert self._conn is not None conn = self._conn @@ -95,6 +99,11 @@ def list_messages(self) -> Iterator[tuple[str, Message, dict[str, Any]]]: else: folder_list = self.folders + fetch_parts = 'BODY.PEEK[HEADER]' + if with_body_text: + fetch_parts += ' BODY.PEEK[TEXT]' + fetch_parts = '(' + fetch_parts + ')' + for folder in folder_list: # select IMAP folder conn.select(f'"{folder}"', readonly = True) @@ -108,15 +117,26 @@ def list_messages(self) -> Iterator[tuple[str, Message, dict[str, Any]]]: logging.debug('Folder %s in status %s | Data: %s', (folder, status, data)) continue # Bugfix LP-735071 for num in data[0].split(): - typ, msg_data = conn.uid('FETCH', num, '(BODY.PEEK[HEADER])') # header only (without setting READ flag) + typ, msg_data = conn.uid('FETCH', num, fetch_parts) # header with or without text (without setting READ flag) + logging.debug("Msg data (length=%d):\n%s", len(msg_data), + dbgindent(msg_data)) + header = None + text = None for response_part in msg_data: if isinstance(response_part, tuple): - try: - msg = email.message_from_bytes(response_part[1]) - except: - logging.debug("Couldn't get IMAP message.") - continue - yield (folder, msg, {'uid' : num.decode("utf-8"), 'folder' : folder}) + if b'BODY[HEADER]' in response_part[0]: + header = email.message_from_bytes(response_part[1]) + elif b'BODY[TEXT]' in response_part[0]: + text = email.message_from_bytes(response_part[1]) + if text is not None: + text = text.as_string() + if text is not None: + text = text.replace('=\n', '').strip() + if header: + logging.debug("Msg header:\n%s\nMsg text:\n%s", + dbgindent(header), + dbgindent(text)) + yield (folder, header, { 'uid' : num.decode("utf-8"), 'folder' : folder, 'body': text }) def request_folders(self) -> list[str]: From 28146240051b3d839c0e7be773b34b79fc73d59c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Auzi?= Date: Mon, 10 Nov 2025 15:12:16 +0100 Subject: [PATCH 05/49] 'Allow running from the development root directory' --- mailnagger/config/__init__.py | 6 +++++- mailnagger/resources.py | 6 +++++- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/mailnagger/config/__init__.py b/mailnagger/config/__init__.py index 23c20ff..bae3fff 100755 --- a/mailnagger/config/__init__.py +++ b/mailnagger/config/__init__.py @@ -1,3 +1,4 @@ +# Copyright 2025 André Auzi # Copyright 2024 Timo Kankare # Copyright 2011 - 2019 Patrick Ulbrich # @@ -71,7 +72,10 @@ def do_shutdown(self) -> None: # the launched daemon shuts down # an already running daemon print("Launching Mailnagger daemon.") - subprocess.Popen(os.path.join(BIN_DIR, "mailnagger")) + try: + subprocess.Popen(os.path.join(BIN_DIR, "mailnagger")) + except: + subprocess.Popen(['/usr/bin/env', 'python3', '-m', 'mailnagger']) except Exception as e: print(f"ERROR: Failed to launch Mailnagger daemon: {str(e)}") else: diff --git a/mailnagger/resources.py b/mailnagger/resources.py index 92dd765..891e5ea 100644 --- a/mailnagger/resources.py +++ b/mailnagger/resources.py @@ -1,3 +1,4 @@ +# Copyright 2025 André Auzi # Copyright 2024 Timo Kankare # # This program is free software; you can redistribute it and/or modify @@ -82,13 +83,16 @@ def get_plugin_paths() -> list[Union[Path, Traversable]]: def get_locale_path() -> Path: """Returns path to translation files.""" + if Path('./Mailnag').exists() and Path('./locale').exists(): + return Path('./locale') + for p in [LOCALE_DIR, Path("./locale")]: if p.exists(): return p + return LOCALE_DIR def get_resource_text(module: ModuleType, resource: str) -> str: """Returns resource text from module.""" return files(module).joinpath(resource).read_text() - From 48210f13bd4dd0f471efdc1e26a1149e0383402f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Auzi?= Date: Mon, 10 Nov 2025 15:15:04 +0100 Subject: [PATCH 06/49] 'Add Garmin 2FA code capture plugin' --- Mailnag/plugins/garmin2FAplugin.py | 330 +++++++++++++++++++++++++++++ po/bg.po | 255 +++++++++++----------- po/ca.po | 255 +++++++++++----------- po/cs.po | 259 +++++++++++----------- po/de.po | 261 ++++++++++++----------- po/es.po | 259 +++++++++++----------- po/fi.po | 257 +++++++++++----------- po/fr.po | 265 ++++++++++++----------- po/gl.po | 251 ++++++++++++---------- po/hr.po | 263 ++++++++++++----------- po/id.po | 247 +++++++++++---------- po/it.po | 263 ++++++++++++----------- po/mailnagger.pot | 227 +++++++++++--------- po/pl.po | 255 +++++++++++----------- po/pt.po | 261 ++++++++++++----------- po/pt_BR.po | 261 ++++++++++++----------- po/ru.po | 265 ++++++++++++----------- po/sr.po | 245 +++++++++++---------- po/sv.po | 257 +++++++++++----------- po/tr.po | 257 +++++++++++----------- po/uk.po | 257 +++++++++++----------- po/zh_CN.po | 251 ++++++++++++---------- po/zh_TW.po | 247 +++++++++++---------- 23 files changed, 3346 insertions(+), 2602 deletions(-) create mode 100644 Mailnag/plugins/garmin2FAplugin.py diff --git a/Mailnag/plugins/garmin2FAplugin.py b/Mailnag/plugins/garmin2FAplugin.py new file mode 100644 index 0000000..b84bbe7 --- /dev/null +++ b/Mailnag/plugins/garmin2FAplugin.py @@ -0,0 +1,330 @@ +# Copyright 2025 André Auzi +# Copyright 2013 - 2020 Patrick Ulbrich +# Copyright 2020 Dan Christensen +# Copyright 2020 Denis Anuschewski +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, +# MA 02110-1301, USA. +# + +import gi + +gi.require_version('Notify', '0.7') +gi.require_version('GLib', '2.0') +gi.require_version('Gtk', '3.0') + +import os +import dbus +import threading +import logging +import re +from html.parser import HTMLParser + +from gi.repository import Notify, Gio, Gtk +from Mailnag.common.plugins import Plugin, HookTypes +from Mailnag.common.i18n import _ +from Mailnag.common.subproc import start_subprocess +from Mailnag.common.exceptions import InvalidOperationException +from Mailnag.common.utils import dbgindent + + +class HTML2FAParser(HTMLParser): + def __init__(self): + super().__init__() + + self._in_strong = False + self._data = '' + + def handle_starttag(self, tag, attrs): + if tag == 'strong': + self._in_strong = True + def handle_endtag(self, tag): + if tag == 'strong': + self._in_strong = False + def handle_data(self, data): + if not self._in_strong: + return + self._data += data + def get_passcode(self, text): + self.feed(text) + self.close() + + if not self._data: + return None + + return self._data + + +class Garmin2FAPlugin(Plugin): + def __init__(self): + # dict that tracks all notifications that need to be closed + self._notifications = {} + self._initialized = False + self._lock = threading.Lock() + self._notification_server_wait_event = threading.Event() + self._notification_server_ready = False + self._is_gnome = False + self._mails_added_hook = None + self._mails_removed_hook = None + + + def enable(self): + self._notification_server_wait_event.clear() + self._notification_server_ready = False + self._notifications = {} + + # initialize Notification + if not self._initialized: + Notify.init("Mailnag") + self._is_gnome = self._is_gnome_environment(('XDG_CURRENT_DESKTOP', 'GDMSESSION')) + self._initialized = True + + def mails_added_hook(new_mails, all_mails): + self._notify_async(new_mails, all_mails) + + self._mails_added_hook = mails_added_hook + + def mails_removed_hook(remaining_mails): + self._notify_async([], remaining_mails) + + self._mails_removed_hook = mails_removed_hook + + controller = self.get_mailnag_controller() + hooks = controller.get_hooks() + + hooks.register_hook_func(HookTypes.MAILS_ADDED, + self._mails_added_hook) + + hooks.register_hook_func(HookTypes.MAILS_REMOVED, + self._mails_removed_hook) + + def disable(self): + controller = self.get_mailnag_controller() + hooks = controller.get_hooks() + + if self._mails_added_hook != None: + hooks.unregister_hook_func(HookTypes.MAILS_ADDED, + self._mails_added_hook) + self._mails_added_hook = None + + if self._mails_removed_hook != None: + hooks.unregister_hook_func(HookTypes.MAILS_REMOVED, + self._mails_removed_hook) + self._mails_removed_hook = None + + # Abort possible notification server wait + self._notification_server_wait_event.set() + # Close all open notifications + # (must be called after _notification_server_wait_event.set() + # to prevent a possible deadlock) + self._close_notifications() + + + def get_manifest(self): + return (_("Garmin 2FA LibNotify Notifications"), + _("Shows a popup when Garmin 2FA mails arrive."), + "0.1", + "André Auzi ") + + + def get_default_config(self): + return {} + + + def has_config_ui(self): + return False + + + def get_config_ui(self): + return None + + + def load_ui_from_config(self, config_ui): + pass + + + def save_ui_to_config(self, config_ui): + pass + + + def _notify_async(self, new_mails, all_mails): + def thread(): + with self._lock: + # The desktop session may have started Mailnag + # before the libnotify dbus daemon. + if not self._notification_server_ready: + if not self._wait_for_notification_server(): + return + self._notification_server_ready = True + + self._notify_2FA(new_mails, all_mails) + + t = threading.Thread(target = thread) + t.start() + + + def _get_2FA_passcode(self, mail): + _parser = HTML2FAParser() + return _parser.get_passcode(mail) + + + def _notify_2FA(self, new_mails, all_mails): + # Remove notifications for messages not in all_mails: + for k, n in list(self._notifications.items()): + if hasattr(n, 'mail') and not (n.mail in all_mails): + # The user may have closed the notification: + try_close(n) + del self._notifications[k] + + # In single notification mode new mails are + # added to the *bottom* of the notification list. + new_mails.sort(key = lambda m: m.datetime, reverse = False) + + for mail in new_mails: + sender = self._get_sender(mail) + body = str(mail.flags['body']) + logging.debug("garmin2FA: sender=%s, subject=%s, body:\n%s", + sender, mail.subject, + dbgindent(body)) + + if (sender != 'Garmin' or + (mail.subject != 'Your Security Passcode' and + mail.subject != _('Your Security Passcode'))): + continue + + code = self._get_2FA_passcode(body) + if code is None: + continue + + logging.info("garmin2FA: passcode=%s", code) + + n = self._get_notification(self._get_sender(mail), + '{0}: {1}'.format(mail.subject, code), "mail-unread") + # Remember the associated message, so we know when to remove the notification: + n.mail = mail + notification_id = str(id(n)) + if self._is_gnome: + n.set_timeout(Notify.EXPIRES_NEVER) + n.set_urgency(Notify.Urgency.CRITICAL) + n.add_action("copy-code", _("📋 Code: {0}").format(code), + self._notification_action_handler, (mail, notification_id, code)) + n.show() + self._notifications[notification_id] = n + + + def _close_notifications(self): + with self._lock: + for n in self._notifications.values(): + try_close(n) + self._notifications = {} + + + def _get_notification(self, summary, body, icon): + n = Notify.Notification.new(summary, body, icon) + n.set_category("email") + n.set_hint_string("desktop-entry", "mailnag") + + if self._is_gnome: + n.add_action("default", "default", self._notification_action_handler, None) + + return n + + + def _wait_for_notification_server(self): + bus = dbus.SessionBus() + while not bus.name_has_owner('org.freedesktop.Notifications'): + self._notification_server_wait_event.wait(5) + if self._notification_server_wait_event.is_set(): + return False + return True + + + def _notification_action_handler(self, n, action, user_data): + with self._lock: + if action == "default": + mailclient = get_default_mail_reader() + if mailclient != None: + start_subprocess(mailclient) + + # clicking the notification bubble has closed all notifications + # so clear the reference array as well. + self._notifications = {} + elif action == "copy-code": + controller = self.get_mailnag_controller() + try: + try: + import subprocess + + code = user_data[2] + p = subprocess.Popen(['xclip', '-selection', 'c'], + stdin=subprocess.PIPE, + close_fds=True) + p.communicate(input=code.encode('utf-8')) + + logging.debug('xclip set text: %s', code) + except Exception as ex: + logging.error('xclip set text failed (%s)', str(ex)) + + controller.mark_mail_as_read(user_data[0].id) + except InvalidOperationException: + pass + + # clicking the action has closed the notification + # so remove its reference. + del self._notifications[user_data[1]] + + + def _get_sender(self, mail): + name, addr = mail.sender + if len(name) > 0: return name + else: return addr + + + def _prepend_new_mails(self, new_mails, all_mails): + # The mail list (all_mails) is sorted by date (mails with most recent + # date on top). New mails with no date or older mails that come in + # delayed won't be listed on top. So if a mail with no or an older date + # arrives, it gives the impression that the top most mail (i.e. the mail + # with the most recent date) is re-notified. + # To fix that, simply put new mails on top explicitly. + return new_mails + [m for m in all_mails if m not in new_mails] + + + def _is_gnome_environment(self, env_vars): + for var in env_vars: + if 'gnome' in os.environ.get(var, '').lower().split(':'): + return True + return False + + +def get_default_mail_reader(): + mail_reader = None + app_info = Gio.AppInfo.get_default_for_type ("x-scheme-handler/mailto", False) + + if app_info != None: + executable = Gio.AppInfo.get_executable(app_info) + + if (executable != None) and (len(executable) > 0): + mail_reader = executable + + return mail_reader + + +# If the user has closed the notification, an exception is raised. +def try_close(notification): + try: + notification.close() + except: + pass diff --git a/po/bg.po b/po/bg.po index ef68d22..22e9923 100644 --- a/po/bg.po +++ b/po/bg.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: mailnag\n" "Report-Msgid-Bugs-To: https://github.com/tikank/mailnagger/issues\n" -"POT-Creation-Date: 2024-11-27 20:16+0200\n" +"POT-Creation-Date: 2025-11-10 12:57+0100\n" "PO-Revision-Date: 2019-03-16 14:48+0000\n" "Last-Translator: Launchpad Translations Administrators \n" "Language-Team: Bulgarian \n" @@ -18,87 +18,29 @@ msgstr "" "X-Launchpad-Export-Date: 2020-06-11 14:44+0000\n" "X-Generator: Launchpad (build b190cebbf563f89e480a8b57f641753c8196bda0)\n" -#: Mailnag/configuration/accountdialog.py:77 -msgid "Mail Account" -msgstr "Пощенски акаунт" - -#: Mailnag/configuration/accountdialog.py:119 -msgid "optional" -msgstr "незадължително" - -#: Mailnag/configuration/accountdialog.py:123 -#: Mailnag/configuration/configwindow.py:88 -#: Mailnag/configuration/configwindow.py:108 -msgid "Enabled" -msgstr "Включено" - -#: Mailnag/configuration/accountdialog.py:129 -#: Mailnag/configuration/configwindow.py:94 -#: Mailnag/configuration/configwindow.py:114 -msgid "Name" -msgstr "Име" - -#: Mailnag/configuration/accountdialog.py:252 -msgid "IMAP (Custom)" -msgstr "" - -#: Mailnag/configuration/accountdialog.py:253 -msgid "POP3 (Custom)" -msgstr "" - -#: Mailnag/configuration/accountdialog.py:254 -msgid "MBox (Custom)" -msgstr "" - -#: Mailnag/configuration/accountdialog.py:255 -msgid "Maildir (Custom)" -msgstr "" +#: Mailnag/daemon/mails.py:153 +msgid "No subject" +msgstr "Без тема" -#: Mailnag/configuration/accountdialog.py:361 -msgid "Connection failed." -msgstr "Връзката се разпадна." +#: Mailnag/plugins/garmin2FAplugin.py:135 +#, fuzzy +msgid "Garmin 2FA LibNotify Notifications" +msgstr "LibNotify известия" -#: Mailnag/configuration/configwindow.py:278 -msgid "About Mailnagger" -msgstr "" +#: Mailnag/plugins/garmin2FAplugin.py:136 +#, fuzzy +msgid "Shows a popup when Garmin 2FA mails arrive." +msgstr "Показва изкачащ прозорец при пристигане на имейл." -#: Mailnag/configuration/configwindow.py:281 -msgid "An extensible mail notification daemon." +#: Mailnag/plugins/garmin2FAplugin.py:203 +msgid "Your Security Passcode" msgstr "" -#: Mailnag/configuration/configwindow.py:283 +#: Mailnag/plugins/garmin2FAplugin.py:220 #, python-brace-format -msgid "Copyright (c) {years} {author} and contributors." +msgid "📋 Code: {0}" msgstr "" -#: Mailnag/configuration/configwindow.py:290 -msgid "Homepage" -msgstr "" - -#: Mailnag/configuration/configwindow.py:293 -msgid "maintainer" -msgstr "" - -#. TRANSLATORS: Translate `translator-credits` to the list of names -#. of translators, or team, or something like that. -#: Mailnag/configuration/configwindow.py:313 -msgid "translator-credits" -msgstr "" -"Launchpad Contributions:\n" -" spacy01 https://launchpad.net/~spacy00001" - -#: Mailnag/configuration/configwindow.py:353 -msgid "Delete this account:" -msgstr "Изтриване на акаунта:" - -#: Mailnag/configuration/plugindialog.py:30 -msgid "Plugin Configuration" -msgstr "Настройки на приставките" - -#: Mailnag/daemon/mails.py:135 -msgid "No subject" -msgstr "Без тема" - #: Mailnag/plugins/spamfilterplugin.py:67 msgid "Spam Filter" msgstr "Спам филтър" @@ -116,106 +58,183 @@ msgstr "" "Mailnag ще игнорира писма съдържащи поне една от \n" "следните думи в темата или изпращача." -#: Mailnag/plugins/soundplugin.py:64 +#: Mailnag/plugins/soundplugin.py:66 msgid "Sound Notifications" msgstr "Звукови известия" -#: Mailnag/plugins/soundplugin.py:65 +#: Mailnag/plugins/soundplugin.py:67 msgid "Plays a sound when new mails arrive." msgstr "Изпълнява звук при пристигане на имейл." -#: Mailnag/plugins/libnotifyplugin.py:114 +#: Mailnag/plugins/userscriptplugin.py:60 +msgid "User Script" +msgstr "Потребителски скрипт" + +#: Mailnag/plugins/userscriptplugin.py:61 +msgid "Runs an user defined script on mail arrival." +msgstr "При пристигане на имейл стартира скрипт дефиниран от потребителя" + +#: Mailnag/plugins/userscriptplugin.py:80 +msgid "account" +msgstr "акаунт" + +#: Mailnag/plugins/userscriptplugin.py:80 +msgid "sender" +msgstr "изпращач" + +#: Mailnag/plugins/userscriptplugin.py:80 +msgid "subject" +msgstr "тема" + +#: Mailnag/plugins/userscriptplugin.py:81 +#, fuzzy, python-format +msgid "" +"The following script will be executed whenever new mails arrive.\n" +"Mailnagger passes the total count of new mails to this script,\n" +"followed by %s sequences." +msgstr "" +"Следния скрипт ще бъде изпълнен при пристигането на нов имейл.\n" +"Mailnag ще предава общия брой имейли на този скрипт,\n" +"последвано от %s поредици." + +#: Mailnag/plugins/libnotifyplugin.py:117 msgid "LibNotify Notifications" msgstr "LibNotify известия" -#: Mailnag/plugins/libnotifyplugin.py:115 +#: Mailnag/plugins/libnotifyplugin.py:118 msgid "Shows a popup when new mails arrive." msgstr "Показва изкачащ прозорец при пристигане на имейл." -#: Mailnag/plugins/libnotifyplugin.py:130 +#: Mailnag/plugins/libnotifyplugin.py:133 msgid "Count of new mails" msgstr "Брой на нови писма" -#: Mailnag/plugins/libnotifyplugin.py:131 +#: Mailnag/plugins/libnotifyplugin.py:134 msgid "Short summary of new mails" msgstr "Кратка извадка от новите писма" -#: Mailnag/plugins/libnotifyplugin.py:132 +#: Mailnag/plugins/libnotifyplugin.py:135 msgid "Detailed summary of new mails" msgstr "Подробна извадка от новите писма" -#: Mailnag/plugins/libnotifyplugin.py:133 +#: Mailnag/plugins/libnotifyplugin.py:136 msgid "One notification per new mail" msgstr "Едно известие за имейл" -#: Mailnag/plugins/libnotifyplugin.py:141 +#: Mailnag/plugins/libnotifyplugin.py:144 msgid "Notification mode:" msgstr "Режим на известяване:" -#: Mailnag/plugins/libnotifyplugin.py:234 -#: Mailnag/plugins/libnotifyplugin.py:270 -#: Mailnag/plugins/libnotifyplugin.py:307 +#: Mailnag/plugins/libnotifyplugin.py:237 +#: Mailnag/plugins/libnotifyplugin.py:273 +#: Mailnag/plugins/libnotifyplugin.py:310 #, python-brace-format msgid "{0} new mails" msgstr "{0} нови писма" -#: Mailnag/plugins/libnotifyplugin.py:236 +#: Mailnag/plugins/libnotifyplugin.py:239 #, python-brace-format msgid "from {0} and others." msgstr "от {0} и други." -#: Mailnag/plugins/libnotifyplugin.py:238 #: Mailnag/plugins/libnotifyplugin.py:241 +#: Mailnag/plugins/libnotifyplugin.py:244 #, python-brace-format msgid "from {0}." msgstr "от {0}." -#: Mailnag/plugins/libnotifyplugin.py:240 -#: Mailnag/plugins/libnotifyplugin.py:272 -#: Mailnag/plugins/libnotifyplugin.py:309 +#: Mailnag/plugins/libnotifyplugin.py:243 +#: Mailnag/plugins/libnotifyplugin.py:275 +#: Mailnag/plugins/libnotifyplugin.py:312 msgid "New mail" msgstr "Ново писмо" -#: Mailnag/plugins/libnotifyplugin.py:265 -#: Mailnag/plugins/libnotifyplugin.py:267 +#: Mailnag/plugins/libnotifyplugin.py:268 +#: Mailnag/plugins/libnotifyplugin.py:270 #, python-brace-format msgid "(and {0} more)" msgstr "( и {0} други)" -#: Mailnag/plugins/libnotifyplugin.py:296 +#: Mailnag/plugins/libnotifyplugin.py:299 msgid "Mark as read" msgstr "Отбележи като прочетено" -#: Mailnag/plugins/userscriptplugin.py:60 -msgid "User Script" -msgstr "Потребителски скрипт" +#: Mailnag/configuration/accountdialog.py:77 +msgid "Mail Account" +msgstr "Пощенски акаунт" -#: Mailnag/plugins/userscriptplugin.py:61 -msgid "Runs an user defined script on mail arrival." -msgstr "При пристигане на имейл стартира скрипт дефиниран от потребителя" +#: Mailnag/configuration/accountdialog.py:119 +msgid "optional" +msgstr "незадължително" -#: Mailnag/plugins/userscriptplugin.py:80 -msgid "account" -msgstr "акаунт" +#: Mailnag/configuration/accountdialog.py:123 +#: Mailnag/configuration/configwindow.py:88 +#: Mailnag/configuration/configwindow.py:108 +msgid "Enabled" +msgstr "Включено" -#: Mailnag/plugins/userscriptplugin.py:80 -msgid "sender" -msgstr "изпращач" +#: Mailnag/configuration/accountdialog.py:129 +#: Mailnag/configuration/configwindow.py:94 +#: Mailnag/configuration/configwindow.py:114 +msgid "Name" +msgstr "Име" -#: Mailnag/plugins/userscriptplugin.py:80 -msgid "subject" -msgstr "тема" +#: Mailnag/configuration/accountdialog.py:252 +msgid "IMAP (Custom)" +msgstr "" -#: Mailnag/plugins/userscriptplugin.py:81 -#, fuzzy, python-format -msgid "" -"The following script will be executed whenever new mails arrive.\n" -"Mailnagger passes the total count of new mails to this script,\n" -"followed by %s sequences." +#: Mailnag/configuration/accountdialog.py:253 +msgid "POP3 (Custom)" msgstr "" -"Следния скрипт ще бъде изпълнен при пристигането на нов имейл.\n" -"Mailnag ще предава общия брой имейли на този скрипт,\n" -"последвано от %s поредици." + +#: Mailnag/configuration/accountdialog.py:254 +msgid "MBox (Custom)" +msgstr "" + +#: Mailnag/configuration/accountdialog.py:255 +msgid "Maildir (Custom)" +msgstr "" + +#: Mailnag/configuration/accountdialog.py:361 +msgid "Connection failed." +msgstr "Връзката се разпадна." + +#: Mailnag/configuration/configwindow.py:278 +msgid "About Mailnagger" +msgstr "" + +#: Mailnag/configuration/configwindow.py:281 +msgid "An extensible mail notification daemon." +msgstr "" + +#: Mailnag/configuration/configwindow.py:283 +#, python-brace-format +msgid "Copyright (c) {years} {author} and contributors." +msgstr "" + +#: Mailnag/configuration/configwindow.py:290 +msgid "Homepage" +msgstr "" + +#: Mailnag/configuration/configwindow.py:293 +msgid "maintainer" +msgstr "" + +#. TRANSLATORS: Translate `translator-credits` to the list of names +#. of translators, or team, or something like that. +#: Mailnag/configuration/configwindow.py:313 +msgid "translator-credits" +msgstr "" +"Launchpad Contributions:\n" +" spacy01 https://launchpad.net/~spacy00001" + +#: Mailnag/configuration/configwindow.py:353 +msgid "Delete this account:" +msgstr "Изтриване на акаунта:" + +#: Mailnag/configuration/plugindialog.py:35 +msgid "Plugin Configuration" +msgstr "Настройки на приставките" #: Mailnag/configuration/ui/account_widget.ui.h:1 msgid "" diff --git a/po/ca.po b/po/ca.po index 9ce262a..2369ff1 100644 --- a/po/ca.po +++ b/po/ca.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: mailnag\n" "Report-Msgid-Bugs-To: https://github.com/tikank/mailnagger/issues\n" -"POT-Creation-Date: 2024-11-27 20:16+0200\n" +"POT-Creation-Date: 2025-11-10 12:57+0100\n" "PO-Revision-Date: 2020-04-05 12:44+0000\n" "Last-Translator: Marc Riera Irigoyen \n" "Language-Team: Catalan \n" @@ -18,87 +18,29 @@ msgstr "" "X-Launchpad-Export-Date: 2020-06-11 14:44+0000\n" "X-Generator: Launchpad (build b190cebbf563f89e480a8b57f641753c8196bda0)\n" -#: Mailnag/configuration/accountdialog.py:77 -msgid "Mail Account" -msgstr "Compte de correu" - -#: Mailnag/configuration/accountdialog.py:119 -msgid "optional" -msgstr "opcional" - -#: Mailnag/configuration/accountdialog.py:123 -#: Mailnag/configuration/configwindow.py:88 -#: Mailnag/configuration/configwindow.py:108 -msgid "Enabled" -msgstr "Habilitat" - -#: Mailnag/configuration/accountdialog.py:129 -#: Mailnag/configuration/configwindow.py:94 -#: Mailnag/configuration/configwindow.py:114 -msgid "Name" -msgstr "Nom" - -#: Mailnag/configuration/accountdialog.py:252 -msgid "IMAP (Custom)" -msgstr "IMAP (personalitzat)" - -#: Mailnag/configuration/accountdialog.py:253 -msgid "POP3 (Custom)" -msgstr "POP3 (personalitzat)" - -#: Mailnag/configuration/accountdialog.py:254 -msgid "MBox (Custom)" -msgstr "MBox (personalitzat)" +#: Mailnag/daemon/mails.py:153 +msgid "No subject" +msgstr "Sense assumpte" -#: Mailnag/configuration/accountdialog.py:255 -msgid "Maildir (Custom)" -msgstr "Maildir (personalitzat)" +#: Mailnag/plugins/garmin2FAplugin.py:135 +#, fuzzy +msgid "Garmin 2FA LibNotify Notifications" +msgstr "Notificacions del LibNotify" -#: Mailnag/configuration/accountdialog.py:361 -msgid "Connection failed." -msgstr "No s'ha pogut connectar." +#: Mailnag/plugins/garmin2FAplugin.py:136 +#, fuzzy +msgid "Shows a popup when Garmin 2FA mails arrive." +msgstr "Mostra una finestra emergent quan arriben correus nous." -#: Mailnag/configuration/configwindow.py:278 -msgid "About Mailnagger" +#: Mailnag/plugins/garmin2FAplugin.py:203 +msgid "Your Security Passcode" msgstr "" -#: Mailnag/configuration/configwindow.py:281 -msgid "An extensible mail notification daemon." -msgstr "Un dimoni de notificacions de correu extensible." - -#: Mailnag/configuration/configwindow.py:283 +#: Mailnag/plugins/garmin2FAplugin.py:220 #, python-brace-format -msgid "Copyright (c) {years} {author} and contributors." +msgid "📋 Code: {0}" msgstr "" -#: Mailnag/configuration/configwindow.py:290 -msgid "Homepage" -msgstr "Lloc web" - -#: Mailnag/configuration/configwindow.py:293 -msgid "maintainer" -msgstr "" - -#. TRANSLATORS: Translate `translator-credits` to the list of names -#. of translators, or team, or something like that. -#: Mailnag/configuration/configwindow.py:313 -msgid "translator-credits" -msgstr "" -"Launchpad Contributions:\n" -" Marc Riera Irigoyen https://launchpad.net/~marcriera" - -#: Mailnag/configuration/configwindow.py:353 -msgid "Delete this account:" -msgstr "Suprimeix aquest compte:" - -#: Mailnag/configuration/plugindialog.py:30 -msgid "Plugin Configuration" -msgstr "Configuració del connector" - -#: Mailnag/daemon/mails.py:135 -msgid "No subject" -msgstr "Sense assumpte" - #: Mailnag/plugins/spamfilterplugin.py:67 msgid "Spam Filter" msgstr "Filtre de correu brossa" @@ -116,106 +58,183 @@ msgstr "" "El Mailnag ignorarà els correus que continguin com a mínim \n" "una de les paraules següents a l'assumpte o el remitent." -#: Mailnag/plugins/soundplugin.py:64 +#: Mailnag/plugins/soundplugin.py:66 msgid "Sound Notifications" msgstr "Notificacions sonores" -#: Mailnag/plugins/soundplugin.py:65 +#: Mailnag/plugins/soundplugin.py:67 msgid "Plays a sound when new mails arrive." msgstr "Reprodueix un so quan arriben correus nous." -#: Mailnag/plugins/libnotifyplugin.py:114 +#: Mailnag/plugins/userscriptplugin.py:60 +msgid "User Script" +msgstr "Script de l'usuari" + +#: Mailnag/plugins/userscriptplugin.py:61 +msgid "Runs an user defined script on mail arrival." +msgstr "Executa un script definit per l'usuari quan arriba correu nou." + +#: Mailnag/plugins/userscriptplugin.py:80 +msgid "account" +msgstr "compte" + +#: Mailnag/plugins/userscriptplugin.py:80 +msgid "sender" +msgstr "remitent" + +#: Mailnag/plugins/userscriptplugin.py:80 +msgid "subject" +msgstr "assumpte" + +#: Mailnag/plugins/userscriptplugin.py:81 +#, fuzzy, python-format +msgid "" +"The following script will be executed whenever new mails arrive.\n" +"Mailnagger passes the total count of new mails to this script,\n" +"followed by %s sequences." +msgstr "" +"S'executarà l'script següent quan arribin correus nous.\n" +"El Mailnag passa el nombre total de correus nous a aquest script,\n" +"seguit de seqüències %s." + +#: Mailnag/plugins/libnotifyplugin.py:117 msgid "LibNotify Notifications" msgstr "Notificacions del LibNotify" -#: Mailnag/plugins/libnotifyplugin.py:115 +#: Mailnag/plugins/libnotifyplugin.py:118 msgid "Shows a popup when new mails arrive." msgstr "Mostra una finestra emergent quan arriben correus nous." -#: Mailnag/plugins/libnotifyplugin.py:130 +#: Mailnag/plugins/libnotifyplugin.py:133 msgid "Count of new mails" msgstr "Recompte de correus nous" -#: Mailnag/plugins/libnotifyplugin.py:131 +#: Mailnag/plugins/libnotifyplugin.py:134 msgid "Short summary of new mails" msgstr "Resum breu dels correus nous" -#: Mailnag/plugins/libnotifyplugin.py:132 +#: Mailnag/plugins/libnotifyplugin.py:135 msgid "Detailed summary of new mails" msgstr "Resum detallat dels correus nous" -#: Mailnag/plugins/libnotifyplugin.py:133 +#: Mailnag/plugins/libnotifyplugin.py:136 msgid "One notification per new mail" msgstr "Una notificació per correu nou" -#: Mailnag/plugins/libnotifyplugin.py:141 +#: Mailnag/plugins/libnotifyplugin.py:144 msgid "Notification mode:" msgstr "Mode de notificació:" -#: Mailnag/plugins/libnotifyplugin.py:234 -#: Mailnag/plugins/libnotifyplugin.py:270 -#: Mailnag/plugins/libnotifyplugin.py:307 +#: Mailnag/plugins/libnotifyplugin.py:237 +#: Mailnag/plugins/libnotifyplugin.py:273 +#: Mailnag/plugins/libnotifyplugin.py:310 #, python-brace-format msgid "{0} new mails" msgstr "{0} correus nous" -#: Mailnag/plugins/libnotifyplugin.py:236 +#: Mailnag/plugins/libnotifyplugin.py:239 #, python-brace-format msgid "from {0} and others." msgstr "de {0} i altres." -#: Mailnag/plugins/libnotifyplugin.py:238 #: Mailnag/plugins/libnotifyplugin.py:241 +#: Mailnag/plugins/libnotifyplugin.py:244 #, python-brace-format msgid "from {0}." msgstr "de {0}." -#: Mailnag/plugins/libnotifyplugin.py:240 -#: Mailnag/plugins/libnotifyplugin.py:272 -#: Mailnag/plugins/libnotifyplugin.py:309 +#: Mailnag/plugins/libnotifyplugin.py:243 +#: Mailnag/plugins/libnotifyplugin.py:275 +#: Mailnag/plugins/libnotifyplugin.py:312 msgid "New mail" msgstr "Correu nou" -#: Mailnag/plugins/libnotifyplugin.py:265 -#: Mailnag/plugins/libnotifyplugin.py:267 +#: Mailnag/plugins/libnotifyplugin.py:268 +#: Mailnag/plugins/libnotifyplugin.py:270 #, python-brace-format msgid "(and {0} more)" msgstr "(i {0} més)" -#: Mailnag/plugins/libnotifyplugin.py:296 +#: Mailnag/plugins/libnotifyplugin.py:299 msgid "Mark as read" msgstr "Marca com a llegit" -#: Mailnag/plugins/userscriptplugin.py:60 -msgid "User Script" -msgstr "Script de l'usuari" +#: Mailnag/configuration/accountdialog.py:77 +msgid "Mail Account" +msgstr "Compte de correu" -#: Mailnag/plugins/userscriptplugin.py:61 -msgid "Runs an user defined script on mail arrival." -msgstr "Executa un script definit per l'usuari quan arriba correu nou." +#: Mailnag/configuration/accountdialog.py:119 +msgid "optional" +msgstr "opcional" -#: Mailnag/plugins/userscriptplugin.py:80 -msgid "account" -msgstr "compte" +#: Mailnag/configuration/accountdialog.py:123 +#: Mailnag/configuration/configwindow.py:88 +#: Mailnag/configuration/configwindow.py:108 +msgid "Enabled" +msgstr "Habilitat" -#: Mailnag/plugins/userscriptplugin.py:80 -msgid "sender" -msgstr "remitent" +#: Mailnag/configuration/accountdialog.py:129 +#: Mailnag/configuration/configwindow.py:94 +#: Mailnag/configuration/configwindow.py:114 +msgid "Name" +msgstr "Nom" -#: Mailnag/plugins/userscriptplugin.py:80 -msgid "subject" -msgstr "assumpte" +#: Mailnag/configuration/accountdialog.py:252 +msgid "IMAP (Custom)" +msgstr "IMAP (personalitzat)" -#: Mailnag/plugins/userscriptplugin.py:81 -#, fuzzy, python-format -msgid "" -"The following script will be executed whenever new mails arrive.\n" -"Mailnagger passes the total count of new mails to this script,\n" -"followed by %s sequences." +#: Mailnag/configuration/accountdialog.py:253 +msgid "POP3 (Custom)" +msgstr "POP3 (personalitzat)" + +#: Mailnag/configuration/accountdialog.py:254 +msgid "MBox (Custom)" +msgstr "MBox (personalitzat)" + +#: Mailnag/configuration/accountdialog.py:255 +msgid "Maildir (Custom)" +msgstr "Maildir (personalitzat)" + +#: Mailnag/configuration/accountdialog.py:361 +msgid "Connection failed." +msgstr "No s'ha pogut connectar." + +#: Mailnag/configuration/configwindow.py:278 +msgid "About Mailnagger" msgstr "" -"S'executarà l'script següent quan arribin correus nous.\n" -"El Mailnag passa el nombre total de correus nous a aquest script,\n" -"seguit de seqüències %s." + +#: Mailnag/configuration/configwindow.py:281 +msgid "An extensible mail notification daemon." +msgstr "Un dimoni de notificacions de correu extensible." + +#: Mailnag/configuration/configwindow.py:283 +#, python-brace-format +msgid "Copyright (c) {years} {author} and contributors." +msgstr "" + +#: Mailnag/configuration/configwindow.py:290 +msgid "Homepage" +msgstr "Lloc web" + +#: Mailnag/configuration/configwindow.py:293 +msgid "maintainer" +msgstr "" + +#. TRANSLATORS: Translate `translator-credits` to the list of names +#. of translators, or team, or something like that. +#: Mailnag/configuration/configwindow.py:313 +msgid "translator-credits" +msgstr "" +"Launchpad Contributions:\n" +" Marc Riera Irigoyen https://launchpad.net/~marcriera" + +#: Mailnag/configuration/configwindow.py:353 +msgid "Delete this account:" +msgstr "Suprimeix aquest compte:" + +#: Mailnag/configuration/plugindialog.py:35 +msgid "Plugin Configuration" +msgstr "Configuració del connector" #: Mailnag/configuration/ui/account_widget.ui.h:1 msgid "" diff --git a/po/cs.po b/po/cs.po index 48fc377..92b3f69 100644 --- a/po/cs.po +++ b/po/cs.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: mailnag\n" "Report-Msgid-Bugs-To: https://github.com/tikank/mailnagger/issues\n" -"POT-Creation-Date: 2024-11-27 20:16+0200\n" +"POT-Creation-Date: 2025-11-10 12:57+0100\n" "PO-Revision-Date: 2019-03-16 14:48+0000\n" "Last-Translator: Launchpad Translations Administrators \n" "Language-Team: Czech \n" @@ -18,89 +18,29 @@ msgstr "" "X-Launchpad-Export-Date: 2020-06-11 14:44+0000\n" "X-Generator: Launchpad (build b190cebbf563f89e480a8b57f641753c8196bda0)\n" -#: Mailnag/configuration/accountdialog.py:77 -msgid "Mail Account" -msgstr "Poštovní účet" - -#: Mailnag/configuration/accountdialog.py:119 -msgid "optional" -msgstr "volitelně" - -#: Mailnag/configuration/accountdialog.py:123 -#: Mailnag/configuration/configwindow.py:88 -#: Mailnag/configuration/configwindow.py:108 -msgid "Enabled" -msgstr "Povoleno" - -#: Mailnag/configuration/accountdialog.py:129 -#: Mailnag/configuration/configwindow.py:94 -#: Mailnag/configuration/configwindow.py:114 -msgid "Name" -msgstr "Název" - -#: Mailnag/configuration/accountdialog.py:252 -msgid "IMAP (Custom)" -msgstr "" - -#: Mailnag/configuration/accountdialog.py:253 -msgid "POP3 (Custom)" -msgstr "" - -#: Mailnag/configuration/accountdialog.py:254 -msgid "MBox (Custom)" -msgstr "" - -#: Mailnag/configuration/accountdialog.py:255 -msgid "Maildir (Custom)" -msgstr "" +#: Mailnag/daemon/mails.py:153 +msgid "No subject" +msgstr "Žádný předmět" -#: Mailnag/configuration/accountdialog.py:361 -msgid "Connection failed." -msgstr "Spojení selhalo." +#: Mailnag/plugins/garmin2FAplugin.py:135 +#, fuzzy +msgid "Garmin 2FA LibNotify Notifications" +msgstr "LibNotify notifikace" -#: Mailnag/configuration/configwindow.py:278 -msgid "About Mailnagger" -msgstr "" +#: Mailnag/plugins/garmin2FAplugin.py:136 +#, fuzzy +msgid "Shows a popup when Garmin 2FA mails arrive." +msgstr "Zobrazí popup okno při novém e-mailu." -#: Mailnag/configuration/configwindow.py:281 -msgid "An extensible mail notification daemon." +#: Mailnag/plugins/garmin2FAplugin.py:203 +msgid "Your Security Passcode" msgstr "" -#: Mailnag/configuration/configwindow.py:283 +#: Mailnag/plugins/garmin2FAplugin.py:220 #, python-brace-format -msgid "Copyright (c) {years} {author} and contributors." +msgid "📋 Code: {0}" msgstr "" -#: Mailnag/configuration/configwindow.py:290 -msgid "Homepage" -msgstr "" - -#: Mailnag/configuration/configwindow.py:293 -msgid "maintainer" -msgstr "" - -#. TRANSLATORS: Translate `translator-credits` to the list of names -#. of translators, or team, or something like that. -#: Mailnag/configuration/configwindow.py:313 -msgid "translator-credits" -msgstr "" -"Launchpad Contributions:\n" -" Jirka Dutka https://launchpad.net/~jirka-x\n" -" Patrick Ulbrich https://launchpad.net/~pulb\n" -" Radek Otáhal https://launchpad.net/~radek-otahal" - -#: Mailnag/configuration/configwindow.py:353 -msgid "Delete this account:" -msgstr "Odstranit tento účet:" - -#: Mailnag/configuration/plugindialog.py:30 -msgid "Plugin Configuration" -msgstr "Konfigurace pluginu" - -#: Mailnag/daemon/mails.py:135 -msgid "No subject" -msgstr "Žádný předmět" - #: Mailnag/plugins/spamfilterplugin.py:67 msgid "Spam Filter" msgstr "Spam filtr" @@ -118,106 +58,185 @@ msgstr "" "Mailnag bude ignorovat e-maily obsahující aspoň jedno z \n" "následujících slov v poli předmět nebo odesílatel." -#: Mailnag/plugins/soundplugin.py:64 +#: Mailnag/plugins/soundplugin.py:66 msgid "Sound Notifications" msgstr "Zvukové notifikace" -#: Mailnag/plugins/soundplugin.py:65 +#: Mailnag/plugins/soundplugin.py:67 msgid "Plays a sound when new mails arrive." msgstr "Přehraje zvuk při novém e-mailu." -#: Mailnag/plugins/libnotifyplugin.py:114 +#: Mailnag/plugins/userscriptplugin.py:60 +msgid "User Script" +msgstr "Uživatelský skript" + +#: Mailnag/plugins/userscriptplugin.py:61 +msgid "Runs an user defined script on mail arrival." +msgstr "Spuštění uživatelem definovaného skriptu při přijetí e-mailu." + +#: Mailnag/plugins/userscriptplugin.py:80 +msgid "account" +msgstr "účet" + +#: Mailnag/plugins/userscriptplugin.py:80 +msgid "sender" +msgstr "odesílatel" + +#: Mailnag/plugins/userscriptplugin.py:80 +msgid "subject" +msgstr "předmět" + +#: Mailnag/plugins/userscriptplugin.py:81 +#, fuzzy, python-format +msgid "" +"The following script will be executed whenever new mails arrive.\n" +"Mailnagger passes the total count of new mails to this script,\n" +"followed by %s sequences." +msgstr "" +"Následující skript bude spuštěn při novém e-mailu.\n" +"Mailnag předá celkové počet nových e-mailů tomuto skriptu,\n" +"následovaný %s sekvencemi." + +#: Mailnag/plugins/libnotifyplugin.py:117 msgid "LibNotify Notifications" msgstr "LibNotify notifikace" -#: Mailnag/plugins/libnotifyplugin.py:115 +#: Mailnag/plugins/libnotifyplugin.py:118 msgid "Shows a popup when new mails arrive." msgstr "Zobrazí popup okno při novém e-mailu." -#: Mailnag/plugins/libnotifyplugin.py:130 +#: Mailnag/plugins/libnotifyplugin.py:133 msgid "Count of new mails" msgstr "Počet nových e-mailů" -#: Mailnag/plugins/libnotifyplugin.py:131 +#: Mailnag/plugins/libnotifyplugin.py:134 msgid "Short summary of new mails" msgstr "Krátký přehled nových e-mailů" -#: Mailnag/plugins/libnotifyplugin.py:132 +#: Mailnag/plugins/libnotifyplugin.py:135 msgid "Detailed summary of new mails" msgstr "Detailní přehled nových e-mailů" -#: Mailnag/plugins/libnotifyplugin.py:133 +#: Mailnag/plugins/libnotifyplugin.py:136 msgid "One notification per new mail" msgstr "Jedna notifikace pro nový e-mail" -#: Mailnag/plugins/libnotifyplugin.py:141 +#: Mailnag/plugins/libnotifyplugin.py:144 msgid "Notification mode:" msgstr "Notifikační mód:" -#: Mailnag/plugins/libnotifyplugin.py:234 -#: Mailnag/plugins/libnotifyplugin.py:270 -#: Mailnag/plugins/libnotifyplugin.py:307 +#: Mailnag/plugins/libnotifyplugin.py:237 +#: Mailnag/plugins/libnotifyplugin.py:273 +#: Mailnag/plugins/libnotifyplugin.py:310 #, python-brace-format msgid "{0} new mails" msgstr "{0} nových e-mailů" -#: Mailnag/plugins/libnotifyplugin.py:236 +#: Mailnag/plugins/libnotifyplugin.py:239 #, python-brace-format msgid "from {0} and others." msgstr "z {0} a další." -#: Mailnag/plugins/libnotifyplugin.py:238 #: Mailnag/plugins/libnotifyplugin.py:241 +#: Mailnag/plugins/libnotifyplugin.py:244 #, python-brace-format msgid "from {0}." msgstr "z {0}." -#: Mailnag/plugins/libnotifyplugin.py:240 -#: Mailnag/plugins/libnotifyplugin.py:272 -#: Mailnag/plugins/libnotifyplugin.py:309 +#: Mailnag/plugins/libnotifyplugin.py:243 +#: Mailnag/plugins/libnotifyplugin.py:275 +#: Mailnag/plugins/libnotifyplugin.py:312 msgid "New mail" msgstr "Nový mail" -#: Mailnag/plugins/libnotifyplugin.py:265 -#: Mailnag/plugins/libnotifyplugin.py:267 +#: Mailnag/plugins/libnotifyplugin.py:268 +#: Mailnag/plugins/libnotifyplugin.py:270 #, python-brace-format msgid "(and {0} more)" msgstr "(a {0} dalších)" -#: Mailnag/plugins/libnotifyplugin.py:296 +#: Mailnag/plugins/libnotifyplugin.py:299 msgid "Mark as read" msgstr "Označit jako přečtený" -#: Mailnag/plugins/userscriptplugin.py:60 -msgid "User Script" -msgstr "Uživatelský skript" +#: Mailnag/configuration/accountdialog.py:77 +msgid "Mail Account" +msgstr "Poštovní účet" -#: Mailnag/plugins/userscriptplugin.py:61 -msgid "Runs an user defined script on mail arrival." -msgstr "Spuštění uživatelem definovaného skriptu při přijetí e-mailu." +#: Mailnag/configuration/accountdialog.py:119 +msgid "optional" +msgstr "volitelně" -#: Mailnag/plugins/userscriptplugin.py:80 -msgid "account" -msgstr "účet" +#: Mailnag/configuration/accountdialog.py:123 +#: Mailnag/configuration/configwindow.py:88 +#: Mailnag/configuration/configwindow.py:108 +msgid "Enabled" +msgstr "Povoleno" -#: Mailnag/plugins/userscriptplugin.py:80 -msgid "sender" -msgstr "odesílatel" +#: Mailnag/configuration/accountdialog.py:129 +#: Mailnag/configuration/configwindow.py:94 +#: Mailnag/configuration/configwindow.py:114 +msgid "Name" +msgstr "Název" -#: Mailnag/plugins/userscriptplugin.py:80 -msgid "subject" -msgstr "předmět" +#: Mailnag/configuration/accountdialog.py:252 +msgid "IMAP (Custom)" +msgstr "" -#: Mailnag/plugins/userscriptplugin.py:81 -#, fuzzy, python-format -msgid "" -"The following script will be executed whenever new mails arrive.\n" -"Mailnagger passes the total count of new mails to this script,\n" -"followed by %s sequences." +#: Mailnag/configuration/accountdialog.py:253 +msgid "POP3 (Custom)" msgstr "" -"Následující skript bude spuštěn při novém e-mailu.\n" -"Mailnag předá celkové počet nových e-mailů tomuto skriptu,\n" -"následovaný %s sekvencemi." + +#: Mailnag/configuration/accountdialog.py:254 +msgid "MBox (Custom)" +msgstr "" + +#: Mailnag/configuration/accountdialog.py:255 +msgid "Maildir (Custom)" +msgstr "" + +#: Mailnag/configuration/accountdialog.py:361 +msgid "Connection failed." +msgstr "Spojení selhalo." + +#: Mailnag/configuration/configwindow.py:278 +msgid "About Mailnagger" +msgstr "" + +#: Mailnag/configuration/configwindow.py:281 +msgid "An extensible mail notification daemon." +msgstr "" + +#: Mailnag/configuration/configwindow.py:283 +#, python-brace-format +msgid "Copyright (c) {years} {author} and contributors." +msgstr "" + +#: Mailnag/configuration/configwindow.py:290 +msgid "Homepage" +msgstr "" + +#: Mailnag/configuration/configwindow.py:293 +msgid "maintainer" +msgstr "" + +#. TRANSLATORS: Translate `translator-credits` to the list of names +#. of translators, or team, or something like that. +#: Mailnag/configuration/configwindow.py:313 +msgid "translator-credits" +msgstr "" +"Launchpad Contributions:\n" +" Jirka Dutka https://launchpad.net/~jirka-x\n" +" Patrick Ulbrich https://launchpad.net/~pulb\n" +" Radek Otáhal https://launchpad.net/~radek-otahal" + +#: Mailnag/configuration/configwindow.py:353 +msgid "Delete this account:" +msgstr "Odstranit tento účet:" + +#: Mailnag/configuration/plugindialog.py:35 +msgid "Plugin Configuration" +msgstr "Konfigurace pluginu" #: Mailnag/configuration/ui/account_widget.ui.h:1 msgid "" diff --git a/po/de.po b/po/de.po index 9a03477..e21ee84 100644 --- a/po/de.po +++ b/po/de.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: mailnag\n" "Report-Msgid-Bugs-To: https://github.com/tikank/mailnagger/issues\n" -"POT-Creation-Date: 2024-11-27 20:16+0200\n" +"POT-Creation-Date: 2025-11-10 12:57+0100\n" "PO-Revision-Date: 2020-10-24 19:26+0000\n" "Last-Translator: J. Lavoie \n" "Language-Team: German \n" "Language-Team: Spanish \n" "Language-Team: \n" @@ -18,84 +18,28 @@ msgstr "" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Poedit 3.5\n" -#: Mailnag/configuration/accountdialog.py:77 -msgid "Mail Account" -msgstr "Sähköpostitili" - -#: Mailnag/configuration/accountdialog.py:119 -msgid "optional" -msgstr "valinnainen" - -#: Mailnag/configuration/accountdialog.py:123 -#: Mailnag/configuration/configwindow.py:88 -#: Mailnag/configuration/configwindow.py:108 -msgid "Enabled" -msgstr "Käytössä" - -#: Mailnag/configuration/accountdialog.py:129 -#: Mailnag/configuration/configwindow.py:94 -#: Mailnag/configuration/configwindow.py:114 -msgid "Name" -msgstr "Nimi" - -#: Mailnag/configuration/accountdialog.py:252 -msgid "IMAP (Custom)" -msgstr "IMAP" - -#: Mailnag/configuration/accountdialog.py:253 -msgid "POP3 (Custom)" -msgstr "POP3" - -#: Mailnag/configuration/accountdialog.py:254 -msgid "MBox (Custom)" -msgstr "MBox" - -#: Mailnag/configuration/accountdialog.py:255 -msgid "Maildir (Custom)" -msgstr "Maildir" +#: Mailnag/daemon/mails.py:153 +msgid "No subject" +msgstr "Ei otsikkoa" -#: Mailnag/configuration/accountdialog.py:361 -msgid "Connection failed." -msgstr "Yhteydenotto epäonnistui." +#: Mailnag/plugins/garmin2FAplugin.py:135 +#, fuzzy +msgid "Garmin 2FA LibNotify Notifications" +msgstr "LibNotify-huomautin" -#: Mailnag/configuration/configwindow.py:278 -msgid "About Mailnagger" -msgstr "Tietoja Mailnaggerista" +#: Mailnag/plugins/garmin2FAplugin.py:136 +#, fuzzy +msgid "Shows a popup when Garmin 2FA mails arrive." +msgstr "Näyttää huomautuksen, kun uusi sähköposti saapuu." -#: Mailnag/configuration/configwindow.py:281 -msgid "An extensible mail notification daemon." -msgstr "Laajennettava sähköpostihuomautin." +#: Mailnag/plugins/garmin2FAplugin.py:203 +msgid "Your Security Passcode" +msgstr "" -#: Mailnag/configuration/configwindow.py:283 +#: Mailnag/plugins/garmin2FAplugin.py:220 #, python-brace-format -msgid "Copyright (c) {years} {author} and contributors." -msgstr "Copyright (c) {years} {author} ja muut tekijät." - -#: Mailnag/configuration/configwindow.py:290 -msgid "Homepage" -msgstr "Kotisivu" - -#: Mailnag/configuration/configwindow.py:293 -msgid "maintainer" -msgstr "ylläpitäjä" - -#. TRANSLATORS: Translate `translator-credits` to the list of names -#. of translators, or team, or something like that. -#: Mailnag/configuration/configwindow.py:313 -msgid "translator-credits" -msgstr "Timo Kankare" - -#: Mailnag/configuration/configwindow.py:353 -msgid "Delete this account:" -msgstr "Poista tämä tili:" - -#: Mailnag/configuration/plugindialog.py:30 -msgid "Plugin Configuration" -msgstr "Lisäosan konfigurointi" - -#: Mailnag/daemon/mails.py:135 -msgid "No subject" -msgstr "Ei otsikkoa" +msgid "📋 Code: {0}" +msgstr "" #: Mailnag/plugins/spamfilterplugin.py:67 msgid "Spam Filter" @@ -113,106 +57,181 @@ msgstr "" "Mailnagger suodattaa pois postit, joissa on otsikossa\n" "tai lähettäjäkentässä ainakin yksi seuraavista sanoista." -#: Mailnag/plugins/soundplugin.py:64 +#: Mailnag/plugins/soundplugin.py:66 msgid "Sound Notifications" msgstr "Äänimerkki" -#: Mailnag/plugins/soundplugin.py:65 +#: Mailnag/plugins/soundplugin.py:67 msgid "Plays a sound when new mails arrive." msgstr "Soittaa äänimerkin, kun uusi sähköposti saapuu." -#: Mailnag/plugins/libnotifyplugin.py:114 +#: Mailnag/plugins/userscriptplugin.py:60 +msgid "User Script" +msgstr "Käyttäjän skripti" + +#: Mailnag/plugins/userscriptplugin.py:61 +msgid "Runs an user defined script on mail arrival." +msgstr "Ajaa käyttäjän määrittelemän skriptin, kun uusi sähköposti saapuu." + +#: Mailnag/plugins/userscriptplugin.py:80 +msgid "account" +msgstr "tili" + +#: Mailnag/plugins/userscriptplugin.py:80 +msgid "sender" +msgstr "lähettäjä" + +#: Mailnag/plugins/userscriptplugin.py:80 +msgid "subject" +msgstr "otsikko" + +#: Mailnag/plugins/userscriptplugin.py:81 +#, python-format +msgid "" +"The following script will be executed whenever new mails arrive.\n" +"Mailnagger passes the total count of new mails to this script,\n" +"followed by %s sequences." +msgstr "" +"Seuraava skripti suoritetaan, kun uusi sähköposti saapuu.\n" +"Mailnagger välittää skriptille uusien postien kokonaismäärän\n" +"ja sen perään %s-sarjan." + +#: Mailnag/plugins/libnotifyplugin.py:117 msgid "LibNotify Notifications" msgstr "LibNotify-huomautin" -#: Mailnag/plugins/libnotifyplugin.py:115 +#: Mailnag/plugins/libnotifyplugin.py:118 msgid "Shows a popup when new mails arrive." msgstr "Näyttää huomautuksen, kun uusi sähköposti saapuu." -#: Mailnag/plugins/libnotifyplugin.py:130 +#: Mailnag/plugins/libnotifyplugin.py:133 msgid "Count of new mails" msgstr "Uusien sähköpostien lukumäärä" -#: Mailnag/plugins/libnotifyplugin.py:131 +#: Mailnag/plugins/libnotifyplugin.py:134 msgid "Short summary of new mails" msgstr "Lyhyt yhteenveto uusista sähköposteista" -#: Mailnag/plugins/libnotifyplugin.py:132 +#: Mailnag/plugins/libnotifyplugin.py:135 msgid "Detailed summary of new mails" msgstr "Yksityiskohtainen yhteenveto uusista sähköposteista" -#: Mailnag/plugins/libnotifyplugin.py:133 +#: Mailnag/plugins/libnotifyplugin.py:136 msgid "One notification per new mail" msgstr "Oma huomautus kustakin uudesta sähköpostista" -#: Mailnag/plugins/libnotifyplugin.py:141 +#: Mailnag/plugins/libnotifyplugin.py:144 msgid "Notification mode:" msgstr "Huomautusvalinta:" -#: Mailnag/plugins/libnotifyplugin.py:234 -#: Mailnag/plugins/libnotifyplugin.py:270 -#: Mailnag/plugins/libnotifyplugin.py:307 +#: Mailnag/plugins/libnotifyplugin.py:237 +#: Mailnag/plugins/libnotifyplugin.py:273 +#: Mailnag/plugins/libnotifyplugin.py:310 #, python-brace-format msgid "{0} new mails" msgstr "{0} uutta sähköpostia" -#: Mailnag/plugins/libnotifyplugin.py:236 +#: Mailnag/plugins/libnotifyplugin.py:239 #, python-brace-format msgid "from {0} and others." msgstr "lähettäjältä {0} ja muilta." -#: Mailnag/plugins/libnotifyplugin.py:238 #: Mailnag/plugins/libnotifyplugin.py:241 +#: Mailnag/plugins/libnotifyplugin.py:244 #, python-brace-format msgid "from {0}." msgstr "lähettäjältä {0}." -#: Mailnag/plugins/libnotifyplugin.py:240 -#: Mailnag/plugins/libnotifyplugin.py:272 -#: Mailnag/plugins/libnotifyplugin.py:309 +#: Mailnag/plugins/libnotifyplugin.py:243 +#: Mailnag/plugins/libnotifyplugin.py:275 +#: Mailnag/plugins/libnotifyplugin.py:312 msgid "New mail" msgstr "Uusi sähköposti" -#: Mailnag/plugins/libnotifyplugin.py:265 -#: Mailnag/plugins/libnotifyplugin.py:267 +#: Mailnag/plugins/libnotifyplugin.py:268 +#: Mailnag/plugins/libnotifyplugin.py:270 #, python-brace-format msgid "(and {0} more)" msgstr "(ja {0} muuta)" -#: Mailnag/plugins/libnotifyplugin.py:296 +#: Mailnag/plugins/libnotifyplugin.py:299 msgid "Mark as read" msgstr "Merkitse luetuksi" -#: Mailnag/plugins/userscriptplugin.py:60 -msgid "User Script" -msgstr "Käyttäjän skripti" +#: Mailnag/configuration/accountdialog.py:77 +msgid "Mail Account" +msgstr "Sähköpostitili" -#: Mailnag/plugins/userscriptplugin.py:61 -msgid "Runs an user defined script on mail arrival." -msgstr "Ajaa käyttäjän määrittelemän skriptin, kun uusi sähköposti saapuu." +#: Mailnag/configuration/accountdialog.py:119 +msgid "optional" +msgstr "valinnainen" -#: Mailnag/plugins/userscriptplugin.py:80 -msgid "account" -msgstr "tili" +#: Mailnag/configuration/accountdialog.py:123 +#: Mailnag/configuration/configwindow.py:88 +#: Mailnag/configuration/configwindow.py:108 +msgid "Enabled" +msgstr "Käytössä" -#: Mailnag/plugins/userscriptplugin.py:80 -msgid "sender" -msgstr "lähettäjä" +#: Mailnag/configuration/accountdialog.py:129 +#: Mailnag/configuration/configwindow.py:94 +#: Mailnag/configuration/configwindow.py:114 +msgid "Name" +msgstr "Nimi" -#: Mailnag/plugins/userscriptplugin.py:80 -msgid "subject" -msgstr "otsikko" +#: Mailnag/configuration/accountdialog.py:252 +msgid "IMAP (Custom)" +msgstr "IMAP" -#: Mailnag/plugins/userscriptplugin.py:81 -#, python-format -msgid "" -"The following script will be executed whenever new mails arrive.\n" -"Mailnagger passes the total count of new mails to this script,\n" -"followed by %s sequences." -msgstr "" -"Seuraava skripti suoritetaan, kun uusi sähköposti saapuu.\n" -"Mailnagger välittää skriptille uusien postien kokonaismäärän\n" -"ja sen perään %s-sarjan." +#: Mailnag/configuration/accountdialog.py:253 +msgid "POP3 (Custom)" +msgstr "POP3" + +#: Mailnag/configuration/accountdialog.py:254 +msgid "MBox (Custom)" +msgstr "MBox" + +#: Mailnag/configuration/accountdialog.py:255 +msgid "Maildir (Custom)" +msgstr "Maildir" + +#: Mailnag/configuration/accountdialog.py:361 +msgid "Connection failed." +msgstr "Yhteydenotto epäonnistui." + +#: Mailnag/configuration/configwindow.py:278 +msgid "About Mailnagger" +msgstr "Tietoja Mailnaggerista" + +#: Mailnag/configuration/configwindow.py:281 +msgid "An extensible mail notification daemon." +msgstr "Laajennettava sähköpostihuomautin." + +#: Mailnag/configuration/configwindow.py:283 +#, python-brace-format +msgid "Copyright (c) {years} {author} and contributors." +msgstr "Copyright (c) {years} {author} ja muut tekijät." + +#: Mailnag/configuration/configwindow.py:290 +msgid "Homepage" +msgstr "Kotisivu" + +#: Mailnag/configuration/configwindow.py:293 +msgid "maintainer" +msgstr "ylläpitäjä" + +#. TRANSLATORS: Translate `translator-credits` to the list of names +#. of translators, or team, or something like that. +#: Mailnag/configuration/configwindow.py:313 +msgid "translator-credits" +msgstr "Timo Kankare" + +#: Mailnag/configuration/configwindow.py:353 +msgid "Delete this account:" +msgstr "Poista tämä tili:" + +#: Mailnag/configuration/plugindialog.py:35 +msgid "Plugin Configuration" +msgstr "Lisäosan konfigurointi" #: Mailnag/configuration/ui/account_widget.ui.h:1 msgid "" diff --git a/po/fr.po b/po/fr.po index ed57ad3..feb3868 100644 --- a/po/fr.po +++ b/po/fr.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: mailnag\n" "Report-Msgid-Bugs-To: https://github.com/tikank/mailnagger/issues\n" -"POT-Creation-Date: 2024-11-27 20:16+0200\n" +"POT-Creation-Date: 2025-11-10 12:57+0100\n" "PO-Revision-Date: 2020-10-15 17:26+0000\n" "Last-Translator: J. Lavoie \n" "Language-Team: French \n" "Language-Team: Galician \n" @@ -18,89 +18,29 @@ msgstr "" "X-Launchpad-Export-Date: 2020-06-11 14:44+0000\n" "X-Generator: Launchpad (build b190cebbf563f89e480a8b57f641753c8196bda0)\n" -#: Mailnag/configuration/accountdialog.py:77 -msgid "Mail Account" -msgstr "Conta de correo-e" - -#: Mailnag/configuration/accountdialog.py:119 -msgid "optional" -msgstr "opcional" - -#: Mailnag/configuration/accountdialog.py:123 -#: Mailnag/configuration/configwindow.py:88 -#: Mailnag/configuration/configwindow.py:108 -msgid "Enabled" -msgstr "Activado" - -#: Mailnag/configuration/accountdialog.py:129 -#: Mailnag/configuration/configwindow.py:94 -#: Mailnag/configuration/configwindow.py:114 -msgid "Name" -msgstr "Nome" - -#: Mailnag/configuration/accountdialog.py:252 -msgid "IMAP (Custom)" -msgstr "" - -#: Mailnag/configuration/accountdialog.py:253 -msgid "POP3 (Custom)" -msgstr "" - -#: Mailnag/configuration/accountdialog.py:254 -msgid "MBox (Custom)" -msgstr "" - -#: Mailnag/configuration/accountdialog.py:255 -msgid "Maildir (Custom)" -msgstr "" +#: Mailnag/daemon/mails.py:153 +msgid "No subject" +msgstr "Sen asunto" -#: Mailnag/configuration/accountdialog.py:361 -msgid "Connection failed." -msgstr "" +#: Mailnag/plugins/garmin2FAplugin.py:135 +#, fuzzy +msgid "Garmin 2FA LibNotify Notifications" +msgstr "Notificacións LibNotify" -#: Mailnag/configuration/configwindow.py:278 -msgid "About Mailnagger" -msgstr "" +#: Mailnag/plugins/garmin2FAplugin.py:136 +#, fuzzy +msgid "Shows a popup when Garmin 2FA mails arrive." +msgstr "Mostra unha xanela emerxente ao recibir correos novos." -#: Mailnag/configuration/configwindow.py:281 -msgid "An extensible mail notification daemon." +#: Mailnag/plugins/garmin2FAplugin.py:203 +msgid "Your Security Passcode" msgstr "" -#: Mailnag/configuration/configwindow.py:283 +#: Mailnag/plugins/garmin2FAplugin.py:220 #, python-brace-format -msgid "Copyright (c) {years} {author} and contributors." +msgid "📋 Code: {0}" msgstr "" -#: Mailnag/configuration/configwindow.py:290 -msgid "Homepage" -msgstr "" - -#: Mailnag/configuration/configwindow.py:293 -msgid "maintainer" -msgstr "" - -#. TRANSLATORS: Translate `translator-credits` to the list of names -#. of translators, or team, or something like that. -#: Mailnag/configuration/configwindow.py:313 -msgid "translator-credits" -msgstr "" -"Launchpad Contributions:\n" -" Manuel Xosé Lemos https://launchpad.net/~mxlemos\n" -" Marcos Lans https://launchpad.net/~markooss\n" -" Patrick Ulbrich https://launchpad.net/~pulb" - -#: Mailnag/configuration/configwindow.py:353 -msgid "Delete this account:" -msgstr "Eliminar esta conta:" - -#: Mailnag/configuration/plugindialog.py:30 -msgid "Plugin Configuration" -msgstr "Configuración do complemento" - -#: Mailnag/daemon/mails.py:135 -msgid "No subject" -msgstr "Sen asunto" - #: Mailnag/plugins/spamfilterplugin.py:67 msgid "Spam Filter" msgstr "Filtro de spam" @@ -118,104 +58,183 @@ msgstr "" "Mailnag ignorará os correos que conteñan alomenos \n" "unha das seguintes palabras no asunto ou no remitente." -#: Mailnag/plugins/soundplugin.py:64 +#: Mailnag/plugins/soundplugin.py:66 msgid "Sound Notifications" msgstr "Notificacións con son" -#: Mailnag/plugins/soundplugin.py:65 +#: Mailnag/plugins/soundplugin.py:67 msgid "Plays a sound when new mails arrive." msgstr "Reproduce un son ao recibir un novo correo-e" -#: Mailnag/plugins/libnotifyplugin.py:114 +#: Mailnag/plugins/userscriptplugin.py:60 +msgid "User Script" +msgstr "Script do usuario" + +#: Mailnag/plugins/userscriptplugin.py:61 +msgid "Runs an user defined script on mail arrival." +msgstr "Executa un script do usuario ao recibir algún correo." + +#: Mailnag/plugins/userscriptplugin.py:80 +msgid "account" +msgstr "" + +#: Mailnag/plugins/userscriptplugin.py:80 +msgid "sender" +msgstr "remitente" + +#: Mailnag/plugins/userscriptplugin.py:80 +msgid "subject" +msgstr "asunto" + +#: Mailnag/plugins/userscriptplugin.py:81 +#, python-format +msgid "" +"The following script will be executed whenever new mails arrive.\n" +"Mailnagger passes the total count of new mails to this script,\n" +"followed by %s sequences." +msgstr "" + +#: Mailnag/plugins/libnotifyplugin.py:117 msgid "LibNotify Notifications" msgstr "Notificacións LibNotify" -#: Mailnag/plugins/libnotifyplugin.py:115 +#: Mailnag/plugins/libnotifyplugin.py:118 msgid "Shows a popup when new mails arrive." msgstr "Mostra unha xanela emerxente ao recibir correos novos." -#: Mailnag/plugins/libnotifyplugin.py:130 +#: Mailnag/plugins/libnotifyplugin.py:133 msgid "Count of new mails" msgstr "Total de novos correos" -#: Mailnag/plugins/libnotifyplugin.py:131 +#: Mailnag/plugins/libnotifyplugin.py:134 msgid "Short summary of new mails" msgstr "" -#: Mailnag/plugins/libnotifyplugin.py:132 +#: Mailnag/plugins/libnotifyplugin.py:135 msgid "Detailed summary of new mails" msgstr "" -#: Mailnag/plugins/libnotifyplugin.py:133 +#: Mailnag/plugins/libnotifyplugin.py:136 msgid "One notification per new mail" msgstr "Unha notificación por cada novo correo" -#: Mailnag/plugins/libnotifyplugin.py:141 +#: Mailnag/plugins/libnotifyplugin.py:144 msgid "Notification mode:" msgstr "Modo Notificación:" -#: Mailnag/plugins/libnotifyplugin.py:234 -#: Mailnag/plugins/libnotifyplugin.py:270 -#: Mailnag/plugins/libnotifyplugin.py:307 +#: Mailnag/plugins/libnotifyplugin.py:237 +#: Mailnag/plugins/libnotifyplugin.py:273 +#: Mailnag/plugins/libnotifyplugin.py:310 #, python-brace-format msgid "{0} new mails" msgstr "{0} novos correos" -#: Mailnag/plugins/libnotifyplugin.py:236 +#: Mailnag/plugins/libnotifyplugin.py:239 #, python-brace-format msgid "from {0} and others." msgstr "" -#: Mailnag/plugins/libnotifyplugin.py:238 #: Mailnag/plugins/libnotifyplugin.py:241 +#: Mailnag/plugins/libnotifyplugin.py:244 #, python-brace-format msgid "from {0}." msgstr "" -#: Mailnag/plugins/libnotifyplugin.py:240 -#: Mailnag/plugins/libnotifyplugin.py:272 -#: Mailnag/plugins/libnotifyplugin.py:309 +#: Mailnag/plugins/libnotifyplugin.py:243 +#: Mailnag/plugins/libnotifyplugin.py:275 +#: Mailnag/plugins/libnotifyplugin.py:312 msgid "New mail" msgstr "Correo novo" -#: Mailnag/plugins/libnotifyplugin.py:265 -#: Mailnag/plugins/libnotifyplugin.py:267 +#: Mailnag/plugins/libnotifyplugin.py:268 +#: Mailnag/plugins/libnotifyplugin.py:270 #, python-brace-format msgid "(and {0} more)" msgstr "(e {0} máis)" -#: Mailnag/plugins/libnotifyplugin.py:296 +#: Mailnag/plugins/libnotifyplugin.py:299 msgid "Mark as read" msgstr "Marcar como lido" -#: Mailnag/plugins/userscriptplugin.py:60 -msgid "User Script" -msgstr "Script do usuario" +#: Mailnag/configuration/accountdialog.py:77 +msgid "Mail Account" +msgstr "Conta de correo-e" -#: Mailnag/plugins/userscriptplugin.py:61 -msgid "Runs an user defined script on mail arrival." -msgstr "Executa un script do usuario ao recibir algún correo." +#: Mailnag/configuration/accountdialog.py:119 +msgid "optional" +msgstr "opcional" -#: Mailnag/plugins/userscriptplugin.py:80 -msgid "account" +#: Mailnag/configuration/accountdialog.py:123 +#: Mailnag/configuration/configwindow.py:88 +#: Mailnag/configuration/configwindow.py:108 +msgid "Enabled" +msgstr "Activado" + +#: Mailnag/configuration/accountdialog.py:129 +#: Mailnag/configuration/configwindow.py:94 +#: Mailnag/configuration/configwindow.py:114 +msgid "Name" +msgstr "Nome" + +#: Mailnag/configuration/accountdialog.py:252 +msgid "IMAP (Custom)" msgstr "" -#: Mailnag/plugins/userscriptplugin.py:80 -msgid "sender" -msgstr "remitente" +#: Mailnag/configuration/accountdialog.py:253 +msgid "POP3 (Custom)" +msgstr "" -#: Mailnag/plugins/userscriptplugin.py:80 -msgid "subject" -msgstr "asunto" +#: Mailnag/configuration/accountdialog.py:254 +msgid "MBox (Custom)" +msgstr "" -#: Mailnag/plugins/userscriptplugin.py:81 -#, python-format -msgid "" -"The following script will be executed whenever new mails arrive.\n" -"Mailnagger passes the total count of new mails to this script,\n" -"followed by %s sequences." +#: Mailnag/configuration/accountdialog.py:255 +msgid "Maildir (Custom)" +msgstr "" + +#: Mailnag/configuration/accountdialog.py:361 +msgid "Connection failed." +msgstr "" + +#: Mailnag/configuration/configwindow.py:278 +msgid "About Mailnagger" +msgstr "" + +#: Mailnag/configuration/configwindow.py:281 +msgid "An extensible mail notification daemon." +msgstr "" + +#: Mailnag/configuration/configwindow.py:283 +#, python-brace-format +msgid "Copyright (c) {years} {author} and contributors." msgstr "" +#: Mailnag/configuration/configwindow.py:290 +msgid "Homepage" +msgstr "" + +#: Mailnag/configuration/configwindow.py:293 +msgid "maintainer" +msgstr "" + +#. TRANSLATORS: Translate `translator-credits` to the list of names +#. of translators, or team, or something like that. +#: Mailnag/configuration/configwindow.py:313 +msgid "translator-credits" +msgstr "" +"Launchpad Contributions:\n" +" Manuel Xosé Lemos https://launchpad.net/~mxlemos\n" +" Marcos Lans https://launchpad.net/~markooss\n" +" Patrick Ulbrich https://launchpad.net/~pulb" + +#: Mailnag/configuration/configwindow.py:353 +msgid "Delete this account:" +msgstr "Eliminar esta conta:" + +#: Mailnag/configuration/plugindialog.py:35 +msgid "Plugin Configuration" +msgstr "Configuración do complemento" + #: Mailnag/configuration/ui/account_widget.ui.h:1 msgid "" "You may need to create an application-specific password for Gmail.\n" diff --git a/po/hr.po b/po/hr.po index ae20d71..0710cf8 100644 --- a/po/hr.po +++ b/po/hr.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: mailnag\n" "Report-Msgid-Bugs-To: https://github.com/tikank/mailnagger/issues\n" -"POT-Creation-Date: 2024-11-27 20:16+0200\n" +"POT-Creation-Date: 2025-11-10 12:57+0100\n" "PO-Revision-Date: 2021-01-18 00:35+0000\n" "Last-Translator: Milo Ivir \n" "Language-Team: Croatian \n" "Language-Team: Indonesian \n" @@ -18,87 +18,29 @@ msgstr "" "X-Launchpad-Export-Date: 2020-06-11 14:44+0000\n" "X-Generator: Launchpad (build b190cebbf563f89e480a8b57f641753c8196bda0)\n" -#: Mailnag/configuration/accountdialog.py:77 -msgid "Mail Account" -msgstr "Akun Surat" - -#: Mailnag/configuration/accountdialog.py:119 -msgid "optional" -msgstr "opsional" - -#: Mailnag/configuration/accountdialog.py:123 -#: Mailnag/configuration/configwindow.py:88 -#: Mailnag/configuration/configwindow.py:108 -msgid "Enabled" -msgstr "Aktifkan" - -#: Mailnag/configuration/accountdialog.py:129 -#: Mailnag/configuration/configwindow.py:94 -#: Mailnag/configuration/configwindow.py:114 -msgid "Name" -msgstr "Nama" - -#: Mailnag/configuration/accountdialog.py:252 -msgid "IMAP (Custom)" -msgstr "" - -#: Mailnag/configuration/accountdialog.py:253 -msgid "POP3 (Custom)" -msgstr "" - -#: Mailnag/configuration/accountdialog.py:254 -msgid "MBox (Custom)" -msgstr "" - -#: Mailnag/configuration/accountdialog.py:255 -msgid "Maildir (Custom)" -msgstr "" +#: Mailnag/daemon/mails.py:153 +msgid "No subject" +msgstr "Tidak ada subyek" -#: Mailnag/configuration/accountdialog.py:361 -msgid "Connection failed." -msgstr "Koneksi gagal." +#: Mailnag/plugins/garmin2FAplugin.py:135 +#, fuzzy +msgid "Garmin 2FA LibNotify Notifications" +msgstr "Notifikasi LibNotify" -#: Mailnag/configuration/configwindow.py:278 -msgid "About Mailnagger" -msgstr "" +#: Mailnag/plugins/garmin2FAplugin.py:136 +#, fuzzy +msgid "Shows a popup when Garmin 2FA mails arrive." +msgstr "Tampilkan jendela munculan ketika surat baru datang." -#: Mailnag/configuration/configwindow.py:281 -msgid "An extensible mail notification daemon." +#: Mailnag/plugins/garmin2FAplugin.py:203 +msgid "Your Security Passcode" msgstr "" -#: Mailnag/configuration/configwindow.py:283 +#: Mailnag/plugins/garmin2FAplugin.py:220 #, python-brace-format -msgid "Copyright (c) {years} {author} and contributors." +msgid "📋 Code: {0}" msgstr "" -#: Mailnag/configuration/configwindow.py:290 -msgid "Homepage" -msgstr "" - -#: Mailnag/configuration/configwindow.py:293 -msgid "maintainer" -msgstr "" - -#. TRANSLATORS: Translate `translator-credits` to the list of names -#. of translators, or team, or something like that. -#: Mailnag/configuration/configwindow.py:313 -msgid "translator-credits" -msgstr "" -"Launchpad Contributions:\n" -" zmni https://launchpad.net/~zmni-deactivatedaccount" - -#: Mailnag/configuration/configwindow.py:353 -msgid "Delete this account:" -msgstr "Hapus akun ini:" - -#: Mailnag/configuration/plugindialog.py:30 -msgid "Plugin Configuration" -msgstr "Konfigurasi Plugin" - -#: Mailnag/daemon/mails.py:135 -msgid "No subject" -msgstr "Tidak ada subyek" - #: Mailnag/plugins/spamfilterplugin.py:67 msgid "Spam Filter" msgstr "Penyaring Spam" @@ -116,104 +58,181 @@ msgstr "" "Mailnag akan mengabaikan surat yang memuat sedikitnya \n" "satu dari kata-kata berikut di dalam subyek atau pengirim." -#: Mailnag/plugins/soundplugin.py:64 +#: Mailnag/plugins/soundplugin.py:66 msgid "Sound Notifications" msgstr "Notifikasi Suara" -#: Mailnag/plugins/soundplugin.py:65 +#: Mailnag/plugins/soundplugin.py:67 msgid "Plays a sound when new mails arrive." msgstr "Putar suara ketika surat baru datang." -#: Mailnag/plugins/libnotifyplugin.py:114 +#: Mailnag/plugins/userscriptplugin.py:60 +msgid "User Script" +msgstr "Skrip Pengguna" + +#: Mailnag/plugins/userscriptplugin.py:61 +msgid "Runs an user defined script on mail arrival." +msgstr "Jalankan skrip tentuan pengguna saat surat datang." + +#: Mailnag/plugins/userscriptplugin.py:80 +msgid "account" +msgstr "" + +#: Mailnag/plugins/userscriptplugin.py:80 +msgid "sender" +msgstr "pengirim" + +#: Mailnag/plugins/userscriptplugin.py:80 +msgid "subject" +msgstr "subyek" + +#: Mailnag/plugins/userscriptplugin.py:81 +#, python-format +msgid "" +"The following script will be executed whenever new mails arrive.\n" +"Mailnagger passes the total count of new mails to this script,\n" +"followed by %s sequences." +msgstr "" + +#: Mailnag/plugins/libnotifyplugin.py:117 msgid "LibNotify Notifications" msgstr "Notifikasi LibNotify" -#: Mailnag/plugins/libnotifyplugin.py:115 +#: Mailnag/plugins/libnotifyplugin.py:118 msgid "Shows a popup when new mails arrive." msgstr "Tampilkan jendela munculan ketika surat baru datang." -#: Mailnag/plugins/libnotifyplugin.py:130 +#: Mailnag/plugins/libnotifyplugin.py:133 msgid "Count of new mails" msgstr "Jumlah surat baru" -#: Mailnag/plugins/libnotifyplugin.py:131 +#: Mailnag/plugins/libnotifyplugin.py:134 msgid "Short summary of new mails" msgstr "Ringkasan singkat surel baru" -#: Mailnag/plugins/libnotifyplugin.py:132 +#: Mailnag/plugins/libnotifyplugin.py:135 msgid "Detailed summary of new mails" msgstr "Ringkasan detail surel baru" -#: Mailnag/plugins/libnotifyplugin.py:133 +#: Mailnag/plugins/libnotifyplugin.py:136 msgid "One notification per new mail" msgstr "Satu notifikasi per surat baru" -#: Mailnag/plugins/libnotifyplugin.py:141 +#: Mailnag/plugins/libnotifyplugin.py:144 msgid "Notification mode:" msgstr "Mode notifikasi:" -#: Mailnag/plugins/libnotifyplugin.py:234 -#: Mailnag/plugins/libnotifyplugin.py:270 -#: Mailnag/plugins/libnotifyplugin.py:307 +#: Mailnag/plugins/libnotifyplugin.py:237 +#: Mailnag/plugins/libnotifyplugin.py:273 +#: Mailnag/plugins/libnotifyplugin.py:310 #, python-brace-format msgid "{0} new mails" msgstr "{0} surat baru" -#: Mailnag/plugins/libnotifyplugin.py:236 +#: Mailnag/plugins/libnotifyplugin.py:239 #, python-brace-format msgid "from {0} and others." msgstr "dari {0} dan lainnya." -#: Mailnag/plugins/libnotifyplugin.py:238 #: Mailnag/plugins/libnotifyplugin.py:241 +#: Mailnag/plugins/libnotifyplugin.py:244 #, python-brace-format msgid "from {0}." msgstr "dari {0}." -#: Mailnag/plugins/libnotifyplugin.py:240 -#: Mailnag/plugins/libnotifyplugin.py:272 -#: Mailnag/plugins/libnotifyplugin.py:309 +#: Mailnag/plugins/libnotifyplugin.py:243 +#: Mailnag/plugins/libnotifyplugin.py:275 +#: Mailnag/plugins/libnotifyplugin.py:312 msgid "New mail" msgstr "Surat baru" -#: Mailnag/plugins/libnotifyplugin.py:265 -#: Mailnag/plugins/libnotifyplugin.py:267 +#: Mailnag/plugins/libnotifyplugin.py:268 +#: Mailnag/plugins/libnotifyplugin.py:270 #, python-brace-format msgid "(and {0} more)" msgstr "(dan {0} lainnya)" -#: Mailnag/plugins/libnotifyplugin.py:296 +#: Mailnag/plugins/libnotifyplugin.py:299 msgid "Mark as read" msgstr "Tandai sudah dibaca" -#: Mailnag/plugins/userscriptplugin.py:60 -msgid "User Script" -msgstr "Skrip Pengguna" +#: Mailnag/configuration/accountdialog.py:77 +msgid "Mail Account" +msgstr "Akun Surat" -#: Mailnag/plugins/userscriptplugin.py:61 -msgid "Runs an user defined script on mail arrival." -msgstr "Jalankan skrip tentuan pengguna saat surat datang." +#: Mailnag/configuration/accountdialog.py:119 +msgid "optional" +msgstr "opsional" -#: Mailnag/plugins/userscriptplugin.py:80 -msgid "account" +#: Mailnag/configuration/accountdialog.py:123 +#: Mailnag/configuration/configwindow.py:88 +#: Mailnag/configuration/configwindow.py:108 +msgid "Enabled" +msgstr "Aktifkan" + +#: Mailnag/configuration/accountdialog.py:129 +#: Mailnag/configuration/configwindow.py:94 +#: Mailnag/configuration/configwindow.py:114 +msgid "Name" +msgstr "Nama" + +#: Mailnag/configuration/accountdialog.py:252 +msgid "IMAP (Custom)" msgstr "" -#: Mailnag/plugins/userscriptplugin.py:80 -msgid "sender" -msgstr "pengirim" +#: Mailnag/configuration/accountdialog.py:253 +msgid "POP3 (Custom)" +msgstr "" -#: Mailnag/plugins/userscriptplugin.py:80 -msgid "subject" -msgstr "subyek" +#: Mailnag/configuration/accountdialog.py:254 +msgid "MBox (Custom)" +msgstr "" -#: Mailnag/plugins/userscriptplugin.py:81 -#, python-format -msgid "" -"The following script will be executed whenever new mails arrive.\n" -"Mailnagger passes the total count of new mails to this script,\n" -"followed by %s sequences." +#: Mailnag/configuration/accountdialog.py:255 +msgid "Maildir (Custom)" msgstr "" +#: Mailnag/configuration/accountdialog.py:361 +msgid "Connection failed." +msgstr "Koneksi gagal." + +#: Mailnag/configuration/configwindow.py:278 +msgid "About Mailnagger" +msgstr "" + +#: Mailnag/configuration/configwindow.py:281 +msgid "An extensible mail notification daemon." +msgstr "" + +#: Mailnag/configuration/configwindow.py:283 +#, python-brace-format +msgid "Copyright (c) {years} {author} and contributors." +msgstr "" + +#: Mailnag/configuration/configwindow.py:290 +msgid "Homepage" +msgstr "" + +#: Mailnag/configuration/configwindow.py:293 +msgid "maintainer" +msgstr "" + +#. TRANSLATORS: Translate `translator-credits` to the list of names +#. of translators, or team, or something like that. +#: Mailnag/configuration/configwindow.py:313 +msgid "translator-credits" +msgstr "" +"Launchpad Contributions:\n" +" zmni https://launchpad.net/~zmni-deactivatedaccount" + +#: Mailnag/configuration/configwindow.py:353 +msgid "Delete this account:" +msgstr "Hapus akun ini:" + +#: Mailnag/configuration/plugindialog.py:35 +msgid "Plugin Configuration" +msgstr "Konfigurasi Plugin" + #: Mailnag/configuration/ui/account_widget.ui.h:1 msgid "" "You may need to create an application-specific password for Gmail.\n" diff --git a/po/it.po b/po/it.po index 09c3073..0a624d0 100644 --- a/po/it.po +++ b/po/it.po @@ -2,7 +2,7 @@ msgid "" msgstr "" "Project-Id-Version: mailnag\n" "Report-Msgid-Bugs-To: https://github.com/tikank/mailnagger/issues\n" -"POT-Creation-Date: 2024-11-27 20:16+0200\n" +"POT-Creation-Date: 2025-11-10 12:57+0100\n" "PO-Revision-Date: 2020-10-15 17:26+0000\n" "Last-Translator: J. Lavoie \n" "Language-Team: Italian \n" "Language-Team: LANGUAGE \n" "Language: \n" "MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=CHARSET\n" +"Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -#: Mailnag/configuration/accountdialog.py:77 -msgid "Mail Account" -msgstr "" - -#: Mailnag/configuration/accountdialog.py:119 -msgid "optional" -msgstr "" - -#: Mailnag/configuration/accountdialog.py:123 -#: Mailnag/configuration/configwindow.py:88 -#: Mailnag/configuration/configwindow.py:108 -msgid "Enabled" -msgstr "" - -#: Mailnag/configuration/accountdialog.py:129 -#: Mailnag/configuration/configwindow.py:94 -#: Mailnag/configuration/configwindow.py:114 -msgid "Name" -msgstr "" - -#: Mailnag/configuration/accountdialog.py:252 -msgid "IMAP (Custom)" -msgstr "" - -#: Mailnag/configuration/accountdialog.py:253 -msgid "POP3 (Custom)" -msgstr "" - -#: Mailnag/configuration/accountdialog.py:254 -msgid "MBox (Custom)" -msgstr "" - -#: Mailnag/configuration/accountdialog.py:255 -msgid "Maildir (Custom)" +#: Mailnag/daemon/mails.py:153 +msgid "No subject" msgstr "" -#: Mailnag/configuration/accountdialog.py:361 -msgid "Connection failed." +#: Mailnag/plugins/garmin2FAplugin.py:135 +msgid "Garmin 2FA LibNotify Notifications" msgstr "" -#: Mailnag/configuration/configwindow.py:278 -msgid "About Mailnagger" +#: Mailnag/plugins/garmin2FAplugin.py:136 +msgid "Shows a popup when Garmin 2FA mails arrive." msgstr "" -#: Mailnag/configuration/configwindow.py:281 -msgid "An extensible mail notification daemon." +#: Mailnag/plugins/garmin2FAplugin.py:203 +msgid "Your Security Passcode" msgstr "" -#: Mailnag/configuration/configwindow.py:283 +#: Mailnag/plugins/garmin2FAplugin.py:220 #, python-brace-format -msgid "Copyright (c) {years} {author} and contributors." +msgid "📋 Code: {0}" msgstr "" -#: Mailnag/configuration/configwindow.py:290 -msgid "Homepage" +#: Mailnag/plugins/spamfilterplugin.py:67 +msgid "Spam Filter" msgstr "" -#: Mailnag/configuration/configwindow.py:293 -msgid "maintainer" +#: Mailnag/plugins/spamfilterplugin.py:68 +msgid "Filters out unwanted mails." msgstr "" -#. TRANSLATORS: Translate `translator-credits` to the list of names -#. of translators, or team, or something like that. -#: Mailnag/configuration/configwindow.py:313 -msgid "translator-credits" +#: Mailnag/plugins/spamfilterplugin.py:87 +msgid "" +"Mailnagger will ignore mails containing at least one of \n" +"the following words in subject or sender." msgstr "" -#: Mailnag/configuration/configwindow.py:353 -msgid "Delete this account:" +#: Mailnag/plugins/soundplugin.py:66 +msgid "Sound Notifications" msgstr "" -#: Mailnag/configuration/plugindialog.py:30 -msgid "Plugin Configuration" +#: Mailnag/plugins/soundplugin.py:67 +msgid "Plays a sound when new mails arrive." msgstr "" -#: Mailnag/daemon/mails.py:135 -msgid "No subject" +#: Mailnag/plugins/userscriptplugin.py:60 +msgid "User Script" msgstr "" -#: Mailnag/plugins/spamfilterplugin.py:67 -msgid "Spam Filter" +#: Mailnag/plugins/userscriptplugin.py:61 +msgid "Runs an user defined script on mail arrival." msgstr "" -#: Mailnag/plugins/spamfilterplugin.py:68 -msgid "Filters out unwanted mails." +#: Mailnag/plugins/userscriptplugin.py:80 +msgid "account" msgstr "" -#: Mailnag/plugins/spamfilterplugin.py:87 -msgid "" -"Mailnagger will ignore mails containing at least one of \n" -"the following words in subject or sender." +#: Mailnag/plugins/userscriptplugin.py:80 +msgid "sender" msgstr "" -#: Mailnag/plugins/soundplugin.py:64 -msgid "Sound Notifications" +#: Mailnag/plugins/userscriptplugin.py:80 +msgid "subject" msgstr "" -#: Mailnag/plugins/soundplugin.py:65 -msgid "Plays a sound when new mails arrive." +#: Mailnag/plugins/userscriptplugin.py:81 +#, python-format +msgid "" +"The following script will be executed whenever new mails arrive.\n" +"Mailnagger passes the total count of new mails to this script,\n" +"followed by %s sequences." msgstr "" -#: Mailnag/plugins/libnotifyplugin.py:114 +#: Mailnag/plugins/libnotifyplugin.py:117 msgid "LibNotify Notifications" msgstr "" -#: Mailnag/plugins/libnotifyplugin.py:115 +#: Mailnag/plugins/libnotifyplugin.py:118 msgid "Shows a popup when new mails arrive." msgstr "" -#: Mailnag/plugins/libnotifyplugin.py:130 +#: Mailnag/plugins/libnotifyplugin.py:133 msgid "Count of new mails" msgstr "" -#: Mailnag/plugins/libnotifyplugin.py:131 +#: Mailnag/plugins/libnotifyplugin.py:134 msgid "Short summary of new mails" msgstr "" -#: Mailnag/plugins/libnotifyplugin.py:132 +#: Mailnag/plugins/libnotifyplugin.py:135 msgid "Detailed summary of new mails" msgstr "" -#: Mailnag/plugins/libnotifyplugin.py:133 +#: Mailnag/plugins/libnotifyplugin.py:136 msgid "One notification per new mail" msgstr "" -#: Mailnag/plugins/libnotifyplugin.py:141 +#: Mailnag/plugins/libnotifyplugin.py:144 msgid "Notification mode:" msgstr "" -#: Mailnag/plugins/libnotifyplugin.py:234 -#: Mailnag/plugins/libnotifyplugin.py:270 -#: Mailnag/plugins/libnotifyplugin.py:307 +#: Mailnag/plugins/libnotifyplugin.py:237 +#: Mailnag/plugins/libnotifyplugin.py:273 +#: Mailnag/plugins/libnotifyplugin.py:310 #, python-brace-format msgid "{0} new mails" msgstr "" -#: Mailnag/plugins/libnotifyplugin.py:236 +#: Mailnag/plugins/libnotifyplugin.py:239 #, python-brace-format msgid "from {0} and others." msgstr "" -#: Mailnag/plugins/libnotifyplugin.py:238 #: Mailnag/plugins/libnotifyplugin.py:241 +#: Mailnag/plugins/libnotifyplugin.py:244 #, python-brace-format msgid "from {0}." msgstr "" -#: Mailnag/plugins/libnotifyplugin.py:240 -#: Mailnag/plugins/libnotifyplugin.py:272 -#: Mailnag/plugins/libnotifyplugin.py:309 +#: Mailnag/plugins/libnotifyplugin.py:243 +#: Mailnag/plugins/libnotifyplugin.py:275 +#: Mailnag/plugins/libnotifyplugin.py:312 msgid "New mail" msgstr "" -#: Mailnag/plugins/libnotifyplugin.py:265 -#: Mailnag/plugins/libnotifyplugin.py:267 +#: Mailnag/plugins/libnotifyplugin.py:268 +#: Mailnag/plugins/libnotifyplugin.py:270 #, python-brace-format msgid "(and {0} more)" msgstr "" -#: Mailnag/plugins/libnotifyplugin.py:296 +#: Mailnag/plugins/libnotifyplugin.py:299 msgid "Mark as read" msgstr "" -#: Mailnag/plugins/userscriptplugin.py:60 -msgid "User Script" +#: Mailnag/configuration/accountdialog.py:77 +msgid "Mail Account" msgstr "" -#: Mailnag/plugins/userscriptplugin.py:61 -msgid "Runs an user defined script on mail arrival." +#: Mailnag/configuration/accountdialog.py:119 +msgid "optional" msgstr "" -#: Mailnag/plugins/userscriptplugin.py:80 -msgid "account" +#: Mailnag/configuration/accountdialog.py:123 +#: Mailnag/configuration/configwindow.py:88 +#: Mailnag/configuration/configwindow.py:108 +msgid "Enabled" msgstr "" -#: Mailnag/plugins/userscriptplugin.py:80 -msgid "sender" +#: Mailnag/configuration/accountdialog.py:129 +#: Mailnag/configuration/configwindow.py:94 +#: Mailnag/configuration/configwindow.py:114 +msgid "Name" msgstr "" -#: Mailnag/plugins/userscriptplugin.py:80 -msgid "subject" +#: Mailnag/configuration/accountdialog.py:252 +msgid "IMAP (Custom)" msgstr "" -#: Mailnag/plugins/userscriptplugin.py:81 -#, python-format -msgid "" -"The following script will be executed whenever new mails arrive.\n" -"Mailnagger passes the total count of new mails to this script,\n" -"followed by %s sequences." +#: Mailnag/configuration/accountdialog.py:253 +msgid "POP3 (Custom)" +msgstr "" + +#: Mailnag/configuration/accountdialog.py:254 +msgid "MBox (Custom)" +msgstr "" + +#: Mailnag/configuration/accountdialog.py:255 +msgid "Maildir (Custom)" +msgstr "" + +#: Mailnag/configuration/accountdialog.py:361 +msgid "Connection failed." +msgstr "" + +#: Mailnag/configuration/configwindow.py:278 +msgid "About Mailnagger" +msgstr "" + +#: Mailnag/configuration/configwindow.py:281 +msgid "An extensible mail notification daemon." +msgstr "" + +#: Mailnag/configuration/configwindow.py:283 +#, python-brace-format +msgid "Copyright (c) {years} {author} and contributors." +msgstr "" + +#: Mailnag/configuration/configwindow.py:290 +msgid "Homepage" +msgstr "" + +#: Mailnag/configuration/configwindow.py:293 +msgid "maintainer" +msgstr "" + +#. TRANSLATORS: Translate `translator-credits` to the list of names +#. of translators, or team, or something like that. +#: Mailnag/configuration/configwindow.py:313 +msgid "translator-credits" +msgstr "" + +#: Mailnag/configuration/configwindow.py:353 +msgid "Delete this account:" +msgstr "" + +#: Mailnag/configuration/plugindialog.py:35 +msgid "Plugin Configuration" msgstr "" #: Mailnag/configuration/ui/account_widget.ui.h:1 diff --git a/po/pl.po b/po/pl.po index 8f329f8..8baab0d 100644 --- a/po/pl.po +++ b/po/pl.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: mailnag\n" "Report-Msgid-Bugs-To: https://github.com/tikank/mailnagger/issues\n" -"POT-Creation-Date: 2024-11-27 20:16+0200\n" +"POT-Creation-Date: 2025-11-10 12:57+0100\n" "PO-Revision-Date: 2019-03-16 14:48+0000\n" "Last-Translator: Launchpad Translations Administrators \n" "Language-Team: Polish \n" @@ -18,6 +18,141 @@ msgstr "" "X-Launchpad-Export-Date: 2020-06-11 14:44+0000\n" "X-Generator: Launchpad (build b190cebbf563f89e480a8b57f641753c8196bda0)\n" +#: Mailnag/daemon/mails.py:153 +msgid "No subject" +msgstr "Brak tematu" + +#: Mailnag/plugins/garmin2FAplugin.py:135 +#, fuzzy +msgid "Garmin 2FA LibNotify Notifications" +msgstr "Powiadomienia LibNotify" + +#: Mailnag/plugins/garmin2FAplugin.py:136 +#, fuzzy +msgid "Shows a popup when Garmin 2FA mails arrive." +msgstr "Pokaż okno kiedy przychodzi nowa poczta." + +#: Mailnag/plugins/garmin2FAplugin.py:203 +msgid "Your Security Passcode" +msgstr "" + +#: Mailnag/plugins/garmin2FAplugin.py:220 +#, python-brace-format +msgid "📋 Code: {0}" +msgstr "" + +#: Mailnag/plugins/spamfilterplugin.py:67 +msgid "Spam Filter" +msgstr "Filtr spamowy" + +#: Mailnag/plugins/spamfilterplugin.py:68 +msgid "Filters out unwanted mails." +msgstr "Filtruje niechciane wiadomości." + +#: Mailnag/plugins/spamfilterplugin.py:87 +msgid "" +"Mailnagger will ignore mails containing at least one of \n" +"the following words in subject or sender." +msgstr "" + +#: Mailnag/plugins/soundplugin.py:66 +msgid "Sound Notifications" +msgstr "Dżwięk powiadomienia" + +#: Mailnag/plugins/soundplugin.py:67 +msgid "Plays a sound when new mails arrive." +msgstr "Odtwarzaj dźwięk kiedy przychodzi nowa poczta." + +#: Mailnag/plugins/userscriptplugin.py:60 +msgid "User Script" +msgstr "Skrypt użytkownika" + +#: Mailnag/plugins/userscriptplugin.py:61 +msgid "Runs an user defined script on mail arrival." +msgstr "Uruchom skrypt użytkownika gdy nadejdzie nowa poczta." + +#: Mailnag/plugins/userscriptplugin.py:80 +msgid "account" +msgstr "konto" + +#: Mailnag/plugins/userscriptplugin.py:80 +msgid "sender" +msgstr "nadawca" + +#: Mailnag/plugins/userscriptplugin.py:80 +msgid "subject" +msgstr "temat" + +#: Mailnag/plugins/userscriptplugin.py:81 +#, python-format +msgid "" +"The following script will be executed whenever new mails arrive.\n" +"Mailnagger passes the total count of new mails to this script,\n" +"followed by %s sequences." +msgstr "" + +#: Mailnag/plugins/libnotifyplugin.py:117 +msgid "LibNotify Notifications" +msgstr "Powiadomienia LibNotify" + +#: Mailnag/plugins/libnotifyplugin.py:118 +msgid "Shows a popup when new mails arrive." +msgstr "Pokaż okno kiedy przychodzi nowa poczta." + +#: Mailnag/plugins/libnotifyplugin.py:133 +msgid "Count of new mails" +msgstr "Liczba nowych wiadomości" + +#: Mailnag/plugins/libnotifyplugin.py:134 +msgid "Short summary of new mails" +msgstr "Krótkie podsumowanie nowych wiadomości e-mail" + +#: Mailnag/plugins/libnotifyplugin.py:135 +msgid "Detailed summary of new mails" +msgstr "Szczegółowe podsumowanie nowych wiadomości e-mail" + +#: Mailnag/plugins/libnotifyplugin.py:136 +msgid "One notification per new mail" +msgstr "Jedno powiadomienie dla jednej wiadomości" + +#: Mailnag/plugins/libnotifyplugin.py:144 +msgid "Notification mode:" +msgstr "Tryb powiadamiania:" + +#: Mailnag/plugins/libnotifyplugin.py:237 +#: Mailnag/plugins/libnotifyplugin.py:273 +#: Mailnag/plugins/libnotifyplugin.py:310 +#, python-brace-format +msgid "{0} new mails" +msgstr "{0} nowych wiadomości" + +#: Mailnag/plugins/libnotifyplugin.py:239 +#, python-brace-format +msgid "from {0} and others." +msgstr "od {0} i innych." + +#: Mailnag/plugins/libnotifyplugin.py:241 +#: Mailnag/plugins/libnotifyplugin.py:244 +#, python-brace-format +msgid "from {0}." +msgstr "od {0}" + +#: Mailnag/plugins/libnotifyplugin.py:243 +#: Mailnag/plugins/libnotifyplugin.py:275 +#: Mailnag/plugins/libnotifyplugin.py:312 +msgid "New mail" +msgstr "Nowa poczta" + +#: Mailnag/plugins/libnotifyplugin.py:268 +#: Mailnag/plugins/libnotifyplugin.py:270 +#, python-brace-format +msgid "(and {0} more)" +msgstr "(i {0} więcej)" + +#: Mailnag/plugins/libnotifyplugin.py:299 +msgid "Mark as read" +msgstr "Oznacz jako przeczytana" + #: Mailnag/configuration/accountdialog.py:77 msgid "Mail Account" msgstr "Konto pocztowe" @@ -96,126 +231,10 @@ msgstr "" msgid "Delete this account:" msgstr "Usuń to konto:" -#: Mailnag/configuration/plugindialog.py:30 +#: Mailnag/configuration/plugindialog.py:35 msgid "Plugin Configuration" msgstr "Konfiguracja wtyczki" -#: Mailnag/daemon/mails.py:135 -msgid "No subject" -msgstr "Brak tematu" - -#: Mailnag/plugins/spamfilterplugin.py:67 -msgid "Spam Filter" -msgstr "Filtr spamowy" - -#: Mailnag/plugins/spamfilterplugin.py:68 -msgid "Filters out unwanted mails." -msgstr "Filtruje niechciane wiadomości." - -#: Mailnag/plugins/spamfilterplugin.py:87 -msgid "" -"Mailnagger will ignore mails containing at least one of \n" -"the following words in subject or sender." -msgstr "" - -#: Mailnag/plugins/soundplugin.py:64 -msgid "Sound Notifications" -msgstr "Dżwięk powiadomienia" - -#: Mailnag/plugins/soundplugin.py:65 -msgid "Plays a sound when new mails arrive." -msgstr "Odtwarzaj dźwięk kiedy przychodzi nowa poczta." - -#: Mailnag/plugins/libnotifyplugin.py:114 -msgid "LibNotify Notifications" -msgstr "Powiadomienia LibNotify" - -#: Mailnag/plugins/libnotifyplugin.py:115 -msgid "Shows a popup when new mails arrive." -msgstr "Pokaż okno kiedy przychodzi nowa poczta." - -#: Mailnag/plugins/libnotifyplugin.py:130 -msgid "Count of new mails" -msgstr "Liczba nowych wiadomości" - -#: Mailnag/plugins/libnotifyplugin.py:131 -msgid "Short summary of new mails" -msgstr "Krótkie podsumowanie nowych wiadomości e-mail" - -#: Mailnag/plugins/libnotifyplugin.py:132 -msgid "Detailed summary of new mails" -msgstr "Szczegółowe podsumowanie nowych wiadomości e-mail" - -#: Mailnag/plugins/libnotifyplugin.py:133 -msgid "One notification per new mail" -msgstr "Jedno powiadomienie dla jednej wiadomości" - -#: Mailnag/plugins/libnotifyplugin.py:141 -msgid "Notification mode:" -msgstr "Tryb powiadamiania:" - -#: Mailnag/plugins/libnotifyplugin.py:234 -#: Mailnag/plugins/libnotifyplugin.py:270 -#: Mailnag/plugins/libnotifyplugin.py:307 -#, python-brace-format -msgid "{0} new mails" -msgstr "{0} nowych wiadomości" - -#: Mailnag/plugins/libnotifyplugin.py:236 -#, python-brace-format -msgid "from {0} and others." -msgstr "od {0} i innych." - -#: Mailnag/plugins/libnotifyplugin.py:238 -#: Mailnag/plugins/libnotifyplugin.py:241 -#, python-brace-format -msgid "from {0}." -msgstr "od {0}" - -#: Mailnag/plugins/libnotifyplugin.py:240 -#: Mailnag/plugins/libnotifyplugin.py:272 -#: Mailnag/plugins/libnotifyplugin.py:309 -msgid "New mail" -msgstr "Nowa poczta" - -#: Mailnag/plugins/libnotifyplugin.py:265 -#: Mailnag/plugins/libnotifyplugin.py:267 -#, python-brace-format -msgid "(and {0} more)" -msgstr "(i {0} więcej)" - -#: Mailnag/plugins/libnotifyplugin.py:296 -msgid "Mark as read" -msgstr "Oznacz jako przeczytana" - -#: Mailnag/plugins/userscriptplugin.py:60 -msgid "User Script" -msgstr "Skrypt użytkownika" - -#: Mailnag/plugins/userscriptplugin.py:61 -msgid "Runs an user defined script on mail arrival." -msgstr "Uruchom skrypt użytkownika gdy nadejdzie nowa poczta." - -#: Mailnag/plugins/userscriptplugin.py:80 -msgid "account" -msgstr "konto" - -#: Mailnag/plugins/userscriptplugin.py:80 -msgid "sender" -msgstr "nadawca" - -#: Mailnag/plugins/userscriptplugin.py:80 -msgid "subject" -msgstr "temat" - -#: Mailnag/plugins/userscriptplugin.py:81 -#, python-format -msgid "" -"The following script will be executed whenever new mails arrive.\n" -"Mailnagger passes the total count of new mails to this script,\n" -"followed by %s sequences." -msgstr "" - #: Mailnag/configuration/ui/account_widget.ui.h:1 msgid "" "You may need to create an application-specific password for Gmail.\n" diff --git a/po/pt.po b/po/pt.po index 98fd45a..74cee2f 100644 --- a/po/pt.po +++ b/po/pt.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: mailnag\n" "Report-Msgid-Bugs-To: https://github.com/tikank/mailnagger/issues\n" -"POT-Creation-Date: 2024-11-27 20:16+0200\n" +"POT-Creation-Date: 2025-11-10 12:57+0100\n" "PO-Revision-Date: 2019-03-16 14:48+0000\n" "Last-Translator: Launchpad Translations Administrators \n" "Language-Team: Portuguese \n" @@ -18,89 +18,28 @@ msgstr "" "X-Launchpad-Export-Date: 2020-06-11 14:44+0000\n" "X-Generator: Launchpad (build b190cebbf563f89e480a8b57f641753c8196bda0)\n" -#: Mailnag/configuration/accountdialog.py:77 -msgid "Mail Account" -msgstr "Conta de mail" - -#: Mailnag/configuration/accountdialog.py:119 -msgid "optional" -msgstr "opcional" - -#: Mailnag/configuration/accountdialog.py:123 -#: Mailnag/configuration/configwindow.py:88 -#: Mailnag/configuration/configwindow.py:108 -msgid "Enabled" -msgstr "Ativado" - -#: Mailnag/configuration/accountdialog.py:129 -#: Mailnag/configuration/configwindow.py:94 -#: Mailnag/configuration/configwindow.py:114 -msgid "Name" -msgstr "Nome" - -#: Mailnag/configuration/accountdialog.py:252 -msgid "IMAP (Custom)" -msgstr "" - -#: Mailnag/configuration/accountdialog.py:253 -msgid "POP3 (Custom)" -msgstr "" - -#: Mailnag/configuration/accountdialog.py:254 -msgid "MBox (Custom)" -msgstr "" - -#: Mailnag/configuration/accountdialog.py:255 -msgid "Maildir (Custom)" -msgstr "" +#: Mailnag/daemon/mails.py:153 +msgid "No subject" +msgstr "Sem assunto" -#: Mailnag/configuration/accountdialog.py:361 -msgid "Connection failed." -msgstr "A ligação falhou." +#: Mailnag/plugins/garmin2FAplugin.py:135 +#, fuzzy +msgid "Garmin 2FA LibNotify Notifications" +msgstr "Notificações da LibNotify" -#: Mailnag/configuration/configwindow.py:278 -msgid "About Mailnagger" -msgstr "" +#: Mailnag/plugins/garmin2FAplugin.py:136 +#, fuzzy +msgid "Shows a popup when Garmin 2FA mails arrive." +msgstr "Mostra um popup quando chegam novos mails." -#: Mailnag/configuration/configwindow.py:281 -msgid "An extensible mail notification daemon." +#: Mailnag/plugins/garmin2FAplugin.py:203 +msgid "Your Security Passcode" msgstr "" -#: Mailnag/configuration/configwindow.py:283 +#: Mailnag/plugins/garmin2FAplugin.py:220 #, python-brace-format -msgid "Copyright (c) {years} {author} and contributors." -msgstr "" - -#: Mailnag/configuration/configwindow.py:290 -msgid "Homepage" -msgstr "" - -#: Mailnag/configuration/configwindow.py:293 -msgid "maintainer" -msgstr "" - -#. TRANSLATORS: Translate `translator-credits` to the list of names -#. of translators, or team, or something like that. -#: Mailnag/configuration/configwindow.py:313 -msgid "translator-credits" +msgid "📋 Code: {0}" msgstr "" -"Launchpad Contributions:\n" -" Lidinei https://launchpad.net/~lidinei-gmail\n" -" Patrick Ulbrich https://launchpad.net/~pulb\n" -" Pedro Beja https://launchpad.net/~althaser\n" -" Rafael Neri https://launchpad.net/~rafepel" - -#: Mailnag/configuration/configwindow.py:353 -msgid "Delete this account:" -msgstr "Apagar esta conta:" - -#: Mailnag/configuration/plugindialog.py:30 -msgid "Plugin Configuration" -msgstr "Configuração de Plugin" - -#: Mailnag/daemon/mails.py:135 -msgid "No subject" -msgstr "Sem assunto" #: Mailnag/plugins/spamfilterplugin.py:67 msgid "Spam Filter" @@ -119,106 +58,186 @@ msgstr "" "O Mailnag irá ignorar mails que contenham pelo menos uma \n" "das palavras seguintes no assunto ou remetente." -#: Mailnag/plugins/soundplugin.py:64 +#: Mailnag/plugins/soundplugin.py:66 msgid "Sound Notifications" msgstr "Notificações de Som" -#: Mailnag/plugins/soundplugin.py:65 +#: Mailnag/plugins/soundplugin.py:67 msgid "Plays a sound when new mails arrive." msgstr "Toca um som quando chegam novos mails." -#: Mailnag/plugins/libnotifyplugin.py:114 +#: Mailnag/plugins/userscriptplugin.py:60 +msgid "User Script" +msgstr "Script de Utilizador" + +#: Mailnag/plugins/userscriptplugin.py:61 +msgid "Runs an user defined script on mail arrival." +msgstr "Executa um script definido pelo utilizador na receção de mails." + +#: Mailnag/plugins/userscriptplugin.py:80 +msgid "account" +msgstr "conta" + +#: Mailnag/plugins/userscriptplugin.py:80 +msgid "sender" +msgstr "remetente" + +#: Mailnag/plugins/userscriptplugin.py:80 +msgid "subject" +msgstr "assunto" + +#: Mailnag/plugins/userscriptplugin.py:81 +#, fuzzy, python-format +msgid "" +"The following script will be executed whenever new mails arrive.\n" +"Mailnagger passes the total count of new mails to this script,\n" +"followed by %s sequences." +msgstr "" +"O script seguinte vai ser executado sempre que cheguem novos mails.\n" +"O Mailnag passa a quantidade total de mails novos para este script,\n" +"seguido por sequências de %s." + +#: Mailnag/plugins/libnotifyplugin.py:117 msgid "LibNotify Notifications" msgstr "Notificações da LibNotify" -#: Mailnag/plugins/libnotifyplugin.py:115 +#: Mailnag/plugins/libnotifyplugin.py:118 msgid "Shows a popup when new mails arrive." msgstr "Mostra um popup quando chegam novos mails." -#: Mailnag/plugins/libnotifyplugin.py:130 +#: Mailnag/plugins/libnotifyplugin.py:133 msgid "Count of new mails" msgstr "Quantidade de mails novos" -#: Mailnag/plugins/libnotifyplugin.py:131 +#: Mailnag/plugins/libnotifyplugin.py:134 msgid "Short summary of new mails" msgstr "Resumo curto de mails novos" -#: Mailnag/plugins/libnotifyplugin.py:132 +#: Mailnag/plugins/libnotifyplugin.py:135 msgid "Detailed summary of new mails" msgstr "Resumo detalhado de mails novos" -#: Mailnag/plugins/libnotifyplugin.py:133 +#: Mailnag/plugins/libnotifyplugin.py:136 msgid "One notification per new mail" msgstr "Uma notificação por novo mail" -#: Mailnag/plugins/libnotifyplugin.py:141 +#: Mailnag/plugins/libnotifyplugin.py:144 msgid "Notification mode:" msgstr "Modo de notificação:" -#: Mailnag/plugins/libnotifyplugin.py:234 -#: Mailnag/plugins/libnotifyplugin.py:270 -#: Mailnag/plugins/libnotifyplugin.py:307 +#: Mailnag/plugins/libnotifyplugin.py:237 +#: Mailnag/plugins/libnotifyplugin.py:273 +#: Mailnag/plugins/libnotifyplugin.py:310 #, python-brace-format msgid "{0} new mails" msgstr "{0} novos mails" -#: Mailnag/plugins/libnotifyplugin.py:236 +#: Mailnag/plugins/libnotifyplugin.py:239 #, python-brace-format msgid "from {0} and others." msgstr "de {0} e outros." -#: Mailnag/plugins/libnotifyplugin.py:238 #: Mailnag/plugins/libnotifyplugin.py:241 +#: Mailnag/plugins/libnotifyplugin.py:244 #, python-brace-format msgid "from {0}." msgstr "de {0}." -#: Mailnag/plugins/libnotifyplugin.py:240 -#: Mailnag/plugins/libnotifyplugin.py:272 -#: Mailnag/plugins/libnotifyplugin.py:309 +#: Mailnag/plugins/libnotifyplugin.py:243 +#: Mailnag/plugins/libnotifyplugin.py:275 +#: Mailnag/plugins/libnotifyplugin.py:312 msgid "New mail" msgstr "Novo mail" -#: Mailnag/plugins/libnotifyplugin.py:265 -#: Mailnag/plugins/libnotifyplugin.py:267 +#: Mailnag/plugins/libnotifyplugin.py:268 +#: Mailnag/plugins/libnotifyplugin.py:270 #, python-brace-format msgid "(and {0} more)" msgstr "(e mais {0})" -#: Mailnag/plugins/libnotifyplugin.py:296 +#: Mailnag/plugins/libnotifyplugin.py:299 msgid "Mark as read" msgstr "Marcar como lido" -#: Mailnag/plugins/userscriptplugin.py:60 -msgid "User Script" -msgstr "Script de Utilizador" +#: Mailnag/configuration/accountdialog.py:77 +msgid "Mail Account" +msgstr "Conta de mail" -#: Mailnag/plugins/userscriptplugin.py:61 -msgid "Runs an user defined script on mail arrival." -msgstr "Executa um script definido pelo utilizador na receção de mails." +#: Mailnag/configuration/accountdialog.py:119 +msgid "optional" +msgstr "opcional" -#: Mailnag/plugins/userscriptplugin.py:80 -msgid "account" -msgstr "conta" +#: Mailnag/configuration/accountdialog.py:123 +#: Mailnag/configuration/configwindow.py:88 +#: Mailnag/configuration/configwindow.py:108 +msgid "Enabled" +msgstr "Ativado" -#: Mailnag/plugins/userscriptplugin.py:80 -msgid "sender" -msgstr "remetente" +#: Mailnag/configuration/accountdialog.py:129 +#: Mailnag/configuration/configwindow.py:94 +#: Mailnag/configuration/configwindow.py:114 +msgid "Name" +msgstr "Nome" -#: Mailnag/plugins/userscriptplugin.py:80 -msgid "subject" -msgstr "assunto" +#: Mailnag/configuration/accountdialog.py:252 +msgid "IMAP (Custom)" +msgstr "" -#: Mailnag/plugins/userscriptplugin.py:81 -#, fuzzy, python-format -msgid "" -"The following script will be executed whenever new mails arrive.\n" -"Mailnagger passes the total count of new mails to this script,\n" -"followed by %s sequences." +#: Mailnag/configuration/accountdialog.py:253 +msgid "POP3 (Custom)" msgstr "" -"O script seguinte vai ser executado sempre que cheguem novos mails.\n" -"O Mailnag passa a quantidade total de mails novos para este script,\n" -"seguido por sequências de %s." + +#: Mailnag/configuration/accountdialog.py:254 +msgid "MBox (Custom)" +msgstr "" + +#: Mailnag/configuration/accountdialog.py:255 +msgid "Maildir (Custom)" +msgstr "" + +#: Mailnag/configuration/accountdialog.py:361 +msgid "Connection failed." +msgstr "A ligação falhou." + +#: Mailnag/configuration/configwindow.py:278 +msgid "About Mailnagger" +msgstr "" + +#: Mailnag/configuration/configwindow.py:281 +msgid "An extensible mail notification daemon." +msgstr "" + +#: Mailnag/configuration/configwindow.py:283 +#, python-brace-format +msgid "Copyright (c) {years} {author} and contributors." +msgstr "" + +#: Mailnag/configuration/configwindow.py:290 +msgid "Homepage" +msgstr "" + +#: Mailnag/configuration/configwindow.py:293 +msgid "maintainer" +msgstr "" + +#. TRANSLATORS: Translate `translator-credits` to the list of names +#. of translators, or team, or something like that. +#: Mailnag/configuration/configwindow.py:313 +msgid "translator-credits" +msgstr "" +"Launchpad Contributions:\n" +" Lidinei https://launchpad.net/~lidinei-gmail\n" +" Patrick Ulbrich https://launchpad.net/~pulb\n" +" Pedro Beja https://launchpad.net/~althaser\n" +" Rafael Neri https://launchpad.net/~rafepel" + +#: Mailnag/configuration/configwindow.py:353 +msgid "Delete this account:" +msgstr "Apagar esta conta:" + +#: Mailnag/configuration/plugindialog.py:35 +msgid "Plugin Configuration" +msgstr "Configuração de Plugin" #: Mailnag/configuration/ui/account_widget.ui.h:1 msgid "" diff --git a/po/pt_BR.po b/po/pt_BR.po index 60d5a38..1f0ca2c 100644 --- a/po/pt_BR.po +++ b/po/pt_BR.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: mailnag\n" "Report-Msgid-Bugs-To: https://github.com/tikank/mailnagger/issues\n" -"POT-Creation-Date: 2024-11-27 20:16+0200\n" +"POT-Creation-Date: 2025-11-10 12:57+0100\n" "PO-Revision-Date: 2019-12-25 19:25+0000\n" "Last-Translator: Relaxeaza \n" "Language-Team: Brazilian Portuguese \n" @@ -18,89 +18,28 @@ msgstr "" "X-Launchpad-Export-Date: 2020-06-11 14:44+0000\n" "X-Generator: Launchpad (build b190cebbf563f89e480a8b57f641753c8196bda0)\n" -#: Mailnag/configuration/accountdialog.py:77 -msgid "Mail Account" -msgstr "Conta de mail" - -#: Mailnag/configuration/accountdialog.py:119 -msgid "optional" -msgstr "opcional" - -#: Mailnag/configuration/accountdialog.py:123 -#: Mailnag/configuration/configwindow.py:88 -#: Mailnag/configuration/configwindow.py:108 -msgid "Enabled" -msgstr "Ativado" - -#: Mailnag/configuration/accountdialog.py:129 -#: Mailnag/configuration/configwindow.py:94 -#: Mailnag/configuration/configwindow.py:114 -msgid "Name" -msgstr "Nome" - -#: Mailnag/configuration/accountdialog.py:252 -msgid "IMAP (Custom)" -msgstr "" - -#: Mailnag/configuration/accountdialog.py:253 -msgid "POP3 (Custom)" -msgstr "" - -#: Mailnag/configuration/accountdialog.py:254 -msgid "MBox (Custom)" -msgstr "" - -#: Mailnag/configuration/accountdialog.py:255 -msgid "Maildir (Custom)" -msgstr "" +#: Mailnag/daemon/mails.py:153 +msgid "No subject" +msgstr "Sem assunto" -#: Mailnag/configuration/accountdialog.py:361 -msgid "Connection failed." -msgstr "A ligação falhou." +#: Mailnag/plugins/garmin2FAplugin.py:135 +#, fuzzy +msgid "Garmin 2FA LibNotify Notifications" +msgstr "Notificações da LibNotify" -#: Mailnag/configuration/configwindow.py:278 -msgid "About Mailnagger" -msgstr "" +#: Mailnag/plugins/garmin2FAplugin.py:136 +#, fuzzy +msgid "Shows a popup when Garmin 2FA mails arrive." +msgstr "Mostra um popup quando chegam novas mensagens." -#: Mailnag/configuration/configwindow.py:281 -msgid "An extensible mail notification daemon." +#: Mailnag/plugins/garmin2FAplugin.py:203 +msgid "Your Security Passcode" msgstr "" -#: Mailnag/configuration/configwindow.py:283 +#: Mailnag/plugins/garmin2FAplugin.py:220 #, python-brace-format -msgid "Copyright (c) {years} {author} and contributors." -msgstr "" - -#: Mailnag/configuration/configwindow.py:290 -msgid "Homepage" -msgstr "" - -#: Mailnag/configuration/configwindow.py:293 -msgid "maintainer" -msgstr "" - -#. TRANSLATORS: Translate `translator-credits` to the list of names -#. of translators, or team, or something like that. -#: Mailnag/configuration/configwindow.py:313 -msgid "translator-credits" +msgid "📋 Code: {0}" msgstr "" -"Launchpad Contributions:\n" -" Patrick Ulbrich https://launchpad.net/~pulb\n" -" Pedro Beja https://launchpad.net/~althaser\n" -" Rafael Neri https://launchpad.net/~rafepel\n" -" Relaxeaza https://launchpad.net/~relaxeaza" - -#: Mailnag/configuration/configwindow.py:353 -msgid "Delete this account:" -msgstr "Apagar esta conta:" - -#: Mailnag/configuration/plugindialog.py:30 -msgid "Plugin Configuration" -msgstr "Configuração de Plugin" - -#: Mailnag/daemon/mails.py:135 -msgid "No subject" -msgstr "Sem assunto" #: Mailnag/plugins/spamfilterplugin.py:67 msgid "Spam Filter" @@ -119,106 +58,186 @@ msgstr "" "Mailnag ignorará mensagens que contenham pelo menos uma \n" "das palavras seguintes no assunto ou remetente." -#: Mailnag/plugins/soundplugin.py:64 +#: Mailnag/plugins/soundplugin.py:66 msgid "Sound Notifications" msgstr "Notificações de Som" -#: Mailnag/plugins/soundplugin.py:65 +#: Mailnag/plugins/soundplugin.py:67 msgid "Plays a sound when new mails arrive." msgstr "Toca um som quando novas mensagens chegarem." -#: Mailnag/plugins/libnotifyplugin.py:114 +#: Mailnag/plugins/userscriptplugin.py:60 +msgid "User Script" +msgstr "Script de Usuário" + +#: Mailnag/plugins/userscriptplugin.py:61 +msgid "Runs an user defined script on mail arrival." +msgstr "Executa um script definido pelo usuário na chegada de mensagens." + +#: Mailnag/plugins/userscriptplugin.py:80 +msgid "account" +msgstr "conta" + +#: Mailnag/plugins/userscriptplugin.py:80 +msgid "sender" +msgstr "remetente" + +#: Mailnag/plugins/userscriptplugin.py:80 +msgid "subject" +msgstr "assunto" + +#: Mailnag/plugins/userscriptplugin.py:81 +#, fuzzy, python-format +msgid "" +"The following script will be executed whenever new mails arrive.\n" +"Mailnagger passes the total count of new mails to this script,\n" +"followed by %s sequences." +msgstr "" +"O script seguinte será executado sempre que cheguarem novas mensagens.\n" +"Mailnag passa o total novas mensagens para o script,\n" +"seguido por sequências de %s." + +#: Mailnag/plugins/libnotifyplugin.py:117 msgid "LibNotify Notifications" msgstr "Notificações da LibNotify" -#: Mailnag/plugins/libnotifyplugin.py:115 +#: Mailnag/plugins/libnotifyplugin.py:118 msgid "Shows a popup when new mails arrive." msgstr "Mostra um popup quando chegam novas mensagens." -#: Mailnag/plugins/libnotifyplugin.py:130 +#: Mailnag/plugins/libnotifyplugin.py:133 msgid "Count of new mails" msgstr "Quantidade de mensagens novas" -#: Mailnag/plugins/libnotifyplugin.py:131 +#: Mailnag/plugins/libnotifyplugin.py:134 msgid "Short summary of new mails" msgstr "Resumo curto de mensagens novas" -#: Mailnag/plugins/libnotifyplugin.py:132 +#: Mailnag/plugins/libnotifyplugin.py:135 msgid "Detailed summary of new mails" msgstr "Resumo detalhado de mensagens novas" -#: Mailnag/plugins/libnotifyplugin.py:133 +#: Mailnag/plugins/libnotifyplugin.py:136 msgid "One notification per new mail" msgstr "Uma notificação por mensagem nova" -#: Mailnag/plugins/libnotifyplugin.py:141 +#: Mailnag/plugins/libnotifyplugin.py:144 msgid "Notification mode:" msgstr "Modo de notificação:" -#: Mailnag/plugins/libnotifyplugin.py:234 -#: Mailnag/plugins/libnotifyplugin.py:270 -#: Mailnag/plugins/libnotifyplugin.py:307 +#: Mailnag/plugins/libnotifyplugin.py:237 +#: Mailnag/plugins/libnotifyplugin.py:273 +#: Mailnag/plugins/libnotifyplugin.py:310 #, python-brace-format msgid "{0} new mails" msgstr "{0} novas mensagens" -#: Mailnag/plugins/libnotifyplugin.py:236 +#: Mailnag/plugins/libnotifyplugin.py:239 #, python-brace-format msgid "from {0} and others." msgstr "de {0} e outros." -#: Mailnag/plugins/libnotifyplugin.py:238 #: Mailnag/plugins/libnotifyplugin.py:241 +#: Mailnag/plugins/libnotifyplugin.py:244 #, python-brace-format msgid "from {0}." msgstr "de {0}." -#: Mailnag/plugins/libnotifyplugin.py:240 -#: Mailnag/plugins/libnotifyplugin.py:272 -#: Mailnag/plugins/libnotifyplugin.py:309 +#: Mailnag/plugins/libnotifyplugin.py:243 +#: Mailnag/plugins/libnotifyplugin.py:275 +#: Mailnag/plugins/libnotifyplugin.py:312 msgid "New mail" msgstr "Novo mail" -#: Mailnag/plugins/libnotifyplugin.py:265 -#: Mailnag/plugins/libnotifyplugin.py:267 +#: Mailnag/plugins/libnotifyplugin.py:268 +#: Mailnag/plugins/libnotifyplugin.py:270 #, python-brace-format msgid "(and {0} more)" msgstr "(e mais {0})" -#: Mailnag/plugins/libnotifyplugin.py:296 +#: Mailnag/plugins/libnotifyplugin.py:299 msgid "Mark as read" msgstr "Marcar como lido" -#: Mailnag/plugins/userscriptplugin.py:60 -msgid "User Script" -msgstr "Script de Usuário" +#: Mailnag/configuration/accountdialog.py:77 +msgid "Mail Account" +msgstr "Conta de mail" -#: Mailnag/plugins/userscriptplugin.py:61 -msgid "Runs an user defined script on mail arrival." -msgstr "Executa um script definido pelo usuário na chegada de mensagens." +#: Mailnag/configuration/accountdialog.py:119 +msgid "optional" +msgstr "opcional" -#: Mailnag/plugins/userscriptplugin.py:80 -msgid "account" -msgstr "conta" +#: Mailnag/configuration/accountdialog.py:123 +#: Mailnag/configuration/configwindow.py:88 +#: Mailnag/configuration/configwindow.py:108 +msgid "Enabled" +msgstr "Ativado" -#: Mailnag/plugins/userscriptplugin.py:80 -msgid "sender" -msgstr "remetente" +#: Mailnag/configuration/accountdialog.py:129 +#: Mailnag/configuration/configwindow.py:94 +#: Mailnag/configuration/configwindow.py:114 +msgid "Name" +msgstr "Nome" -#: Mailnag/plugins/userscriptplugin.py:80 -msgid "subject" -msgstr "assunto" +#: Mailnag/configuration/accountdialog.py:252 +msgid "IMAP (Custom)" +msgstr "" -#: Mailnag/plugins/userscriptplugin.py:81 -#, fuzzy, python-format -msgid "" -"The following script will be executed whenever new mails arrive.\n" -"Mailnagger passes the total count of new mails to this script,\n" -"followed by %s sequences." +#: Mailnag/configuration/accountdialog.py:253 +msgid "POP3 (Custom)" msgstr "" -"O script seguinte será executado sempre que cheguarem novas mensagens.\n" -"Mailnag passa o total novas mensagens para o script,\n" -"seguido por sequências de %s." + +#: Mailnag/configuration/accountdialog.py:254 +msgid "MBox (Custom)" +msgstr "" + +#: Mailnag/configuration/accountdialog.py:255 +msgid "Maildir (Custom)" +msgstr "" + +#: Mailnag/configuration/accountdialog.py:361 +msgid "Connection failed." +msgstr "A ligação falhou." + +#: Mailnag/configuration/configwindow.py:278 +msgid "About Mailnagger" +msgstr "" + +#: Mailnag/configuration/configwindow.py:281 +msgid "An extensible mail notification daemon." +msgstr "" + +#: Mailnag/configuration/configwindow.py:283 +#, python-brace-format +msgid "Copyright (c) {years} {author} and contributors." +msgstr "" + +#: Mailnag/configuration/configwindow.py:290 +msgid "Homepage" +msgstr "" + +#: Mailnag/configuration/configwindow.py:293 +msgid "maintainer" +msgstr "" + +#. TRANSLATORS: Translate `translator-credits` to the list of names +#. of translators, or team, or something like that. +#: Mailnag/configuration/configwindow.py:313 +msgid "translator-credits" +msgstr "" +"Launchpad Contributions:\n" +" Patrick Ulbrich https://launchpad.net/~pulb\n" +" Pedro Beja https://launchpad.net/~althaser\n" +" Rafael Neri https://launchpad.net/~rafepel\n" +" Relaxeaza https://launchpad.net/~relaxeaza" + +#: Mailnag/configuration/configwindow.py:353 +msgid "Delete this account:" +msgstr "Apagar esta conta:" + +#: Mailnag/configuration/plugindialog.py:35 +msgid "Plugin Configuration" +msgstr "Configuração de Plugin" #: Mailnag/configuration/ui/account_widget.ui.h:1 msgid "" diff --git a/po/ru.po b/po/ru.po index 41bb5b9..7fa3668 100644 --- a/po/ru.po +++ b/po/ru.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: mailnag\n" "Report-Msgid-Bugs-To: https://github.com/tikank/mailnagger/issues\n" -"POT-Creation-Date: 2024-11-27 20:16+0200\n" +"POT-Creation-Date: 2025-11-10 12:57+0100\n" "PO-Revision-Date: 2019-03-16 14:48+0000\n" "Last-Translator: Launchpad Translations Administrators \n" "Language-Team: LANGUAGE \n" @@ -17,91 +17,28 @@ msgstr "" "X-Launchpad-Export-Date: 2020-06-11 14:44+0000\n" "X-Generator: Launchpad (build b190cebbf563f89e480a8b57f641753c8196bda0)\n" -#: Mailnag/configuration/accountdialog.py:77 -msgid "Mail Account" -msgstr "Учетная запись" - -#: Mailnag/configuration/accountdialog.py:119 -msgid "optional" -msgstr "необязательно" - -#: Mailnag/configuration/accountdialog.py:123 -#: Mailnag/configuration/configwindow.py:88 -#: Mailnag/configuration/configwindow.py:108 -msgid "Enabled" -msgstr "Включено" - -#: Mailnag/configuration/accountdialog.py:129 -#: Mailnag/configuration/configwindow.py:94 -#: Mailnag/configuration/configwindow.py:114 -msgid "Name" -msgstr "Имя" - -#: Mailnag/configuration/accountdialog.py:252 -msgid "IMAP (Custom)" -msgstr "" - -#: Mailnag/configuration/accountdialog.py:253 -msgid "POP3 (Custom)" -msgstr "" - -#: Mailnag/configuration/accountdialog.py:254 -msgid "MBox (Custom)" -msgstr "" - -#: Mailnag/configuration/accountdialog.py:255 -msgid "Maildir (Custom)" -msgstr "" +#: Mailnag/daemon/mails.py:153 +msgid "No subject" +msgstr "Без темы" -#: Mailnag/configuration/accountdialog.py:361 -msgid "Connection failed." -msgstr "Ошибка соединения." +#: Mailnag/plugins/garmin2FAplugin.py:135 +#, fuzzy +msgid "Garmin 2FA LibNotify Notifications" +msgstr "Уведомления LibNotify" -#: Mailnag/configuration/configwindow.py:278 -msgid "About Mailnagger" -msgstr "" +#: Mailnag/plugins/garmin2FAplugin.py:136 +#, fuzzy +msgid "Shows a popup when Garmin 2FA mails arrive." +msgstr "Отображение всплывающего уведомления при получении новых писем" -#: Mailnag/configuration/configwindow.py:281 -msgid "An extensible mail notification daemon." +#: Mailnag/plugins/garmin2FAplugin.py:203 +msgid "Your Security Passcode" msgstr "" -#: Mailnag/configuration/configwindow.py:283 +#: Mailnag/plugins/garmin2FAplugin.py:220 #, python-brace-format -msgid "Copyright (c) {years} {author} and contributors." -msgstr "" - -#: Mailnag/configuration/configwindow.py:290 -msgid "Homepage" -msgstr "" - -#: Mailnag/configuration/configwindow.py:293 -msgid "maintainer" -msgstr "" - -#. TRANSLATORS: Translate `translator-credits` to the list of names -#. of translators, or team, or something like that. -#: Mailnag/configuration/configwindow.py:313 -msgid "translator-credits" +msgid "📋 Code: {0}" msgstr "" -"Launchpad Contributions:\n" -" Dmitry Shachnev https://launchpad.net/~mitya57\n" -" Hromin https://launchpad.net/~hromin\n" -" Oleg https://launchpad.net/~cheshire-mouse\n" -" Patrick Ulbrich https://launchpad.net/~pulb\n" -" Vyacheslav Sharmanov https://launchpad.net/~vsharmanov\n" -" u-t https://launchpad.net/~fenoform" - -#: Mailnag/configuration/configwindow.py:353 -msgid "Delete this account:" -msgstr "Удалить учетную запись:" - -#: Mailnag/configuration/plugindialog.py:30 -msgid "Plugin Configuration" -msgstr "Настройка плагина" - -#: Mailnag/daemon/mails.py:135 -msgid "No subject" -msgstr "Без темы" #: Mailnag/plugins/spamfilterplugin.py:67 msgid "Spam Filter" @@ -120,106 +57,188 @@ msgstr "" "Mailnag проигнорирует письмо, если имя отправителя\n" "или тема содержит одно из следующих слов" -#: Mailnag/plugins/soundplugin.py:64 +#: Mailnag/plugins/soundplugin.py:66 msgid "Sound Notifications" msgstr "Звуковые уведомления" -#: Mailnag/plugins/soundplugin.py:65 +#: Mailnag/plugins/soundplugin.py:67 msgid "Plays a sound when new mails arrive." msgstr "Проигрывает мелодию при появлении нового сообщения." -#: Mailnag/plugins/libnotifyplugin.py:114 +#: Mailnag/plugins/userscriptplugin.py:60 +msgid "User Script" +msgstr "Пользовательский скрипт" + +#: Mailnag/plugins/userscriptplugin.py:61 +msgid "Runs an user defined script on mail arrival." +msgstr "Запустить пользовательский скрипт при получении почты" + +#: Mailnag/plugins/userscriptplugin.py:80 +msgid "account" +msgstr "учетная запись" + +#: Mailnag/plugins/userscriptplugin.py:80 +msgid "sender" +msgstr "отправитель" + +#: Mailnag/plugins/userscriptplugin.py:80 +msgid "subject" +msgstr "тема" + +#: Mailnag/plugins/userscriptplugin.py:81 +#, fuzzy, python-format +msgid "" +"The following script will be executed whenever new mails arrive.\n" +"Mailnagger passes the total count of new mails to this script,\n" +"followed by %s sequences." +msgstr "" +"Следующий скрипт будет выполнен при появлении новых сообщений.\n" +"Скрипту передаётся количество сообщений,\n" +"за которым следуют: %s" + +#: Mailnag/plugins/libnotifyplugin.py:117 msgid "LibNotify Notifications" msgstr "Уведомления LibNotify" -#: Mailnag/plugins/libnotifyplugin.py:115 +#: Mailnag/plugins/libnotifyplugin.py:118 msgid "Shows a popup when new mails arrive." msgstr "Отображение всплывающего уведомления при получении новых писем" -#: Mailnag/plugins/libnotifyplugin.py:130 +#: Mailnag/plugins/libnotifyplugin.py:133 msgid "Count of new mails" msgstr "Количество новых писем" -#: Mailnag/plugins/libnotifyplugin.py:131 +#: Mailnag/plugins/libnotifyplugin.py:134 msgid "Short summary of new mails" msgstr "Краткие сведения о письмах" -#: Mailnag/plugins/libnotifyplugin.py:132 +#: Mailnag/plugins/libnotifyplugin.py:135 msgid "Detailed summary of new mails" msgstr "Подробные сведения о письмах" -#: Mailnag/plugins/libnotifyplugin.py:133 +#: Mailnag/plugins/libnotifyplugin.py:136 msgid "One notification per new mail" msgstr "Одно уведомление на письмо" -#: Mailnag/plugins/libnotifyplugin.py:141 +#: Mailnag/plugins/libnotifyplugin.py:144 msgid "Notification mode:" msgstr "Тип уведомлений:" -#: Mailnag/plugins/libnotifyplugin.py:234 -#: Mailnag/plugins/libnotifyplugin.py:270 -#: Mailnag/plugins/libnotifyplugin.py:307 +#: Mailnag/plugins/libnotifyplugin.py:237 +#: Mailnag/plugins/libnotifyplugin.py:273 +#: Mailnag/plugins/libnotifyplugin.py:310 #, python-brace-format msgid "{0} new mails" msgstr "сообщений: {0}" -#: Mailnag/plugins/libnotifyplugin.py:236 +#: Mailnag/plugins/libnotifyplugin.py:239 #, python-brace-format msgid "from {0} and others." msgstr "от {0} и других." -#: Mailnag/plugins/libnotifyplugin.py:238 #: Mailnag/plugins/libnotifyplugin.py:241 +#: Mailnag/plugins/libnotifyplugin.py:244 #, python-brace-format msgid "from {0}." msgstr "от {0}." -#: Mailnag/plugins/libnotifyplugin.py:240 -#: Mailnag/plugins/libnotifyplugin.py:272 -#: Mailnag/plugins/libnotifyplugin.py:309 +#: Mailnag/plugins/libnotifyplugin.py:243 +#: Mailnag/plugins/libnotifyplugin.py:275 +#: Mailnag/plugins/libnotifyplugin.py:312 msgid "New mail" msgstr "Новое сообщение" -#: Mailnag/plugins/libnotifyplugin.py:265 -#: Mailnag/plugins/libnotifyplugin.py:267 +#: Mailnag/plugins/libnotifyplugin.py:268 +#: Mailnag/plugins/libnotifyplugin.py:270 #, python-brace-format msgid "(and {0} more)" msgstr "(и еще {0})" -#: Mailnag/plugins/libnotifyplugin.py:296 +#: Mailnag/plugins/libnotifyplugin.py:299 msgid "Mark as read" msgstr "Отметить как прочитанное" -#: Mailnag/plugins/userscriptplugin.py:60 -msgid "User Script" -msgstr "Пользовательский скрипт" +#: Mailnag/configuration/accountdialog.py:77 +msgid "Mail Account" +msgstr "Учетная запись" -#: Mailnag/plugins/userscriptplugin.py:61 -msgid "Runs an user defined script on mail arrival." -msgstr "Запустить пользовательский скрипт при получении почты" +#: Mailnag/configuration/accountdialog.py:119 +msgid "optional" +msgstr "необязательно" -#: Mailnag/plugins/userscriptplugin.py:80 -msgid "account" -msgstr "учетная запись" +#: Mailnag/configuration/accountdialog.py:123 +#: Mailnag/configuration/configwindow.py:88 +#: Mailnag/configuration/configwindow.py:108 +msgid "Enabled" +msgstr "Включено" -#: Mailnag/plugins/userscriptplugin.py:80 -msgid "sender" -msgstr "отправитель" +#: Mailnag/configuration/accountdialog.py:129 +#: Mailnag/configuration/configwindow.py:94 +#: Mailnag/configuration/configwindow.py:114 +msgid "Name" +msgstr "Имя" -#: Mailnag/plugins/userscriptplugin.py:80 -msgid "subject" -msgstr "тема" +#: Mailnag/configuration/accountdialog.py:252 +msgid "IMAP (Custom)" +msgstr "" -#: Mailnag/plugins/userscriptplugin.py:81 -#, fuzzy, python-format -msgid "" -"The following script will be executed whenever new mails arrive.\n" -"Mailnagger passes the total count of new mails to this script,\n" -"followed by %s sequences." +#: Mailnag/configuration/accountdialog.py:253 +msgid "POP3 (Custom)" msgstr "" -"Следующий скрипт будет выполнен при появлении новых сообщений.\n" -"Скрипту передаётся количество сообщений,\n" -"за которым следуют: %s" + +#: Mailnag/configuration/accountdialog.py:254 +msgid "MBox (Custom)" +msgstr "" + +#: Mailnag/configuration/accountdialog.py:255 +msgid "Maildir (Custom)" +msgstr "" + +#: Mailnag/configuration/accountdialog.py:361 +msgid "Connection failed." +msgstr "Ошибка соединения." + +#: Mailnag/configuration/configwindow.py:278 +msgid "About Mailnagger" +msgstr "" + +#: Mailnag/configuration/configwindow.py:281 +msgid "An extensible mail notification daemon." +msgstr "" + +#: Mailnag/configuration/configwindow.py:283 +#, python-brace-format +msgid "Copyright (c) {years} {author} and contributors." +msgstr "" + +#: Mailnag/configuration/configwindow.py:290 +msgid "Homepage" +msgstr "" + +#: Mailnag/configuration/configwindow.py:293 +msgid "maintainer" +msgstr "" + +#. TRANSLATORS: Translate `translator-credits` to the list of names +#. of translators, or team, or something like that. +#: Mailnag/configuration/configwindow.py:313 +msgid "translator-credits" +msgstr "" +"Launchpad Contributions:\n" +" Dmitry Shachnev https://launchpad.net/~mitya57\n" +" Hromin https://launchpad.net/~hromin\n" +" Oleg https://launchpad.net/~cheshire-mouse\n" +" Patrick Ulbrich https://launchpad.net/~pulb\n" +" Vyacheslav Sharmanov https://launchpad.net/~vsharmanov\n" +" u-t https://launchpad.net/~fenoform" + +#: Mailnag/configuration/configwindow.py:353 +msgid "Delete this account:" +msgstr "Удалить учетную запись:" + +#: Mailnag/configuration/plugindialog.py:35 +msgid "Plugin Configuration" +msgstr "Настройка плагина" #: Mailnag/configuration/ui/account_widget.ui.h:1 msgid "" diff --git a/po/sr.po b/po/sr.po index d4fa24b..608d945 100644 --- a/po/sr.po +++ b/po/sr.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: mailnag\n" "Report-Msgid-Bugs-To: https://github.com/tikank/mailnagger/issues\n" -"POT-Creation-Date: 2024-11-27 20:16+0200\n" +"POT-Creation-Date: 2025-11-10 12:57+0100\n" "PO-Revision-Date: 2021-01-07 11:29+0000\n" "Last-Translator: Burek \n" "Language-Team: Serbian \n" "Language-Team: Swedish \n" "Language-Team: Turkish " - -#: Mailnag/configuration/configwindow.py:353 -msgid "Delete this account:" -msgstr "Bu hesabı sil:" - -#: Mailnag/configuration/plugindialog.py:30 -msgid "Plugin Configuration" -msgstr "Eklenti Yapılandırması" - -#: Mailnag/daemon/mails.py:135 -msgid "No subject" -msgstr "Konu yok" #: Mailnag/plugins/spamfilterplugin.py:67 msgid "Spam Filter" @@ -118,107 +60,184 @@ msgstr "" "Mailnag, konu veya gönderen kısmında aşağıdaki sözcüklerden\n" "en az birini içeren e-postaları dikkate almayacaktır." -#: Mailnag/plugins/soundplugin.py:64 +#: Mailnag/plugins/soundplugin.py:66 msgid "Sound Notifications" msgstr "Sesli Bildirimler" -#: Mailnag/plugins/soundplugin.py:65 +#: Mailnag/plugins/soundplugin.py:67 msgid "Plays a sound when new mails arrive." msgstr "Yeni e-posta geldiğinde bir ses çalar." -#: Mailnag/plugins/libnotifyplugin.py:114 +#: Mailnag/plugins/userscriptplugin.py:60 +msgid "User Script" +msgstr "Kullanıcı Betiği" + +#: Mailnag/plugins/userscriptplugin.py:61 +msgid "Runs an user defined script on mail arrival." +msgstr "" +"E-posta geldiğinde kullanıcı tarafından tanımlanan bir betik çalıştırır." + +#: Mailnag/plugins/userscriptplugin.py:80 +msgid "account" +msgstr "hesap" + +#: Mailnag/plugins/userscriptplugin.py:80 +msgid "sender" +msgstr "gönderen" + +#: Mailnag/plugins/userscriptplugin.py:80 +msgid "subject" +msgstr "konu" + +#: Mailnag/plugins/userscriptplugin.py:81 +#, fuzzy, python-format +msgid "" +"The following script will be executed whenever new mails arrive.\n" +"Mailnagger passes the total count of new mails to this script,\n" +"followed by %s sequences." +msgstr "" +"Yeni e-posta geldiğinde aşağıdaki betik çalıştırılacaktır.\n" +"Mailnag, yeni e-postaların toplam sayısını, ve ardından\n" +"%s dizisini bu betiğe iletir." + +#: Mailnag/plugins/libnotifyplugin.py:117 msgid "LibNotify Notifications" msgstr "LibNotify Bildirimleri" -#: Mailnag/plugins/libnotifyplugin.py:115 +#: Mailnag/plugins/libnotifyplugin.py:118 msgid "Shows a popup when new mails arrive." msgstr "Yeni e-posta geldiğinde bir açılır pencere gösterir." -#: Mailnag/plugins/libnotifyplugin.py:130 +#: Mailnag/plugins/libnotifyplugin.py:133 msgid "Count of new mails" msgstr "Yeni e-posta sayısı" -#: Mailnag/plugins/libnotifyplugin.py:131 +#: Mailnag/plugins/libnotifyplugin.py:134 msgid "Short summary of new mails" msgstr "Yeni e-postaların kısa özeti" -#: Mailnag/plugins/libnotifyplugin.py:132 +#: Mailnag/plugins/libnotifyplugin.py:135 msgid "Detailed summary of new mails" msgstr "Yeni e-postaların ayrıntılı özeti" -#: Mailnag/plugins/libnotifyplugin.py:133 +#: Mailnag/plugins/libnotifyplugin.py:136 msgid "One notification per new mail" msgstr "Her yeni e-posta için bir bildirim" -#: Mailnag/plugins/libnotifyplugin.py:141 +#: Mailnag/plugins/libnotifyplugin.py:144 msgid "Notification mode:" msgstr "Bildirim modu:" -#: Mailnag/plugins/libnotifyplugin.py:234 -#: Mailnag/plugins/libnotifyplugin.py:270 -#: Mailnag/plugins/libnotifyplugin.py:307 +#: Mailnag/plugins/libnotifyplugin.py:237 +#: Mailnag/plugins/libnotifyplugin.py:273 +#: Mailnag/plugins/libnotifyplugin.py:310 #, python-brace-format msgid "{0} new mails" msgstr "{0} yeni e-posta" -#: Mailnag/plugins/libnotifyplugin.py:236 +#: Mailnag/plugins/libnotifyplugin.py:239 #, python-brace-format msgid "from {0} and others." msgstr "{0} ve diğerlerinden." -#: Mailnag/plugins/libnotifyplugin.py:238 #: Mailnag/plugins/libnotifyplugin.py:241 +#: Mailnag/plugins/libnotifyplugin.py:244 #, python-brace-format msgid "from {0}." msgstr "{0}'den." -#: Mailnag/plugins/libnotifyplugin.py:240 -#: Mailnag/plugins/libnotifyplugin.py:272 -#: Mailnag/plugins/libnotifyplugin.py:309 +#: Mailnag/plugins/libnotifyplugin.py:243 +#: Mailnag/plugins/libnotifyplugin.py:275 +#: Mailnag/plugins/libnotifyplugin.py:312 msgid "New mail" msgstr "Yeni e-posta" -#: Mailnag/plugins/libnotifyplugin.py:265 -#: Mailnag/plugins/libnotifyplugin.py:267 +#: Mailnag/plugins/libnotifyplugin.py:268 +#: Mailnag/plugins/libnotifyplugin.py:270 #, python-brace-format msgid "(and {0} more)" msgstr "(ve {0} tane daha)" -#: Mailnag/plugins/libnotifyplugin.py:296 +#: Mailnag/plugins/libnotifyplugin.py:299 msgid "Mark as read" msgstr "Okundu olarak işaretle" -#: Mailnag/plugins/userscriptplugin.py:60 -msgid "User Script" -msgstr "Kullanıcı Betiği" +#: Mailnag/configuration/accountdialog.py:77 +msgid "Mail Account" +msgstr "E-posta Hesabı" -#: Mailnag/plugins/userscriptplugin.py:61 -msgid "Runs an user defined script on mail arrival." +#: Mailnag/configuration/accountdialog.py:119 +msgid "optional" +msgstr "isteğe bağlı" + +#: Mailnag/configuration/accountdialog.py:123 +#: Mailnag/configuration/configwindow.py:88 +#: Mailnag/configuration/configwindow.py:108 +msgid "Enabled" +msgstr "Etkin" + +#: Mailnag/configuration/accountdialog.py:129 +#: Mailnag/configuration/configwindow.py:94 +#: Mailnag/configuration/configwindow.py:114 +msgid "Name" +msgstr "Adı" + +#: Mailnag/configuration/accountdialog.py:252 +msgid "IMAP (Custom)" +msgstr "IMAP (Özel)" + +#: Mailnag/configuration/accountdialog.py:253 +msgid "POP3 (Custom)" +msgstr "POP3 (Özel)" + +#: Mailnag/configuration/accountdialog.py:254 +msgid "MBox (Custom)" +msgstr "MBox (Özel)" + +#: Mailnag/configuration/accountdialog.py:255 +msgid "Maildir (Custom)" +msgstr "Maildir (Özel)" + +#: Mailnag/configuration/accountdialog.py:361 +msgid "Connection failed." +msgstr "Bağlantı başarısız oldu." + +#: Mailnag/configuration/configwindow.py:278 +msgid "About Mailnagger" msgstr "" -"E-posta geldiğinde kullanıcı tarafından tanımlanan bir betik çalıştırır." -#: Mailnag/plugins/userscriptplugin.py:80 -msgid "account" -msgstr "hesap" +#: Mailnag/configuration/configwindow.py:281 +msgid "An extensible mail notification daemon." +msgstr "Genişletilebilir bir e-posta bildirim arka plan programı." -#: Mailnag/plugins/userscriptplugin.py:80 -msgid "sender" -msgstr "gönderen" +#: Mailnag/configuration/configwindow.py:283 +#, fuzzy, python-brace-format +msgid "Copyright (c) {years} {author} and contributors." +msgstr "Telif hakkı (c) 2011 - 2020 Patrick Ulbrich ve katkıda bulunanlar." -#: Mailnag/plugins/userscriptplugin.py:80 -msgid "subject" -msgstr "konu" +#: Mailnag/configuration/configwindow.py:290 +msgid "Homepage" +msgstr "Ana sayfa" -#: Mailnag/plugins/userscriptplugin.py:81 -#, fuzzy, python-format -msgid "" -"The following script will be executed whenever new mails arrive.\n" -"Mailnagger passes the total count of new mails to this script,\n" -"followed by %s sequences." +#: Mailnag/configuration/configwindow.py:293 +msgid "maintainer" msgstr "" -"Yeni e-posta geldiğinde aşağıdaki betik çalıştırılacaktır.\n" -"Mailnag, yeni e-postaların toplam sayısını, ve ardından\n" -"%s dizisini bu betiğe iletir." + +#. TRANSLATORS: Translate `translator-credits` to the list of names +#. of translators, or team, or something like that. +#: Mailnag/configuration/configwindow.py:313 +msgid "translator-credits" +msgstr "" +"Aydın Yakar https://launchpad.net/~yakar\n" +"Oğuz Ersen " + +#: Mailnag/configuration/configwindow.py:353 +msgid "Delete this account:" +msgstr "Bu hesabı sil:" + +#: Mailnag/configuration/plugindialog.py:35 +msgid "Plugin Configuration" +msgstr "Eklenti Yapılandırması" #: Mailnag/configuration/ui/account_widget.ui.h:1 msgid "" diff --git a/po/uk.po b/po/uk.po index 3251490..9d8cd3f 100644 --- a/po/uk.po +++ b/po/uk.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: mailnag\n" "Report-Msgid-Bugs-To: https://github.com/tikank/mailnagger/issues\n" -"POT-Creation-Date: 2024-11-27 20:16+0200\n" +"POT-Creation-Date: 2025-11-10 12:57+0100\n" "PO-Revision-Date: 2019-03-16 14:48+0000\n" "Last-Translator: Launchpad Translations Administrators \n" "Language-Team: Ukrainian \n" @@ -17,90 +17,28 @@ msgstr "" "X-Launchpad-Export-Date: 2020-06-11 14:44+0000\n" "X-Generator: Launchpad (build b190cebbf563f89e480a8b57f641753c8196bda0)\n" -#: Mailnag/configuration/accountdialog.py:77 -msgid "Mail Account" -msgstr "Обліковий запис пошти" - -#: Mailnag/configuration/accountdialog.py:119 -msgid "optional" -msgstr "(необов’язково)" - -#: Mailnag/configuration/accountdialog.py:123 -#: Mailnag/configuration/configwindow.py:88 -#: Mailnag/configuration/configwindow.py:108 -msgid "Enabled" -msgstr "Задіяно" - -#: Mailnag/configuration/accountdialog.py:129 -#: Mailnag/configuration/configwindow.py:94 -#: Mailnag/configuration/configwindow.py:114 -msgid "Name" -msgstr "Назва" - -#: Mailnag/configuration/accountdialog.py:252 -msgid "IMAP (Custom)" -msgstr "" - -#: Mailnag/configuration/accountdialog.py:253 -msgid "POP3 (Custom)" -msgstr "" - -#: Mailnag/configuration/accountdialog.py:254 -msgid "MBox (Custom)" -msgstr "" - -#: Mailnag/configuration/accountdialog.py:255 -msgid "Maildir (Custom)" -msgstr "" +#: Mailnag/daemon/mails.py:153 +msgid "No subject" +msgstr "Без теми" -#: Mailnag/configuration/accountdialog.py:361 -msgid "Connection failed." -msgstr "Не вдалося встановити з'єднання." +#: Mailnag/plugins/garmin2FAplugin.py:135 +#, fuzzy +msgid "Garmin 2FA LibNotify Notifications" +msgstr "Сповіщення LibNotify" -#: Mailnag/configuration/configwindow.py:278 -msgid "About Mailnagger" -msgstr "" +#: Mailnag/plugins/garmin2FAplugin.py:136 +#, fuzzy +msgid "Shows a popup when Garmin 2FA mails arrive." +msgstr "Сповіщає про нові листи за допомогою виринаючих повідомлень." -#: Mailnag/configuration/configwindow.py:281 -msgid "An extensible mail notification daemon." +#: Mailnag/plugins/garmin2FAplugin.py:203 +msgid "Your Security Passcode" msgstr "" -#: Mailnag/configuration/configwindow.py:283 +#: Mailnag/plugins/garmin2FAplugin.py:220 #, python-brace-format -msgid "Copyright (c) {years} {author} and contributors." -msgstr "" - -#: Mailnag/configuration/configwindow.py:290 -msgid "Homepage" -msgstr "" - -#: Mailnag/configuration/configwindow.py:293 -msgid "maintainer" -msgstr "" - -#. TRANSLATORS: Translate `translator-credits` to the list of names -#. of translators, or team, or something like that. -#: Mailnag/configuration/configwindow.py:313 -msgid "translator-credits" +msgid "📋 Code: {0}" msgstr "" -"Launchpad Contributions:\n" -" Andrii Prokopenko https://launchpad.net/~anprok\n" -" Mykola Tkach https://launchpad.net/~stuartlittle1970\n" -" Oleg «Eleidan» Kulyk https://launchpad.net/~helh-saintman\n" -" Patrick Ulbrich https://launchpad.net/~pulb\n" -" Rax https://launchpad.net/~r-a-x" - -#: Mailnag/configuration/configwindow.py:353 -msgid "Delete this account:" -msgstr "Видалити обліковий запис" - -#: Mailnag/configuration/plugindialog.py:30 -msgid "Plugin Configuration" -msgstr "Налаштування додатка" - -#: Mailnag/daemon/mails.py:135 -msgid "No subject" -msgstr "Без теми" #: Mailnag/plugins/spamfilterplugin.py:67 msgid "Spam Filter" @@ -119,104 +57,185 @@ msgstr "" "Mailnag буде нехтувати листи, що містять в темі\n" "чи імени відправника хоча б одне слово з переліку ." -#: Mailnag/plugins/soundplugin.py:64 +#: Mailnag/plugins/soundplugin.py:66 msgid "Sound Notifications" msgstr "Звукові сповіщення" -#: Mailnag/plugins/soundplugin.py:65 +#: Mailnag/plugins/soundplugin.py:67 msgid "Plays a sound when new mails arrive." msgstr "Супроводжує нові листи звуковим сповіщенням." -#: Mailnag/plugins/libnotifyplugin.py:114 +#: Mailnag/plugins/userscriptplugin.py:60 +msgid "User Script" +msgstr "Користувацький скріпт" + +#: Mailnag/plugins/userscriptplugin.py:61 +msgid "Runs an user defined script on mail arrival." +msgstr "Виконувати скріпт користувача при отриманні листа." + +#: Mailnag/plugins/userscriptplugin.py:80 +msgid "account" +msgstr "обліківка" + +#: Mailnag/plugins/userscriptplugin.py:80 +msgid "sender" +msgstr "відправник" + +#: Mailnag/plugins/userscriptplugin.py:80 +msgid "subject" +msgstr "тема" + +#: Mailnag/plugins/userscriptplugin.py:81 +#, python-format +msgid "" +"The following script will be executed whenever new mails arrive.\n" +"Mailnagger passes the total count of new mails to this script,\n" +"followed by %s sequences." +msgstr "" + +#: Mailnag/plugins/libnotifyplugin.py:117 msgid "LibNotify Notifications" msgstr "Сповіщення LibNotify" -#: Mailnag/plugins/libnotifyplugin.py:115 +#: Mailnag/plugins/libnotifyplugin.py:118 msgid "Shows a popup when new mails arrive." msgstr "Сповіщає про нові листи за допомогою виринаючих повідомлень." -#: Mailnag/plugins/libnotifyplugin.py:130 +#: Mailnag/plugins/libnotifyplugin.py:133 msgid "Count of new mails" msgstr "Кількість нових листів" -#: Mailnag/plugins/libnotifyplugin.py:131 +#: Mailnag/plugins/libnotifyplugin.py:134 msgid "Short summary of new mails" msgstr "" -#: Mailnag/plugins/libnotifyplugin.py:132 +#: Mailnag/plugins/libnotifyplugin.py:135 msgid "Detailed summary of new mails" msgstr "" -#: Mailnag/plugins/libnotifyplugin.py:133 +#: Mailnag/plugins/libnotifyplugin.py:136 msgid "One notification per new mail" msgstr "Про кожен лист окремо" -#: Mailnag/plugins/libnotifyplugin.py:141 +#: Mailnag/plugins/libnotifyplugin.py:144 msgid "Notification mode:" msgstr "Метод сповіщення:" -#: Mailnag/plugins/libnotifyplugin.py:234 -#: Mailnag/plugins/libnotifyplugin.py:270 -#: Mailnag/plugins/libnotifyplugin.py:307 +#: Mailnag/plugins/libnotifyplugin.py:237 +#: Mailnag/plugins/libnotifyplugin.py:273 +#: Mailnag/plugins/libnotifyplugin.py:310 #, python-brace-format msgid "{0} new mails" msgstr "{0} листів" -#: Mailnag/plugins/libnotifyplugin.py:236 +#: Mailnag/plugins/libnotifyplugin.py:239 #, python-brace-format msgid "from {0} and others." msgstr "" -#: Mailnag/plugins/libnotifyplugin.py:238 #: Mailnag/plugins/libnotifyplugin.py:241 +#: Mailnag/plugins/libnotifyplugin.py:244 #, python-brace-format msgid "from {0}." msgstr "" -#: Mailnag/plugins/libnotifyplugin.py:240 -#: Mailnag/plugins/libnotifyplugin.py:272 -#: Mailnag/plugins/libnotifyplugin.py:309 +#: Mailnag/plugins/libnotifyplugin.py:243 +#: Mailnag/plugins/libnotifyplugin.py:275 +#: Mailnag/plugins/libnotifyplugin.py:312 msgid "New mail" msgstr "Новий лист" -#: Mailnag/plugins/libnotifyplugin.py:265 -#: Mailnag/plugins/libnotifyplugin.py:267 +#: Mailnag/plugins/libnotifyplugin.py:268 +#: Mailnag/plugins/libnotifyplugin.py:270 #, python-brace-format msgid "(and {0} more)" msgstr "(і ще {0})" -#: Mailnag/plugins/libnotifyplugin.py:296 +#: Mailnag/plugins/libnotifyplugin.py:299 msgid "Mark as read" msgstr "Позначити як прочитане" -#: Mailnag/plugins/userscriptplugin.py:60 -msgid "User Script" -msgstr "Користувацький скріпт" +#: Mailnag/configuration/accountdialog.py:77 +msgid "Mail Account" +msgstr "Обліковий запис пошти" -#: Mailnag/plugins/userscriptplugin.py:61 -msgid "Runs an user defined script on mail arrival." -msgstr "Виконувати скріпт користувача при отриманні листа." +#: Mailnag/configuration/accountdialog.py:119 +msgid "optional" +msgstr "(необов’язково)" -#: Mailnag/plugins/userscriptplugin.py:80 -msgid "account" -msgstr "обліківка" +#: Mailnag/configuration/accountdialog.py:123 +#: Mailnag/configuration/configwindow.py:88 +#: Mailnag/configuration/configwindow.py:108 +msgid "Enabled" +msgstr "Задіяно" -#: Mailnag/plugins/userscriptplugin.py:80 -msgid "sender" -msgstr "відправник" +#: Mailnag/configuration/accountdialog.py:129 +#: Mailnag/configuration/configwindow.py:94 +#: Mailnag/configuration/configwindow.py:114 +msgid "Name" +msgstr "Назва" -#: Mailnag/plugins/userscriptplugin.py:80 -msgid "subject" -msgstr "тема" +#: Mailnag/configuration/accountdialog.py:252 +msgid "IMAP (Custom)" +msgstr "" -#: Mailnag/plugins/userscriptplugin.py:81 -#, python-format -msgid "" -"The following script will be executed whenever new mails arrive.\n" -"Mailnagger passes the total count of new mails to this script,\n" -"followed by %s sequences." +#: Mailnag/configuration/accountdialog.py:253 +msgid "POP3 (Custom)" msgstr "" +#: Mailnag/configuration/accountdialog.py:254 +msgid "MBox (Custom)" +msgstr "" + +#: Mailnag/configuration/accountdialog.py:255 +msgid "Maildir (Custom)" +msgstr "" + +#: Mailnag/configuration/accountdialog.py:361 +msgid "Connection failed." +msgstr "Не вдалося встановити з'єднання." + +#: Mailnag/configuration/configwindow.py:278 +msgid "About Mailnagger" +msgstr "" + +#: Mailnag/configuration/configwindow.py:281 +msgid "An extensible mail notification daemon." +msgstr "" + +#: Mailnag/configuration/configwindow.py:283 +#, python-brace-format +msgid "Copyright (c) {years} {author} and contributors." +msgstr "" + +#: Mailnag/configuration/configwindow.py:290 +msgid "Homepage" +msgstr "" + +#: Mailnag/configuration/configwindow.py:293 +msgid "maintainer" +msgstr "" + +#. TRANSLATORS: Translate `translator-credits` to the list of names +#. of translators, or team, or something like that. +#: Mailnag/configuration/configwindow.py:313 +msgid "translator-credits" +msgstr "" +"Launchpad Contributions:\n" +" Andrii Prokopenko https://launchpad.net/~anprok\n" +" Mykola Tkach https://launchpad.net/~stuartlittle1970\n" +" Oleg «Eleidan» Kulyk https://launchpad.net/~helh-saintman\n" +" Patrick Ulbrich https://launchpad.net/~pulb\n" +" Rax https://launchpad.net/~r-a-x" + +#: Mailnag/configuration/configwindow.py:353 +msgid "Delete this account:" +msgstr "Видалити обліковий запис" + +#: Mailnag/configuration/plugindialog.py:35 +msgid "Plugin Configuration" +msgstr "Налаштування додатка" + #: Mailnag/configuration/ui/account_widget.ui.h:1 msgid "" "You may need to create an application-specific password for Gmail.\n" diff --git a/po/zh_CN.po b/po/zh_CN.po index f08cba6..c9b1f0c 100644 --- a/po/zh_CN.po +++ b/po/zh_CN.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: mailnag\n" "Report-Msgid-Bugs-To: https://github.com/tikank/mailnagger/issues\n" -"POT-Creation-Date: 2024-11-27 20:16+0200\n" +"POT-Creation-Date: 2025-11-10 12:57+0100\n" "PO-Revision-Date: 2019-03-16 14:48+0000\n" "Last-Translator: Launchpad Translations Administrators \n" "Language-Team: Chinese (Simplified) \n" @@ -18,88 +18,28 @@ msgstr "" "X-Launchpad-Export-Date: 2020-06-11 14:44+0000\n" "X-Generator: Launchpad (build b190cebbf563f89e480a8b57f641753c8196bda0)\n" -#: Mailnag/configuration/accountdialog.py:77 -msgid "Mail Account" -msgstr "邮件账户" - -#: Mailnag/configuration/accountdialog.py:119 -msgid "optional" -msgstr "可选" - -#: Mailnag/configuration/accountdialog.py:123 -#: Mailnag/configuration/configwindow.py:88 -#: Mailnag/configuration/configwindow.py:108 -msgid "Enabled" -msgstr "已启用" - -#: Mailnag/configuration/accountdialog.py:129 -#: Mailnag/configuration/configwindow.py:94 -#: Mailnag/configuration/configwindow.py:114 -msgid "Name" -msgstr "名称" - -#: Mailnag/configuration/accountdialog.py:252 -msgid "IMAP (Custom)" -msgstr "" - -#: Mailnag/configuration/accountdialog.py:253 -msgid "POP3 (Custom)" -msgstr "" - -#: Mailnag/configuration/accountdialog.py:254 -msgid "MBox (Custom)" -msgstr "" - -#: Mailnag/configuration/accountdialog.py:255 -msgid "Maildir (Custom)" -msgstr "" +#: Mailnag/daemon/mails.py:153 +msgid "No subject" +msgstr "无主题" -#: Mailnag/configuration/accountdialog.py:361 -msgid "Connection failed." -msgstr "" +#: Mailnag/plugins/garmin2FAplugin.py:135 +#, fuzzy +msgid "Garmin 2FA LibNotify Notifications" +msgstr "弹出窗口通知" -#: Mailnag/configuration/configwindow.py:278 -msgid "About Mailnagger" -msgstr "" +#: Mailnag/plugins/garmin2FAplugin.py:136 +#, fuzzy +msgid "Shows a popup when Garmin 2FA mails arrive." +msgstr "当新邮件到达时弹出。" -#: Mailnag/configuration/configwindow.py:281 -msgid "An extensible mail notification daemon." +#: Mailnag/plugins/garmin2FAplugin.py:203 +msgid "Your Security Passcode" msgstr "" -#: Mailnag/configuration/configwindow.py:283 +#: Mailnag/plugins/garmin2FAplugin.py:220 #, python-brace-format -msgid "Copyright (c) {years} {author} and contributors." -msgstr "" - -#: Mailnag/configuration/configwindow.py:290 -msgid "Homepage" -msgstr "" - -#: Mailnag/configuration/configwindow.py:293 -msgid "maintainer" -msgstr "" - -#. TRANSLATORS: Translate `translator-credits` to the list of names -#. of translators, or team, or something like that. -#: Mailnag/configuration/configwindow.py:313 -msgid "translator-credits" +msgid "📋 Code: {0}" msgstr "" -"Launchpad Contributions:\n" -" Hu Meng https://launchpad.net/~humeng\n" -" Patrick Ulbrich https://launchpad.net/~pulb\n" -" 朱涛 https://launchpad.net/~bill-zt" - -#: Mailnag/configuration/configwindow.py:353 -msgid "Delete this account:" -msgstr "删除该帐户:" - -#: Mailnag/configuration/plugindialog.py:30 -msgid "Plugin Configuration" -msgstr "" - -#: Mailnag/daemon/mails.py:135 -msgid "No subject" -msgstr "无主题" #: Mailnag/plugins/spamfilterplugin.py:67 msgid "Spam Filter" @@ -115,102 +55,181 @@ msgid "" "the following words in subject or sender." msgstr "" -#: Mailnag/plugins/soundplugin.py:64 +#: Mailnag/plugins/soundplugin.py:66 msgid "Sound Notifications" msgstr "声音通知" -#: Mailnag/plugins/soundplugin.py:65 +#: Mailnag/plugins/soundplugin.py:67 msgid "Plays a sound when new mails arrive." msgstr "当新邮件到达时播放声音。" -#: Mailnag/plugins/libnotifyplugin.py:114 +#: Mailnag/plugins/userscriptplugin.py:60 +msgid "User Script" +msgstr "用户脚本" + +#: Mailnag/plugins/userscriptplugin.py:61 +msgid "Runs an user defined script on mail arrival." +msgstr "运行在邮件到达时的用户自定义脚本。" + +#: Mailnag/plugins/userscriptplugin.py:80 +msgid "account" +msgstr "" + +#: Mailnag/plugins/userscriptplugin.py:80 +msgid "sender" +msgstr "寄件人" + +#: Mailnag/plugins/userscriptplugin.py:80 +msgid "subject" +msgstr "主题" + +#: Mailnag/plugins/userscriptplugin.py:81 +#, python-format +msgid "" +"The following script will be executed whenever new mails arrive.\n" +"Mailnagger passes the total count of new mails to this script,\n" +"followed by %s sequences." +msgstr "" + +#: Mailnag/plugins/libnotifyplugin.py:117 msgid "LibNotify Notifications" msgstr "弹出窗口通知" -#: Mailnag/plugins/libnotifyplugin.py:115 +#: Mailnag/plugins/libnotifyplugin.py:118 msgid "Shows a popup when new mails arrive." msgstr "当新邮件到达时弹出。" -#: Mailnag/plugins/libnotifyplugin.py:130 +#: Mailnag/plugins/libnotifyplugin.py:133 msgid "Count of new mails" msgstr "新邮件数量" -#: Mailnag/plugins/libnotifyplugin.py:131 +#: Mailnag/plugins/libnotifyplugin.py:134 msgid "Short summary of new mails" msgstr "" -#: Mailnag/plugins/libnotifyplugin.py:132 +#: Mailnag/plugins/libnotifyplugin.py:135 msgid "Detailed summary of new mails" msgstr "" -#: Mailnag/plugins/libnotifyplugin.py:133 +#: Mailnag/plugins/libnotifyplugin.py:136 msgid "One notification per new mail" msgstr "每封新邮件通知一次" -#: Mailnag/plugins/libnotifyplugin.py:141 +#: Mailnag/plugins/libnotifyplugin.py:144 msgid "Notification mode:" msgstr "通知模式" -#: Mailnag/plugins/libnotifyplugin.py:234 -#: Mailnag/plugins/libnotifyplugin.py:270 -#: Mailnag/plugins/libnotifyplugin.py:307 +#: Mailnag/plugins/libnotifyplugin.py:237 +#: Mailnag/plugins/libnotifyplugin.py:273 +#: Mailnag/plugins/libnotifyplugin.py:310 #, python-brace-format msgid "{0} new mails" msgstr "" -#: Mailnag/plugins/libnotifyplugin.py:236 +#: Mailnag/plugins/libnotifyplugin.py:239 #, python-brace-format msgid "from {0} and others." msgstr "" -#: Mailnag/plugins/libnotifyplugin.py:238 #: Mailnag/plugins/libnotifyplugin.py:241 +#: Mailnag/plugins/libnotifyplugin.py:244 #, python-brace-format msgid "from {0}." msgstr "" -#: Mailnag/plugins/libnotifyplugin.py:240 -#: Mailnag/plugins/libnotifyplugin.py:272 -#: Mailnag/plugins/libnotifyplugin.py:309 +#: Mailnag/plugins/libnotifyplugin.py:243 +#: Mailnag/plugins/libnotifyplugin.py:275 +#: Mailnag/plugins/libnotifyplugin.py:312 msgid "New mail" msgstr "" -#: Mailnag/plugins/libnotifyplugin.py:265 -#: Mailnag/plugins/libnotifyplugin.py:267 +#: Mailnag/plugins/libnotifyplugin.py:268 +#: Mailnag/plugins/libnotifyplugin.py:270 #, python-brace-format msgid "(and {0} more)" msgstr "( 还有 {0} 条)" -#: Mailnag/plugins/libnotifyplugin.py:296 +#: Mailnag/plugins/libnotifyplugin.py:299 msgid "Mark as read" msgstr "标记为已读" -#: Mailnag/plugins/userscriptplugin.py:60 -msgid "User Script" -msgstr "用户脚本" +#: Mailnag/configuration/accountdialog.py:77 +msgid "Mail Account" +msgstr "邮件账户" -#: Mailnag/plugins/userscriptplugin.py:61 -msgid "Runs an user defined script on mail arrival." -msgstr "运行在邮件到达时的用户自定义脚本。" +#: Mailnag/configuration/accountdialog.py:119 +msgid "optional" +msgstr "可选" -#: Mailnag/plugins/userscriptplugin.py:80 -msgid "account" +#: Mailnag/configuration/accountdialog.py:123 +#: Mailnag/configuration/configwindow.py:88 +#: Mailnag/configuration/configwindow.py:108 +msgid "Enabled" +msgstr "已启用" + +#: Mailnag/configuration/accountdialog.py:129 +#: Mailnag/configuration/configwindow.py:94 +#: Mailnag/configuration/configwindow.py:114 +msgid "Name" +msgstr "名称" + +#: Mailnag/configuration/accountdialog.py:252 +msgid "IMAP (Custom)" msgstr "" -#: Mailnag/plugins/userscriptplugin.py:80 -msgid "sender" -msgstr "寄件人" +#: Mailnag/configuration/accountdialog.py:253 +msgid "POP3 (Custom)" +msgstr "" -#: Mailnag/plugins/userscriptplugin.py:80 -msgid "subject" -msgstr "主题" +#: Mailnag/configuration/accountdialog.py:254 +msgid "MBox (Custom)" +msgstr "" -#: Mailnag/plugins/userscriptplugin.py:81 -#, python-format -msgid "" -"The following script will be executed whenever new mails arrive.\n" -"Mailnagger passes the total count of new mails to this script,\n" -"followed by %s sequences." +#: Mailnag/configuration/accountdialog.py:255 +msgid "Maildir (Custom)" +msgstr "" + +#: Mailnag/configuration/accountdialog.py:361 +msgid "Connection failed." +msgstr "" + +#: Mailnag/configuration/configwindow.py:278 +msgid "About Mailnagger" +msgstr "" + +#: Mailnag/configuration/configwindow.py:281 +msgid "An extensible mail notification daemon." +msgstr "" + +#: Mailnag/configuration/configwindow.py:283 +#, python-brace-format +msgid "Copyright (c) {years} {author} and contributors." +msgstr "" + +#: Mailnag/configuration/configwindow.py:290 +msgid "Homepage" +msgstr "" + +#: Mailnag/configuration/configwindow.py:293 +msgid "maintainer" +msgstr "" + +#. TRANSLATORS: Translate `translator-credits` to the list of names +#. of translators, or team, or something like that. +#: Mailnag/configuration/configwindow.py:313 +msgid "translator-credits" +msgstr "" +"Launchpad Contributions:\n" +" Hu Meng https://launchpad.net/~humeng\n" +" Patrick Ulbrich https://launchpad.net/~pulb\n" +" 朱涛 https://launchpad.net/~bill-zt" + +#: Mailnag/configuration/configwindow.py:353 +msgid "Delete this account:" +msgstr "删除该帐户:" + +#: Mailnag/configuration/plugindialog.py:35 +msgid "Plugin Configuration" msgstr "" #: Mailnag/configuration/ui/account_widget.ui.h:1 diff --git a/po/zh_TW.po b/po/zh_TW.po index fd41afb..7868e50 100644 --- a/po/zh_TW.po +++ b/po/zh_TW.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: mailnag\n" "Report-Msgid-Bugs-To: https://github.com/tikank/mailnagger/issues\n" -"POT-Creation-Date: 2024-11-27 20:16+0200\n" +"POT-Creation-Date: 2025-11-10 12:57+0100\n" "PO-Revision-Date: 2019-03-16 14:48+0000\n" "Last-Translator: Launchpad Translations Administrators \n" "Language-Team: Chinese (Traditional) \n" @@ -18,87 +18,29 @@ msgstr "" "X-Launchpad-Export-Date: 2020-06-11 14:44+0000\n" "X-Generator: Launchpad (build b190cebbf563f89e480a8b57f641753c8196bda0)\n" -#: Mailnag/configuration/accountdialog.py:77 -msgid "Mail Account" -msgstr "郵件賬戶" - -#: Mailnag/configuration/accountdialog.py:119 -msgid "optional" -msgstr "可選" - -#: Mailnag/configuration/accountdialog.py:123 -#: Mailnag/configuration/configwindow.py:88 -#: Mailnag/configuration/configwindow.py:108 -msgid "Enabled" -msgstr "已啓用" - -#: Mailnag/configuration/accountdialog.py:129 -#: Mailnag/configuration/configwindow.py:94 -#: Mailnag/configuration/configwindow.py:114 -msgid "Name" -msgstr "名稱" - -#: Mailnag/configuration/accountdialog.py:252 -msgid "IMAP (Custom)" -msgstr "" - -#: Mailnag/configuration/accountdialog.py:253 -msgid "POP3 (Custom)" -msgstr "" - -#: Mailnag/configuration/accountdialog.py:254 -msgid "MBox (Custom)" -msgstr "" - -#: Mailnag/configuration/accountdialog.py:255 -msgid "Maildir (Custom)" -msgstr "" +#: Mailnag/daemon/mails.py:153 +msgid "No subject" +msgstr "無主題" -#: Mailnag/configuration/accountdialog.py:361 -msgid "Connection failed." -msgstr "" +#: Mailnag/plugins/garmin2FAplugin.py:135 +#, fuzzy +msgid "Garmin 2FA LibNotify Notifications" +msgstr "彈出視窗通知" -#: Mailnag/configuration/configwindow.py:278 -msgid "About Mailnagger" -msgstr "" +#: Mailnag/plugins/garmin2FAplugin.py:136 +#, fuzzy +msgid "Shows a popup when Garmin 2FA mails arrive." +msgstr "當新郵件到達時彈出訊息視窗。" -#: Mailnag/configuration/configwindow.py:281 -msgid "An extensible mail notification daemon." +#: Mailnag/plugins/garmin2FAplugin.py:203 +msgid "Your Security Passcode" msgstr "" -#: Mailnag/configuration/configwindow.py:283 +#: Mailnag/plugins/garmin2FAplugin.py:220 #, python-brace-format -msgid "Copyright (c) {years} {author} and contributors." +msgid "📋 Code: {0}" msgstr "" -#: Mailnag/configuration/configwindow.py:290 -msgid "Homepage" -msgstr "" - -#: Mailnag/configuration/configwindow.py:293 -msgid "maintainer" -msgstr "" - -#. TRANSLATORS: Translate `translator-credits` to the list of names -#. of translators, or team, or something like that. -#: Mailnag/configuration/configwindow.py:313 -msgid "translator-credits" -msgstr "" -"Launchpad Contributions:\n" -" elleryq https://launchpad.net/~elleryq" - -#: Mailnag/configuration/configwindow.py:353 -msgid "Delete this account:" -msgstr "刪除該帳戶:" - -#: Mailnag/configuration/plugindialog.py:30 -msgid "Plugin Configuration" -msgstr "Plugin 配置" - -#: Mailnag/daemon/mails.py:135 -msgid "No subject" -msgstr "無主題" - #: Mailnag/plugins/spamfilterplugin.py:67 msgid "Spam Filter" msgstr "垃圾郵件過濾器" @@ -114,104 +56,181 @@ msgid "" "the following words in subject or sender." msgstr "Mailnag 將會忽略主旨或寄件者裡帶有這些字詞的郵件。" -#: Mailnag/plugins/soundplugin.py:64 +#: Mailnag/plugins/soundplugin.py:66 msgid "Sound Notifications" msgstr "聲音通知" -#: Mailnag/plugins/soundplugin.py:65 +#: Mailnag/plugins/soundplugin.py:67 msgid "Plays a sound when new mails arrive." msgstr "當新郵件到達時播放聲音。" -#: Mailnag/plugins/libnotifyplugin.py:114 +#: Mailnag/plugins/userscriptplugin.py:60 +msgid "User Script" +msgstr "用戶腳本" + +#: Mailnag/plugins/userscriptplugin.py:61 +msgid "Runs an user defined script on mail arrival." +msgstr "運行在郵件到達時的用戶自定義腳本。" + +#: Mailnag/plugins/userscriptplugin.py:80 +msgid "account" +msgstr "" + +#: Mailnag/plugins/userscriptplugin.py:80 +msgid "sender" +msgstr "寄件人" + +#: Mailnag/plugins/userscriptplugin.py:80 +msgid "subject" +msgstr "主題" + +#: Mailnag/plugins/userscriptplugin.py:81 +#, python-format +msgid "" +"The following script will be executed whenever new mails arrive.\n" +"Mailnagger passes the total count of new mails to this script,\n" +"followed by %s sequences." +msgstr "" + +#: Mailnag/plugins/libnotifyplugin.py:117 msgid "LibNotify Notifications" msgstr "彈出視窗通知" -#: Mailnag/plugins/libnotifyplugin.py:115 +#: Mailnag/plugins/libnotifyplugin.py:118 msgid "Shows a popup when new mails arrive." msgstr "當新郵件到達時彈出訊息視窗。" -#: Mailnag/plugins/libnotifyplugin.py:130 +#: Mailnag/plugins/libnotifyplugin.py:133 msgid "Count of new mails" msgstr "新郵件數量" -#: Mailnag/plugins/libnotifyplugin.py:131 +#: Mailnag/plugins/libnotifyplugin.py:134 msgid "Short summary of new mails" msgstr "" -#: Mailnag/plugins/libnotifyplugin.py:132 +#: Mailnag/plugins/libnotifyplugin.py:135 msgid "Detailed summary of new mails" msgstr "" -#: Mailnag/plugins/libnotifyplugin.py:133 +#: Mailnag/plugins/libnotifyplugin.py:136 msgid "One notification per new mail" msgstr "每封新郵件通知一次" -#: Mailnag/plugins/libnotifyplugin.py:141 +#: Mailnag/plugins/libnotifyplugin.py:144 msgid "Notification mode:" msgstr "通知模式" -#: Mailnag/plugins/libnotifyplugin.py:234 -#: Mailnag/plugins/libnotifyplugin.py:270 -#: Mailnag/plugins/libnotifyplugin.py:307 +#: Mailnag/plugins/libnotifyplugin.py:237 +#: Mailnag/plugins/libnotifyplugin.py:273 +#: Mailnag/plugins/libnotifyplugin.py:310 #, python-brace-format msgid "{0} new mails" msgstr "{0} 封新郵件" -#: Mailnag/plugins/libnotifyplugin.py:236 +#: Mailnag/plugins/libnotifyplugin.py:239 #, python-brace-format msgid "from {0} and others." msgstr "" -#: Mailnag/plugins/libnotifyplugin.py:238 #: Mailnag/plugins/libnotifyplugin.py:241 +#: Mailnag/plugins/libnotifyplugin.py:244 #, python-brace-format msgid "from {0}." msgstr "" -#: Mailnag/plugins/libnotifyplugin.py:240 -#: Mailnag/plugins/libnotifyplugin.py:272 -#: Mailnag/plugins/libnotifyplugin.py:309 +#: Mailnag/plugins/libnotifyplugin.py:243 +#: Mailnag/plugins/libnotifyplugin.py:275 +#: Mailnag/plugins/libnotifyplugin.py:312 msgid "New mail" msgstr "新郵件" -#: Mailnag/plugins/libnotifyplugin.py:265 -#: Mailnag/plugins/libnotifyplugin.py:267 +#: Mailnag/plugins/libnotifyplugin.py:268 +#: Mailnag/plugins/libnotifyplugin.py:270 #, python-brace-format msgid "(and {0} more)" msgstr "( 還有 {0} 條)" -#: Mailnag/plugins/libnotifyplugin.py:296 +#: Mailnag/plugins/libnotifyplugin.py:299 msgid "Mark as read" msgstr "標記爲已讀" -#: Mailnag/plugins/userscriptplugin.py:60 -msgid "User Script" -msgstr "用戶腳本" +#: Mailnag/configuration/accountdialog.py:77 +msgid "Mail Account" +msgstr "郵件賬戶" -#: Mailnag/plugins/userscriptplugin.py:61 -msgid "Runs an user defined script on mail arrival." -msgstr "運行在郵件到達時的用戶自定義腳本。" +#: Mailnag/configuration/accountdialog.py:119 +msgid "optional" +msgstr "可選" -#: Mailnag/plugins/userscriptplugin.py:80 -msgid "account" +#: Mailnag/configuration/accountdialog.py:123 +#: Mailnag/configuration/configwindow.py:88 +#: Mailnag/configuration/configwindow.py:108 +msgid "Enabled" +msgstr "已啓用" + +#: Mailnag/configuration/accountdialog.py:129 +#: Mailnag/configuration/configwindow.py:94 +#: Mailnag/configuration/configwindow.py:114 +msgid "Name" +msgstr "名稱" + +#: Mailnag/configuration/accountdialog.py:252 +msgid "IMAP (Custom)" msgstr "" -#: Mailnag/plugins/userscriptplugin.py:80 -msgid "sender" -msgstr "寄件人" +#: Mailnag/configuration/accountdialog.py:253 +msgid "POP3 (Custom)" +msgstr "" -#: Mailnag/plugins/userscriptplugin.py:80 -msgid "subject" -msgstr "主題" +#: Mailnag/configuration/accountdialog.py:254 +msgid "MBox (Custom)" +msgstr "" -#: Mailnag/plugins/userscriptplugin.py:81 -#, python-format -msgid "" -"The following script will be executed whenever new mails arrive.\n" -"Mailnagger passes the total count of new mails to this script,\n" -"followed by %s sequences." +#: Mailnag/configuration/accountdialog.py:255 +msgid "Maildir (Custom)" +msgstr "" + +#: Mailnag/configuration/accountdialog.py:361 +msgid "Connection failed." msgstr "" +#: Mailnag/configuration/configwindow.py:278 +msgid "About Mailnagger" +msgstr "" + +#: Mailnag/configuration/configwindow.py:281 +msgid "An extensible mail notification daemon." +msgstr "" + +#: Mailnag/configuration/configwindow.py:283 +#, python-brace-format +msgid "Copyright (c) {years} {author} and contributors." +msgstr "" + +#: Mailnag/configuration/configwindow.py:290 +msgid "Homepage" +msgstr "" + +#: Mailnag/configuration/configwindow.py:293 +msgid "maintainer" +msgstr "" + +#. TRANSLATORS: Translate `translator-credits` to the list of names +#. of translators, or team, or something like that. +#: Mailnag/configuration/configwindow.py:313 +msgid "translator-credits" +msgstr "" +"Launchpad Contributions:\n" +" elleryq https://launchpad.net/~elleryq" + +#: Mailnag/configuration/configwindow.py:353 +msgid "Delete this account:" +msgstr "刪除該帳戶:" + +#: Mailnag/configuration/plugindialog.py:35 +msgid "Plugin Configuration" +msgstr "Plugin 配置" + #: Mailnag/configuration/ui/account_widget.ui.h:1 msgid "" "You may need to create an application-specific password for Gmail.\n" From 05b92ed343effdc71eb07ce64dbe3ffd24b71544 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Auzi?= Date: Mon, 10 Nov 2025 16:27:53 +0100 Subject: [PATCH 07/49] 'Fetch text only when needed' --- Mailnag/backends/imap.py | 45 +++++++++++++++++------------- Mailnag/plugins/garmin2FAplugin.py | 4 ++- 2 files changed, 28 insertions(+), 21 deletions(-) diff --git a/Mailnag/backends/imap.py b/Mailnag/backends/imap.py index edcca1b..51fd160 100644 --- a/Mailnag/backends/imap.py +++ b/Mailnag/backends/imap.py @@ -87,9 +87,7 @@ def is_open(self) -> bool: return self._conn != None - def list_messages(self, - with_body_text:bool = True - ) -> Iterator[tuple[str, Message, dict[str, Any]]]: + def list_messages(self) -> Iterator[tuple[str, Message, dict[str, Any]]]: self._ensure_open() assert self._conn is not None conn = self._conn @@ -99,11 +97,6 @@ def list_messages(self, else: folder_list = self.folders - fetch_parts = 'BODY.PEEK[HEADER]' - if with_body_text: - fetch_parts += ' BODY.PEEK[TEXT]' - fetch_parts = '(' + fetch_parts + ')' - for folder in folder_list: # select IMAP folder conn.select(f'"{folder}"', readonly = True) @@ -117,26 +110,38 @@ def list_messages(self, logging.debug('Folder %s in status %s | Data: %s', (folder, status, data)) continue # Bugfix LP-735071 for num in data[0].split(): - typ, msg_data = conn.uid('FETCH', num, fetch_parts) # header with or without text (without setting READ flag) + typ, msg_data = conn.uid('FETCH', num, '(BODY.PEEK[HEADER])') # header (without setting READ flag) logging.debug("Msg data (length=%d):\n%s", len(msg_data), dbgindent(msg_data)) header = None - text = None for response_part in msg_data: if isinstance(response_part, tuple): if b'BODY[HEADER]' in response_part[0]: header = email.message_from_bytes(response_part[1]) - elif b'BODY[TEXT]' in response_part[0]: - text = email.message_from_bytes(response_part[1]) - if text is not None: - text = text.as_string() - if text is not None: - text = text.replace('=\n', '').strip() if header: - logging.debug("Msg header:\n%s\nMsg text:\n%s", - dbgindent(header), - dbgindent(text)) - yield (folder, header, { 'uid' : num.decode("utf-8"), 'folder' : folder, 'body': text }) + logging.debug("Msg header:\n%s", + dbgindent(header)) + yield (folder, header, { 'uid' : num.decode("utf-8"), 'folder' : folder, 'backend': self }) + + def fetch_text(self, uid: str) -> str: + conn = self._connect() + + typ, msg_data = conn.uid('FETCH', uid.encode('utf-8'), '(BODY.PEEK[TEXT])') # body text (without setting READ flag) + logging.debug("Msg data (length=%d):\n%s", len(msg_data), + dbgindent(msg_data)) + text = [] + for response_part in msg_data: + if isinstance(response_part, tuple): + if b'BODY[TEXT]' in response_part[0]: + t = email.message_from_bytes(response_part[1]) + if t is not None: + t = t.as_string() + t = t.replace('=\n', '') + text.append(t) + if len(text): + return ''.join(text).strip() + + return None def request_folders(self) -> list[str]: diff --git a/Mailnag/plugins/garmin2FAplugin.py b/Mailnag/plugins/garmin2FAplugin.py index b84bbe7..db60ef0 100644 --- a/Mailnag/plugins/garmin2FAplugin.py +++ b/Mailnag/plugins/garmin2FAplugin.py @@ -194,7 +194,9 @@ def _notify_2FA(self, new_mails, all_mails): for mail in new_mails: sender = self._get_sender(mail) - body = str(mail.flags['body']) + uid = mail.flags['uid'] + backend = mail.flags['backend'] + body = backend.fetch_text(uid) logging.debug("garmin2FA: sender=%s, subject=%s, body:\n%s", sender, mail.subject, dbgindent(body)) From 66a99ec623bad2dd8947caff73b5acca05ede1de Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Auzi?= Date: Mon, 10 Nov 2025 21:26:26 +0100 Subject: [PATCH 08/49] 'Add *~ in .gitignore' --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 8291b25..50e4a1b 100644 --- a/.gitignore +++ b/.gitignore @@ -10,3 +10,4 @@ Mailnag/plugins/messagingmenuplugin.py *.egg-info/ .python-version +*~ From 1dbd02dfd826a81c2efcdd11ccb7e701d16b8efc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Auzi?= Date: Mon, 10 Nov 2025 21:58:13 +0100 Subject: [PATCH 09/49] Generalize fetch_text processing --- Mailnag/backends/base.py | 13 +++-- Mailnag/backends/imap.py | 17 +++---- Mailnag/backends/local.py | 25 +++++++-- Mailnag/backends/pop3.py | 70 ++++++++++++++++++++----- Mailnag/common/accounts.py | 82 ++++++++++++++++-------------- Mailnag/daemon/mails.py | 36 +++++++++++-- Mailnag/plugins/garmin2FAplugin.py | 4 +- 7 files changed, 174 insertions(+), 73 deletions(-) diff --git a/Mailnag/backends/base.py b/Mailnag/backends/base.py index 9ef31a6..c6e1a92 100644 --- a/Mailnag/backends/base.py +++ b/Mailnag/backends/base.py @@ -1,3 +1,4 @@ +# Copyright 2025 André Auzi # Copyright 2020 Patrick Ulbrich # Copyright 2016, 2024 Timo Kankare # @@ -54,9 +55,9 @@ def is_open(self) -> bool: raise NotImplementedError @abstractmethod - def list_messages(self) -> Iterator[tuple[str, Message, dict[str, Any]]]: + def list_messages(self) -> Iterator[tuple[str, Message, str | None, dict[str, Any]]]: """Lists unseen messages from the mailbox for this account. - Yields tuples (folder, message, flags) for every message. + Yields tuples (folder, message, uid, flags) for every message. """ raise NotImplementedError @@ -78,7 +79,7 @@ def mark_as_seen(self, mails: list[Mail]): This may raise an exception if mailbox does not support this action. """ raise NotImplementedError - + def supports_notifications(self) -> bool: """Returns True if mailbox supports notifications.""" # Default implementation @@ -105,3 +106,9 @@ def cancel_notifications(self) -> None: """ raise NotImplementedError + @abstractmethod + def fetch_text(self, mail: Mail) -> str | None: + """Fetches the text body of the message identified by an uid. + This should raise an exception if uid is None. + """ + raise NotImplementedError diff --git a/Mailnag/backends/imap.py b/Mailnag/backends/imap.py index 51fd160..d9a8d64 100644 --- a/Mailnag/backends/imap.py +++ b/Mailnag/backends/imap.py @@ -36,7 +36,7 @@ from Mailnag.common.imaplib2 import AUTH from Mailnag.common.exceptions import InvalidOperationException from Mailnag.common.mutf7 import encode_mutf7, decode_mutf7 -from Mailnag.daemon.mails import Mail +from Mailnag.daemon.mails import Mail, message_text from Mailnag.common.utils import dbgindent @@ -87,7 +87,7 @@ def is_open(self) -> bool: return self._conn != None - def list_messages(self) -> Iterator[tuple[str, Message, dict[str, Any]]]: + def list_messages(self) -> Iterator[tuple[str, Message, str | None, dict[str, Any]]]: self._ensure_open() assert self._conn is not None conn = self._conn @@ -121,22 +121,21 @@ def list_messages(self) -> Iterator[tuple[str, Message, dict[str, Any]]]: if header: logging.debug("Msg header:\n%s", dbgindent(header)) - yield (folder, header, { 'uid' : num.decode("utf-8"), 'folder' : folder, 'backend': self }) + yield (folder, header, num.decode("utf-8"), { 'folder' : folder }) - def fetch_text(self, uid: str) -> str: + def fetch_text(self, mail: Mail) -> str | None: conn = self._connect() - typ, msg_data = conn.uid('FETCH', uid.encode('utf-8'), '(BODY.PEEK[TEXT])') # body text (without setting READ flag) + typ, msg_data = conn.uid('FETCH', mail.uid.encode('utf-8'), '(BODY.PEEK[TEXT])') # body text (without setting READ flag) logging.debug("Msg data (length=%d):\n%s", len(msg_data), dbgindent(msg_data)) text = [] for response_part in msg_data: if isinstance(response_part, tuple): if b'BODY[TEXT]' in response_part[0]: - t = email.message_from_bytes(response_part[1]) - if t is not None: - t = t.as_string() - t = t.replace('=\n', '') + msg = email.message_from_bytes(response_part[1]) + if msg is not None: + t = message_text(msg) text.append(t) if len(text): return ''.join(text).strip() diff --git a/Mailnag/backends/local.py b/Mailnag/backends/local.py index 4052c55..194ec1e 100644 --- a/Mailnag/backends/local.py +++ b/Mailnag/backends/local.py @@ -1,3 +1,4 @@ +# Copyright 2025 André Auzi # Copyright 2020 Patrick Ulbrich # Copyright 2016, 2024 Timo Kankare # @@ -26,6 +27,7 @@ from Mailnag.backends.base import MailboxBackend from Mailnag.common.exceptions import InvalidOperationException +from Mailnag.daemon.mails import message_text class MBoxBackend(MailboxBackend): @@ -55,7 +57,7 @@ def is_open(self) -> bool: return self._opened - def list_messages(self) -> Iterator[tuple[str, Message, dict[str, Any]]]: + def list_messages(self) -> Iterator[tuple[str, Message, str | None, dict[str, Any]]]: """List unread messages from the mailbox. Yields tuples (folder, message, flags) where folder is always ''. """ @@ -66,13 +68,28 @@ def list_messages(self) -> Iterator[tuple[str, Message, dict[str, Any]]]: mbox = mailbox.mbox(self._path, create=False) folder = '' try: - for msg in mbox: + for key, msg in mbox.iteritems(): if 'R' not in msg.get_flags(): - yield (folder, msg, {}) + yield (folder, msg, str(key), {}) finally: mbox.close() + def fetch_text(self, mail: Mail) -> str | None: + if self._path is None: + raise InvalidOperationException( + "Path is not defined for Mbox '{self._name}'" + ) + mbox = mailbox.mbox(self._path, create=False) + + msg = mbox.get(mail.uid) + if msg is not None: + return message_text(msg) + + return None + + + def request_folders(self) -> list[str]: """mbox does not suppoert folders.""" raise NotImplementedError("mbox does not support folders") @@ -133,7 +150,7 @@ def is_open(self) -> bool: return self._opened - def list_messages(self) -> Iterator[tuple[str, Message, dict[str, Any]]]: + def list_messages(self) -> Iterator[tuple[str, Message, str | None, dict[str, Any]]]: """List unread messages from the mailbox. Yields tuples (folder, message, flags). """ diff --git a/Mailnag/backends/pop3.py b/Mailnag/backends/pop3.py index 7835726..39117cc 100644 --- a/Mailnag/backends/pop3.py +++ b/Mailnag/backends/pop3.py @@ -1,3 +1,4 @@ +# Copyright 2025 André Auzi # Copyright 2011 - 2019 Patrick Ulbrich # Copyright 2016, 2024 Timo Kankare # Copyright 2016 Thomas Haider @@ -30,11 +31,11 @@ from Mailnag.backends.base import MailboxBackend from Mailnag.common.exceptions import InvalidOperationException - +from Mailnag.daemon.mails import message_text class POP3MailboxBackend(MailboxBackend): """Implementation of POP3 mail boxes.""" - + def __init__( self, name: str = '', @@ -59,9 +60,9 @@ def __init__( def open(self) -> None: if self._conn != None: raise InvalidOperationException("Account is aready open") - + conn: Optional[poplib.POP3] = None - + try: if self.ssl: if self.port == '': @@ -73,12 +74,12 @@ def open(self) -> None: conn = poplib.POP3(self.server) else: conn = poplib.POP3(self.server, int(self.port)) - + try: conn.stls() except: logging.warning("Using unencrypted connection for account '%s'" % self.name) - + conn.getwelcome() conn.user(self.user) conn.pass_(self.password) @@ -88,7 +89,7 @@ def open(self) -> None: conn.quit() except: pass raise # re-throw exception - + self._conn = conn @@ -103,12 +104,12 @@ def is_open(self) -> bool: ('sock' in self._conn.__dict__) - def list_messages(self) -> Iterator[tuple[str, Message, dict[str, Any]]]: + def list_messages(self) -> Iterator[tuple[str, Message, str | None, dict[str, Any]]]: self._ensure_open() assert self._conn is not None conn = self._conn folder = '' - + # number of mails on the server mail_total = len(conn.list()[1]) for i in range(1, mail_total + 1): # for each mail @@ -118,16 +119,61 @@ def list_messages(self) -> Iterator[tuple[str, Message, dict[str, Any]]]: except: logging.debug("Couldn't get POP message.") continue - + + uid = None + try: + # uid of message + uid = conn.uidl(i).split()[3] + except: + logging.debug("Couldn't get POP message uid.") + # convert list to byte sequence message_bytes = b'\n'.join(message) - + try: msg = email.message_from_bytes(message_bytes) except: logging.debug("Couldn't get msg from POP message.") continue - yield (folder, msg, {}) + yield (folder, msg, uid, {}) + + def fetch_text(self, mail: Mail) -> str | None: + if mail.uid == None: + raise NotImplementedError("POP3 does not support uidl") + + self._ensure_open() + assert self._conn is not None + conn = self._conn + + for entry in conn.uidl(): + msgnum, msguid = tuple(entry.split()) + i = int(msgnum) + if mail.uid == msguid: + try: + # get message size + size = int(conn.stat(i)[1]) + except: + logging.debug("Couldn't get msg size from POP.") + break + + try: + # header plus lines from body + message = conn.top(i, size)[1] + except: + logging.debug("Couldn't get POP message.") + break + + message_bytes = b'\n'.join(message) + + try: + msg = email.message_from_bytes(message_bytes) + return message_text(msg) + except: + logging.debug("Couldn't get msg from POP message.") + break + + break + return None def request_folders(self) -> list[str]: diff --git a/Mailnag/common/accounts.py b/Mailnag/common/accounts.py index fffa75b..c2aeb21 100644 --- a/Mailnag/common/accounts.py +++ b/Mailnag/common/accounts.py @@ -1,3 +1,4 @@ +# Copyright 2025 André Auzi # Copyright 2011 - 2020 Patrick Ulbrich # Copyright 2016 Thomas Haider # Copyright 2016, 2018, 2024 Timo Kankare @@ -37,13 +38,13 @@ account_defaults = { 'enabled' : '0', 'type' : 'imap', - 'name' : '', + 'name' : '', 'user' : '', 'password' : '', 'server' : '', 'port' : '', 'ssl' : '1', - 'imap' : '1', + 'imap' : '1', 'idle' : '1', 'folder' : '[]' } @@ -121,20 +122,24 @@ def close(self) -> None: self._get_backend().close() - # Indicates whether the account + # Indicates whether the account # holds an active existing connection. def is_open(self) -> bool: """Returns true if the mailbox is opened.""" return self._get_backend().is_open() - def list_messages(self) -> Iterator[tuple[str, Message, dict[str, Any]]]: + def list_messages(self) -> Iterator[tuple[str, Message, str | None, dict[str, Any]]]: """Lists unseen messages from the mailbox for this account. Yields a set of tuples (folder, message, flags). """ return self._get_backend().list_messages() + def fetch_text(self, mail: Mail) -> str | None: + return self._get_backend().fetch_text(mail) + + def supports_notifications(self) -> bool: """Returns True if account supports notifications.""" return self._get_backend().supports_notifications() @@ -176,8 +181,8 @@ def supports_mark_as_seen(self) -> bool: def mark_as_seen(self, mails: list[Mail]): """Marks mails as seen.""" self._get_backend().mark_as_seen(mails) - - + + def get_id(self) -> str: """Returns unique id for the account.""" # Assumption: The name of the account is unique. @@ -221,52 +226,52 @@ def __init__(self) -> None: self._accounts: list[Account] = [] self._removed: list[Account] = [] self._secretstore = SecretStore.get_default() - + if self._secretstore is None: logging.warning("Failed to create secretstore - account passwords will be stored in plaintext config file.") - + def __len__(self) -> int: """Returns number of accounts""" return len(self._accounts) - - + + def __iter__(self) -> Iterator[Account]: """Returns iterator for accounts""" for acc in self._accounts: yield acc - + def __contains__(self, item: Account) -> bool: """Checks if account is in account managers collection.""" return (item in self._accounts) - - + + def add(self, account: Account) -> None: """Adds account to account manager.""" self._accounts.append(account) - - + + def remove(self, account: Account) -> None: """Removes account from account manager.""" self._accounts.remove(account) self._removed.append(account) - - + + def clear(self) -> None: """Removes all accounts.""" for acc in self._accounts: self._removed.append(acc) del self._accounts[:] - - + + def to_list(self) -> list[Account]: """Returns list of accounts.""" # Don't pass a ref to the internal accounts list. # (Accounts must be removed via the remove() method only.) return self._accounts[:] - - + + def load_from_cfg( self, cfg: RawConfigParser, @@ -275,13 +280,13 @@ def load_from_cfg( """Loads accounts from configuration.""" del self._accounts[:] del self._removed[:] - + i = 1 section_name = "account" + str(i) - + while cfg.has_section(section_name): enabled = bool(int(self._get_account_cfg(cfg, section_name, 'enabled'))) - + if (not enabled_only) or (enabled_only and enabled): if cfg.has_option(section_name, 'type'): mailbox_type = self._get_account_cfg(cfg, section_name, 'type') @@ -295,7 +300,7 @@ def load_from_cfg( options = self._get_cfg_options(cfg, section_name, option_spec) # TODO: Getting a password from the secretstore is mailbox specific. - # Not every backend requires a password. + # Not every backend requires a password. user = options.get('user') server = options.get('server') if self._secretstore is not None and user and server: @@ -313,7 +318,7 @@ def load_from_cfg( i = i + 1 section_name = "account" + str(i) - + def save_to_cfg(self, cfg: RawConfigParser) -> None: """Saves accounts to configuration.""" @@ -324,27 +329,27 @@ def save_to_cfg(self, cfg: RawConfigParser) -> None: cfg.remove_section(section_name) i = i + 1 section_name = "account" + str(i) - + # Delete secrets of removed accounts from the secretstore - # (it's important to do this before adding accounts, + # (it's important to do this before adding accounts, # in case multiple accounts with the same id exist). if self._secretstore is not None: for acc in self._removed: self._secretstore.remove(self._get_account_id(acc.user, acc.server, acc.imap)) - + del self._removed[:] - + # Add accounts i = 1 for acc in self._accounts: if acc.oauth2string != '': logging.warning("Saving of OAuth2 based accounts is not supported. Account '%s' skipped." % acc.name) continue - + section_name = "account" + str(i) - + cfg.add_section(section_name) - + cfg.set(section_name, 'enabled', str(int(acc.enabled))) cfg.set(section_name, 'type', acc.mailbox_type) cfg.set(section_name, 'name', acc.name) @@ -353,7 +358,7 @@ def save_to_cfg(self, cfg: RawConfigParser) -> None: option_spec = get_mailbox_parameter_specs(acc.mailbox_type) # TODO: Storing a password is mailbox specific. - # Not every backend requires a password. + # Not every backend requires a password. if self._secretstore is not None: self._secretstore.set( self._get_account_id(acc.user, acc.server, acc.imap), @@ -365,13 +370,13 @@ def save_to_cfg(self, cfg: RawConfigParser) -> None: self._set_cfg_options(cfg, section_name, config, option_spec) i = i + 1 - - + + def _get_account_id(self, user: str, server: str, is_imap: bool) -> str: # TODO : Introduce account.uuid when rewriting account and backend code return hashlib.md5((user + server + str(is_imap)).encode('utf-8')).hexdigest() - - + + def _get_account_cfg( self, cfg: RawConfigParser, @@ -428,4 +433,3 @@ def _set_cfg_options( else: value = s.default_value cfg.set(section_name, s.option_name, value) - diff --git a/Mailnag/daemon/mails.py b/Mailnag/daemon/mails.py index 30d77fa..a4c39fd 100644 --- a/Mailnag/daemon/mails.py +++ b/Mailnag/daemon/mails.py @@ -1,3 +1,4 @@ +# Copyright 2025 André Auzi # Copyright 2011 - 2021 Patrick Ulbrich # Copyright 2020 Andreas Angerer # Copyright 2016, 2018, 2024 Timo Kankare @@ -27,9 +28,11 @@ import logging import hashlib +from io import StringIO from configparser import RawConfigParser from email.header import decode_header, make_header from email.message import Message +from email.generator import Generator from typing import Any, TYPE_CHECKING from Mailnag.common.i18n import _ from Mailnag.common.config import cfg_folder @@ -38,6 +41,28 @@ from Mailnag.common.accounts import Account +def message_text(msg: Message) -> str: + """Extract the text body of the given message. + The default method is to flatten the message, skip the header + and unfold the long lines. + """ + fp = StringIO() + g = Generator(fp) + g.flatten(msg) + + message = fp.getvalue().splitlines() + + # skip header + n = 0 + for line in message: + n += 1 + if not len(line): + break + + t = '\n'.join(message[n:]) + t.replace('=\n', '') + return t.strip() + # # Mail class # @@ -49,6 +74,7 @@ def __init__( sender: tuple[str, str], id: str, account: "Account", + uid: str | None, flags: dict[str, Any] ): self.datetime = datetime @@ -57,6 +83,10 @@ def __init__( self.account = account self.id = id self.flags = flags + self.uid = uid + + def fetch_text(self): + return self.account.fetch_text(self) # @@ -82,7 +112,7 @@ def collect_mail(self, sort: bool = True) -> list[Mail]: continue try: - for folder, msg, flags in acc.list_messages(): + for folder, msg, uid, flags in acc.list_messages(): sender, subject, datetime, msgid = self._get_header(msg) id = self._get_id(msgid, acc, folder, sender, subject, datetime) @@ -94,7 +124,7 @@ def collect_mail(self, sort: bool = True) -> list[Mail]: # Also filter duplicates caused by Gmail labels. if id not in mail_ids: mail_list.append(Mail(datetime, subject, - sender, id, acc, flags)) + sender, id, acc, uid, flags)) mail_ids[id] = None except Exception as ex: # Catch exceptions here, so remaining accounts will still be checked @@ -103,7 +133,7 @@ def collect_mail(self, sort: bool = True) -> list[Mail]: # Re-throw the exception for accounts that support notifications (i.e. imap IDLE), # so the calling idler thread can handle the error and reset the connection if needed (see idlers.py). # NOTE: Idler threads always check single accounts (i.e. len(self._accounts) == 1), - # so there are no remaining accounts to be checked for now. + # so there are no remaining accounts to be checked for now. if acc.supports_notifications(): raise else: diff --git a/Mailnag/plugins/garmin2FAplugin.py b/Mailnag/plugins/garmin2FAplugin.py index db60ef0..60121ee 100644 --- a/Mailnag/plugins/garmin2FAplugin.py +++ b/Mailnag/plugins/garmin2FAplugin.py @@ -194,9 +194,7 @@ def _notify_2FA(self, new_mails, all_mails): for mail in new_mails: sender = self._get_sender(mail) - uid = mail.flags['uid'] - backend = mail.flags['backend'] - body = backend.fetch_text(uid) + body = mail.fetch_text() logging.debug("garmin2FA: sender=%s, subject=%s, body:\n%s", sender, mail.subject, dbgindent(body)) From fbf90846d892970d930f920faf9c5bd99d69cdfa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Auzi?= Date: Tue, 11 Nov 2025 21:37:15 +0100 Subject: [PATCH 10/49] Remove garmin2FAplugin --- Mailnag/plugins/garmin2FAplugin.py | 330 ----------------------------- 1 file changed, 330 deletions(-) delete mode 100644 Mailnag/plugins/garmin2FAplugin.py diff --git a/Mailnag/plugins/garmin2FAplugin.py b/Mailnag/plugins/garmin2FAplugin.py deleted file mode 100644 index 60121ee..0000000 --- a/Mailnag/plugins/garmin2FAplugin.py +++ /dev/null @@ -1,330 +0,0 @@ -# Copyright 2025 André Auzi -# Copyright 2013 - 2020 Patrick Ulbrich -# Copyright 2020 Dan Christensen -# Copyright 2020 Denis Anuschewski -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, -# MA 02110-1301, USA. -# - -import gi - -gi.require_version('Notify', '0.7') -gi.require_version('GLib', '2.0') -gi.require_version('Gtk', '3.0') - -import os -import dbus -import threading -import logging -import re -from html.parser import HTMLParser - -from gi.repository import Notify, Gio, Gtk -from Mailnag.common.plugins import Plugin, HookTypes -from Mailnag.common.i18n import _ -from Mailnag.common.subproc import start_subprocess -from Mailnag.common.exceptions import InvalidOperationException -from Mailnag.common.utils import dbgindent - - -class HTML2FAParser(HTMLParser): - def __init__(self): - super().__init__() - - self._in_strong = False - self._data = '' - - def handle_starttag(self, tag, attrs): - if tag == 'strong': - self._in_strong = True - def handle_endtag(self, tag): - if tag == 'strong': - self._in_strong = False - def handle_data(self, data): - if not self._in_strong: - return - self._data += data - def get_passcode(self, text): - self.feed(text) - self.close() - - if not self._data: - return None - - return self._data - - -class Garmin2FAPlugin(Plugin): - def __init__(self): - # dict that tracks all notifications that need to be closed - self._notifications = {} - self._initialized = False - self._lock = threading.Lock() - self._notification_server_wait_event = threading.Event() - self._notification_server_ready = False - self._is_gnome = False - self._mails_added_hook = None - self._mails_removed_hook = None - - - def enable(self): - self._notification_server_wait_event.clear() - self._notification_server_ready = False - self._notifications = {} - - # initialize Notification - if not self._initialized: - Notify.init("Mailnag") - self._is_gnome = self._is_gnome_environment(('XDG_CURRENT_DESKTOP', 'GDMSESSION')) - self._initialized = True - - def mails_added_hook(new_mails, all_mails): - self._notify_async(new_mails, all_mails) - - self._mails_added_hook = mails_added_hook - - def mails_removed_hook(remaining_mails): - self._notify_async([], remaining_mails) - - self._mails_removed_hook = mails_removed_hook - - controller = self.get_mailnag_controller() - hooks = controller.get_hooks() - - hooks.register_hook_func(HookTypes.MAILS_ADDED, - self._mails_added_hook) - - hooks.register_hook_func(HookTypes.MAILS_REMOVED, - self._mails_removed_hook) - - def disable(self): - controller = self.get_mailnag_controller() - hooks = controller.get_hooks() - - if self._mails_added_hook != None: - hooks.unregister_hook_func(HookTypes.MAILS_ADDED, - self._mails_added_hook) - self._mails_added_hook = None - - if self._mails_removed_hook != None: - hooks.unregister_hook_func(HookTypes.MAILS_REMOVED, - self._mails_removed_hook) - self._mails_removed_hook = None - - # Abort possible notification server wait - self._notification_server_wait_event.set() - # Close all open notifications - # (must be called after _notification_server_wait_event.set() - # to prevent a possible deadlock) - self._close_notifications() - - - def get_manifest(self): - return (_("Garmin 2FA LibNotify Notifications"), - _("Shows a popup when Garmin 2FA mails arrive."), - "0.1", - "André Auzi ") - - - def get_default_config(self): - return {} - - - def has_config_ui(self): - return False - - - def get_config_ui(self): - return None - - - def load_ui_from_config(self, config_ui): - pass - - - def save_ui_to_config(self, config_ui): - pass - - - def _notify_async(self, new_mails, all_mails): - def thread(): - with self._lock: - # The desktop session may have started Mailnag - # before the libnotify dbus daemon. - if not self._notification_server_ready: - if not self._wait_for_notification_server(): - return - self._notification_server_ready = True - - self._notify_2FA(new_mails, all_mails) - - t = threading.Thread(target = thread) - t.start() - - - def _get_2FA_passcode(self, mail): - _parser = HTML2FAParser() - return _parser.get_passcode(mail) - - - def _notify_2FA(self, new_mails, all_mails): - # Remove notifications for messages not in all_mails: - for k, n in list(self._notifications.items()): - if hasattr(n, 'mail') and not (n.mail in all_mails): - # The user may have closed the notification: - try_close(n) - del self._notifications[k] - - # In single notification mode new mails are - # added to the *bottom* of the notification list. - new_mails.sort(key = lambda m: m.datetime, reverse = False) - - for mail in new_mails: - sender = self._get_sender(mail) - body = mail.fetch_text() - logging.debug("garmin2FA: sender=%s, subject=%s, body:\n%s", - sender, mail.subject, - dbgindent(body)) - - if (sender != 'Garmin' or - (mail.subject != 'Your Security Passcode' and - mail.subject != _('Your Security Passcode'))): - continue - - code = self._get_2FA_passcode(body) - if code is None: - continue - - logging.info("garmin2FA: passcode=%s", code) - - n = self._get_notification(self._get_sender(mail), - '{0}: {1}'.format(mail.subject, code), "mail-unread") - # Remember the associated message, so we know when to remove the notification: - n.mail = mail - notification_id = str(id(n)) - if self._is_gnome: - n.set_timeout(Notify.EXPIRES_NEVER) - n.set_urgency(Notify.Urgency.CRITICAL) - n.add_action("copy-code", _("📋 Code: {0}").format(code), - self._notification_action_handler, (mail, notification_id, code)) - n.show() - self._notifications[notification_id] = n - - - def _close_notifications(self): - with self._lock: - for n in self._notifications.values(): - try_close(n) - self._notifications = {} - - - def _get_notification(self, summary, body, icon): - n = Notify.Notification.new(summary, body, icon) - n.set_category("email") - n.set_hint_string("desktop-entry", "mailnag") - - if self._is_gnome: - n.add_action("default", "default", self._notification_action_handler, None) - - return n - - - def _wait_for_notification_server(self): - bus = dbus.SessionBus() - while not bus.name_has_owner('org.freedesktop.Notifications'): - self._notification_server_wait_event.wait(5) - if self._notification_server_wait_event.is_set(): - return False - return True - - - def _notification_action_handler(self, n, action, user_data): - with self._lock: - if action == "default": - mailclient = get_default_mail_reader() - if mailclient != None: - start_subprocess(mailclient) - - # clicking the notification bubble has closed all notifications - # so clear the reference array as well. - self._notifications = {} - elif action == "copy-code": - controller = self.get_mailnag_controller() - try: - try: - import subprocess - - code = user_data[2] - p = subprocess.Popen(['xclip', '-selection', 'c'], - stdin=subprocess.PIPE, - close_fds=True) - p.communicate(input=code.encode('utf-8')) - - logging.debug('xclip set text: %s', code) - except Exception as ex: - logging.error('xclip set text failed (%s)', str(ex)) - - controller.mark_mail_as_read(user_data[0].id) - except InvalidOperationException: - pass - - # clicking the action has closed the notification - # so remove its reference. - del self._notifications[user_data[1]] - - - def _get_sender(self, mail): - name, addr = mail.sender - if len(name) > 0: return name - else: return addr - - - def _prepend_new_mails(self, new_mails, all_mails): - # The mail list (all_mails) is sorted by date (mails with most recent - # date on top). New mails with no date or older mails that come in - # delayed won't be listed on top. So if a mail with no or an older date - # arrives, it gives the impression that the top most mail (i.e. the mail - # with the most recent date) is re-notified. - # To fix that, simply put new mails on top explicitly. - return new_mails + [m for m in all_mails if m not in new_mails] - - - def _is_gnome_environment(self, env_vars): - for var in env_vars: - if 'gnome' in os.environ.get(var, '').lower().split(':'): - return True - return False - - -def get_default_mail_reader(): - mail_reader = None - app_info = Gio.AppInfo.get_default_for_type ("x-scheme-handler/mailto", False) - - if app_info != None: - executable = Gio.AppInfo.get_executable(app_info) - - if (executable != None) and (len(executable) > 0): - mail_reader = executable - - return mail_reader - - -# If the user has closed the notification, an exception is raised. -def try_close(notification): - try: - notification.close() - except: - pass From 01fbffe523aa58590a00a7a200d0579f7a8d8094 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Auzi?= Date: Tue, 11 Nov 2025 21:37:56 +0100 Subject: [PATCH 11/49] Fix line continuation in message_text --- Mailnag/daemon/mails.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Mailnag/daemon/mails.py b/Mailnag/daemon/mails.py index a4c39fd..623011a 100644 --- a/Mailnag/daemon/mails.py +++ b/Mailnag/daemon/mails.py @@ -60,7 +60,7 @@ def message_text(msg: Message) -> str: break t = '\n'.join(message[n:]) - t.replace('=\n', '') + t = t.replace('=\n', '') return t.strip() # From 6630ce831c493e7889cbfeb4a4dee9c8fee29c97 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Auzi?= Date: Wed, 12 Nov 2025 05:44:36 +0100 Subject: [PATCH 12/49] Change _is_gnome into _is_supported_env --- Mailnag/plugins/libnotifyplugin.py | 32 ++++++++++++++++++------------ 1 file changed, 19 insertions(+), 13 deletions(-) diff --git a/Mailnag/plugins/libnotifyplugin.py b/Mailnag/plugins/libnotifyplugin.py index 502890f..bc7e209 100644 --- a/Mailnag/plugins/libnotifyplugin.py +++ b/Mailnag/plugins/libnotifyplugin.py @@ -42,6 +42,9 @@ NOTIFICATION_MODE_SUMMARY = '1' NOTIFICATION_MODE_SINGLE = '2' +DESKTOP_ENV_VARS_FOR_SUPPORT_TEST = ('XDG_CURRENT_DESKTOP', 'GDMSESSION') +SUPPORTED_DESKTOP_ENVIRONMENTS = ("gnome", "cinnamon") + plugin_defaults = { 'notification_mode' : NOTIFICATION_MODE_SHORT_SUMMARY, 'max_visible_mails' : '10' @@ -56,7 +59,7 @@ def __init__(self) -> None: self._lock = threading.Lock() self._notification_server_wait_event = threading.Event() self._notification_server_ready = False - self._is_gnome = False + self._is_supported_env = False self._mails_added_hook: Optional[Callable[[list[Mail], list[Mail]], None]] = None @@ -69,7 +72,7 @@ def enable(self) -> None: # initialize Notification if not self._initialized: Notify.init("Mailnagger") - self._is_gnome = self._is_gnome_environment(['XDG_CURRENT_DESKTOP', 'GDMSESSION']) + self._is_supported_env = self._is_supported_environment() self._initialized = True def mails_added_hook(new_mails: list[Mail], all_mails: list[Mail]) -> None: @@ -228,7 +231,7 @@ def _notify_short_summary(self, new_mails: list[Mail], all_mails: list[Mail]) -> n += 1 i += 1 - if self._is_gnome: + if self._is_supported_env: senders = "%s" % ", ".join(lst) else: senders = ", ".join(lst) @@ -258,13 +261,13 @@ def _notify_summary(self, new_mails: list[Mail], all_mails: list[Mail]) -> None: ubound = len(mails) if len(mails) <= self._max_mails else self._max_mails for i in range(ubound): - if self._is_gnome: + if self._is_supported_env: body += "%s:\n%s\n\n" % (self._get_sender(mails[i]), mails[i].subject) else: - body += "%s - %s\n" % (ellipsize(self._get_sender(mails[i]), 20), ellipsize(mails[i].subject, 20)) + body += "%s - %s\n" % (ellipsize(self._get_sender(mails[i]), 20), ellipsize(mails[i].subject, 20)) if len(mails) > self._max_mails: - if self._is_gnome: + if self._is_supported_env: body += "%s" % _("(and {0} more)").format(str(len(mails) - self._max_mails)) else: body += _("(and {0} more)").format(str(len(mails) - self._max_mails)) @@ -295,7 +298,7 @@ def _notify_single(self, new_mails, all_mails): # Remember the associated message, so we know when to remove the notification: n.mail = mail notification_id = str(id(n)) - if self._is_gnome: + if self._is_supported_env: n.add_action("mark-as-read", _("Mark as read"), self._notification_action_handler, (mail, notification_id)) n.show() @@ -332,7 +335,7 @@ def _get_notification( n.set_category("email") n.set_hint_string("desktop-entry", "mailnagger") - if self._is_gnome: + if self._is_supported_env: n.add_action("default", "default", self._notification_action_handler, None) return n @@ -386,14 +389,17 @@ def _prepend_new_mails(self, new_mails: list[Mail], all_mails: list[Mail]) -> li # delayed won't be listed on top. So if a mail with no or an older date # arrives, it gives the impression that the top most mail (i.e. the mail # with the most recent date) is re-notified. - # To fix that, simply put new mails on top explicitly. + # To fix that, simply put new mails on top explicitly. return new_mails + [m for m in all_mails if m not in new_mails] - def _is_gnome_environment(self, env_vars: list[str]) -> bool: - for var in env_vars: - if 'gnome' in os.environ.get(var, '').lower().split(':'): - return True + @staticmethod + def _is_supported_environment() -> bool: + for var in DESKTOP_ENV_VARS_FOR_SUPPORT_TEST: + desktop_env = os.environ.get(var, '').lower().split(':') + for env in SUPPORTED_DESKTOP_ENVIRONMENTS: + if env in desktop_env: + return True return False From 8d95d1d2e66e666d905392e18a069a7940c53926 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Auzi?= Date: Wed, 12 Nov 2025 05:48:19 +0100 Subject: [PATCH 13/49] Change mailclient get and launch --- Mailnag/plugins/libnotifyplugin.py | 17 ++--------------- 1 file changed, 2 insertions(+), 15 deletions(-) diff --git a/Mailnag/plugins/libnotifyplugin.py b/Mailnag/plugins/libnotifyplugin.py index bc7e209..fdf9064 100644 --- a/Mailnag/plugins/libnotifyplugin.py +++ b/Mailnag/plugins/libnotifyplugin.py @@ -358,9 +358,9 @@ def _notification_action_handler( ) -> None: with self._lock: if action == "default": - mailclient = get_default_mail_reader() + mailclient = Gio.AppInfo.get_default_for_type("x-scheme-handler/mailto", False) if mailclient is not None: - start_subprocess(mailclient) + Gio.AppInfo.launch(mailclient) # clicking the notification bubble has closed all notifications # so clear the reference array as well. @@ -403,19 +403,6 @@ def _is_supported_environment() -> bool: return False -def get_default_mail_reader() -> Optional[str]: - mail_reader: Optional[str] = None - app_info = Gio.AppInfo.get_default_for_type("x-scheme-handler/mailto", False) - - if app_info is not None: - executable = Gio.AppInfo.get_executable(app_info) - - if (executable != None) and (len(executable) > 0): - mail_reader = executable - - return mail_reader - - def ellipsize(str: str, max_len: int) -> str: if max_len < 3: max_len = 3 if len(str) <= max_len: From 6dd3b6642e6c5bb7dfcea77ab0a817f178231332 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Auzi?= Date: Wed, 12 Nov 2025 05:53:14 +0100 Subject: [PATCH 14/49] Nitpick on @staticmethod --- Mailnag/plugins/libnotifyplugin.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Mailnag/plugins/libnotifyplugin.py b/Mailnag/plugins/libnotifyplugin.py index fdf9064..a4e515f 100644 --- a/Mailnag/plugins/libnotifyplugin.py +++ b/Mailnag/plugins/libnotifyplugin.py @@ -376,14 +376,15 @@ def _notification_action_handler( # so remove its reference. del self._notifications[user_data[1]] - - def _get_sender(self, mail: Mail) -> str: + @staticmethod + def _get_sender(mail: Mail) -> str: name, addr = mail.sender if len(name) > 0: return name else: return addr - def _prepend_new_mails(self, new_mails: list[Mail], all_mails: list[Mail]) -> list[Mail]: + @staticmethod + def _prepend_new_mails(new_mails: list[Mail], all_mails: list[Mail]) -> list[Mail]: # The mail list (all_mails) is sorted by date (mails with most recent # date on top). New mails with no date or older mails that come in # delayed won't be listed on top. So if a mail with no or an older date @@ -392,7 +393,6 @@ def _prepend_new_mails(self, new_mails: list[Mail], all_mails: list[Mail]) -> li # To fix that, simply put new mails on top explicitly. return new_mails + [m for m in all_mails if m not in new_mails] - @staticmethod def _is_supported_environment() -> bool: for var in DESKTOP_ENV_VARS_FOR_SUPPORT_TEST: From 786a36d1dc8cf55244710a2ff2b65a49d10fb14e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Auzi?= Date: Wed, 12 Nov 2025 06:05:06 +0100 Subject: [PATCH 15/49] Implement basic 2FA processing feature --- Mailnag/plugins/libnotifyplugin.py | 279 ++++++++++++++++++++--------- 1 file changed, 198 insertions(+), 81 deletions(-) diff --git a/Mailnag/plugins/libnotifyplugin.py b/Mailnag/plugins/libnotifyplugin.py index a4e515f..a88b11e 100644 --- a/Mailnag/plugins/libnotifyplugin.py +++ b/Mailnag/plugins/libnotifyplugin.py @@ -1,3 +1,4 @@ +# Copyright 2025 André Auzi # Copyright 2024 Timo Kankare # Copyright 2013 - 2020 Patrick Ulbrich # Copyright 2020 Dan Christensen @@ -28,6 +29,9 @@ import os import dbus import threading +import re +from subprocess import Popen, PIPE +import logging from collections.abc import Callable from typing import Any, Optional from gi.repository import Notify, Gio, Gtk @@ -36,6 +40,7 @@ from Mailnag.common.subproc import start_subprocess from Mailnag.common.exceptions import InvalidOperationException from Mailnag.daemon.mails import Mail +from Mailnag.common.utils import dbgindent NOTIFICATION_MODE_COUNT = '0' NOTIFICATION_MODE_SHORT_SUMMARY = '3' @@ -45,9 +50,15 @@ DESKTOP_ENV_VARS_FOR_SUPPORT_TEST = ('XDG_CURRENT_DESKTOP', 'GDMSESSION') SUPPORTED_DESKTOP_ENVIRONMENTS = ("gnome", "cinnamon") -plugin_defaults = { +plugin_defaults = { 'notification_mode' : NOTIFICATION_MODE_SHORT_SUMMARY, - 'max_visible_mails' : '10' + 'max_visible_mails' : '10', + '2FA_notifications' : True, + '2FA_providers': [ + # sender, subject, body text re + ('Garmin', 'Your Security Passcode', r']*>(?P\d+)'), + ('Garmin', _('Your Security Passcode'), r']*>(?P\d+)'), + ], } @@ -61,61 +72,61 @@ def __init__(self) -> None: self._notification_server_ready = False self._is_supported_env = False self._mails_added_hook: Optional[Callable[[list[Mail], list[Mail]], None]] = None - - + + def enable(self) -> None: self._max_mails = int(self.get_config()['max_visible_mails']) self._notification_server_wait_event.clear() self._notification_server_ready = False self._notifications = {} - + # initialize Notification if not self._initialized: Notify.init("Mailnagger") self._is_supported_env = self._is_supported_environment() self._initialized = True - + def mails_added_hook(new_mails: list[Mail], all_mails: list[Mail]) -> None: self._notify_async(new_mails, all_mails) - + self._mails_added_hook = mails_added_hook - + def mails_removed_hook(remaining_mails: list[Mail]) -> None: self._notify_async([], remaining_mails) - + self._mails_removed_hook: Optional[Callable[[list[Mail]], None]] = mails_removed_hook - + controller = self.get_mailnag_controller() hooks = controller.get_hooks() - - hooks.register_hook_func(HookTypes.MAILS_ADDED, + + hooks.register_hook_func(HookTypes.MAILS_ADDED, self._mails_added_hook) - + hooks.register_hook_func(HookTypes.MAILS_REMOVED, self._mails_removed_hook) - + def disable(self) -> None: controller = self.get_mailnag_controller() hooks = controller.get_hooks() - + if self._mails_added_hook is not None: hooks.unregister_hook_func(HookTypes.MAILS_ADDED, self._mails_added_hook) self._mails_added_hook = None - + if self._mails_removed_hook is not None: hooks.unregister_hook_func(HookTypes.MAILS_REMOVED, self._mails_removed_hook) self._mails_removed_hook = None - + # Abort possible notification server wait self._notification_server_wait_event.set() - # Close all open notifications - # (must be called after _notification_server_wait_event.set() + # Close all open notifications + # (must be called after _notification_server_wait_event.set() # to prevent a possible deadlock) self._close_notifications() - + def get_manifest(self) -> tuple[str, str, str, str]: return (_("LibNotify Notifications"), _("Shows a popup when new mails arrive."), @@ -125,16 +136,16 @@ def get_manifest(self) -> tuple[str, str, str, str]: def get_default_config(self) -> dict[str, Any]: return plugin_defaults - - + + def has_config_ui(self) -> bool: return True - - + + def get_config_ui(self) -> Gtk.Box: radio_mapping = [ (NOTIFICATION_MODE_COUNT, Gtk.RadioButton(label = _('Count of new mails'))), - (NOTIFICATION_MODE_SHORT_SUMMARY, Gtk.RadioButton(label = _('Short summary of new mails'))), + (NOTIFICATION_MODE_SHORT_SUMMARY, Gtk.RadioButton(label = _('Short summary of new mails'))), (NOTIFICATION_MODE_SUMMARY, Gtk.RadioButton(label = _('Detailed summary of new mails'))), (NOTIFICATION_MODE_SINGLE, Gtk.RadioButton(label = _('One notification per new mail'))) ] @@ -142,39 +153,39 @@ def get_config_ui(self) -> Gtk.Box: box = Gtk.Box() box.set_spacing(12) box.set_orientation(Gtk.Orientation.VERTICAL) - + label = Gtk.Label() label.set_markup('%s' % _('Notification mode:')) label.set_alignment(0.0, 0.0) box.pack_start(label, False, False, 0) - + inner_box = Gtk.Box() inner_box.set_spacing(6) inner_box.set_orientation(Gtk.Orientation.VERTICAL) - + last_radio = None for m, r in radio_mapping: if last_radio != None: r.join_group(last_radio) inner_box.pack_start(r, False, False, 0) last_radio = r - + alignment = Gtk.Alignment() alignment.set_padding(0, 6, 18, 0) alignment.add(inner_box) box.pack_start(alignment, False, False, 0) - + self._radio_mapping = radio_mapping - + return box - - + + def load_ui_from_config(self, config_ui: Gtk.Widget) -> None: - config = self.get_config() + config = self.get_config() radio = [r for m, r in self._radio_mapping if m == config['notification_mode']][0] radio.set_active(True) - - + + def save_ui_to_config(self, config_ui: Gtk.Widget) -> None: config = self.get_config() mode = [m for m, r in self._radio_mapping if r.get_active()][0] @@ -184,17 +195,19 @@ def save_ui_to_config(self, config_ui: Gtk.Widget) -> None: def _notify_async(self, new_mails: list[Mail], all_mails: list[Mail]) -> None: def thread() -> None: with self._lock: - # The desktop session may have started Mailnag + # The desktop session may have started Mailnag # before the libnotify dbus daemon. if not self._notification_server_ready: if not self._wait_for_notification_server(): return self._notification_server_ready = True - + config = self.get_config() + if config['notification_mode'] == NOTIFICATION_MODE_SINGLE: self._notify_single(new_mails, all_mails) else: + self._notify_2FA_attempts(new_mails, all_mails) if len(all_mails) == 0: if '0' in self._notifications: # The user may have closed the notification: @@ -207,21 +220,21 @@ def thread() -> None: self._notify_short_summary(new_mails, all_mails) elif config['notification_mode'] == NOTIFICATION_MODE_SUMMARY: self._notify_summary(new_mails, all_mails) - + t = threading.Thread(target = thread) t.start() - - + + def _notify_short_summary(self, new_mails: list[Mail], all_mails: list[Mail]) -> None: summary = "" body = "" lst = [] mails = self._prepend_new_mails(new_mails, all_mails) mail_count = len(mails) - - if len(self._notifications) == 0: + + if '0' not in self._notifications: self._notifications['0'] = self._get_notification(" ", None, None) # empty string will emit a gtk warning - + i = 0 n = 0 while (n < 3) and (i < mail_count): @@ -230,12 +243,12 @@ def _notify_short_summary(self, new_mails: list[Mail], all_mails: list[Mail]) -> lst.append(s) n += 1 i += 1 - + if self._is_supported_env: senders = "%s" % ", ".join(lst) else: senders = ", ".join(lst) - + if mail_count > 1: summary = _("{0} new mails").format(str(mail_count)) if (mail_count - i) > 1: @@ -245,17 +258,17 @@ def _notify_short_summary(self, new_mails: list[Mail], all_mails: list[Mail]) -> else: summary = _("New mail") body = _("from {0}.").format(senders) - + self._notifications['0'].update(summary, body, "mail-unread") self._notifications['0'].show() - - + + def _notify_summary(self, new_mails: list[Mail], all_mails: list[Mail]) -> None: summary = "" body = "" mails = self._prepend_new_mails(new_mails, all_mails) - - if len(self._notifications) == 0: + + if '0' not in self._notifications: self._notifications['0'] = self._get_notification(" ", None, None) # empty string will emit a gtk warning ubound = len(mails) if len(mails) <= self._max_mails else self._max_mails @@ -279,9 +292,82 @@ def _notify_summary(self, new_mails: list[Mail], all_mails: list[Mail]) -> None: self._notifications['0'].update(summary, body, "mail-unread") self._notifications['0'].show() - - - def _notify_single(self, new_mails, all_mails): + + + def _notify_2FA_attempts(self, new_mails, all_mails) -> None: + self._cleanup_notifications_not_in(all_mails) + + # In single notification mode new mails are + # added to the *bottom* of the notification list. + new_mails.sort(key = lambda m: m.datetime, reverse = False) + + config = self.get_config() + + if not config['2FA_notifications']: + return + + providers = config['2FA_providers'] + if not len(providers): + return + + for mail in new_mails: + self._notify_2FA_attempt(mail, providers) + + + def _notify_2FA_attempt(self, mail, providers) -> bool: + sender = self._get_sender(mail) + subject = mail.subject + body = None + + for p in providers: + if (sender == p[0] and subject == p[1]): + logging.debug("2FA pre-matched : sender=%s, subject=%s", + sender, subject) + + # fetch the body text only when send and subject match + # but only once (different regexps may work) + if body is None: + body = mail.fetch_text() + #pipe = Popen(['grep', '-C', '4', '-e', ' None: + # Remember the associated message, so we know when to remove the notification: + n.mail = mail + notification_id = str(id(n)) + self._notifications[notification_id] = n + + + def _cleanup_notifications_not_in(self, all_mails) -> None: # Remove notifications for messages not in all_mails: for k, n in list(self._notifications.items()): if hasattr(n, 'mail') and not (n.mail in all_mails): @@ -289,42 +375,54 @@ def _notify_single(self, new_mails, all_mails): try_close(n) del self._notifications[k] + + def _notify_single(self, new_mails, all_mails): + self._cleanup_notifications_not_in(all_mails) + # In single notification mode new mails are # added to the *bottom* of the notification list. new_mails.sort(key = lambda m: m.datetime, reverse = False) - + + config = self.get_config() + providers = None + + if config['2FA_notifications']: + providers = config['2FA_providers'] + for mail in new_mails: + if (providers is not None and + self._notify_2FA_attempt(mail, providers)): + continue + n = self._get_notification(self._get_sender(mail), mail.subject, "mail-unread") - # Remember the associated message, so we know when to remove the notification: - n.mail = mail notification_id = str(id(n)) if self._is_supported_env: - n.add_action("mark-as-read", _("Mark as read"), - self._notification_action_handler, (mail, notification_id)) + n.add_action("mark-as-read", _("Mark as read"), + self._notification_action_handler, (mail, notification_id)) n.show() - self._notifications[notification_id] = n + self._record_mail_notification(mail, n) def _notify_count(self, count: int) -> None: - if len(self._notifications) == 0: + if '0' not in self._notifications: self._notifications['0'] = self._get_notification(" ", None, None) # empty string will emit a gtk warning - + if count > 1: # multiple new emails summary = _("{0} new mails").format(str(count)) else: summary = _("New mail") - + self._notifications['0'].update(summary, None, "mail-unread") self._notifications['0'].show() - - + + def _close_notifications(self) -> None: with self._lock: for n in self._notifications.values(): try_close(n) self._notifications = {} - - + + def _get_notification( self, summary: str, @@ -334,13 +432,13 @@ def _get_notification( n = Notify.Notification.new(summary, body, icon) n.set_category("email") n.set_hint_string("desktop-entry", "mailnagger") - + if self._is_supported_env: n.add_action("default", "default", self._notification_action_handler, None) return n - - + + def _wait_for_notification_server(self) -> bool: bus = dbus.SessionBus() while not bus.name_has_owner('org.freedesktop.Notifications'): @@ -349,7 +447,7 @@ def _wait_for_notification_server(self) -> bool: return False return True - + def _notification_action_handler( self, n: Notify.Notification, @@ -363,7 +461,7 @@ def _notification_action_handler( Gio.AppInfo.launch(mailclient) # clicking the notification bubble has closed all notifications - # so clear the reference array as well. + # so clear the reference array as well. self._notifications = {} elif action == "mark-as-read": controller = self.get_mailnag_controller() @@ -371,26 +469,45 @@ def _notification_action_handler( controller.mark_mail_as_read(user_data[0].id) except InvalidOperationException: pass - + # clicking the action has closed the notification # so remove its reference. del self._notifications[user_data[1]] - + elif action == "copy-code": + controller = self.get_mailnag_controller() + try: + code = user_data[2] + try: + pipe = Popen(['xclip', '-selection', 'c'], + stdin=PIPE, + close_fds=True) + pipe.communicate(input=code.encode('utf-8')) + logging.debug('xclip set text:%s', code) + except: + logging.exception('xclip set text failed.') + + controller.mark_mail_as_read(user_data[0].id) + except InvalidOperationException: + pass + + # clicking the action has closed the notification + # so remove its reference. + del self._notifications[user_data[1]] + @staticmethod def _get_sender(mail: Mail) -> str: name, addr = mail.sender if len(name) > 0: return name else: return addr - - + @staticmethod def _prepend_new_mails(new_mails: list[Mail], all_mails: list[Mail]) -> list[Mail]: - # The mail list (all_mails) is sorted by date (mails with most recent - # date on top). New mails with no date or older mails that come in - # delayed won't be listed on top. So if a mail with no or an older date - # arrives, it gives the impression that the top most mail (i.e. the mail + # The mail list (all_mails) is sorted by date (mails with most recent + # date on top). New mails with no date or older mails that come in + # delayed won't be listed on top. So if a mail with no or an older date + # arrives, it gives the impression that the top most mail (i.e. the mail # with the most recent date) is re-notified. - # To fix that, simply put new mails on top explicitly. + # To fix that, simply put new mails on top explicitly. return new_mails + [m for m in all_mails if m not in new_mails] @staticmethod From db899b75b5e749f7bfe85eb25620ba92a444f180 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Auzi?= Date: Wed, 12 Nov 2025 07:57:18 +0100 Subject: [PATCH 16/49] Allow 2FA notif. only (mode silent) --- Mailnag/plugins/libnotifyplugin.py | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/Mailnag/plugins/libnotifyplugin.py b/Mailnag/plugins/libnotifyplugin.py index a88b11e..ddb3816 100644 --- a/Mailnag/plugins/libnotifyplugin.py +++ b/Mailnag/plugins/libnotifyplugin.py @@ -46,6 +46,7 @@ NOTIFICATION_MODE_SHORT_SUMMARY = '3' NOTIFICATION_MODE_SUMMARY = '1' NOTIFICATION_MODE_SINGLE = '2' +NOTIFICATION_MODE_SILENT = '4' DESKTOP_ENV_VARS_FOR_SUPPORT_TEST = ('XDG_CURRENT_DESKTOP', 'GDMSESSION') SUPPORTED_DESKTOP_ENVIRONMENTS = ("gnome", "cinnamon") @@ -147,7 +148,8 @@ def get_config_ui(self) -> Gtk.Box: (NOTIFICATION_MODE_COUNT, Gtk.RadioButton(label = _('Count of new mails'))), (NOTIFICATION_MODE_SHORT_SUMMARY, Gtk.RadioButton(label = _('Short summary of new mails'))), (NOTIFICATION_MODE_SUMMARY, Gtk.RadioButton(label = _('Detailed summary of new mails'))), - (NOTIFICATION_MODE_SINGLE, Gtk.RadioButton(label = _('One notification per new mail'))) + (NOTIFICATION_MODE_SINGLE, Gtk.RadioButton(label = _('One notification per new mail'))), + (NOTIFICATION_MODE_SILENT, Gtk.RadioButton(label = _('Only 2FA notification, when enabled'))) ] box = Gtk.Box() @@ -204,7 +206,9 @@ def thread() -> None: config = self.get_config() - if config['notification_mode'] == NOTIFICATION_MODE_SINGLE: + if config['notification_mode'] == NOTIFICATION_MODE_SILENT: + self._notify_2FA_attempts(new_mails, all_mails) + elif config['notification_mode'] == NOTIFICATION_MODE_SINGLE: self._notify_single(new_mails, all_mails) else: self._notify_2FA_attempts(new_mails, all_mails) From 88b09d5e32943fa78faf49b8635ea4b04442d448 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Auzi?= Date: Fri, 14 Nov 2025 06:19:53 +0100 Subject: [PATCH 17/49] Add 2FA provider enable --- Mailnag/plugins/libnotifyplugin.py | 56 +++++++++++++++++------------- 1 file changed, 31 insertions(+), 25 deletions(-) diff --git a/Mailnag/plugins/libnotifyplugin.py b/Mailnag/plugins/libnotifyplugin.py index ddb3816..58e28fe 100644 --- a/Mailnag/plugins/libnotifyplugin.py +++ b/Mailnag/plugins/libnotifyplugin.py @@ -56,9 +56,9 @@ 'max_visible_mails' : '10', '2FA_notifications' : True, '2FA_providers': [ - # sender, subject, body text re - ('Garmin', 'Your Security Passcode', r']*>(?P\d+)'), - ('Garmin', _('Your Security Passcode'), r']*>(?P\d+)'), + # enabled, sender, subject, pattern + (True, 'Garmin', 'Your Security Passcode', r']*>(?P\d+)'), + (True, 'Garmin', _('Your Security Passcode'), r']*>(?P\d+)'), ], } @@ -178,7 +178,6 @@ def get_config_ui(self) -> Gtk.Box: box.pack_start(alignment, False, False, 0) self._radio_mapping = radio_mapping - return box @@ -323,27 +322,34 @@ def _notify_2FA_attempt(self, mail, providers) -> bool: subject = mail.subject body = None - for p in providers: - if (sender == p[0] and subject == p[1]): - logging.debug("2FA pre-matched : sender=%s, subject=%s", - sender, subject) - - # fetch the body text only when send and subject match - # but only once (different regexps may work) - if body is None: - body = mail.fetch_text() - #pipe = Popen(['grep', '-C', '4', '-e', ' Date: Sun, 16 Nov 2025 17:07:14 +0100 Subject: [PATCH 18/49] Add libnotifyplugin configuration ui for 2FA notifications --- Mailnag/plugins/libnotifyplugin.py | 238 ++++++++++--- Mailnag/plugins/libnotifyplugin.ui | 524 +++++++++++++++++++++++++++++ 2 files changed, 720 insertions(+), 42 deletions(-) create mode 100644 Mailnag/plugins/libnotifyplugin.ui diff --git a/Mailnag/plugins/libnotifyplugin.py b/Mailnag/plugins/libnotifyplugin.py index 58e28fe..9a2a2ea 100644 --- a/Mailnag/plugins/libnotifyplugin.py +++ b/Mailnag/plugins/libnotifyplugin.py @@ -48,21 +48,20 @@ NOTIFICATION_MODE_SINGLE = '2' NOTIFICATION_MODE_SILENT = '4' + DESKTOP_ENV_VARS_FOR_SUPPORT_TEST = ('XDG_CURRENT_DESKTOP', 'GDMSESSION') SUPPORTED_DESKTOP_ENVIRONMENTS = ("gnome", "cinnamon") plugin_defaults = { 'notification_mode' : NOTIFICATION_MODE_SHORT_SUMMARY, 'max_visible_mails' : '10', - '2FA_notifications' : True, - '2FA_providers': [ - # enabled, sender, subject, pattern + '2fa_notifications' : True, + '2fa_providers': [ (True, 'Garmin', 'Your Security Passcode', r']*>(?P\d+)'), (True, 'Garmin', _('Your Security Passcode'), r']*>(?P\d+)'), ], } - class LibNotifyPlugin(Plugin): def __init__(self) -> None: # dict that tracks all notifications that need to be closed @@ -141,56 +140,81 @@ def get_default_config(self) -> dict[str, Any]: def has_config_ui(self) -> bool: return True - - def get_config_ui(self) -> Gtk.Box: - radio_mapping = [ - (NOTIFICATION_MODE_COUNT, Gtk.RadioButton(label = _('Count of new mails'))), - (NOTIFICATION_MODE_SHORT_SUMMARY, Gtk.RadioButton(label = _('Short summary of new mails'))), - (NOTIFICATION_MODE_SUMMARY, Gtk.RadioButton(label = _('Detailed summary of new mails'))), - (NOTIFICATION_MODE_SINGLE, Gtk.RadioButton(label = _('One notification per new mail'))), - (NOTIFICATION_MODE_SILENT, Gtk.RadioButton(label = _('Only 2FA notification, when enabled'))) - ] - - box = Gtk.Box() - box.set_spacing(12) - box.set_orientation(Gtk.Orientation.VERTICAL) - - label = Gtk.Label() + builder = Gtk.Builder() + + builder.add_from_file( os.path.splitext(__file__)[0]+'.ui') + + radio_id_mapping = { + NOTIFICATION_MODE_COUNT: 'notification_mode_count', + NOTIFICATION_MODE_SHORT_SUMMARY: 'notification_mode_short_summary', + NOTIFICATION_MODE_SUMMARY: 'notification_mode_summary', + NOTIFICATION_MODE_SINGLE: 'notification_mode_single', + NOTIFICATION_MODE_SILENT: 'notification_2FA_only', + } + + radio_mapping = [] + + for mode in [NOTIFICATION_MODE_COUNT, + NOTIFICATION_MODE_SHORT_SUMMARY, + NOTIFICATION_MODE_SUMMARY, + NOTIFICATION_MODE_SINGLE, + NOTIFICATION_MODE_SILENT, + ]: + radio_btn = builder.get_object(radio_id_mapping[mode]) + radio_mapping.append((mode, radio_btn)) + + label = builder.get_object('notification_modes') label.set_markup('%s' % _('Notification mode:')) - label.set_alignment(0.0, 0.0) - box.pack_start(label, False, False, 0) - - inner_box = Gtk.Box() - inner_box.set_spacing(6) - inner_box.set_orientation(Gtk.Orientation.VERTICAL) - - last_radio = None - for m, r in radio_mapping: - if last_radio != None: - r.join_group(last_radio) - inner_box.pack_start(r, False, False, 0) - last_radio = r - - alignment = Gtk.Alignment() - alignment.set_padding(0, 6, 18, 0) - alignment.add(inner_box) - box.pack_start(alignment, False, False, 0) + builder.connect_signals({ + 'close': self._on_close, + 'btn_cancel_clicked': self._on_btn_cancel_clicked, + 'btn_ok_clicked': self._on_btn_ok_clicked, + 'btn_add_provider_clicked': self._on_btn_add_provider_clicked, + 'btn_remove_provider_clicked': self._on_btn_remove_provider_clicked, + 'btn_edit_provider_clicked': self._on_btn_edit_provider_clicked, + 'provider_toggled': self._on_provider_toggled, + 'provider_row_activated': self._on_provider_row_activated, + }) + + self._builder = builder self._radio_mapping = radio_mapping - return box + self._dialog = builder.get_object('edit_2FA_provider_dialog') + self._switch_2FA_notifications = builder.get_object('switch_2FA_notifications') + self._liststore_2FA_providers = builder.get_object('liststore_2FA_providers') + self._treeview_2FA_providers = builder.get_object('treeview_2FA_providers') + return builder.get_object('box1') + + @staticmethod + def _eval_2fa_providers(providers): + if isinstance(providers,list): + return providers + if not isinstance(providers,str): + return [] + return eval(providers) def load_ui_from_config(self, config_ui: Gtk.Widget) -> None: config = self.get_config() radio = [r for m, r in self._radio_mapping if m == config['notification_mode']][0] radio.set_active(True) + self._switch_2FA_notifications.set_active(config['2fa_notifications']) + providers = self._eval_2fa_providers(config['2fa_providers']) + for (_enabled, _sender, _subject, _pattern) in providers: + self._liststore_2FA_providers.append([_enabled, _sender, _subject, _pattern]) def save_ui_to_config(self, config_ui: Gtk.Widget) -> None: config = self.get_config() mode = [m for m, r in self._radio_mapping if r.get_active()][0] config['notification_mode'] = mode + config['2fa_notifications'] = self._switch_2FA_notifications.get_active() + providers = [] + for row in self._liststore_2FA_providers: + providers.append(tuple(row)) + config['2fa_providers']=providers + def _notify_async(self, new_mails: list[Mail], all_mails: list[Mail]) -> None: @@ -306,10 +330,10 @@ def _notify_2FA_attempts(self, new_mails, all_mails) -> None: config = self.get_config() - if not config['2FA_notifications']: + if not config['2fa_notifications']: return - providers = config['2FA_providers'] + providers = self._eval_2fa_providers(config['2fa_providers']) if not len(providers): return @@ -396,8 +420,8 @@ def _notify_single(self, new_mails, all_mails): config = self.get_config() providers = None - if config['2FA_notifications']: - providers = config['2FA_providers'] + if config['2fa_notifications']: + providers = self._eval_2fa_providers(config['2fa_providers']) for mail in new_mails: if (providers is not None and @@ -530,6 +554,136 @@ def _is_supported_environment() -> bool: return False + + + def _on_close(self, widget): + logging.debug('on_close') + self._dialog.hide() + self._dialog.response(Gtk.ResponseType.CLOSE) + + + def _on_btn_cancel_clicked(self, widget): + logging.debug('on_btn_cancel_clicked') + self._dialog.hide() + self._dialog.response(Gtk.ResponseType.CANCEL) + + + def _on_btn_ok_clicked(self, widget): + logging.debug('on_btn_ok_clicked') + self._dialog.hide() + self._dialog.response(Gtk.ResponseType.OK) + + + def _on_btn_add_provider_clicked(self, widget): + logging.debug('on_btn_add_provider_clicked') + b = self._builder + d = self._dialog + + b.get_object('enable').set_active(False) + b.get_object('sender').set_text('') + b.get_object('subject').set_text('') + b.get_object('pattern').set_text('') + + if d.run() != Gtk.ResponseType.OK: + return + row = [b.get_object('enable').get_active(), + b.get_object('sender').get_text(), + b.get_object('subject').get_text(), + b.get_object('pattern').get_text()] + + iter = self._liststore_2FA_providers.append(row) + model = self._treeview_2FA_providers.get_model() + path = model.get_path(iter) + self._treeview_2FA_providers.set_cursor(path, None, False) + self._treeview_2FA_providers.grab_focus() + + + def _get_selected_provider(self): + treeselection = self._treeview_2FA_providers.get_selection() + selection = treeselection.get_selected() + model, iter = selection + sender = None + subject = None + pattern = None + if iter != None: + sender = model.get_value(iter, 1) + subject = model.get_value(iter, 2) + pattern = model.get_value(iter, 3) + return sender, subject, pattern, model, iter + + + def _show_confirmation_dialog(self, text): + message = Gtk.MessageDialog(None, Gtk.DialogFlags.MODAL, + Gtk.MessageType.QUESTION, Gtk.ButtonsType.YES_NO, text) + resp = message.run() + message.destroy() + if resp == Gtk.ResponseType.YES: return True + else: return False + + + def _on_btn_remove_provider_clicked(self, widget): + logging.debug('on_btn_remove_provider_clicked') + sender, subject, pattern, model, iter = self._get_selected_provider() + if (iter is None + or not self._show_confirmation_dialog( + _('Delete this provider:') + '\n' + + '\n' + _("Sender:") + sender + + '\n' + _("Subject:") + subject + + '\n' + _("Pattern:") + + '\n' + pattern)): + return + + # select prev/next account + p = model.get_path(iter) + if not p.prev(): + p.next() + + treeselection = self._treeview_2FA_providers.get_selection() + treeselection.select_path(p) + self._treeview_2FA_providers.grab_focus() + + # remove from treeview + model.remove(iter) + + + def _edit_provider(self): + sender, suject, pattern, model, iter = self._get_selected_provider() + if iter is None: + return + + b = self._builder + d = self._dialog + + b.get_object('enable').set_active(model.get_value(iter, 0)) + b.get_object('sender').set_text(model.get_value(iter, 1)) + b.get_object('subject').set_text(model.get_value(iter, 2)) + b.get_object('pattern').set_text(model.get_value(iter, 3)) + + if d.run() != Gtk.ResponseType.OK: + return + + model.set_value(iter, 0, b.get_object('enable').get_active()) + model.set_value(iter, 1, b.get_object('sender').get_text()) + model.set_value(iter, 2, b.get_object('subject').get_text()) + model.set_value(iter, 3, b.get_object('pattern').get_text()) + + + def _on_btn_edit_provider_clicked(self, widget): + logging.debug('on_btn_edit_provider_clicked') + self._edit_provider() + + + def _on_provider_toggled(self, cell, path): + logging.debug('on_provider_toggled') + model = self._liststore_2FA_providers + iter = model.get_iter(path) + self._liststore_2FA_providers.set_value(iter, 0, not cell.get_active()) + + + def _on_provider_row_activated(self, view, path, column): + logging.debug('on_provider_row_activated') + + def ellipsize(str: str, max_len: int) -> str: if max_len < 3: max_len = 3 if len(str) <= max_len: diff --git a/Mailnag/plugins/libnotifyplugin.ui b/Mailnag/plugins/libnotifyplugin.ui new file mode 100644 index 0000000..119cc0a --- /dev/null +++ b/Mailnag/plugins/libnotifyplugin.ui @@ -0,0 +1,524 @@ + + + + + + False + True + True + text-editor-symbolic + dialog + + + + False + 12 + True + True + vertical + 2 + + + True + False + end + + + gtk-cancel + True + False + False + True + + + + True + True + 0 + + + + + gtk-ok + True + False + True + False + True + + + + True + True + 1 + + + + + False + False + 2 + + + + + + True + False + 12 + 12 + + + True + False + end + Sender: + + + 0 + 0 + + + + + True + True + 6 + 6 + True + Sender + + + 1 + 0 + + + + + True + False + end + Subject: + + + 0 + 1 + + + + + True + True + 6 + 6 + True + Subject + + + 1 + 1 + + + + + True + False + end + Pattern: + + + 0 + 2 + + + + + + + + True + True + 0 + + + + + True + True + 24 + 6 + 24 + 6 + True + True + Pattern + + + False + True + 1 + + + + + True + False + 6 + 6 + + + False + True + 3 + + + + + + button1 + button2 + + + + True + False + Edit 2FA provider + + + switch_enable_provider + True + True + Enable provider + + + + + + button1 + button2 + + + + + + + + + + + + + + + + True + False + vertical + 12 + + + True + False + start + <b>Notification modes:</b> + True + + + False + True + 0 + + + + + True + False + 18 + 6 + vertical + 6 + + + Count of new mails + False + False + False + True + + + False + True + 0 + + + + + Short summary of new mails + False + False + True + notification_mode_count + + + False + True + 1 + + + + + Detailed summary of new mails + False + False + True + notification_mode_count + + + False + True + 2 + + + + + One notification per new mail + False + False + True + notification_mode_count + + + False + True + 3 + + + + + Only 2FA notification, when enabled + False + False + True + notification_mode_count + + + False + True + 4 + + + + + False + True + 1 + + + + + True + False + True + True + + + True + False + vertical + + + True + True + in + + + True + True + False + True + True + liststore_2FA_providers + False + False + 1 + True + + + + + + + Enabled + + + + + + 0 + + + + + + + True + autosize + Sender + + + + 1 + + + + + + + True + Subject + + + + 2 + + + + + + + True + autosize + Pattern + + + + 3 + + + + + + + + + True + True + 0 + + + + + True + False + + + True + False + icons + False + 1 + + + True + False + Add 2FA Provider + list-add-symbolic + + + + False + True + + + + + True + False + Remove 2FA Provider + list-remove-symbolic + + + + False + True + + + + + True + False + Edit 2FA Provider + text-editor-symbolic + + + + False + True + + + + + + False + True + 0 + + + + + True + True + end + 6 + 6 + 2FA notifications + right + + + True + True + 2 + + + + + True + True + Enable/disable libnotify 2FA processing + end + center + 3 + + + False + False + 3 + + + + + False + False + end + 1 + + + + + + + False + 2FA providers + + + + + True + True + 2 + + + + From 0a981b023025da184a999e2fc7822dcc62726a01 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Auzi?= Date: Sun, 16 Nov 2025 17:46:23 +0100 Subject: [PATCH 19/49] Update translations (fr only) --- Mailnag/plugins/libnotifyplugin.py | 2 + gen_po_template | 7 +- po/bg.po | 334 +++++++++++++++++----------- po/ca.po | 334 +++++++++++++++++----------- po/cs.po | 338 +++++++++++++++++----------- po/de.po | 340 +++++++++++++++++----------- po/es.po | 344 ++++++++++++++++++----------- po/fi.po | 338 +++++++++++++++++----------- po/fr.po | 335 ++++++++++++++++------------ po/gl.po | 338 +++++++++++++++++----------- po/hr.po | 344 ++++++++++++++++++----------- po/id.po | 334 +++++++++++++++++----------- po/it.po | 344 ++++++++++++++++++----------- po/mailnagger.pot | 278 ++++++++++++++--------- po/pl.po | 338 +++++++++++++++++----------- po/pt.po | 340 +++++++++++++++++----------- po/pt_BR.po | 340 +++++++++++++++++----------- po/ru.po | 344 ++++++++++++++++++----------- po/sr.po | 332 +++++++++++++++++----------- po/sv.po | 336 +++++++++++++++++----------- po/tr.po | 338 +++++++++++++++++----------- po/uk.po | 342 +++++++++++++++++----------- po/zh_CN.po | 332 +++++++++++++++++----------- po/zh_TW.po | 334 +++++++++++++++++----------- 24 files changed, 4495 insertions(+), 2891 deletions(-) diff --git a/Mailnag/plugins/libnotifyplugin.py b/Mailnag/plugins/libnotifyplugin.py index 9a2a2ea..3b0b0ed 100644 --- a/Mailnag/plugins/libnotifyplugin.py +++ b/Mailnag/plugins/libnotifyplugin.py @@ -35,6 +35,7 @@ from collections.abc import Callable from typing import Any, Optional from gi.repository import Notify, Gio, Gtk +from Mailnag.common.dist_cfg import PACKAGE_NAME from Mailnag.common.plugins import Plugin, HookTypes from Mailnag.common.i18n import _ from Mailnag.common.subproc import start_subprocess @@ -142,6 +143,7 @@ def has_config_ui(self) -> bool: return True def get_config_ui(self) -> Gtk.Box: builder = Gtk.Builder() + builder.set_translation_domain(PACKAGE_NAME) builder.add_from_file( os.path.splitext(__file__)[0]+'.ui') diff --git a/gen_po_template b/gen_po_template index e4908f7..fc01288 100755 --- a/gen_po_template +++ b/gen_po_template @@ -3,6 +3,7 @@ # generates a gettext .pot template. glade_dir=./Mailnag/configuration/ui +plugins_dir=./Mailnag/plugins python_dir=./Mailnag pot_file=./po/mailnagger.pot @@ -15,13 +16,13 @@ if [ -f $pot_file ]; then fi # generate string headers of all glade files -for f in $glade_dir/*.ui ; do +for f in $glade_dir/*.ui $plugins_dir/*.ui ; do intltool-extract --type=gettext/glade $f done # write template files pyfiles=`find $python_dir -iname "*.py" -printf "%p "` -xgettext $pyfiles $glade_dir/*.h --keyword=_ --keyword=N_ --add-comments="TRANSLATORS:" --from-code=UTF-8 --copyright-holder="2024 Timo Kankare " --package-name="Mailnagger" --package-version="2.4.0.dev0" --msgid-bugs-address="https://github.com/tikank/mailnagger/issues" --output=$pot_file +xgettext $pyfiles $glade_dir/*.h $plugins_dir/*.h --keyword=_ --keyword=N_ --add-comments="TRANSLATORS:" --from-code=UTF-8 --copyright-holder="2024 Timo Kankare " --package-name="Mailnagger" --package-version="2.4.0.dev0" --msgid-bugs-address="https://github.com/tikank/mailnagger/issues" --output=$pot_file # clean up -rm $glade_dir/*.h +rm $glade_dir/*.h $plugins_dir/*.h diff --git a/po/bg.po b/po/bg.po index 22e9923..34c60fd 100644 --- a/po/bg.po +++ b/po/bg.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: mailnag\n" "Report-Msgid-Bugs-To: https://github.com/tikank/mailnagger/issues\n" -"POT-Creation-Date: 2025-11-10 12:57+0100\n" +"POT-Creation-Date: 2025-11-16 17:15+0100\n" "PO-Revision-Date: 2019-03-16 14:48+0000\n" "Last-Translator: Launchpad Translations Administrators \n" "Language-Team: Bulgarian \n" @@ -18,53 +18,87 @@ msgstr "" "X-Launchpad-Export-Date: 2020-06-11 14:44+0000\n" "X-Generator: Launchpad (build b190cebbf563f89e480a8b57f641753c8196bda0)\n" -#: Mailnag/daemon/mails.py:153 +#: Mailnag/daemon/mails.py:183 msgid "No subject" msgstr "Без тема" -#: Mailnag/plugins/garmin2FAplugin.py:135 -#, fuzzy -msgid "Garmin 2FA LibNotify Notifications" -msgstr "LibNotify известия" +#: Mailnag/configuration/accountdialog.py:77 +msgid "Mail Account" +msgstr "Пощенски акаунт" -#: Mailnag/plugins/garmin2FAplugin.py:136 -#, fuzzy -msgid "Shows a popup when Garmin 2FA mails arrive." -msgstr "Показва изкачащ прозорец при пристигане на имейл." +#: Mailnag/configuration/accountdialog.py:119 +msgid "optional" +msgstr "незадължително" -#: Mailnag/plugins/garmin2FAplugin.py:203 -msgid "Your Security Passcode" +#: Mailnag/configuration/accountdialog.py:123 +#: Mailnag/configuration/configwindow.py:88 +#: Mailnag/configuration/configwindow.py:108 +#: Mailnag/plugins/libnotifyplugin.ui.h:14 +msgid "Enabled" +msgstr "Включено" + +#: Mailnag/configuration/accountdialog.py:129 +#: Mailnag/configuration/configwindow.py:94 +#: Mailnag/configuration/configwindow.py:114 +msgid "Name" +msgstr "Име" + +#: Mailnag/configuration/accountdialog.py:252 +msgid "IMAP (Custom)" msgstr "" -#: Mailnag/plugins/garmin2FAplugin.py:220 +#: Mailnag/configuration/accountdialog.py:253 +msgid "POP3 (Custom)" +msgstr "" + +#: Mailnag/configuration/accountdialog.py:254 +msgid "MBox (Custom)" +msgstr "" + +#: Mailnag/configuration/accountdialog.py:255 +msgid "Maildir (Custom)" +msgstr "" + +#: Mailnag/configuration/accountdialog.py:361 +msgid "Connection failed." +msgstr "Връзката се разпадна." + +#: Mailnag/configuration/configwindow.py:278 +msgid "About Mailnagger" +msgstr "" + +#: Mailnag/configuration/configwindow.py:281 +msgid "An extensible mail notification daemon." +msgstr "" + +#: Mailnag/configuration/configwindow.py:283 #, python-brace-format -msgid "📋 Code: {0}" +msgid "Copyright (c) {years} {author} and contributors." msgstr "" -#: Mailnag/plugins/spamfilterplugin.py:67 -msgid "Spam Filter" -msgstr "Спам филтър" +#: Mailnag/configuration/configwindow.py:290 +msgid "Homepage" +msgstr "" -#: Mailnag/plugins/spamfilterplugin.py:68 -msgid "Filters out unwanted mails." -msgstr "Филтър за нежелана поща." +#: Mailnag/configuration/configwindow.py:293 +msgid "maintainer" +msgstr "" -#: Mailnag/plugins/spamfilterplugin.py:87 -#, fuzzy -msgid "" -"Mailnagger will ignore mails containing at least one of \n" -"the following words in subject or sender." +#. TRANSLATORS: Translate `translator-credits` to the list of names +#. of translators, or team, or something like that. +#: Mailnag/configuration/configwindow.py:313 +msgid "translator-credits" msgstr "" -"Mailnag ще игнорира писма съдържащи поне една от \n" -"следните думи в темата или изпращача." +"Launchpad Contributions:\n" +" spacy01 https://launchpad.net/~spacy00001" -#: Mailnag/plugins/soundplugin.py:66 -msgid "Sound Notifications" -msgstr "Звукови известия" +#: Mailnag/configuration/configwindow.py:353 +msgid "Delete this account:" +msgstr "Изтриване на акаунта:" -#: Mailnag/plugins/soundplugin.py:67 -msgid "Plays a sound when new mails arrive." -msgstr "Изпълнява звук при пристигане на имейл." +#: Mailnag/configuration/plugindialog.py:35 +msgid "Plugin Configuration" +msgstr "Настройки на приставките" #: Mailnag/plugins/userscriptplugin.py:60 msgid "User Script" @@ -97,144 +131,107 @@ msgstr "" "Mailnag ще предава общия брой имейли на този скрипт,\n" "последвано от %s поредици." -#: Mailnag/plugins/libnotifyplugin.py:117 +#: Mailnag/plugins/libnotifyplugin.py:61 +msgid "Your Security Passcode" +msgstr "" + +#: Mailnag/plugins/libnotifyplugin.py:131 msgid "LibNotify Notifications" msgstr "LibNotify известия" -#: Mailnag/plugins/libnotifyplugin.py:118 +#: Mailnag/plugins/libnotifyplugin.py:132 msgid "Shows a popup when new mails arrive." msgstr "Показва изкачащ прозорец при пристигане на имейл." -#: Mailnag/plugins/libnotifyplugin.py:133 -msgid "Count of new mails" -msgstr "Брой на нови писма" - -#: Mailnag/plugins/libnotifyplugin.py:134 -msgid "Short summary of new mails" -msgstr "Кратка извадка от новите писма" - -#: Mailnag/plugins/libnotifyplugin.py:135 -msgid "Detailed summary of new mails" -msgstr "Подробна извадка от новите писма" - -#: Mailnag/plugins/libnotifyplugin.py:136 -msgid "One notification per new mail" -msgstr "Едно известие за имейл" - -#: Mailnag/plugins/libnotifyplugin.py:144 +#: Mailnag/plugins/libnotifyplugin.py:168 msgid "Notification mode:" msgstr "Режим на известяване:" -#: Mailnag/plugins/libnotifyplugin.py:237 -#: Mailnag/plugins/libnotifyplugin.py:273 -#: Mailnag/plugins/libnotifyplugin.py:310 +#: Mailnag/plugins/libnotifyplugin.py:280 +#: Mailnag/plugins/libnotifyplugin.py:316 +#: Mailnag/plugins/libnotifyplugin.py:445 #, python-brace-format msgid "{0} new mails" msgstr "{0} нови писма" -#: Mailnag/plugins/libnotifyplugin.py:239 +#: Mailnag/plugins/libnotifyplugin.py:282 #, python-brace-format msgid "from {0} and others." msgstr "от {0} и други." -#: Mailnag/plugins/libnotifyplugin.py:241 -#: Mailnag/plugins/libnotifyplugin.py:244 +#: Mailnag/plugins/libnotifyplugin.py:284 +#: Mailnag/plugins/libnotifyplugin.py:287 #, python-brace-format msgid "from {0}." msgstr "от {0}." -#: Mailnag/plugins/libnotifyplugin.py:243 -#: Mailnag/plugins/libnotifyplugin.py:275 -#: Mailnag/plugins/libnotifyplugin.py:312 +#: Mailnag/plugins/libnotifyplugin.py:286 +#: Mailnag/plugins/libnotifyplugin.py:318 +#: Mailnag/plugins/libnotifyplugin.py:447 msgid "New mail" msgstr "Ново писмо" -#: Mailnag/plugins/libnotifyplugin.py:268 -#: Mailnag/plugins/libnotifyplugin.py:270 +#: Mailnag/plugins/libnotifyplugin.py:311 +#: Mailnag/plugins/libnotifyplugin.py:313 #, python-brace-format msgid "(and {0} more)" msgstr "( и {0} други)" -#: Mailnag/plugins/libnotifyplugin.py:299 -msgid "Mark as read" -msgstr "Отбележи като прочетено" - -#: Mailnag/configuration/accountdialog.py:77 -msgid "Mail Account" -msgstr "Пощенски акаунт" - -#: Mailnag/configuration/accountdialog.py:119 -msgid "optional" -msgstr "незадължително" - -#: Mailnag/configuration/accountdialog.py:123 -#: Mailnag/configuration/configwindow.py:88 -#: Mailnag/configuration/configwindow.py:108 -msgid "Enabled" -msgstr "Включено" - -#: Mailnag/configuration/accountdialog.py:129 -#: Mailnag/configuration/configwindow.py:94 -#: Mailnag/configuration/configwindow.py:114 -msgid "Name" -msgstr "Име" - -#: Mailnag/configuration/accountdialog.py:252 -msgid "IMAP (Custom)" -msgstr "" - -#: Mailnag/configuration/accountdialog.py:253 -msgid "POP3 (Custom)" -msgstr "" - -#: Mailnag/configuration/accountdialog.py:254 -msgid "MBox (Custom)" +#: Mailnag/plugins/libnotifyplugin.py:390 +#, python-brace-format +msgid "📋 Code: {0}" msgstr "" -#: Mailnag/configuration/accountdialog.py:255 -msgid "Maildir (Custom)" -msgstr "" +#: Mailnag/plugins/libnotifyplugin.py:434 +msgid "Mark as read" +msgstr "Отбележи като прочетено" -#: Mailnag/configuration/accountdialog.py:361 -msgid "Connection failed." -msgstr "Връзката се разпадна." +#: Mailnag/plugins/libnotifyplugin.py:629 +#, fuzzy +msgid "Delete this provider:" +msgstr "Изтриване на акаунта:" -#: Mailnag/configuration/configwindow.py:278 -msgid "About Mailnagger" -msgstr "" +#: Mailnag/plugins/libnotifyplugin.py:630 +#: Mailnag/plugins/libnotifyplugin.ui.h:1 +#, fuzzy +msgid "Sender:" +msgstr "изпращач" -#: Mailnag/configuration/configwindow.py:281 -msgid "An extensible mail notification daemon." -msgstr "" +#: Mailnag/plugins/libnotifyplugin.py:631 +#: Mailnag/plugins/libnotifyplugin.ui.h:3 +#, fuzzy +msgid "Subject:" +msgstr "тема" -#: Mailnag/configuration/configwindow.py:283 -#, python-brace-format -msgid "Copyright (c) {years} {author} and contributors." +#: Mailnag/plugins/libnotifyplugin.py:632 +#: Mailnag/plugins/libnotifyplugin.ui.h:5 +msgid "Pattern:" msgstr "" -#: Mailnag/configuration/configwindow.py:290 -msgid "Homepage" -msgstr "" +#: Mailnag/plugins/spamfilterplugin.py:67 +msgid "Spam Filter" +msgstr "Спам филтър" -#: Mailnag/configuration/configwindow.py:293 -msgid "maintainer" -msgstr "" +#: Mailnag/plugins/spamfilterplugin.py:68 +msgid "Filters out unwanted mails." +msgstr "Филтър за нежелана поща." -#. TRANSLATORS: Translate `translator-credits` to the list of names -#. of translators, or team, or something like that. -#: Mailnag/configuration/configwindow.py:313 -msgid "translator-credits" +#: Mailnag/plugins/spamfilterplugin.py:87 +#, fuzzy +msgid "" +"Mailnagger will ignore mails containing at least one of \n" +"the following words in subject or sender." msgstr "" -"Launchpad Contributions:\n" -" spacy01 https://launchpad.net/~spacy00001" +"Mailnag ще игнорира писма съдържащи поне една от \n" +"следните думи в темата или изпращача." -#: Mailnag/configuration/configwindow.py:353 -msgid "Delete this account:" -msgstr "Изтриване на акаунта:" +#: Mailnag/plugins/soundplugin.py:66 +msgid "Sound Notifications" +msgstr "Звукови известия" -#: Mailnag/configuration/plugindialog.py:35 -msgid "Plugin Configuration" -msgstr "Настройки на приставките" +#: Mailnag/plugins/soundplugin.py:67 +msgid "Plays a sound when new mails arrive." +msgstr "Изпълнява звук при пристигане на имейл." #: Mailnag/configuration/ui/account_widget.ui.h:1 msgid "" @@ -318,6 +315,83 @@ msgstr "Плъгини" msgid "Info" msgstr "" +#: Mailnag/plugins/libnotifyplugin.ui.h:2 +#, fuzzy +msgid "Sender" +msgstr "изпращач" + +#: Mailnag/plugins/libnotifyplugin.ui.h:4 +#, fuzzy +msgid "Subject" +msgstr "тема" + +#: Mailnag/plugins/libnotifyplugin.ui.h:6 +msgid "Pattern" +msgstr "" + +#: Mailnag/plugins/libnotifyplugin.ui.h:7 +msgid "Edit 2FA provider" +msgstr "" + +#: Mailnag/plugins/libnotifyplugin.ui.h:8 +#, fuzzy +msgid "Enable provider" +msgstr "Включено" + +#: Mailnag/plugins/libnotifyplugin.ui.h:9 +msgid "Count of new mails" +msgstr "Брой на нови писма" + +#: Mailnag/plugins/libnotifyplugin.ui.h:10 +msgid "Short summary of new mails" +msgstr "Кратка извадка от новите писма" + +#: Mailnag/plugins/libnotifyplugin.ui.h:11 +msgid "Detailed summary of new mails" +msgstr "Подробна извадка от новите писма" + +#: Mailnag/plugins/libnotifyplugin.ui.h:12 +msgid "One notification per new mail" +msgstr "Едно известие за имейл" + +#: Mailnag/plugins/libnotifyplugin.ui.h:13 +#, fuzzy +msgid "Only 2FA notification, when enabled" +msgstr "Едно известие за имейл" + +#: Mailnag/plugins/libnotifyplugin.ui.h:15 +msgid "Add 2FA Provider" +msgstr "" + +#: Mailnag/plugins/libnotifyplugin.ui.h:16 +msgid "Remove 2FA Provider" +msgstr "" + +#: Mailnag/plugins/libnotifyplugin.ui.h:17 +msgid "Edit 2FA Provider" +msgstr "" + +#: Mailnag/plugins/libnotifyplugin.ui.h:18 +#, fuzzy +msgid "2FA notifications" +msgstr "Звукови известия" + +#: Mailnag/plugins/libnotifyplugin.ui.h:19 +msgid "Enable/disable libnotify 2FA processing" +msgstr "" + +#: Mailnag/plugins/libnotifyplugin.ui.h:20 +msgid "2FA providers" +msgstr "" + +#, fuzzy +#~ msgid "Garmin 2FA LibNotify Notifications" +#~ msgstr "LibNotify известия" + +#, fuzzy +#~ msgid "Shows a popup when Garmin 2FA mails arrive." +#~ msgstr "Показва изкачащ прозорец при пристигане на имейл." + #~ msgid "Maximum number of visible mails:" #~ msgstr "Максимален брой видими имейли." diff --git a/po/ca.po b/po/ca.po index 2369ff1..f0c188a 100644 --- a/po/ca.po +++ b/po/ca.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: mailnag\n" "Report-Msgid-Bugs-To: https://github.com/tikank/mailnagger/issues\n" -"POT-Creation-Date: 2025-11-10 12:57+0100\n" +"POT-Creation-Date: 2025-11-16 17:15+0100\n" "PO-Revision-Date: 2020-04-05 12:44+0000\n" "Last-Translator: Marc Riera Irigoyen \n" "Language-Team: Catalan \n" @@ -18,53 +18,87 @@ msgstr "" "X-Launchpad-Export-Date: 2020-06-11 14:44+0000\n" "X-Generator: Launchpad (build b190cebbf563f89e480a8b57f641753c8196bda0)\n" -#: Mailnag/daemon/mails.py:153 +#: Mailnag/daemon/mails.py:183 msgid "No subject" msgstr "Sense assumpte" -#: Mailnag/plugins/garmin2FAplugin.py:135 -#, fuzzy -msgid "Garmin 2FA LibNotify Notifications" -msgstr "Notificacions del LibNotify" +#: Mailnag/configuration/accountdialog.py:77 +msgid "Mail Account" +msgstr "Compte de correu" -#: Mailnag/plugins/garmin2FAplugin.py:136 -#, fuzzy -msgid "Shows a popup when Garmin 2FA mails arrive." -msgstr "Mostra una finestra emergent quan arriben correus nous." +#: Mailnag/configuration/accountdialog.py:119 +msgid "optional" +msgstr "opcional" -#: Mailnag/plugins/garmin2FAplugin.py:203 -msgid "Your Security Passcode" +#: Mailnag/configuration/accountdialog.py:123 +#: Mailnag/configuration/configwindow.py:88 +#: Mailnag/configuration/configwindow.py:108 +#: Mailnag/plugins/libnotifyplugin.ui.h:14 +msgid "Enabled" +msgstr "Habilitat" + +#: Mailnag/configuration/accountdialog.py:129 +#: Mailnag/configuration/configwindow.py:94 +#: Mailnag/configuration/configwindow.py:114 +msgid "Name" +msgstr "Nom" + +#: Mailnag/configuration/accountdialog.py:252 +msgid "IMAP (Custom)" +msgstr "IMAP (personalitzat)" + +#: Mailnag/configuration/accountdialog.py:253 +msgid "POP3 (Custom)" +msgstr "POP3 (personalitzat)" + +#: Mailnag/configuration/accountdialog.py:254 +msgid "MBox (Custom)" +msgstr "MBox (personalitzat)" + +#: Mailnag/configuration/accountdialog.py:255 +msgid "Maildir (Custom)" +msgstr "Maildir (personalitzat)" + +#: Mailnag/configuration/accountdialog.py:361 +msgid "Connection failed." +msgstr "No s'ha pogut connectar." + +#: Mailnag/configuration/configwindow.py:278 +msgid "About Mailnagger" msgstr "" -#: Mailnag/plugins/garmin2FAplugin.py:220 +#: Mailnag/configuration/configwindow.py:281 +msgid "An extensible mail notification daemon." +msgstr "Un dimoni de notificacions de correu extensible." + +#: Mailnag/configuration/configwindow.py:283 #, python-brace-format -msgid "📋 Code: {0}" +msgid "Copyright (c) {years} {author} and contributors." msgstr "" -#: Mailnag/plugins/spamfilterplugin.py:67 -msgid "Spam Filter" -msgstr "Filtre de correu brossa" +#: Mailnag/configuration/configwindow.py:290 +msgid "Homepage" +msgstr "Lloc web" -#: Mailnag/plugins/spamfilterplugin.py:68 -msgid "Filters out unwanted mails." -msgstr "Exclou correus no desitjats." +#: Mailnag/configuration/configwindow.py:293 +msgid "maintainer" +msgstr "" -#: Mailnag/plugins/spamfilterplugin.py:87 -#, fuzzy -msgid "" -"Mailnagger will ignore mails containing at least one of \n" -"the following words in subject or sender." +#. TRANSLATORS: Translate `translator-credits` to the list of names +#. of translators, or team, or something like that. +#: Mailnag/configuration/configwindow.py:313 +msgid "translator-credits" msgstr "" -"El Mailnag ignorarà els correus que continguin com a mínim \n" -"una de les paraules següents a l'assumpte o el remitent." +"Launchpad Contributions:\n" +" Marc Riera Irigoyen https://launchpad.net/~marcriera" -#: Mailnag/plugins/soundplugin.py:66 -msgid "Sound Notifications" -msgstr "Notificacions sonores" +#: Mailnag/configuration/configwindow.py:353 +msgid "Delete this account:" +msgstr "Suprimeix aquest compte:" -#: Mailnag/plugins/soundplugin.py:67 -msgid "Plays a sound when new mails arrive." -msgstr "Reprodueix un so quan arriben correus nous." +#: Mailnag/configuration/plugindialog.py:35 +msgid "Plugin Configuration" +msgstr "Configuració del connector" #: Mailnag/plugins/userscriptplugin.py:60 msgid "User Script" @@ -97,144 +131,107 @@ msgstr "" "El Mailnag passa el nombre total de correus nous a aquest script,\n" "seguit de seqüències %s." -#: Mailnag/plugins/libnotifyplugin.py:117 +#: Mailnag/plugins/libnotifyplugin.py:61 +msgid "Your Security Passcode" +msgstr "" + +#: Mailnag/plugins/libnotifyplugin.py:131 msgid "LibNotify Notifications" msgstr "Notificacions del LibNotify" -#: Mailnag/plugins/libnotifyplugin.py:118 +#: Mailnag/plugins/libnotifyplugin.py:132 msgid "Shows a popup when new mails arrive." msgstr "Mostra una finestra emergent quan arriben correus nous." -#: Mailnag/plugins/libnotifyplugin.py:133 -msgid "Count of new mails" -msgstr "Recompte de correus nous" - -#: Mailnag/plugins/libnotifyplugin.py:134 -msgid "Short summary of new mails" -msgstr "Resum breu dels correus nous" - -#: Mailnag/plugins/libnotifyplugin.py:135 -msgid "Detailed summary of new mails" -msgstr "Resum detallat dels correus nous" - -#: Mailnag/plugins/libnotifyplugin.py:136 -msgid "One notification per new mail" -msgstr "Una notificació per correu nou" - -#: Mailnag/plugins/libnotifyplugin.py:144 +#: Mailnag/plugins/libnotifyplugin.py:168 msgid "Notification mode:" msgstr "Mode de notificació:" -#: Mailnag/plugins/libnotifyplugin.py:237 -#: Mailnag/plugins/libnotifyplugin.py:273 -#: Mailnag/plugins/libnotifyplugin.py:310 +#: Mailnag/plugins/libnotifyplugin.py:280 +#: Mailnag/plugins/libnotifyplugin.py:316 +#: Mailnag/plugins/libnotifyplugin.py:445 #, python-brace-format msgid "{0} new mails" msgstr "{0} correus nous" -#: Mailnag/plugins/libnotifyplugin.py:239 +#: Mailnag/plugins/libnotifyplugin.py:282 #, python-brace-format msgid "from {0} and others." msgstr "de {0} i altres." -#: Mailnag/plugins/libnotifyplugin.py:241 -#: Mailnag/plugins/libnotifyplugin.py:244 +#: Mailnag/plugins/libnotifyplugin.py:284 +#: Mailnag/plugins/libnotifyplugin.py:287 #, python-brace-format msgid "from {0}." msgstr "de {0}." -#: Mailnag/plugins/libnotifyplugin.py:243 -#: Mailnag/plugins/libnotifyplugin.py:275 -#: Mailnag/plugins/libnotifyplugin.py:312 +#: Mailnag/plugins/libnotifyplugin.py:286 +#: Mailnag/plugins/libnotifyplugin.py:318 +#: Mailnag/plugins/libnotifyplugin.py:447 msgid "New mail" msgstr "Correu nou" -#: Mailnag/plugins/libnotifyplugin.py:268 -#: Mailnag/plugins/libnotifyplugin.py:270 +#: Mailnag/plugins/libnotifyplugin.py:311 +#: Mailnag/plugins/libnotifyplugin.py:313 #, python-brace-format msgid "(and {0} more)" msgstr "(i {0} més)" -#: Mailnag/plugins/libnotifyplugin.py:299 +#: Mailnag/plugins/libnotifyplugin.py:390 +#, python-brace-format +msgid "📋 Code: {0}" +msgstr "" + +#: Mailnag/plugins/libnotifyplugin.py:434 msgid "Mark as read" msgstr "Marca com a llegit" -#: Mailnag/configuration/accountdialog.py:77 -msgid "Mail Account" -msgstr "Compte de correu" - -#: Mailnag/configuration/accountdialog.py:119 -msgid "optional" -msgstr "opcional" - -#: Mailnag/configuration/accountdialog.py:123 -#: Mailnag/configuration/configwindow.py:88 -#: Mailnag/configuration/configwindow.py:108 -msgid "Enabled" -msgstr "Habilitat" - -#: Mailnag/configuration/accountdialog.py:129 -#: Mailnag/configuration/configwindow.py:94 -#: Mailnag/configuration/configwindow.py:114 -msgid "Name" -msgstr "Nom" - -#: Mailnag/configuration/accountdialog.py:252 -msgid "IMAP (Custom)" -msgstr "IMAP (personalitzat)" - -#: Mailnag/configuration/accountdialog.py:253 -msgid "POP3 (Custom)" -msgstr "POP3 (personalitzat)" - -#: Mailnag/configuration/accountdialog.py:254 -msgid "MBox (Custom)" -msgstr "MBox (personalitzat)" - -#: Mailnag/configuration/accountdialog.py:255 -msgid "Maildir (Custom)" -msgstr "Maildir (personalitzat)" - -#: Mailnag/configuration/accountdialog.py:361 -msgid "Connection failed." -msgstr "No s'ha pogut connectar." +#: Mailnag/plugins/libnotifyplugin.py:629 +#, fuzzy +msgid "Delete this provider:" +msgstr "Suprimeix aquest compte:" -#: Mailnag/configuration/configwindow.py:278 -msgid "About Mailnagger" -msgstr "" +#: Mailnag/plugins/libnotifyplugin.py:630 +#: Mailnag/plugins/libnotifyplugin.ui.h:1 +#, fuzzy +msgid "Sender:" +msgstr "remitent" -#: Mailnag/configuration/configwindow.py:281 -msgid "An extensible mail notification daemon." -msgstr "Un dimoni de notificacions de correu extensible." +#: Mailnag/plugins/libnotifyplugin.py:631 +#: Mailnag/plugins/libnotifyplugin.ui.h:3 +#, fuzzy +msgid "Subject:" +msgstr "assumpte" -#: Mailnag/configuration/configwindow.py:283 -#, python-brace-format -msgid "Copyright (c) {years} {author} and contributors." +#: Mailnag/plugins/libnotifyplugin.py:632 +#: Mailnag/plugins/libnotifyplugin.ui.h:5 +msgid "Pattern:" msgstr "" -#: Mailnag/configuration/configwindow.py:290 -msgid "Homepage" -msgstr "Lloc web" +#: Mailnag/plugins/spamfilterplugin.py:67 +msgid "Spam Filter" +msgstr "Filtre de correu brossa" -#: Mailnag/configuration/configwindow.py:293 -msgid "maintainer" -msgstr "" +#: Mailnag/plugins/spamfilterplugin.py:68 +msgid "Filters out unwanted mails." +msgstr "Exclou correus no desitjats." -#. TRANSLATORS: Translate `translator-credits` to the list of names -#. of translators, or team, or something like that. -#: Mailnag/configuration/configwindow.py:313 -msgid "translator-credits" +#: Mailnag/plugins/spamfilterplugin.py:87 +#, fuzzy +msgid "" +"Mailnagger will ignore mails containing at least one of \n" +"the following words in subject or sender." msgstr "" -"Launchpad Contributions:\n" -" Marc Riera Irigoyen https://launchpad.net/~marcriera" +"El Mailnag ignorarà els correus que continguin com a mínim \n" +"una de les paraules següents a l'assumpte o el remitent." -#: Mailnag/configuration/configwindow.py:353 -msgid "Delete this account:" -msgstr "Suprimeix aquest compte:" +#: Mailnag/plugins/soundplugin.py:66 +msgid "Sound Notifications" +msgstr "Notificacions sonores" -#: Mailnag/configuration/plugindialog.py:35 -msgid "Plugin Configuration" -msgstr "Configuració del connector" +#: Mailnag/plugins/soundplugin.py:67 +msgid "Plays a sound when new mails arrive." +msgstr "Reprodueix un so quan arriben correus nous." #: Mailnag/configuration/ui/account_widget.ui.h:1 msgid "" @@ -319,6 +316,83 @@ msgstr "Connectors" msgid "Info" msgstr "Informació" +#: Mailnag/plugins/libnotifyplugin.ui.h:2 +#, fuzzy +msgid "Sender" +msgstr "remitent" + +#: Mailnag/plugins/libnotifyplugin.ui.h:4 +#, fuzzy +msgid "Subject" +msgstr "assumpte" + +#: Mailnag/plugins/libnotifyplugin.ui.h:6 +msgid "Pattern" +msgstr "" + +#: Mailnag/plugins/libnotifyplugin.ui.h:7 +msgid "Edit 2FA provider" +msgstr "" + +#: Mailnag/plugins/libnotifyplugin.ui.h:8 +#, fuzzy +msgid "Enable provider" +msgstr "Habilitat" + +#: Mailnag/plugins/libnotifyplugin.ui.h:9 +msgid "Count of new mails" +msgstr "Recompte de correus nous" + +#: Mailnag/plugins/libnotifyplugin.ui.h:10 +msgid "Short summary of new mails" +msgstr "Resum breu dels correus nous" + +#: Mailnag/plugins/libnotifyplugin.ui.h:11 +msgid "Detailed summary of new mails" +msgstr "Resum detallat dels correus nous" + +#: Mailnag/plugins/libnotifyplugin.ui.h:12 +msgid "One notification per new mail" +msgstr "Una notificació per correu nou" + +#: Mailnag/plugins/libnotifyplugin.ui.h:13 +#, fuzzy +msgid "Only 2FA notification, when enabled" +msgstr "Una notificació per correu nou" + +#: Mailnag/plugins/libnotifyplugin.ui.h:15 +msgid "Add 2FA Provider" +msgstr "" + +#: Mailnag/plugins/libnotifyplugin.ui.h:16 +msgid "Remove 2FA Provider" +msgstr "" + +#: Mailnag/plugins/libnotifyplugin.ui.h:17 +msgid "Edit 2FA Provider" +msgstr "" + +#: Mailnag/plugins/libnotifyplugin.ui.h:18 +#, fuzzy +msgid "2FA notifications" +msgstr "Notificacions sonores" + +#: Mailnag/plugins/libnotifyplugin.ui.h:19 +msgid "Enable/disable libnotify 2FA processing" +msgstr "" + +#: Mailnag/plugins/libnotifyplugin.ui.h:20 +msgid "2FA providers" +msgstr "" + +#, fuzzy +#~ msgid "Garmin 2FA LibNotify Notifications" +#~ msgstr "Notificacions del LibNotify" + +#, fuzzy +#~ msgid "Shows a popup when Garmin 2FA mails arrive." +#~ msgstr "Mostra una finestra emergent quan arriben correus nous." + #, python-format #~ msgid "About %s" #~ msgstr "Quant al %s" diff --git a/po/cs.po b/po/cs.po index 92b3f69..769fdd1 100644 --- a/po/cs.po +++ b/po/cs.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: mailnag\n" "Report-Msgid-Bugs-To: https://github.com/tikank/mailnagger/issues\n" -"POT-Creation-Date: 2025-11-10 12:57+0100\n" +"POT-Creation-Date: 2025-11-16 17:15+0100\n" "PO-Revision-Date: 2019-03-16 14:48+0000\n" "Last-Translator: Launchpad Translations Administrators \n" "Language-Team: Czech \n" @@ -18,53 +18,89 @@ msgstr "" "X-Launchpad-Export-Date: 2020-06-11 14:44+0000\n" "X-Generator: Launchpad (build b190cebbf563f89e480a8b57f641753c8196bda0)\n" -#: Mailnag/daemon/mails.py:153 +#: Mailnag/daemon/mails.py:183 msgid "No subject" msgstr "Žádný předmět" -#: Mailnag/plugins/garmin2FAplugin.py:135 -#, fuzzy -msgid "Garmin 2FA LibNotify Notifications" -msgstr "LibNotify notifikace" +#: Mailnag/configuration/accountdialog.py:77 +msgid "Mail Account" +msgstr "Poštovní účet" -#: Mailnag/plugins/garmin2FAplugin.py:136 -#, fuzzy -msgid "Shows a popup when Garmin 2FA mails arrive." -msgstr "Zobrazí popup okno při novém e-mailu." +#: Mailnag/configuration/accountdialog.py:119 +msgid "optional" +msgstr "volitelně" -#: Mailnag/plugins/garmin2FAplugin.py:203 -msgid "Your Security Passcode" +#: Mailnag/configuration/accountdialog.py:123 +#: Mailnag/configuration/configwindow.py:88 +#: Mailnag/configuration/configwindow.py:108 +#: Mailnag/plugins/libnotifyplugin.ui.h:14 +msgid "Enabled" +msgstr "Povoleno" + +#: Mailnag/configuration/accountdialog.py:129 +#: Mailnag/configuration/configwindow.py:94 +#: Mailnag/configuration/configwindow.py:114 +msgid "Name" +msgstr "Název" + +#: Mailnag/configuration/accountdialog.py:252 +msgid "IMAP (Custom)" +msgstr "" + +#: Mailnag/configuration/accountdialog.py:253 +msgid "POP3 (Custom)" +msgstr "" + +#: Mailnag/configuration/accountdialog.py:254 +msgid "MBox (Custom)" +msgstr "" + +#: Mailnag/configuration/accountdialog.py:255 +msgid "Maildir (Custom)" +msgstr "" + +#: Mailnag/configuration/accountdialog.py:361 +msgid "Connection failed." +msgstr "Spojení selhalo." + +#: Mailnag/configuration/configwindow.py:278 +msgid "About Mailnagger" msgstr "" -#: Mailnag/plugins/garmin2FAplugin.py:220 +#: Mailnag/configuration/configwindow.py:281 +msgid "An extensible mail notification daemon." +msgstr "" + +#: Mailnag/configuration/configwindow.py:283 #, python-brace-format -msgid "📋 Code: {0}" +msgid "Copyright (c) {years} {author} and contributors." msgstr "" -#: Mailnag/plugins/spamfilterplugin.py:67 -msgid "Spam Filter" -msgstr "Spam filtr" +#: Mailnag/configuration/configwindow.py:290 +msgid "Homepage" +msgstr "" -#: Mailnag/plugins/spamfilterplugin.py:68 -msgid "Filters out unwanted mails." -msgstr "Filtruje nevyžádané e-maily." +#: Mailnag/configuration/configwindow.py:293 +msgid "maintainer" +msgstr "" -#: Mailnag/plugins/spamfilterplugin.py:87 -#, fuzzy -msgid "" -"Mailnagger will ignore mails containing at least one of \n" -"the following words in subject or sender." +#. TRANSLATORS: Translate `translator-credits` to the list of names +#. of translators, or team, or something like that. +#: Mailnag/configuration/configwindow.py:313 +msgid "translator-credits" msgstr "" -"Mailnag bude ignorovat e-maily obsahující aspoň jedno z \n" -"následujících slov v poli předmět nebo odesílatel." +"Launchpad Contributions:\n" +" Jirka Dutka https://launchpad.net/~jirka-x\n" +" Patrick Ulbrich https://launchpad.net/~pulb\n" +" Radek Otáhal https://launchpad.net/~radek-otahal" -#: Mailnag/plugins/soundplugin.py:66 -msgid "Sound Notifications" -msgstr "Zvukové notifikace" +#: Mailnag/configuration/configwindow.py:353 +msgid "Delete this account:" +msgstr "Odstranit tento účet:" -#: Mailnag/plugins/soundplugin.py:67 -msgid "Plays a sound when new mails arrive." -msgstr "Přehraje zvuk při novém e-mailu." +#: Mailnag/configuration/plugindialog.py:35 +msgid "Plugin Configuration" +msgstr "Konfigurace pluginu" #: Mailnag/plugins/userscriptplugin.py:60 msgid "User Script" @@ -97,146 +133,107 @@ msgstr "" "Mailnag předá celkové počet nových e-mailů tomuto skriptu,\n" "následovaný %s sekvencemi." -#: Mailnag/plugins/libnotifyplugin.py:117 +#: Mailnag/plugins/libnotifyplugin.py:61 +msgid "Your Security Passcode" +msgstr "" + +#: Mailnag/plugins/libnotifyplugin.py:131 msgid "LibNotify Notifications" msgstr "LibNotify notifikace" -#: Mailnag/plugins/libnotifyplugin.py:118 +#: Mailnag/plugins/libnotifyplugin.py:132 msgid "Shows a popup when new mails arrive." msgstr "Zobrazí popup okno při novém e-mailu." -#: Mailnag/plugins/libnotifyplugin.py:133 -msgid "Count of new mails" -msgstr "Počet nových e-mailů" - -#: Mailnag/plugins/libnotifyplugin.py:134 -msgid "Short summary of new mails" -msgstr "Krátký přehled nových e-mailů" - -#: Mailnag/plugins/libnotifyplugin.py:135 -msgid "Detailed summary of new mails" -msgstr "Detailní přehled nových e-mailů" - -#: Mailnag/plugins/libnotifyplugin.py:136 -msgid "One notification per new mail" -msgstr "Jedna notifikace pro nový e-mail" - -#: Mailnag/plugins/libnotifyplugin.py:144 +#: Mailnag/plugins/libnotifyplugin.py:168 msgid "Notification mode:" msgstr "Notifikační mód:" -#: Mailnag/plugins/libnotifyplugin.py:237 -#: Mailnag/plugins/libnotifyplugin.py:273 -#: Mailnag/plugins/libnotifyplugin.py:310 +#: Mailnag/plugins/libnotifyplugin.py:280 +#: Mailnag/plugins/libnotifyplugin.py:316 +#: Mailnag/plugins/libnotifyplugin.py:445 #, python-brace-format msgid "{0} new mails" msgstr "{0} nových e-mailů" -#: Mailnag/plugins/libnotifyplugin.py:239 +#: Mailnag/plugins/libnotifyplugin.py:282 #, python-brace-format msgid "from {0} and others." msgstr "z {0} a další." -#: Mailnag/plugins/libnotifyplugin.py:241 -#: Mailnag/plugins/libnotifyplugin.py:244 +#: Mailnag/plugins/libnotifyplugin.py:284 +#: Mailnag/plugins/libnotifyplugin.py:287 #, python-brace-format msgid "from {0}." msgstr "z {0}." -#: Mailnag/plugins/libnotifyplugin.py:243 -#: Mailnag/plugins/libnotifyplugin.py:275 -#: Mailnag/plugins/libnotifyplugin.py:312 +#: Mailnag/plugins/libnotifyplugin.py:286 +#: Mailnag/plugins/libnotifyplugin.py:318 +#: Mailnag/plugins/libnotifyplugin.py:447 msgid "New mail" msgstr "Nový mail" -#: Mailnag/plugins/libnotifyplugin.py:268 -#: Mailnag/plugins/libnotifyplugin.py:270 +#: Mailnag/plugins/libnotifyplugin.py:311 +#: Mailnag/plugins/libnotifyplugin.py:313 #, python-brace-format msgid "(and {0} more)" msgstr "(a {0} dalších)" -#: Mailnag/plugins/libnotifyplugin.py:299 -msgid "Mark as read" -msgstr "Označit jako přečtený" - -#: Mailnag/configuration/accountdialog.py:77 -msgid "Mail Account" -msgstr "Poštovní účet" - -#: Mailnag/configuration/accountdialog.py:119 -msgid "optional" -msgstr "volitelně" - -#: Mailnag/configuration/accountdialog.py:123 -#: Mailnag/configuration/configwindow.py:88 -#: Mailnag/configuration/configwindow.py:108 -msgid "Enabled" -msgstr "Povoleno" - -#: Mailnag/configuration/accountdialog.py:129 -#: Mailnag/configuration/configwindow.py:94 -#: Mailnag/configuration/configwindow.py:114 -msgid "Name" -msgstr "Název" - -#: Mailnag/configuration/accountdialog.py:252 -msgid "IMAP (Custom)" -msgstr "" - -#: Mailnag/configuration/accountdialog.py:253 -msgid "POP3 (Custom)" -msgstr "" - -#: Mailnag/configuration/accountdialog.py:254 -msgid "MBox (Custom)" +#: Mailnag/plugins/libnotifyplugin.py:390 +#, python-brace-format +msgid "📋 Code: {0}" msgstr "" -#: Mailnag/configuration/accountdialog.py:255 -msgid "Maildir (Custom)" -msgstr "" +#: Mailnag/plugins/libnotifyplugin.py:434 +msgid "Mark as read" +msgstr "Označit jako přečtený" -#: Mailnag/configuration/accountdialog.py:361 -msgid "Connection failed." -msgstr "Spojení selhalo." +#: Mailnag/plugins/libnotifyplugin.py:629 +#, fuzzy +msgid "Delete this provider:" +msgstr "Odstranit tento účet:" -#: Mailnag/configuration/configwindow.py:278 -msgid "About Mailnagger" -msgstr "" +#: Mailnag/plugins/libnotifyplugin.py:630 +#: Mailnag/plugins/libnotifyplugin.ui.h:1 +#, fuzzy +msgid "Sender:" +msgstr "odesílatel" -#: Mailnag/configuration/configwindow.py:281 -msgid "An extensible mail notification daemon." -msgstr "" +#: Mailnag/plugins/libnotifyplugin.py:631 +#: Mailnag/plugins/libnotifyplugin.ui.h:3 +#, fuzzy +msgid "Subject:" +msgstr "předmět" -#: Mailnag/configuration/configwindow.py:283 -#, python-brace-format -msgid "Copyright (c) {years} {author} and contributors." +#: Mailnag/plugins/libnotifyplugin.py:632 +#: Mailnag/plugins/libnotifyplugin.ui.h:5 +msgid "Pattern:" msgstr "" -#: Mailnag/configuration/configwindow.py:290 -msgid "Homepage" -msgstr "" +#: Mailnag/plugins/spamfilterplugin.py:67 +msgid "Spam Filter" +msgstr "Spam filtr" -#: Mailnag/configuration/configwindow.py:293 -msgid "maintainer" -msgstr "" +#: Mailnag/plugins/spamfilterplugin.py:68 +msgid "Filters out unwanted mails." +msgstr "Filtruje nevyžádané e-maily." -#. TRANSLATORS: Translate `translator-credits` to the list of names -#. of translators, or team, or something like that. -#: Mailnag/configuration/configwindow.py:313 -msgid "translator-credits" +#: Mailnag/plugins/spamfilterplugin.py:87 +#, fuzzy +msgid "" +"Mailnagger will ignore mails containing at least one of \n" +"the following words in subject or sender." msgstr "" -"Launchpad Contributions:\n" -" Jirka Dutka https://launchpad.net/~jirka-x\n" -" Patrick Ulbrich https://launchpad.net/~pulb\n" -" Radek Otáhal https://launchpad.net/~radek-otahal" +"Mailnag bude ignorovat e-maily obsahující aspoň jedno z \n" +"následujících slov v poli předmět nebo odesílatel." -#: Mailnag/configuration/configwindow.py:353 -msgid "Delete this account:" -msgstr "Odstranit tento účet:" +#: Mailnag/plugins/soundplugin.py:66 +msgid "Sound Notifications" +msgstr "Zvukové notifikace" -#: Mailnag/configuration/plugindialog.py:35 -msgid "Plugin Configuration" -msgstr "Konfigurace pluginu" +#: Mailnag/plugins/soundplugin.py:67 +msgid "Plays a sound when new mails arrive." +msgstr "Přehraje zvuk při novém e-mailu." #: Mailnag/configuration/ui/account_widget.ui.h:1 msgid "" @@ -320,6 +317,83 @@ msgstr "Pluginy" msgid "Info" msgstr "" +#: Mailnag/plugins/libnotifyplugin.ui.h:2 +#, fuzzy +msgid "Sender" +msgstr "odesílatel" + +#: Mailnag/plugins/libnotifyplugin.ui.h:4 +#, fuzzy +msgid "Subject" +msgstr "předmět" + +#: Mailnag/plugins/libnotifyplugin.ui.h:6 +msgid "Pattern" +msgstr "" + +#: Mailnag/plugins/libnotifyplugin.ui.h:7 +msgid "Edit 2FA provider" +msgstr "" + +#: Mailnag/plugins/libnotifyplugin.ui.h:8 +#, fuzzy +msgid "Enable provider" +msgstr "Povoleno" + +#: Mailnag/plugins/libnotifyplugin.ui.h:9 +msgid "Count of new mails" +msgstr "Počet nových e-mailů" + +#: Mailnag/plugins/libnotifyplugin.ui.h:10 +msgid "Short summary of new mails" +msgstr "Krátký přehled nových e-mailů" + +#: Mailnag/plugins/libnotifyplugin.ui.h:11 +msgid "Detailed summary of new mails" +msgstr "Detailní přehled nových e-mailů" + +#: Mailnag/plugins/libnotifyplugin.ui.h:12 +msgid "One notification per new mail" +msgstr "Jedna notifikace pro nový e-mail" + +#: Mailnag/plugins/libnotifyplugin.ui.h:13 +#, fuzzy +msgid "Only 2FA notification, when enabled" +msgstr "Jedna notifikace pro nový e-mail" + +#: Mailnag/plugins/libnotifyplugin.ui.h:15 +msgid "Add 2FA Provider" +msgstr "" + +#: Mailnag/plugins/libnotifyplugin.ui.h:16 +msgid "Remove 2FA Provider" +msgstr "" + +#: Mailnag/plugins/libnotifyplugin.ui.h:17 +msgid "Edit 2FA Provider" +msgstr "" + +#: Mailnag/plugins/libnotifyplugin.ui.h:18 +#, fuzzy +msgid "2FA notifications" +msgstr "Zvukové notifikace" + +#: Mailnag/plugins/libnotifyplugin.ui.h:19 +msgid "Enable/disable libnotify 2FA processing" +msgstr "" + +#: Mailnag/plugins/libnotifyplugin.ui.h:20 +msgid "2FA providers" +msgstr "" + +#, fuzzy +#~ msgid "Garmin 2FA LibNotify Notifications" +#~ msgstr "LibNotify notifikace" + +#, fuzzy +#~ msgid "Shows a popup when Garmin 2FA mails arrive." +#~ msgstr "Zobrazí popup okno při novém e-mailu." + #~ msgid "Maximum number of visible mails:" #~ msgstr "Maximální počet viditelných e-mailů:" diff --git a/po/de.po b/po/de.po index e21ee84..5e8b77d 100644 --- a/po/de.po +++ b/po/de.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: mailnag\n" "Report-Msgid-Bugs-To: https://github.com/tikank/mailnagger/issues\n" -"POT-Creation-Date: 2025-11-10 12:57+0100\n" +"POT-Creation-Date: 2025-11-16 17:15+0100\n" "PO-Revision-Date: 2020-10-24 19:26+0000\n" "Last-Translator: J. Lavoie \n" "Language-Team: German \n" "Language-Team: Spanish \n" "Language-Team: \n" @@ -18,52 +18,85 @@ msgstr "" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Poedit 3.5\n" -#: Mailnag/daemon/mails.py:153 +#: Mailnag/daemon/mails.py:183 msgid "No subject" msgstr "Ei otsikkoa" -#: Mailnag/plugins/garmin2FAplugin.py:135 -#, fuzzy -msgid "Garmin 2FA LibNotify Notifications" -msgstr "LibNotify-huomautin" +#: Mailnag/configuration/accountdialog.py:77 +msgid "Mail Account" +msgstr "Sähköpostitili" -#: Mailnag/plugins/garmin2FAplugin.py:136 -#, fuzzy -msgid "Shows a popup when Garmin 2FA mails arrive." -msgstr "Näyttää huomautuksen, kun uusi sähköposti saapuu." +#: Mailnag/configuration/accountdialog.py:119 +msgid "optional" +msgstr "valinnainen" -#: Mailnag/plugins/garmin2FAplugin.py:203 -msgid "Your Security Passcode" -msgstr "" +#: Mailnag/configuration/accountdialog.py:123 +#: Mailnag/configuration/configwindow.py:88 +#: Mailnag/configuration/configwindow.py:108 +#: Mailnag/plugins/libnotifyplugin.ui.h:14 +msgid "Enabled" +msgstr "Käytössä" + +#: Mailnag/configuration/accountdialog.py:129 +#: Mailnag/configuration/configwindow.py:94 +#: Mailnag/configuration/configwindow.py:114 +msgid "Name" +msgstr "Nimi" + +#: Mailnag/configuration/accountdialog.py:252 +msgid "IMAP (Custom)" +msgstr "IMAP" + +#: Mailnag/configuration/accountdialog.py:253 +msgid "POP3 (Custom)" +msgstr "POP3" -#: Mailnag/plugins/garmin2FAplugin.py:220 +#: Mailnag/configuration/accountdialog.py:254 +msgid "MBox (Custom)" +msgstr "MBox" + +#: Mailnag/configuration/accountdialog.py:255 +msgid "Maildir (Custom)" +msgstr "Maildir" + +#: Mailnag/configuration/accountdialog.py:361 +msgid "Connection failed." +msgstr "Yhteydenotto epäonnistui." + +#: Mailnag/configuration/configwindow.py:278 +msgid "About Mailnagger" +msgstr "Tietoja Mailnaggerista" + +#: Mailnag/configuration/configwindow.py:281 +msgid "An extensible mail notification daemon." +msgstr "Laajennettava sähköpostihuomautin." + +#: Mailnag/configuration/configwindow.py:283 #, python-brace-format -msgid "📋 Code: {0}" -msgstr "" +msgid "Copyright (c) {years} {author} and contributors." +msgstr "Copyright (c) {years} {author} ja muut tekijät." -#: Mailnag/plugins/spamfilterplugin.py:67 -msgid "Spam Filter" -msgstr "Roskapostisuodatin" +#: Mailnag/configuration/configwindow.py:290 +msgid "Homepage" +msgstr "Kotisivu" -#: Mailnag/plugins/spamfilterplugin.py:68 -msgid "Filters out unwanted mails." -msgstr "Suodattaa pois ei-toivottuja sähköposteja." +#: Mailnag/configuration/configwindow.py:293 +msgid "maintainer" +msgstr "ylläpitäjä" -#: Mailnag/plugins/spamfilterplugin.py:87 -msgid "" -"Mailnagger will ignore mails containing at least one of \n" -"the following words in subject or sender." -msgstr "" -"Mailnagger suodattaa pois postit, joissa on otsikossa\n" -"tai lähettäjäkentässä ainakin yksi seuraavista sanoista." +#. TRANSLATORS: Translate `translator-credits` to the list of names +#. of translators, or team, or something like that. +#: Mailnag/configuration/configwindow.py:313 +msgid "translator-credits" +msgstr "Timo Kankare" -#: Mailnag/plugins/soundplugin.py:66 -msgid "Sound Notifications" -msgstr "Äänimerkki" +#: Mailnag/configuration/configwindow.py:353 +msgid "Delete this account:" +msgstr "Poista tämä tili:" -#: Mailnag/plugins/soundplugin.py:67 -msgid "Plays a sound when new mails arrive." -msgstr "Soittaa äänimerkin, kun uusi sähköposti saapuu." +#: Mailnag/configuration/plugindialog.py:35 +msgid "Plugin Configuration" +msgstr "Lisäosan konfigurointi" #: Mailnag/plugins/userscriptplugin.py:60 msgid "User Script" @@ -96,142 +129,106 @@ msgstr "" "Mailnagger välittää skriptille uusien postien kokonaismäärän\n" "ja sen perään %s-sarjan." -#: Mailnag/plugins/libnotifyplugin.py:117 +#: Mailnag/plugins/libnotifyplugin.py:61 +msgid "Your Security Passcode" +msgstr "" + +#: Mailnag/plugins/libnotifyplugin.py:131 msgid "LibNotify Notifications" msgstr "LibNotify-huomautin" -#: Mailnag/plugins/libnotifyplugin.py:118 +#: Mailnag/plugins/libnotifyplugin.py:132 msgid "Shows a popup when new mails arrive." msgstr "Näyttää huomautuksen, kun uusi sähköposti saapuu." -#: Mailnag/plugins/libnotifyplugin.py:133 -msgid "Count of new mails" -msgstr "Uusien sähköpostien lukumäärä" - -#: Mailnag/plugins/libnotifyplugin.py:134 -msgid "Short summary of new mails" -msgstr "Lyhyt yhteenveto uusista sähköposteista" - -#: Mailnag/plugins/libnotifyplugin.py:135 -msgid "Detailed summary of new mails" -msgstr "Yksityiskohtainen yhteenveto uusista sähköposteista" - -#: Mailnag/plugins/libnotifyplugin.py:136 -msgid "One notification per new mail" -msgstr "Oma huomautus kustakin uudesta sähköpostista" - -#: Mailnag/plugins/libnotifyplugin.py:144 +#: Mailnag/plugins/libnotifyplugin.py:168 msgid "Notification mode:" msgstr "Huomautusvalinta:" -#: Mailnag/plugins/libnotifyplugin.py:237 -#: Mailnag/plugins/libnotifyplugin.py:273 -#: Mailnag/plugins/libnotifyplugin.py:310 +#: Mailnag/plugins/libnotifyplugin.py:280 +#: Mailnag/plugins/libnotifyplugin.py:316 +#: Mailnag/plugins/libnotifyplugin.py:445 #, python-brace-format msgid "{0} new mails" msgstr "{0} uutta sähköpostia" -#: Mailnag/plugins/libnotifyplugin.py:239 +#: Mailnag/plugins/libnotifyplugin.py:282 #, python-brace-format msgid "from {0} and others." msgstr "lähettäjältä {0} ja muilta." -#: Mailnag/plugins/libnotifyplugin.py:241 -#: Mailnag/plugins/libnotifyplugin.py:244 +#: Mailnag/plugins/libnotifyplugin.py:284 +#: Mailnag/plugins/libnotifyplugin.py:287 #, python-brace-format msgid "from {0}." msgstr "lähettäjältä {0}." -#: Mailnag/plugins/libnotifyplugin.py:243 -#: Mailnag/plugins/libnotifyplugin.py:275 -#: Mailnag/plugins/libnotifyplugin.py:312 +#: Mailnag/plugins/libnotifyplugin.py:286 +#: Mailnag/plugins/libnotifyplugin.py:318 +#: Mailnag/plugins/libnotifyplugin.py:447 msgid "New mail" msgstr "Uusi sähköposti" -#: Mailnag/plugins/libnotifyplugin.py:268 -#: Mailnag/plugins/libnotifyplugin.py:270 +#: Mailnag/plugins/libnotifyplugin.py:311 +#: Mailnag/plugins/libnotifyplugin.py:313 #, python-brace-format msgid "(and {0} more)" msgstr "(ja {0} muuta)" -#: Mailnag/plugins/libnotifyplugin.py:299 +#: Mailnag/plugins/libnotifyplugin.py:390 +#, python-brace-format +msgid "📋 Code: {0}" +msgstr "" + +#: Mailnag/plugins/libnotifyplugin.py:434 msgid "Mark as read" msgstr "Merkitse luetuksi" -#: Mailnag/configuration/accountdialog.py:77 -msgid "Mail Account" -msgstr "Sähköpostitili" - -#: Mailnag/configuration/accountdialog.py:119 -msgid "optional" -msgstr "valinnainen" - -#: Mailnag/configuration/accountdialog.py:123 -#: Mailnag/configuration/configwindow.py:88 -#: Mailnag/configuration/configwindow.py:108 -msgid "Enabled" -msgstr "Käytössä" - -#: Mailnag/configuration/accountdialog.py:129 -#: Mailnag/configuration/configwindow.py:94 -#: Mailnag/configuration/configwindow.py:114 -msgid "Name" -msgstr "Nimi" - -#: Mailnag/configuration/accountdialog.py:252 -msgid "IMAP (Custom)" -msgstr "IMAP" - -#: Mailnag/configuration/accountdialog.py:253 -msgid "POP3 (Custom)" -msgstr "POP3" - -#: Mailnag/configuration/accountdialog.py:254 -msgid "MBox (Custom)" -msgstr "MBox" - -#: Mailnag/configuration/accountdialog.py:255 -msgid "Maildir (Custom)" -msgstr "Maildir" - -#: Mailnag/configuration/accountdialog.py:361 -msgid "Connection failed." -msgstr "Yhteydenotto epäonnistui." +#: Mailnag/plugins/libnotifyplugin.py:629 +#, fuzzy +msgid "Delete this provider:" +msgstr "Poista tämä tili:" -#: Mailnag/configuration/configwindow.py:278 -msgid "About Mailnagger" -msgstr "Tietoja Mailnaggerista" +#: Mailnag/plugins/libnotifyplugin.py:630 +#: Mailnag/plugins/libnotifyplugin.ui.h:1 +#, fuzzy +msgid "Sender:" +msgstr "lähettäjä" -#: Mailnag/configuration/configwindow.py:281 -msgid "An extensible mail notification daemon." -msgstr "Laajennettava sähköpostihuomautin." +#: Mailnag/plugins/libnotifyplugin.py:631 +#: Mailnag/plugins/libnotifyplugin.ui.h:3 +#, fuzzy +msgid "Subject:" +msgstr "otsikko" -#: Mailnag/configuration/configwindow.py:283 -#, python-brace-format -msgid "Copyright (c) {years} {author} and contributors." -msgstr "Copyright (c) {years} {author} ja muut tekijät." +#: Mailnag/plugins/libnotifyplugin.py:632 +#: Mailnag/plugins/libnotifyplugin.ui.h:5 +msgid "Pattern:" +msgstr "" -#: Mailnag/configuration/configwindow.py:290 -msgid "Homepage" -msgstr "Kotisivu" +#: Mailnag/plugins/spamfilterplugin.py:67 +msgid "Spam Filter" +msgstr "Roskapostisuodatin" -#: Mailnag/configuration/configwindow.py:293 -msgid "maintainer" -msgstr "ylläpitäjä" +#: Mailnag/plugins/spamfilterplugin.py:68 +msgid "Filters out unwanted mails." +msgstr "Suodattaa pois ei-toivottuja sähköposteja." -#. TRANSLATORS: Translate `translator-credits` to the list of names -#. of translators, or team, or something like that. -#: Mailnag/configuration/configwindow.py:313 -msgid "translator-credits" -msgstr "Timo Kankare" +#: Mailnag/plugins/spamfilterplugin.py:87 +msgid "" +"Mailnagger will ignore mails containing at least one of \n" +"the following words in subject or sender." +msgstr "" +"Mailnagger suodattaa pois postit, joissa on otsikossa\n" +"tai lähettäjäkentässä ainakin yksi seuraavista sanoista." -#: Mailnag/configuration/configwindow.py:353 -msgid "Delete this account:" -msgstr "Poista tämä tili:" +#: Mailnag/plugins/soundplugin.py:66 +msgid "Sound Notifications" +msgstr "Äänimerkki" -#: Mailnag/configuration/plugindialog.py:35 -msgid "Plugin Configuration" -msgstr "Lisäosan konfigurointi" +#: Mailnag/plugins/soundplugin.py:67 +msgid "Plays a sound when new mails arrive." +msgstr "Soittaa äänimerkin, kun uusi sähköposti saapuu." #: Mailnag/configuration/ui/account_widget.ui.h:1 msgid "" @@ -316,3 +313,80 @@ msgstr "Lisäosat" #: Mailnag/configuration/ui/config_window.ui.h:8 msgid "Info" msgstr "Tietoja" + +#: Mailnag/plugins/libnotifyplugin.ui.h:2 +#, fuzzy +msgid "Sender" +msgstr "lähettäjä" + +#: Mailnag/plugins/libnotifyplugin.ui.h:4 +#, fuzzy +msgid "Subject" +msgstr "otsikko" + +#: Mailnag/plugins/libnotifyplugin.ui.h:6 +msgid "Pattern" +msgstr "" + +#: Mailnag/plugins/libnotifyplugin.ui.h:7 +msgid "Edit 2FA provider" +msgstr "" + +#: Mailnag/plugins/libnotifyplugin.ui.h:8 +#, fuzzy +msgid "Enable provider" +msgstr "Käytössä" + +#: Mailnag/plugins/libnotifyplugin.ui.h:9 +msgid "Count of new mails" +msgstr "Uusien sähköpostien lukumäärä" + +#: Mailnag/plugins/libnotifyplugin.ui.h:10 +msgid "Short summary of new mails" +msgstr "Lyhyt yhteenveto uusista sähköposteista" + +#: Mailnag/plugins/libnotifyplugin.ui.h:11 +msgid "Detailed summary of new mails" +msgstr "Yksityiskohtainen yhteenveto uusista sähköposteista" + +#: Mailnag/plugins/libnotifyplugin.ui.h:12 +msgid "One notification per new mail" +msgstr "Oma huomautus kustakin uudesta sähköpostista" + +#: Mailnag/plugins/libnotifyplugin.ui.h:13 +#, fuzzy +msgid "Only 2FA notification, when enabled" +msgstr "Oma huomautus kustakin uudesta sähköpostista" + +#: Mailnag/plugins/libnotifyplugin.ui.h:15 +msgid "Add 2FA Provider" +msgstr "" + +#: Mailnag/plugins/libnotifyplugin.ui.h:16 +msgid "Remove 2FA Provider" +msgstr "" + +#: Mailnag/plugins/libnotifyplugin.ui.h:17 +msgid "Edit 2FA Provider" +msgstr "" + +#: Mailnag/plugins/libnotifyplugin.ui.h:18 +#, fuzzy +msgid "2FA notifications" +msgstr "Äänimerkki" + +#: Mailnag/plugins/libnotifyplugin.ui.h:19 +msgid "Enable/disable libnotify 2FA processing" +msgstr "" + +#: Mailnag/plugins/libnotifyplugin.ui.h:20 +msgid "2FA providers" +msgstr "" + +#, fuzzy +#~ msgid "Garmin 2FA LibNotify Notifications" +#~ msgstr "LibNotify-huomautin" + +#, fuzzy +#~ msgid "Shows a popup when Garmin 2FA mails arrive." +#~ msgstr "Näyttää huomautuksen, kun uusi sähköposti saapuu." diff --git a/po/fr.po b/po/fr.po index feb3868..f072825 100644 --- a/po/fr.po +++ b/po/fr.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: mailnag\n" "Report-Msgid-Bugs-To: https://github.com/tikank/mailnagger/issues\n" -"POT-Creation-Date: 2025-11-10 12:57+0100\n" +"POT-Creation-Date: 2025-11-16 17:15+0100\n" "PO-Revision-Date: 2020-10-15 17:26+0000\n" "Last-Translator: J. Lavoie \n" "Language-Team: French \n" "Language-Team: Galician \n" @@ -18,53 +18,89 @@ msgstr "" "X-Launchpad-Export-Date: 2020-06-11 14:44+0000\n" "X-Generator: Launchpad (build b190cebbf563f89e480a8b57f641753c8196bda0)\n" -#: Mailnag/daemon/mails.py:153 +#: Mailnag/daemon/mails.py:183 msgid "No subject" msgstr "Sen asunto" -#: Mailnag/plugins/garmin2FAplugin.py:135 -#, fuzzy -msgid "Garmin 2FA LibNotify Notifications" -msgstr "Notificacións LibNotify" +#: Mailnag/configuration/accountdialog.py:77 +msgid "Mail Account" +msgstr "Conta de correo-e" -#: Mailnag/plugins/garmin2FAplugin.py:136 -#, fuzzy -msgid "Shows a popup when Garmin 2FA mails arrive." -msgstr "Mostra unha xanela emerxente ao recibir correos novos." +#: Mailnag/configuration/accountdialog.py:119 +msgid "optional" +msgstr "opcional" -#: Mailnag/plugins/garmin2FAplugin.py:203 -msgid "Your Security Passcode" +#: Mailnag/configuration/accountdialog.py:123 +#: Mailnag/configuration/configwindow.py:88 +#: Mailnag/configuration/configwindow.py:108 +#: Mailnag/plugins/libnotifyplugin.ui.h:14 +msgid "Enabled" +msgstr "Activado" + +#: Mailnag/configuration/accountdialog.py:129 +#: Mailnag/configuration/configwindow.py:94 +#: Mailnag/configuration/configwindow.py:114 +msgid "Name" +msgstr "Nome" + +#: Mailnag/configuration/accountdialog.py:252 +msgid "IMAP (Custom)" +msgstr "" + +#: Mailnag/configuration/accountdialog.py:253 +msgid "POP3 (Custom)" +msgstr "" + +#: Mailnag/configuration/accountdialog.py:254 +msgid "MBox (Custom)" +msgstr "" + +#: Mailnag/configuration/accountdialog.py:255 +msgid "Maildir (Custom)" +msgstr "" + +#: Mailnag/configuration/accountdialog.py:361 +msgid "Connection failed." +msgstr "" + +#: Mailnag/configuration/configwindow.py:278 +msgid "About Mailnagger" msgstr "" -#: Mailnag/plugins/garmin2FAplugin.py:220 +#: Mailnag/configuration/configwindow.py:281 +msgid "An extensible mail notification daemon." +msgstr "" + +#: Mailnag/configuration/configwindow.py:283 #, python-brace-format -msgid "📋 Code: {0}" +msgid "Copyright (c) {years} {author} and contributors." msgstr "" -#: Mailnag/plugins/spamfilterplugin.py:67 -msgid "Spam Filter" -msgstr "Filtro de spam" +#: Mailnag/configuration/configwindow.py:290 +msgid "Homepage" +msgstr "" -#: Mailnag/plugins/spamfilterplugin.py:68 -msgid "Filters out unwanted mails." -msgstr "Filtra os correos non desexados." +#: Mailnag/configuration/configwindow.py:293 +msgid "maintainer" +msgstr "" -#: Mailnag/plugins/spamfilterplugin.py:87 -#, fuzzy -msgid "" -"Mailnagger will ignore mails containing at least one of \n" -"the following words in subject or sender." +#. TRANSLATORS: Translate `translator-credits` to the list of names +#. of translators, or team, or something like that. +#: Mailnag/configuration/configwindow.py:313 +msgid "translator-credits" msgstr "" -"Mailnag ignorará os correos que conteñan alomenos \n" -"unha das seguintes palabras no asunto ou no remitente." +"Launchpad Contributions:\n" +" Manuel Xosé Lemos https://launchpad.net/~mxlemos\n" +" Marcos Lans https://launchpad.net/~markooss\n" +" Patrick Ulbrich https://launchpad.net/~pulb" -#: Mailnag/plugins/soundplugin.py:66 -msgid "Sound Notifications" -msgstr "Notificacións con son" +#: Mailnag/configuration/configwindow.py:353 +msgid "Delete this account:" +msgstr "Eliminar esta conta:" -#: Mailnag/plugins/soundplugin.py:67 -msgid "Plays a sound when new mails arrive." -msgstr "Reproduce un son ao recibir un novo correo-e" +#: Mailnag/configuration/plugindialog.py:35 +msgid "Plugin Configuration" +msgstr "Configuración do complemento" #: Mailnag/plugins/userscriptplugin.py:60 msgid "User Script" @@ -94,146 +130,107 @@ msgid "" "followed by %s sequences." msgstr "" -#: Mailnag/plugins/libnotifyplugin.py:117 +#: Mailnag/plugins/libnotifyplugin.py:61 +msgid "Your Security Passcode" +msgstr "" + +#: Mailnag/plugins/libnotifyplugin.py:131 msgid "LibNotify Notifications" msgstr "Notificacións LibNotify" -#: Mailnag/plugins/libnotifyplugin.py:118 +#: Mailnag/plugins/libnotifyplugin.py:132 msgid "Shows a popup when new mails arrive." msgstr "Mostra unha xanela emerxente ao recibir correos novos." -#: Mailnag/plugins/libnotifyplugin.py:133 -msgid "Count of new mails" -msgstr "Total de novos correos" - -#: Mailnag/plugins/libnotifyplugin.py:134 -msgid "Short summary of new mails" -msgstr "" - -#: Mailnag/plugins/libnotifyplugin.py:135 -msgid "Detailed summary of new mails" -msgstr "" - -#: Mailnag/plugins/libnotifyplugin.py:136 -msgid "One notification per new mail" -msgstr "Unha notificación por cada novo correo" - -#: Mailnag/plugins/libnotifyplugin.py:144 +#: Mailnag/plugins/libnotifyplugin.py:168 msgid "Notification mode:" msgstr "Modo Notificación:" -#: Mailnag/plugins/libnotifyplugin.py:237 -#: Mailnag/plugins/libnotifyplugin.py:273 -#: Mailnag/plugins/libnotifyplugin.py:310 +#: Mailnag/plugins/libnotifyplugin.py:280 +#: Mailnag/plugins/libnotifyplugin.py:316 +#: Mailnag/plugins/libnotifyplugin.py:445 #, python-brace-format msgid "{0} new mails" msgstr "{0} novos correos" -#: Mailnag/plugins/libnotifyplugin.py:239 +#: Mailnag/plugins/libnotifyplugin.py:282 #, python-brace-format msgid "from {0} and others." msgstr "" -#: Mailnag/plugins/libnotifyplugin.py:241 -#: Mailnag/plugins/libnotifyplugin.py:244 +#: Mailnag/plugins/libnotifyplugin.py:284 +#: Mailnag/plugins/libnotifyplugin.py:287 #, python-brace-format msgid "from {0}." msgstr "" -#: Mailnag/plugins/libnotifyplugin.py:243 -#: Mailnag/plugins/libnotifyplugin.py:275 -#: Mailnag/plugins/libnotifyplugin.py:312 +#: Mailnag/plugins/libnotifyplugin.py:286 +#: Mailnag/plugins/libnotifyplugin.py:318 +#: Mailnag/plugins/libnotifyplugin.py:447 msgid "New mail" msgstr "Correo novo" -#: Mailnag/plugins/libnotifyplugin.py:268 -#: Mailnag/plugins/libnotifyplugin.py:270 +#: Mailnag/plugins/libnotifyplugin.py:311 +#: Mailnag/plugins/libnotifyplugin.py:313 #, python-brace-format msgid "(and {0} more)" msgstr "(e {0} máis)" -#: Mailnag/plugins/libnotifyplugin.py:299 -msgid "Mark as read" -msgstr "Marcar como lido" - -#: Mailnag/configuration/accountdialog.py:77 -msgid "Mail Account" -msgstr "Conta de correo-e" - -#: Mailnag/configuration/accountdialog.py:119 -msgid "optional" -msgstr "opcional" - -#: Mailnag/configuration/accountdialog.py:123 -#: Mailnag/configuration/configwindow.py:88 -#: Mailnag/configuration/configwindow.py:108 -msgid "Enabled" -msgstr "Activado" - -#: Mailnag/configuration/accountdialog.py:129 -#: Mailnag/configuration/configwindow.py:94 -#: Mailnag/configuration/configwindow.py:114 -msgid "Name" -msgstr "Nome" - -#: Mailnag/configuration/accountdialog.py:252 -msgid "IMAP (Custom)" -msgstr "" - -#: Mailnag/configuration/accountdialog.py:253 -msgid "POP3 (Custom)" -msgstr "" - -#: Mailnag/configuration/accountdialog.py:254 -msgid "MBox (Custom)" +#: Mailnag/plugins/libnotifyplugin.py:390 +#, python-brace-format +msgid "📋 Code: {0}" msgstr "" -#: Mailnag/configuration/accountdialog.py:255 -msgid "Maildir (Custom)" -msgstr "" +#: Mailnag/plugins/libnotifyplugin.py:434 +msgid "Mark as read" +msgstr "Marcar como lido" -#: Mailnag/configuration/accountdialog.py:361 -msgid "Connection failed." -msgstr "" +#: Mailnag/plugins/libnotifyplugin.py:629 +#, fuzzy +msgid "Delete this provider:" +msgstr "Eliminar esta conta:" -#: Mailnag/configuration/configwindow.py:278 -msgid "About Mailnagger" -msgstr "" +#: Mailnag/plugins/libnotifyplugin.py:630 +#: Mailnag/plugins/libnotifyplugin.ui.h:1 +#, fuzzy +msgid "Sender:" +msgstr "remitente" -#: Mailnag/configuration/configwindow.py:281 -msgid "An extensible mail notification daemon." -msgstr "" +#: Mailnag/plugins/libnotifyplugin.py:631 +#: Mailnag/plugins/libnotifyplugin.ui.h:3 +#, fuzzy +msgid "Subject:" +msgstr "asunto" -#: Mailnag/configuration/configwindow.py:283 -#, python-brace-format -msgid "Copyright (c) {years} {author} and contributors." +#: Mailnag/plugins/libnotifyplugin.py:632 +#: Mailnag/plugins/libnotifyplugin.ui.h:5 +msgid "Pattern:" msgstr "" -#: Mailnag/configuration/configwindow.py:290 -msgid "Homepage" -msgstr "" +#: Mailnag/plugins/spamfilterplugin.py:67 +msgid "Spam Filter" +msgstr "Filtro de spam" -#: Mailnag/configuration/configwindow.py:293 -msgid "maintainer" -msgstr "" +#: Mailnag/plugins/spamfilterplugin.py:68 +msgid "Filters out unwanted mails." +msgstr "Filtra os correos non desexados." -#. TRANSLATORS: Translate `translator-credits` to the list of names -#. of translators, or team, or something like that. -#: Mailnag/configuration/configwindow.py:313 -msgid "translator-credits" +#: Mailnag/plugins/spamfilterplugin.py:87 +#, fuzzy +msgid "" +"Mailnagger will ignore mails containing at least one of \n" +"the following words in subject or sender." msgstr "" -"Launchpad Contributions:\n" -" Manuel Xosé Lemos https://launchpad.net/~mxlemos\n" -" Marcos Lans https://launchpad.net/~markooss\n" -" Patrick Ulbrich https://launchpad.net/~pulb" +"Mailnag ignorará os correos que conteñan alomenos \n" +"unha das seguintes palabras no asunto ou no remitente." -#: Mailnag/configuration/configwindow.py:353 -msgid "Delete this account:" -msgstr "Eliminar esta conta:" +#: Mailnag/plugins/soundplugin.py:66 +msgid "Sound Notifications" +msgstr "Notificacións con son" -#: Mailnag/configuration/plugindialog.py:35 -msgid "Plugin Configuration" -msgstr "Configuración do complemento" +#: Mailnag/plugins/soundplugin.py:67 +msgid "Plays a sound when new mails arrive." +msgstr "Reproduce un son ao recibir un novo correo-e" #: Mailnag/configuration/ui/account_widget.ui.h:1 msgid "" @@ -317,5 +314,82 @@ msgstr "Complementos" msgid "Info" msgstr "" +#: Mailnag/plugins/libnotifyplugin.ui.h:2 +#, fuzzy +msgid "Sender" +msgstr "remitente" + +#: Mailnag/plugins/libnotifyplugin.ui.h:4 +#, fuzzy +msgid "Subject" +msgstr "asunto" + +#: Mailnag/plugins/libnotifyplugin.ui.h:6 +msgid "Pattern" +msgstr "" + +#: Mailnag/plugins/libnotifyplugin.ui.h:7 +msgid "Edit 2FA provider" +msgstr "" + +#: Mailnag/plugins/libnotifyplugin.ui.h:8 +#, fuzzy +msgid "Enable provider" +msgstr "Activado" + +#: Mailnag/plugins/libnotifyplugin.ui.h:9 +msgid "Count of new mails" +msgstr "Total de novos correos" + +#: Mailnag/plugins/libnotifyplugin.ui.h:10 +msgid "Short summary of new mails" +msgstr "" + +#: Mailnag/plugins/libnotifyplugin.ui.h:11 +msgid "Detailed summary of new mails" +msgstr "" + +#: Mailnag/plugins/libnotifyplugin.ui.h:12 +msgid "One notification per new mail" +msgstr "Unha notificación por cada novo correo" + +#: Mailnag/plugins/libnotifyplugin.ui.h:13 +#, fuzzy +msgid "Only 2FA notification, when enabled" +msgstr "Unha notificación por cada novo correo" + +#: Mailnag/plugins/libnotifyplugin.ui.h:15 +msgid "Add 2FA Provider" +msgstr "" + +#: Mailnag/plugins/libnotifyplugin.ui.h:16 +msgid "Remove 2FA Provider" +msgstr "" + +#: Mailnag/plugins/libnotifyplugin.ui.h:17 +msgid "Edit 2FA Provider" +msgstr "" + +#: Mailnag/plugins/libnotifyplugin.ui.h:18 +#, fuzzy +msgid "2FA notifications" +msgstr "Notificacións con son" + +#: Mailnag/plugins/libnotifyplugin.ui.h:19 +msgid "Enable/disable libnotify 2FA processing" +msgstr "" + +#: Mailnag/plugins/libnotifyplugin.ui.h:20 +msgid "2FA providers" +msgstr "" + +#, fuzzy +#~ msgid "Garmin 2FA LibNotify Notifications" +#~ msgstr "Notificacións LibNotify" + +#, fuzzy +#~ msgid "Shows a popup when Garmin 2FA mails arrive." +#~ msgstr "Mostra unha xanela emerxente ao recibir correos novos." + #~ msgid "Maximum number of visible mails:" #~ msgstr "Número máximo de mensaxes visibles:" diff --git a/po/hr.po b/po/hr.po index 0710cf8..ef8d5be 100644 --- a/po/hr.po +++ b/po/hr.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: mailnag\n" "Report-Msgid-Bugs-To: https://github.com/tikank/mailnagger/issues\n" -"POT-Creation-Date: 2025-11-10 12:57+0100\n" +"POT-Creation-Date: 2025-11-16 17:15+0100\n" "PO-Revision-Date: 2021-01-18 00:35+0000\n" "Last-Translator: Milo Ivir \n" "Language-Team: Croatian \n" "Language-Team: Indonesian \n" @@ -18,53 +18,87 @@ msgstr "" "X-Launchpad-Export-Date: 2020-06-11 14:44+0000\n" "X-Generator: Launchpad (build b190cebbf563f89e480a8b57f641753c8196bda0)\n" -#: Mailnag/daemon/mails.py:153 +#: Mailnag/daemon/mails.py:183 msgid "No subject" msgstr "Tidak ada subyek" -#: Mailnag/plugins/garmin2FAplugin.py:135 -#, fuzzy -msgid "Garmin 2FA LibNotify Notifications" -msgstr "Notifikasi LibNotify" +#: Mailnag/configuration/accountdialog.py:77 +msgid "Mail Account" +msgstr "Akun Surat" -#: Mailnag/plugins/garmin2FAplugin.py:136 -#, fuzzy -msgid "Shows a popup when Garmin 2FA mails arrive." -msgstr "Tampilkan jendela munculan ketika surat baru datang." +#: Mailnag/configuration/accountdialog.py:119 +msgid "optional" +msgstr "opsional" -#: Mailnag/plugins/garmin2FAplugin.py:203 -msgid "Your Security Passcode" +#: Mailnag/configuration/accountdialog.py:123 +#: Mailnag/configuration/configwindow.py:88 +#: Mailnag/configuration/configwindow.py:108 +#: Mailnag/plugins/libnotifyplugin.ui.h:14 +msgid "Enabled" +msgstr "Aktifkan" + +#: Mailnag/configuration/accountdialog.py:129 +#: Mailnag/configuration/configwindow.py:94 +#: Mailnag/configuration/configwindow.py:114 +msgid "Name" +msgstr "Nama" + +#: Mailnag/configuration/accountdialog.py:252 +msgid "IMAP (Custom)" msgstr "" -#: Mailnag/plugins/garmin2FAplugin.py:220 +#: Mailnag/configuration/accountdialog.py:253 +msgid "POP3 (Custom)" +msgstr "" + +#: Mailnag/configuration/accountdialog.py:254 +msgid "MBox (Custom)" +msgstr "" + +#: Mailnag/configuration/accountdialog.py:255 +msgid "Maildir (Custom)" +msgstr "" + +#: Mailnag/configuration/accountdialog.py:361 +msgid "Connection failed." +msgstr "Koneksi gagal." + +#: Mailnag/configuration/configwindow.py:278 +msgid "About Mailnagger" +msgstr "" + +#: Mailnag/configuration/configwindow.py:281 +msgid "An extensible mail notification daemon." +msgstr "" + +#: Mailnag/configuration/configwindow.py:283 #, python-brace-format -msgid "📋 Code: {0}" +msgid "Copyright (c) {years} {author} and contributors." msgstr "" -#: Mailnag/plugins/spamfilterplugin.py:67 -msgid "Spam Filter" -msgstr "Penyaring Spam" +#: Mailnag/configuration/configwindow.py:290 +msgid "Homepage" +msgstr "" -#: Mailnag/plugins/spamfilterplugin.py:68 -msgid "Filters out unwanted mails." -msgstr "Saring surat yang tidak diinginkan." +#: Mailnag/configuration/configwindow.py:293 +msgid "maintainer" +msgstr "" -#: Mailnag/plugins/spamfilterplugin.py:87 -#, fuzzy -msgid "" -"Mailnagger will ignore mails containing at least one of \n" -"the following words in subject or sender." +#. TRANSLATORS: Translate `translator-credits` to the list of names +#. of translators, or team, or something like that. +#: Mailnag/configuration/configwindow.py:313 +msgid "translator-credits" msgstr "" -"Mailnag akan mengabaikan surat yang memuat sedikitnya \n" -"satu dari kata-kata berikut di dalam subyek atau pengirim." +"Launchpad Contributions:\n" +" zmni https://launchpad.net/~zmni-deactivatedaccount" -#: Mailnag/plugins/soundplugin.py:66 -msgid "Sound Notifications" -msgstr "Notifikasi Suara" +#: Mailnag/configuration/configwindow.py:353 +msgid "Delete this account:" +msgstr "Hapus akun ini:" -#: Mailnag/plugins/soundplugin.py:67 -msgid "Plays a sound when new mails arrive." -msgstr "Putar suara ketika surat baru datang." +#: Mailnag/configuration/plugindialog.py:35 +msgid "Plugin Configuration" +msgstr "Konfigurasi Plugin" #: Mailnag/plugins/userscriptplugin.py:60 msgid "User Script" @@ -94,144 +128,107 @@ msgid "" "followed by %s sequences." msgstr "" -#: Mailnag/plugins/libnotifyplugin.py:117 +#: Mailnag/plugins/libnotifyplugin.py:61 +msgid "Your Security Passcode" +msgstr "" + +#: Mailnag/plugins/libnotifyplugin.py:131 msgid "LibNotify Notifications" msgstr "Notifikasi LibNotify" -#: Mailnag/plugins/libnotifyplugin.py:118 +#: Mailnag/plugins/libnotifyplugin.py:132 msgid "Shows a popup when new mails arrive." msgstr "Tampilkan jendela munculan ketika surat baru datang." -#: Mailnag/plugins/libnotifyplugin.py:133 -msgid "Count of new mails" -msgstr "Jumlah surat baru" - -#: Mailnag/plugins/libnotifyplugin.py:134 -msgid "Short summary of new mails" -msgstr "Ringkasan singkat surel baru" - -#: Mailnag/plugins/libnotifyplugin.py:135 -msgid "Detailed summary of new mails" -msgstr "Ringkasan detail surel baru" - -#: Mailnag/plugins/libnotifyplugin.py:136 -msgid "One notification per new mail" -msgstr "Satu notifikasi per surat baru" - -#: Mailnag/plugins/libnotifyplugin.py:144 +#: Mailnag/plugins/libnotifyplugin.py:168 msgid "Notification mode:" msgstr "Mode notifikasi:" -#: Mailnag/plugins/libnotifyplugin.py:237 -#: Mailnag/plugins/libnotifyplugin.py:273 -#: Mailnag/plugins/libnotifyplugin.py:310 +#: Mailnag/plugins/libnotifyplugin.py:280 +#: Mailnag/plugins/libnotifyplugin.py:316 +#: Mailnag/plugins/libnotifyplugin.py:445 #, python-brace-format msgid "{0} new mails" msgstr "{0} surat baru" -#: Mailnag/plugins/libnotifyplugin.py:239 +#: Mailnag/plugins/libnotifyplugin.py:282 #, python-brace-format msgid "from {0} and others." msgstr "dari {0} dan lainnya." -#: Mailnag/plugins/libnotifyplugin.py:241 -#: Mailnag/plugins/libnotifyplugin.py:244 +#: Mailnag/plugins/libnotifyplugin.py:284 +#: Mailnag/plugins/libnotifyplugin.py:287 #, python-brace-format msgid "from {0}." msgstr "dari {0}." -#: Mailnag/plugins/libnotifyplugin.py:243 -#: Mailnag/plugins/libnotifyplugin.py:275 -#: Mailnag/plugins/libnotifyplugin.py:312 +#: Mailnag/plugins/libnotifyplugin.py:286 +#: Mailnag/plugins/libnotifyplugin.py:318 +#: Mailnag/plugins/libnotifyplugin.py:447 msgid "New mail" msgstr "Surat baru" -#: Mailnag/plugins/libnotifyplugin.py:268 -#: Mailnag/plugins/libnotifyplugin.py:270 +#: Mailnag/plugins/libnotifyplugin.py:311 +#: Mailnag/plugins/libnotifyplugin.py:313 #, python-brace-format msgid "(and {0} more)" msgstr "(dan {0} lainnya)" -#: Mailnag/plugins/libnotifyplugin.py:299 -msgid "Mark as read" -msgstr "Tandai sudah dibaca" - -#: Mailnag/configuration/accountdialog.py:77 -msgid "Mail Account" -msgstr "Akun Surat" - -#: Mailnag/configuration/accountdialog.py:119 -msgid "optional" -msgstr "opsional" - -#: Mailnag/configuration/accountdialog.py:123 -#: Mailnag/configuration/configwindow.py:88 -#: Mailnag/configuration/configwindow.py:108 -msgid "Enabled" -msgstr "Aktifkan" - -#: Mailnag/configuration/accountdialog.py:129 -#: Mailnag/configuration/configwindow.py:94 -#: Mailnag/configuration/configwindow.py:114 -msgid "Name" -msgstr "Nama" - -#: Mailnag/configuration/accountdialog.py:252 -msgid "IMAP (Custom)" -msgstr "" - -#: Mailnag/configuration/accountdialog.py:253 -msgid "POP3 (Custom)" -msgstr "" - -#: Mailnag/configuration/accountdialog.py:254 -msgid "MBox (Custom)" +#: Mailnag/plugins/libnotifyplugin.py:390 +#, python-brace-format +msgid "📋 Code: {0}" msgstr "" -#: Mailnag/configuration/accountdialog.py:255 -msgid "Maildir (Custom)" -msgstr "" +#: Mailnag/plugins/libnotifyplugin.py:434 +msgid "Mark as read" +msgstr "Tandai sudah dibaca" -#: Mailnag/configuration/accountdialog.py:361 -msgid "Connection failed." -msgstr "Koneksi gagal." +#: Mailnag/plugins/libnotifyplugin.py:629 +#, fuzzy +msgid "Delete this provider:" +msgstr "Hapus akun ini:" -#: Mailnag/configuration/configwindow.py:278 -msgid "About Mailnagger" -msgstr "" +#: Mailnag/plugins/libnotifyplugin.py:630 +#: Mailnag/plugins/libnotifyplugin.ui.h:1 +#, fuzzy +msgid "Sender:" +msgstr "pengirim" -#: Mailnag/configuration/configwindow.py:281 -msgid "An extensible mail notification daemon." -msgstr "" +#: Mailnag/plugins/libnotifyplugin.py:631 +#: Mailnag/plugins/libnotifyplugin.ui.h:3 +#, fuzzy +msgid "Subject:" +msgstr "subyek" -#: Mailnag/configuration/configwindow.py:283 -#, python-brace-format -msgid "Copyright (c) {years} {author} and contributors." +#: Mailnag/plugins/libnotifyplugin.py:632 +#: Mailnag/plugins/libnotifyplugin.ui.h:5 +msgid "Pattern:" msgstr "" -#: Mailnag/configuration/configwindow.py:290 -msgid "Homepage" -msgstr "" +#: Mailnag/plugins/spamfilterplugin.py:67 +msgid "Spam Filter" +msgstr "Penyaring Spam" -#: Mailnag/configuration/configwindow.py:293 -msgid "maintainer" -msgstr "" +#: Mailnag/plugins/spamfilterplugin.py:68 +msgid "Filters out unwanted mails." +msgstr "Saring surat yang tidak diinginkan." -#. TRANSLATORS: Translate `translator-credits` to the list of names -#. of translators, or team, or something like that. -#: Mailnag/configuration/configwindow.py:313 -msgid "translator-credits" +#: Mailnag/plugins/spamfilterplugin.py:87 +#, fuzzy +msgid "" +"Mailnagger will ignore mails containing at least one of \n" +"the following words in subject or sender." msgstr "" -"Launchpad Contributions:\n" -" zmni https://launchpad.net/~zmni-deactivatedaccount" +"Mailnag akan mengabaikan surat yang memuat sedikitnya \n" +"satu dari kata-kata berikut di dalam subyek atau pengirim." -#: Mailnag/configuration/configwindow.py:353 -msgid "Delete this account:" -msgstr "Hapus akun ini:" +#: Mailnag/plugins/soundplugin.py:66 +msgid "Sound Notifications" +msgstr "Notifikasi Suara" -#: Mailnag/configuration/plugindialog.py:35 -msgid "Plugin Configuration" -msgstr "Konfigurasi Plugin" +#: Mailnag/plugins/soundplugin.py:67 +msgid "Plays a sound when new mails arrive." +msgstr "Putar suara ketika surat baru datang." #: Mailnag/configuration/ui/account_widget.ui.h:1 msgid "" @@ -315,6 +312,83 @@ msgstr "Plugin" msgid "Info" msgstr "" +#: Mailnag/plugins/libnotifyplugin.ui.h:2 +#, fuzzy +msgid "Sender" +msgstr "pengirim" + +#: Mailnag/plugins/libnotifyplugin.ui.h:4 +#, fuzzy +msgid "Subject" +msgstr "subyek" + +#: Mailnag/plugins/libnotifyplugin.ui.h:6 +msgid "Pattern" +msgstr "" + +#: Mailnag/plugins/libnotifyplugin.ui.h:7 +msgid "Edit 2FA provider" +msgstr "" + +#: Mailnag/plugins/libnotifyplugin.ui.h:8 +#, fuzzy +msgid "Enable provider" +msgstr "Aktifkan" + +#: Mailnag/plugins/libnotifyplugin.ui.h:9 +msgid "Count of new mails" +msgstr "Jumlah surat baru" + +#: Mailnag/plugins/libnotifyplugin.ui.h:10 +msgid "Short summary of new mails" +msgstr "Ringkasan singkat surel baru" + +#: Mailnag/plugins/libnotifyplugin.ui.h:11 +msgid "Detailed summary of new mails" +msgstr "Ringkasan detail surel baru" + +#: Mailnag/plugins/libnotifyplugin.ui.h:12 +msgid "One notification per new mail" +msgstr "Satu notifikasi per surat baru" + +#: Mailnag/plugins/libnotifyplugin.ui.h:13 +#, fuzzy +msgid "Only 2FA notification, when enabled" +msgstr "Satu notifikasi per surat baru" + +#: Mailnag/plugins/libnotifyplugin.ui.h:15 +msgid "Add 2FA Provider" +msgstr "" + +#: Mailnag/plugins/libnotifyplugin.ui.h:16 +msgid "Remove 2FA Provider" +msgstr "" + +#: Mailnag/plugins/libnotifyplugin.ui.h:17 +msgid "Edit 2FA Provider" +msgstr "" + +#: Mailnag/plugins/libnotifyplugin.ui.h:18 +#, fuzzy +msgid "2FA notifications" +msgstr "Notifikasi Suara" + +#: Mailnag/plugins/libnotifyplugin.ui.h:19 +msgid "Enable/disable libnotify 2FA processing" +msgstr "" + +#: Mailnag/plugins/libnotifyplugin.ui.h:20 +msgid "2FA providers" +msgstr "" + +#, fuzzy +#~ msgid "Garmin 2FA LibNotify Notifications" +#~ msgstr "Notifikasi LibNotify" + +#, fuzzy +#~ msgid "Shows a popup when Garmin 2FA mails arrive." +#~ msgstr "Tampilkan jendela munculan ketika surat baru datang." + #~ msgid "Maximum number of visible mails:" #~ msgstr "Jumlah maksimum surat terlihat:" diff --git a/po/it.po b/po/it.po index 0a624d0..a49fd5d 100644 --- a/po/it.po +++ b/po/it.po @@ -2,7 +2,7 @@ msgid "" msgstr "" "Project-Id-Version: mailnag\n" "Report-Msgid-Bugs-To: https://github.com/tikank/mailnagger/issues\n" -"POT-Creation-Date: 2025-11-10 12:57+0100\n" +"POT-Creation-Date: 2025-11-16 17:15+0100\n" "PO-Revision-Date: 2020-10-15 17:26+0000\n" "Last-Translator: J. Lavoie \n" "Language-Team: Italian \n" "Language-Team: LANGUAGE \n" @@ -17,47 +17,84 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -#: Mailnag/daemon/mails.py:153 +#: Mailnag/daemon/mails.py:183 msgid "No subject" msgstr "" -#: Mailnag/plugins/garmin2FAplugin.py:135 -msgid "Garmin 2FA LibNotify Notifications" +#: Mailnag/configuration/accountdialog.py:77 +msgid "Mail Account" msgstr "" -#: Mailnag/plugins/garmin2FAplugin.py:136 -msgid "Shows a popup when Garmin 2FA mails arrive." +#: Mailnag/configuration/accountdialog.py:119 +msgid "optional" msgstr "" -#: Mailnag/plugins/garmin2FAplugin.py:203 -msgid "Your Security Passcode" +#: Mailnag/configuration/accountdialog.py:123 +#: Mailnag/configuration/configwindow.py:88 +#: Mailnag/configuration/configwindow.py:108 +#: Mailnag/plugins/libnotifyplugin.ui.h:14 +msgid "Enabled" +msgstr "" + +#: Mailnag/configuration/accountdialog.py:129 +#: Mailnag/configuration/configwindow.py:94 +#: Mailnag/configuration/configwindow.py:114 +msgid "Name" +msgstr "" + +#: Mailnag/configuration/accountdialog.py:252 +msgid "IMAP (Custom)" +msgstr "" + +#: Mailnag/configuration/accountdialog.py:253 +msgid "POP3 (Custom)" +msgstr "" + +#: Mailnag/configuration/accountdialog.py:254 +msgid "MBox (Custom)" +msgstr "" + +#: Mailnag/configuration/accountdialog.py:255 +msgid "Maildir (Custom)" +msgstr "" + +#: Mailnag/configuration/accountdialog.py:361 +msgid "Connection failed." +msgstr "" + +#: Mailnag/configuration/configwindow.py:278 +msgid "About Mailnagger" +msgstr "" + +#: Mailnag/configuration/configwindow.py:281 +msgid "An extensible mail notification daemon." msgstr "" -#: Mailnag/plugins/garmin2FAplugin.py:220 +#: Mailnag/configuration/configwindow.py:283 #, python-brace-format -msgid "📋 Code: {0}" +msgid "Copyright (c) {years} {author} and contributors." msgstr "" -#: Mailnag/plugins/spamfilterplugin.py:67 -msgid "Spam Filter" +#: Mailnag/configuration/configwindow.py:290 +msgid "Homepage" msgstr "" -#: Mailnag/plugins/spamfilterplugin.py:68 -msgid "Filters out unwanted mails." +#: Mailnag/configuration/configwindow.py:293 +msgid "maintainer" msgstr "" -#: Mailnag/plugins/spamfilterplugin.py:87 -msgid "" -"Mailnagger will ignore mails containing at least one of \n" -"the following words in subject or sender." +#. TRANSLATORS: Translate `translator-credits` to the list of names +#. of translators, or team, or something like that. +#: Mailnag/configuration/configwindow.py:313 +msgid "translator-credits" msgstr "" -#: Mailnag/plugins/soundplugin.py:66 -msgid "Sound Notifications" +#: Mailnag/configuration/configwindow.py:353 +msgid "Delete this account:" msgstr "" -#: Mailnag/plugins/soundplugin.py:67 -msgid "Plays a sound when new mails arrive." +#: Mailnag/configuration/plugindialog.py:35 +msgid "Plugin Configuration" msgstr "" #: Mailnag/plugins/userscriptplugin.py:60 @@ -88,141 +125,100 @@ msgid "" "followed by %s sequences." msgstr "" -#: Mailnag/plugins/libnotifyplugin.py:117 -msgid "LibNotify Notifications" -msgstr "" - -#: Mailnag/plugins/libnotifyplugin.py:118 -msgid "Shows a popup when new mails arrive." -msgstr "" - -#: Mailnag/plugins/libnotifyplugin.py:133 -msgid "Count of new mails" -msgstr "" - -#: Mailnag/plugins/libnotifyplugin.py:134 -msgid "Short summary of new mails" +#: Mailnag/plugins/libnotifyplugin.py:61 +msgid "Your Security Passcode" msgstr "" -#: Mailnag/plugins/libnotifyplugin.py:135 -msgid "Detailed summary of new mails" +#: Mailnag/plugins/libnotifyplugin.py:131 +msgid "LibNotify Notifications" msgstr "" -#: Mailnag/plugins/libnotifyplugin.py:136 -msgid "One notification per new mail" +#: Mailnag/plugins/libnotifyplugin.py:132 +msgid "Shows a popup when new mails arrive." msgstr "" -#: Mailnag/plugins/libnotifyplugin.py:144 +#: Mailnag/plugins/libnotifyplugin.py:168 msgid "Notification mode:" msgstr "" -#: Mailnag/plugins/libnotifyplugin.py:237 -#: Mailnag/plugins/libnotifyplugin.py:273 -#: Mailnag/plugins/libnotifyplugin.py:310 +#: Mailnag/plugins/libnotifyplugin.py:280 +#: Mailnag/plugins/libnotifyplugin.py:316 +#: Mailnag/plugins/libnotifyplugin.py:445 #, python-brace-format msgid "{0} new mails" msgstr "" -#: Mailnag/plugins/libnotifyplugin.py:239 +#: Mailnag/plugins/libnotifyplugin.py:282 #, python-brace-format msgid "from {0} and others." msgstr "" -#: Mailnag/plugins/libnotifyplugin.py:241 -#: Mailnag/plugins/libnotifyplugin.py:244 +#: Mailnag/plugins/libnotifyplugin.py:284 +#: Mailnag/plugins/libnotifyplugin.py:287 #, python-brace-format msgid "from {0}." msgstr "" -#: Mailnag/plugins/libnotifyplugin.py:243 -#: Mailnag/plugins/libnotifyplugin.py:275 -#: Mailnag/plugins/libnotifyplugin.py:312 +#: Mailnag/plugins/libnotifyplugin.py:286 +#: Mailnag/plugins/libnotifyplugin.py:318 +#: Mailnag/plugins/libnotifyplugin.py:447 msgid "New mail" msgstr "" -#: Mailnag/plugins/libnotifyplugin.py:268 -#: Mailnag/plugins/libnotifyplugin.py:270 +#: Mailnag/plugins/libnotifyplugin.py:311 +#: Mailnag/plugins/libnotifyplugin.py:313 #, python-brace-format msgid "(and {0} more)" msgstr "" -#: Mailnag/plugins/libnotifyplugin.py:299 -msgid "Mark as read" -msgstr "" - -#: Mailnag/configuration/accountdialog.py:77 -msgid "Mail Account" -msgstr "" - -#: Mailnag/configuration/accountdialog.py:119 -msgid "optional" -msgstr "" - -#: Mailnag/configuration/accountdialog.py:123 -#: Mailnag/configuration/configwindow.py:88 -#: Mailnag/configuration/configwindow.py:108 -msgid "Enabled" -msgstr "" - -#: Mailnag/configuration/accountdialog.py:129 -#: Mailnag/configuration/configwindow.py:94 -#: Mailnag/configuration/configwindow.py:114 -msgid "Name" -msgstr "" - -#: Mailnag/configuration/accountdialog.py:252 -msgid "IMAP (Custom)" -msgstr "" - -#: Mailnag/configuration/accountdialog.py:253 -msgid "POP3 (Custom)" -msgstr "" - -#: Mailnag/configuration/accountdialog.py:254 -msgid "MBox (Custom)" +#: Mailnag/plugins/libnotifyplugin.py:390 +#, python-brace-format +msgid "📋 Code: {0}" msgstr "" -#: Mailnag/configuration/accountdialog.py:255 -msgid "Maildir (Custom)" +#: Mailnag/plugins/libnotifyplugin.py:434 +msgid "Mark as read" msgstr "" -#: Mailnag/configuration/accountdialog.py:361 -msgid "Connection failed." +#: Mailnag/plugins/libnotifyplugin.py:629 +msgid "Delete this provider:" msgstr "" -#: Mailnag/configuration/configwindow.py:278 -msgid "About Mailnagger" +#: Mailnag/plugins/libnotifyplugin.py:630 +#: Mailnag/plugins/libnotifyplugin.ui.h:1 +msgid "Sender:" msgstr "" -#: Mailnag/configuration/configwindow.py:281 -msgid "An extensible mail notification daemon." +#: Mailnag/plugins/libnotifyplugin.py:631 +#: Mailnag/plugins/libnotifyplugin.ui.h:3 +msgid "Subject:" msgstr "" -#: Mailnag/configuration/configwindow.py:283 -#, python-brace-format -msgid "Copyright (c) {years} {author} and contributors." +#: Mailnag/plugins/libnotifyplugin.py:632 +#: Mailnag/plugins/libnotifyplugin.ui.h:5 +msgid "Pattern:" msgstr "" -#: Mailnag/configuration/configwindow.py:290 -msgid "Homepage" +#: Mailnag/plugins/spamfilterplugin.py:67 +msgid "Spam Filter" msgstr "" -#: Mailnag/configuration/configwindow.py:293 -msgid "maintainer" +#: Mailnag/plugins/spamfilterplugin.py:68 +msgid "Filters out unwanted mails." msgstr "" -#. TRANSLATORS: Translate `translator-credits` to the list of names -#. of translators, or team, or something like that. -#: Mailnag/configuration/configwindow.py:313 -msgid "translator-credits" +#: Mailnag/plugins/spamfilterplugin.py:87 +msgid "" +"Mailnagger will ignore mails containing at least one of \n" +"the following words in subject or sender." msgstr "" -#: Mailnag/configuration/configwindow.py:353 -msgid "Delete this account:" +#: Mailnag/plugins/soundplugin.py:66 +msgid "Sound Notifications" msgstr "" -#: Mailnag/configuration/plugindialog.py:35 -msgid "Plugin Configuration" +#: Mailnag/plugins/soundplugin.py:67 +msgid "Plays a sound when new mails arrive." msgstr "" #: Mailnag/configuration/ui/account_widget.ui.h:1 @@ -306,3 +302,67 @@ msgstr "" #: Mailnag/configuration/ui/config_window.ui.h:8 msgid "Info" msgstr "" + +#: Mailnag/plugins/libnotifyplugin.ui.h:2 +msgid "Sender" +msgstr "" + +#: Mailnag/plugins/libnotifyplugin.ui.h:4 +msgid "Subject" +msgstr "" + +#: Mailnag/plugins/libnotifyplugin.ui.h:6 +msgid "Pattern" +msgstr "" + +#: Mailnag/plugins/libnotifyplugin.ui.h:7 +msgid "Edit 2FA provider" +msgstr "" + +#: Mailnag/plugins/libnotifyplugin.ui.h:8 +msgid "Enable provider" +msgstr "" + +#: Mailnag/plugins/libnotifyplugin.ui.h:9 +msgid "Count of new mails" +msgstr "" + +#: Mailnag/plugins/libnotifyplugin.ui.h:10 +msgid "Short summary of new mails" +msgstr "" + +#: Mailnag/plugins/libnotifyplugin.ui.h:11 +msgid "Detailed summary of new mails" +msgstr "" + +#: Mailnag/plugins/libnotifyplugin.ui.h:12 +msgid "One notification per new mail" +msgstr "" + +#: Mailnag/plugins/libnotifyplugin.ui.h:13 +msgid "Only 2FA notification, when enabled" +msgstr "" + +#: Mailnag/plugins/libnotifyplugin.ui.h:15 +msgid "Add 2FA Provider" +msgstr "" + +#: Mailnag/plugins/libnotifyplugin.ui.h:16 +msgid "Remove 2FA Provider" +msgstr "" + +#: Mailnag/plugins/libnotifyplugin.ui.h:17 +msgid "Edit 2FA Provider" +msgstr "" + +#: Mailnag/plugins/libnotifyplugin.ui.h:18 +msgid "2FA notifications" +msgstr "" + +#: Mailnag/plugins/libnotifyplugin.ui.h:19 +msgid "Enable/disable libnotify 2FA processing" +msgstr "" + +#: Mailnag/plugins/libnotifyplugin.ui.h:20 +msgid "2FA providers" +msgstr "" diff --git a/po/pl.po b/po/pl.po index 8baab0d..f1f96db 100644 --- a/po/pl.po +++ b/po/pl.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: mailnag\n" "Report-Msgid-Bugs-To: https://github.com/tikank/mailnagger/issues\n" -"POT-Creation-Date: 2025-11-10 12:57+0100\n" +"POT-Creation-Date: 2025-11-16 17:15+0100\n" "PO-Revision-Date: 2019-03-16 14:48+0000\n" "Last-Translator: Launchpad Translations Administrators \n" "Language-Team: Polish \n" @@ -18,50 +18,92 @@ msgstr "" "X-Launchpad-Export-Date: 2020-06-11 14:44+0000\n" "X-Generator: Launchpad (build b190cebbf563f89e480a8b57f641753c8196bda0)\n" -#: Mailnag/daemon/mails.py:153 +#: Mailnag/daemon/mails.py:183 msgid "No subject" msgstr "Brak tematu" -#: Mailnag/plugins/garmin2FAplugin.py:135 -#, fuzzy -msgid "Garmin 2FA LibNotify Notifications" -msgstr "Powiadomienia LibNotify" +#: Mailnag/configuration/accountdialog.py:77 +msgid "Mail Account" +msgstr "Konto pocztowe" -#: Mailnag/plugins/garmin2FAplugin.py:136 -#, fuzzy -msgid "Shows a popup when Garmin 2FA mails arrive." -msgstr "Pokaż okno kiedy przychodzi nowa poczta." +#: Mailnag/configuration/accountdialog.py:119 +msgid "optional" +msgstr "opcjonalny" -#: Mailnag/plugins/garmin2FAplugin.py:203 -msgid "Your Security Passcode" +#: Mailnag/configuration/accountdialog.py:123 +#: Mailnag/configuration/configwindow.py:88 +#: Mailnag/configuration/configwindow.py:108 +#: Mailnag/plugins/libnotifyplugin.ui.h:14 +msgid "Enabled" +msgstr "Włączone" + +#: Mailnag/configuration/accountdialog.py:129 +#: Mailnag/configuration/configwindow.py:94 +#: Mailnag/configuration/configwindow.py:114 +msgid "Name" +msgstr "Nazwa" + +#: Mailnag/configuration/accountdialog.py:252 +msgid "IMAP (Custom)" +msgstr "" + +#: Mailnag/configuration/accountdialog.py:253 +msgid "POP3 (Custom)" +msgstr "" + +#: Mailnag/configuration/accountdialog.py:254 +msgid "MBox (Custom)" +msgstr "" + +#: Mailnag/configuration/accountdialog.py:255 +msgid "Maildir (Custom)" +msgstr "" + +#: Mailnag/configuration/accountdialog.py:361 +msgid "Connection failed." +msgstr "Połączenie nie powiodło się." + +#: Mailnag/configuration/configwindow.py:278 +msgid "About Mailnagger" msgstr "" -#: Mailnag/plugins/garmin2FAplugin.py:220 +#: Mailnag/configuration/configwindow.py:281 +msgid "An extensible mail notification daemon." +msgstr "" + +#: Mailnag/configuration/configwindow.py:283 #, python-brace-format -msgid "📋 Code: {0}" +msgid "Copyright (c) {years} {author} and contributors." msgstr "" -#: Mailnag/plugins/spamfilterplugin.py:67 -msgid "Spam Filter" -msgstr "Filtr spamowy" +#: Mailnag/configuration/configwindow.py:290 +msgid "Homepage" +msgstr "" -#: Mailnag/plugins/spamfilterplugin.py:68 -msgid "Filters out unwanted mails." -msgstr "Filtruje niechciane wiadomości." +#: Mailnag/configuration/configwindow.py:293 +msgid "maintainer" +msgstr "" -#: Mailnag/plugins/spamfilterplugin.py:87 -msgid "" -"Mailnagger will ignore mails containing at least one of \n" -"the following words in subject or sender." +#. TRANSLATORS: Translate `translator-credits` to the list of names +#. of translators, or team, or something like that. +#: Mailnag/configuration/configwindow.py:313 +msgid "translator-credits" msgstr "" +"Launchpad Contributions:\n" +" Maciej https://launchpad.net/~pan-efem\n" +" Patrick Ulbrich https://launchpad.net/~pulb\n" +" Piotr Filipek https://launchpad.net/~piotrek290\n" +" RapierTG https://launchpad.net/~rapier\n" +" Szymon Nieznański https://launchpad.net/~isamu715\n" +" vbert https://launchpad.net/~wsobczak" -#: Mailnag/plugins/soundplugin.py:66 -msgid "Sound Notifications" -msgstr "Dżwięk powiadomienia" +#: Mailnag/configuration/configwindow.py:353 +msgid "Delete this account:" +msgstr "Usuń to konto:" -#: Mailnag/plugins/soundplugin.py:67 -msgid "Plays a sound when new mails arrive." -msgstr "Odtwarzaj dźwięk kiedy przychodzi nowa poczta." +#: Mailnag/configuration/plugindialog.py:35 +msgid "Plugin Configuration" +msgstr "Konfiguracja wtyczki" #: Mailnag/plugins/userscriptplugin.py:60 msgid "User Script" @@ -91,149 +133,104 @@ msgid "" "followed by %s sequences." msgstr "" -#: Mailnag/plugins/libnotifyplugin.py:117 +#: Mailnag/plugins/libnotifyplugin.py:61 +msgid "Your Security Passcode" +msgstr "" + +#: Mailnag/plugins/libnotifyplugin.py:131 msgid "LibNotify Notifications" msgstr "Powiadomienia LibNotify" -#: Mailnag/plugins/libnotifyplugin.py:118 +#: Mailnag/plugins/libnotifyplugin.py:132 msgid "Shows a popup when new mails arrive." msgstr "Pokaż okno kiedy przychodzi nowa poczta." -#: Mailnag/plugins/libnotifyplugin.py:133 -msgid "Count of new mails" -msgstr "Liczba nowych wiadomości" - -#: Mailnag/plugins/libnotifyplugin.py:134 -msgid "Short summary of new mails" -msgstr "Krótkie podsumowanie nowych wiadomości e-mail" - -#: Mailnag/plugins/libnotifyplugin.py:135 -msgid "Detailed summary of new mails" -msgstr "Szczegółowe podsumowanie nowych wiadomości e-mail" - -#: Mailnag/plugins/libnotifyplugin.py:136 -msgid "One notification per new mail" -msgstr "Jedno powiadomienie dla jednej wiadomości" - -#: Mailnag/plugins/libnotifyplugin.py:144 +#: Mailnag/plugins/libnotifyplugin.py:168 msgid "Notification mode:" msgstr "Tryb powiadamiania:" -#: Mailnag/plugins/libnotifyplugin.py:237 -#: Mailnag/plugins/libnotifyplugin.py:273 -#: Mailnag/plugins/libnotifyplugin.py:310 +#: Mailnag/plugins/libnotifyplugin.py:280 +#: Mailnag/plugins/libnotifyplugin.py:316 +#: Mailnag/plugins/libnotifyplugin.py:445 #, python-brace-format msgid "{0} new mails" msgstr "{0} nowych wiadomości" -#: Mailnag/plugins/libnotifyplugin.py:239 +#: Mailnag/plugins/libnotifyplugin.py:282 #, python-brace-format msgid "from {0} and others." msgstr "od {0} i innych." -#: Mailnag/plugins/libnotifyplugin.py:241 -#: Mailnag/plugins/libnotifyplugin.py:244 +#: Mailnag/plugins/libnotifyplugin.py:284 +#: Mailnag/plugins/libnotifyplugin.py:287 #, python-brace-format msgid "from {0}." msgstr "od {0}" -#: Mailnag/plugins/libnotifyplugin.py:243 -#: Mailnag/plugins/libnotifyplugin.py:275 -#: Mailnag/plugins/libnotifyplugin.py:312 +#: Mailnag/plugins/libnotifyplugin.py:286 +#: Mailnag/plugins/libnotifyplugin.py:318 +#: Mailnag/plugins/libnotifyplugin.py:447 msgid "New mail" msgstr "Nowa poczta" -#: Mailnag/plugins/libnotifyplugin.py:268 -#: Mailnag/plugins/libnotifyplugin.py:270 +#: Mailnag/plugins/libnotifyplugin.py:311 +#: Mailnag/plugins/libnotifyplugin.py:313 #, python-brace-format msgid "(and {0} more)" msgstr "(i {0} więcej)" -#: Mailnag/plugins/libnotifyplugin.py:299 -msgid "Mark as read" -msgstr "Oznacz jako przeczytana" - -#: Mailnag/configuration/accountdialog.py:77 -msgid "Mail Account" -msgstr "Konto pocztowe" - -#: Mailnag/configuration/accountdialog.py:119 -msgid "optional" -msgstr "opcjonalny" - -#: Mailnag/configuration/accountdialog.py:123 -#: Mailnag/configuration/configwindow.py:88 -#: Mailnag/configuration/configwindow.py:108 -msgid "Enabled" -msgstr "Włączone" - -#: Mailnag/configuration/accountdialog.py:129 -#: Mailnag/configuration/configwindow.py:94 -#: Mailnag/configuration/configwindow.py:114 -msgid "Name" -msgstr "Nazwa" - -#: Mailnag/configuration/accountdialog.py:252 -msgid "IMAP (Custom)" -msgstr "" - -#: Mailnag/configuration/accountdialog.py:253 -msgid "POP3 (Custom)" -msgstr "" - -#: Mailnag/configuration/accountdialog.py:254 -msgid "MBox (Custom)" +#: Mailnag/plugins/libnotifyplugin.py:390 +#, python-brace-format +msgid "📋 Code: {0}" msgstr "" -#: Mailnag/configuration/accountdialog.py:255 -msgid "Maildir (Custom)" -msgstr "" +#: Mailnag/plugins/libnotifyplugin.py:434 +msgid "Mark as read" +msgstr "Oznacz jako przeczytana" -#: Mailnag/configuration/accountdialog.py:361 -msgid "Connection failed." -msgstr "Połączenie nie powiodło się." +#: Mailnag/plugins/libnotifyplugin.py:629 +#, fuzzy +msgid "Delete this provider:" +msgstr "Usuń to konto:" -#: Mailnag/configuration/configwindow.py:278 -msgid "About Mailnagger" -msgstr "" +#: Mailnag/plugins/libnotifyplugin.py:630 +#: Mailnag/plugins/libnotifyplugin.ui.h:1 +#, fuzzy +msgid "Sender:" +msgstr "nadawca" -#: Mailnag/configuration/configwindow.py:281 -msgid "An extensible mail notification daemon." -msgstr "" +#: Mailnag/plugins/libnotifyplugin.py:631 +#: Mailnag/plugins/libnotifyplugin.ui.h:3 +#, fuzzy +msgid "Subject:" +msgstr "temat" -#: Mailnag/configuration/configwindow.py:283 -#, python-brace-format -msgid "Copyright (c) {years} {author} and contributors." +#: Mailnag/plugins/libnotifyplugin.py:632 +#: Mailnag/plugins/libnotifyplugin.ui.h:5 +msgid "Pattern:" msgstr "" -#: Mailnag/configuration/configwindow.py:290 -msgid "Homepage" -msgstr "" +#: Mailnag/plugins/spamfilterplugin.py:67 +msgid "Spam Filter" +msgstr "Filtr spamowy" -#: Mailnag/configuration/configwindow.py:293 -msgid "maintainer" -msgstr "" +#: Mailnag/plugins/spamfilterplugin.py:68 +msgid "Filters out unwanted mails." +msgstr "Filtruje niechciane wiadomości." -#. TRANSLATORS: Translate `translator-credits` to the list of names -#. of translators, or team, or something like that. -#: Mailnag/configuration/configwindow.py:313 -msgid "translator-credits" +#: Mailnag/plugins/spamfilterplugin.py:87 +msgid "" +"Mailnagger will ignore mails containing at least one of \n" +"the following words in subject or sender." msgstr "" -"Launchpad Contributions:\n" -" Maciej https://launchpad.net/~pan-efem\n" -" Patrick Ulbrich https://launchpad.net/~pulb\n" -" Piotr Filipek https://launchpad.net/~piotrek290\n" -" RapierTG https://launchpad.net/~rapier\n" -" Szymon Nieznański https://launchpad.net/~isamu715\n" -" vbert https://launchpad.net/~wsobczak" -#: Mailnag/configuration/configwindow.py:353 -msgid "Delete this account:" -msgstr "Usuń to konto:" +#: Mailnag/plugins/soundplugin.py:66 +msgid "Sound Notifications" +msgstr "Dżwięk powiadomienia" -#: Mailnag/configuration/plugindialog.py:35 -msgid "Plugin Configuration" -msgstr "Konfiguracja wtyczki" +#: Mailnag/plugins/soundplugin.py:67 +msgid "Plays a sound when new mails arrive." +msgstr "Odtwarzaj dźwięk kiedy przychodzi nowa poczta." #: Mailnag/configuration/ui/account_widget.ui.h:1 msgid "" @@ -317,6 +314,83 @@ msgstr "Wtyczki" msgid "Info" msgstr "" +#: Mailnag/plugins/libnotifyplugin.ui.h:2 +#, fuzzy +msgid "Sender" +msgstr "nadawca" + +#: Mailnag/plugins/libnotifyplugin.ui.h:4 +#, fuzzy +msgid "Subject" +msgstr "temat" + +#: Mailnag/plugins/libnotifyplugin.ui.h:6 +msgid "Pattern" +msgstr "" + +#: Mailnag/plugins/libnotifyplugin.ui.h:7 +msgid "Edit 2FA provider" +msgstr "" + +#: Mailnag/plugins/libnotifyplugin.ui.h:8 +#, fuzzy +msgid "Enable provider" +msgstr "Włączone" + +#: Mailnag/plugins/libnotifyplugin.ui.h:9 +msgid "Count of new mails" +msgstr "Liczba nowych wiadomości" + +#: Mailnag/plugins/libnotifyplugin.ui.h:10 +msgid "Short summary of new mails" +msgstr "Krótkie podsumowanie nowych wiadomości e-mail" + +#: Mailnag/plugins/libnotifyplugin.ui.h:11 +msgid "Detailed summary of new mails" +msgstr "Szczegółowe podsumowanie nowych wiadomości e-mail" + +#: Mailnag/plugins/libnotifyplugin.ui.h:12 +msgid "One notification per new mail" +msgstr "Jedno powiadomienie dla jednej wiadomości" + +#: Mailnag/plugins/libnotifyplugin.ui.h:13 +#, fuzzy +msgid "Only 2FA notification, when enabled" +msgstr "Jedno powiadomienie dla jednej wiadomości" + +#: Mailnag/plugins/libnotifyplugin.ui.h:15 +msgid "Add 2FA Provider" +msgstr "" + +#: Mailnag/plugins/libnotifyplugin.ui.h:16 +msgid "Remove 2FA Provider" +msgstr "" + +#: Mailnag/plugins/libnotifyplugin.ui.h:17 +msgid "Edit 2FA Provider" +msgstr "" + +#: Mailnag/plugins/libnotifyplugin.ui.h:18 +#, fuzzy +msgid "2FA notifications" +msgstr "Dżwięk powiadomienia" + +#: Mailnag/plugins/libnotifyplugin.ui.h:19 +msgid "Enable/disable libnotify 2FA processing" +msgstr "" + +#: Mailnag/plugins/libnotifyplugin.ui.h:20 +msgid "2FA providers" +msgstr "" + +#, fuzzy +#~ msgid "Garmin 2FA LibNotify Notifications" +#~ msgstr "Powiadomienia LibNotify" + +#, fuzzy +#~ msgid "Shows a popup when Garmin 2FA mails arrive." +#~ msgstr "Pokaż okno kiedy przychodzi nowa poczta." + #~ msgid "Maximum number of visible mails:" #~ msgstr "Maksymalna ilość widocznych wiadomości:" diff --git a/po/pt.po b/po/pt.po index 74cee2f..c192c47 100644 --- a/po/pt.po +++ b/po/pt.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: mailnag\n" "Report-Msgid-Bugs-To: https://github.com/tikank/mailnagger/issues\n" -"POT-Creation-Date: 2025-11-10 12:57+0100\n" +"POT-Creation-Date: 2025-11-16 17:15+0100\n" "PO-Revision-Date: 2019-03-16 14:48+0000\n" "Last-Translator: Launchpad Translations Administrators \n" "Language-Team: Portuguese \n" @@ -18,53 +18,90 @@ msgstr "" "X-Launchpad-Export-Date: 2020-06-11 14:44+0000\n" "X-Generator: Launchpad (build b190cebbf563f89e480a8b57f641753c8196bda0)\n" -#: Mailnag/daemon/mails.py:153 +#: Mailnag/daemon/mails.py:183 msgid "No subject" msgstr "Sem assunto" -#: Mailnag/plugins/garmin2FAplugin.py:135 -#, fuzzy -msgid "Garmin 2FA LibNotify Notifications" -msgstr "Notificações da LibNotify" +#: Mailnag/configuration/accountdialog.py:77 +msgid "Mail Account" +msgstr "Conta de mail" -#: Mailnag/plugins/garmin2FAplugin.py:136 -#, fuzzy -msgid "Shows a popup when Garmin 2FA mails arrive." -msgstr "Mostra um popup quando chegam novos mails." +#: Mailnag/configuration/accountdialog.py:119 +msgid "optional" +msgstr "opcional" -#: Mailnag/plugins/garmin2FAplugin.py:203 -msgid "Your Security Passcode" +#: Mailnag/configuration/accountdialog.py:123 +#: Mailnag/configuration/configwindow.py:88 +#: Mailnag/configuration/configwindow.py:108 +#: Mailnag/plugins/libnotifyplugin.ui.h:14 +msgid "Enabled" +msgstr "Ativado" + +#: Mailnag/configuration/accountdialog.py:129 +#: Mailnag/configuration/configwindow.py:94 +#: Mailnag/configuration/configwindow.py:114 +msgid "Name" +msgstr "Nome" + +#: Mailnag/configuration/accountdialog.py:252 +msgid "IMAP (Custom)" +msgstr "" + +#: Mailnag/configuration/accountdialog.py:253 +msgid "POP3 (Custom)" msgstr "" -#: Mailnag/plugins/garmin2FAplugin.py:220 +#: Mailnag/configuration/accountdialog.py:254 +msgid "MBox (Custom)" +msgstr "" + +#: Mailnag/configuration/accountdialog.py:255 +msgid "Maildir (Custom)" +msgstr "" + +#: Mailnag/configuration/accountdialog.py:361 +msgid "Connection failed." +msgstr "A ligação falhou." + +#: Mailnag/configuration/configwindow.py:278 +msgid "About Mailnagger" +msgstr "" + +#: Mailnag/configuration/configwindow.py:281 +msgid "An extensible mail notification daemon." +msgstr "" + +#: Mailnag/configuration/configwindow.py:283 #, python-brace-format -msgid "📋 Code: {0}" +msgid "Copyright (c) {years} {author} and contributors." msgstr "" -#: Mailnag/plugins/spamfilterplugin.py:67 -msgid "Spam Filter" -msgstr "Filtro Spam" +#: Mailnag/configuration/configwindow.py:290 +msgid "Homepage" +msgstr "" -#: Mailnag/plugins/spamfilterplugin.py:68 -msgid "Filters out unwanted mails." -msgstr "Filtra mails indesejados." +#: Mailnag/configuration/configwindow.py:293 +msgid "maintainer" +msgstr "" -#: Mailnag/plugins/spamfilterplugin.py:87 -#, fuzzy -msgid "" -"Mailnagger will ignore mails containing at least one of \n" -"the following words in subject or sender." +#. TRANSLATORS: Translate `translator-credits` to the list of names +#. of translators, or team, or something like that. +#: Mailnag/configuration/configwindow.py:313 +msgid "translator-credits" msgstr "" -"O Mailnag irá ignorar mails que contenham pelo menos uma \n" -"das palavras seguintes no assunto ou remetente." +"Launchpad Contributions:\n" +" Lidinei https://launchpad.net/~lidinei-gmail\n" +" Patrick Ulbrich https://launchpad.net/~pulb\n" +" Pedro Beja https://launchpad.net/~althaser\n" +" Rafael Neri https://launchpad.net/~rafepel" -#: Mailnag/plugins/soundplugin.py:66 -msgid "Sound Notifications" -msgstr "Notificações de Som" +#: Mailnag/configuration/configwindow.py:353 +msgid "Delete this account:" +msgstr "Apagar esta conta:" -#: Mailnag/plugins/soundplugin.py:67 -msgid "Plays a sound when new mails arrive." -msgstr "Toca um som quando chegam novos mails." +#: Mailnag/configuration/plugindialog.py:35 +msgid "Plugin Configuration" +msgstr "Configuração de Plugin" #: Mailnag/plugins/userscriptplugin.py:60 msgid "User Script" @@ -97,147 +134,107 @@ msgstr "" "O Mailnag passa a quantidade total de mails novos para este script,\n" "seguido por sequências de %s." -#: Mailnag/plugins/libnotifyplugin.py:117 +#: Mailnag/plugins/libnotifyplugin.py:61 +msgid "Your Security Passcode" +msgstr "" + +#: Mailnag/plugins/libnotifyplugin.py:131 msgid "LibNotify Notifications" msgstr "Notificações da LibNotify" -#: Mailnag/plugins/libnotifyplugin.py:118 +#: Mailnag/plugins/libnotifyplugin.py:132 msgid "Shows a popup when new mails arrive." msgstr "Mostra um popup quando chegam novos mails." -#: Mailnag/plugins/libnotifyplugin.py:133 -msgid "Count of new mails" -msgstr "Quantidade de mails novos" - -#: Mailnag/plugins/libnotifyplugin.py:134 -msgid "Short summary of new mails" -msgstr "Resumo curto de mails novos" - -#: Mailnag/plugins/libnotifyplugin.py:135 -msgid "Detailed summary of new mails" -msgstr "Resumo detalhado de mails novos" - -#: Mailnag/plugins/libnotifyplugin.py:136 -msgid "One notification per new mail" -msgstr "Uma notificação por novo mail" - -#: Mailnag/plugins/libnotifyplugin.py:144 +#: Mailnag/plugins/libnotifyplugin.py:168 msgid "Notification mode:" msgstr "Modo de notificação:" -#: Mailnag/plugins/libnotifyplugin.py:237 -#: Mailnag/plugins/libnotifyplugin.py:273 -#: Mailnag/plugins/libnotifyplugin.py:310 +#: Mailnag/plugins/libnotifyplugin.py:280 +#: Mailnag/plugins/libnotifyplugin.py:316 +#: Mailnag/plugins/libnotifyplugin.py:445 #, python-brace-format msgid "{0} new mails" msgstr "{0} novos mails" -#: Mailnag/plugins/libnotifyplugin.py:239 +#: Mailnag/plugins/libnotifyplugin.py:282 #, python-brace-format msgid "from {0} and others." msgstr "de {0} e outros." -#: Mailnag/plugins/libnotifyplugin.py:241 -#: Mailnag/plugins/libnotifyplugin.py:244 +#: Mailnag/plugins/libnotifyplugin.py:284 +#: Mailnag/plugins/libnotifyplugin.py:287 #, python-brace-format msgid "from {0}." msgstr "de {0}." -#: Mailnag/plugins/libnotifyplugin.py:243 -#: Mailnag/plugins/libnotifyplugin.py:275 -#: Mailnag/plugins/libnotifyplugin.py:312 +#: Mailnag/plugins/libnotifyplugin.py:286 +#: Mailnag/plugins/libnotifyplugin.py:318 +#: Mailnag/plugins/libnotifyplugin.py:447 msgid "New mail" msgstr "Novo mail" -#: Mailnag/plugins/libnotifyplugin.py:268 -#: Mailnag/plugins/libnotifyplugin.py:270 +#: Mailnag/plugins/libnotifyplugin.py:311 +#: Mailnag/plugins/libnotifyplugin.py:313 #, python-brace-format msgid "(and {0} more)" msgstr "(e mais {0})" -#: Mailnag/plugins/libnotifyplugin.py:299 -msgid "Mark as read" -msgstr "Marcar como lido" - -#: Mailnag/configuration/accountdialog.py:77 -msgid "Mail Account" -msgstr "Conta de mail" - -#: Mailnag/configuration/accountdialog.py:119 -msgid "optional" -msgstr "opcional" - -#: Mailnag/configuration/accountdialog.py:123 -#: Mailnag/configuration/configwindow.py:88 -#: Mailnag/configuration/configwindow.py:108 -msgid "Enabled" -msgstr "Ativado" - -#: Mailnag/configuration/accountdialog.py:129 -#: Mailnag/configuration/configwindow.py:94 -#: Mailnag/configuration/configwindow.py:114 -msgid "Name" -msgstr "Nome" - -#: Mailnag/configuration/accountdialog.py:252 -msgid "IMAP (Custom)" -msgstr "" - -#: Mailnag/configuration/accountdialog.py:253 -msgid "POP3 (Custom)" -msgstr "" - -#: Mailnag/configuration/accountdialog.py:254 -msgid "MBox (Custom)" +#: Mailnag/plugins/libnotifyplugin.py:390 +#, python-brace-format +msgid "📋 Code: {0}" msgstr "" -#: Mailnag/configuration/accountdialog.py:255 -msgid "Maildir (Custom)" -msgstr "" +#: Mailnag/plugins/libnotifyplugin.py:434 +msgid "Mark as read" +msgstr "Marcar como lido" -#: Mailnag/configuration/accountdialog.py:361 -msgid "Connection failed." -msgstr "A ligação falhou." +#: Mailnag/plugins/libnotifyplugin.py:629 +#, fuzzy +msgid "Delete this provider:" +msgstr "Apagar esta conta:" -#: Mailnag/configuration/configwindow.py:278 -msgid "About Mailnagger" -msgstr "" +#: Mailnag/plugins/libnotifyplugin.py:630 +#: Mailnag/plugins/libnotifyplugin.ui.h:1 +#, fuzzy +msgid "Sender:" +msgstr "remetente" -#: Mailnag/configuration/configwindow.py:281 -msgid "An extensible mail notification daemon." -msgstr "" +#: Mailnag/plugins/libnotifyplugin.py:631 +#: Mailnag/plugins/libnotifyplugin.ui.h:3 +#, fuzzy +msgid "Subject:" +msgstr "assunto" -#: Mailnag/configuration/configwindow.py:283 -#, python-brace-format -msgid "Copyright (c) {years} {author} and contributors." +#: Mailnag/plugins/libnotifyplugin.py:632 +#: Mailnag/plugins/libnotifyplugin.ui.h:5 +msgid "Pattern:" msgstr "" -#: Mailnag/configuration/configwindow.py:290 -msgid "Homepage" -msgstr "" +#: Mailnag/plugins/spamfilterplugin.py:67 +msgid "Spam Filter" +msgstr "Filtro Spam" -#: Mailnag/configuration/configwindow.py:293 -msgid "maintainer" -msgstr "" +#: Mailnag/plugins/spamfilterplugin.py:68 +msgid "Filters out unwanted mails." +msgstr "Filtra mails indesejados." -#. TRANSLATORS: Translate `translator-credits` to the list of names -#. of translators, or team, or something like that. -#: Mailnag/configuration/configwindow.py:313 -msgid "translator-credits" +#: Mailnag/plugins/spamfilterplugin.py:87 +#, fuzzy +msgid "" +"Mailnagger will ignore mails containing at least one of \n" +"the following words in subject or sender." msgstr "" -"Launchpad Contributions:\n" -" Lidinei https://launchpad.net/~lidinei-gmail\n" -" Patrick Ulbrich https://launchpad.net/~pulb\n" -" Pedro Beja https://launchpad.net/~althaser\n" -" Rafael Neri https://launchpad.net/~rafepel" +"O Mailnag irá ignorar mails que contenham pelo menos uma \n" +"das palavras seguintes no assunto ou remetente." -#: Mailnag/configuration/configwindow.py:353 -msgid "Delete this account:" -msgstr "Apagar esta conta:" +#: Mailnag/plugins/soundplugin.py:66 +msgid "Sound Notifications" +msgstr "Notificações de Som" -#: Mailnag/configuration/plugindialog.py:35 -msgid "Plugin Configuration" -msgstr "Configuração de Plugin" +#: Mailnag/plugins/soundplugin.py:67 +msgid "Plays a sound when new mails arrive." +msgstr "Toca um som quando chegam novos mails." #: Mailnag/configuration/ui/account_widget.ui.h:1 msgid "" @@ -321,6 +318,83 @@ msgstr "Plugins" msgid "Info" msgstr "" +#: Mailnag/plugins/libnotifyplugin.ui.h:2 +#, fuzzy +msgid "Sender" +msgstr "remetente" + +#: Mailnag/plugins/libnotifyplugin.ui.h:4 +#, fuzzy +msgid "Subject" +msgstr "assunto" + +#: Mailnag/plugins/libnotifyplugin.ui.h:6 +msgid "Pattern" +msgstr "" + +#: Mailnag/plugins/libnotifyplugin.ui.h:7 +msgid "Edit 2FA provider" +msgstr "" + +#: Mailnag/plugins/libnotifyplugin.ui.h:8 +#, fuzzy +msgid "Enable provider" +msgstr "Ativado" + +#: Mailnag/plugins/libnotifyplugin.ui.h:9 +msgid "Count of new mails" +msgstr "Quantidade de mails novos" + +#: Mailnag/plugins/libnotifyplugin.ui.h:10 +msgid "Short summary of new mails" +msgstr "Resumo curto de mails novos" + +#: Mailnag/plugins/libnotifyplugin.ui.h:11 +msgid "Detailed summary of new mails" +msgstr "Resumo detalhado de mails novos" + +#: Mailnag/plugins/libnotifyplugin.ui.h:12 +msgid "One notification per new mail" +msgstr "Uma notificação por novo mail" + +#: Mailnag/plugins/libnotifyplugin.ui.h:13 +#, fuzzy +msgid "Only 2FA notification, when enabled" +msgstr "Uma notificação por novo mail" + +#: Mailnag/plugins/libnotifyplugin.ui.h:15 +msgid "Add 2FA Provider" +msgstr "" + +#: Mailnag/plugins/libnotifyplugin.ui.h:16 +msgid "Remove 2FA Provider" +msgstr "" + +#: Mailnag/plugins/libnotifyplugin.ui.h:17 +msgid "Edit 2FA Provider" +msgstr "" + +#: Mailnag/plugins/libnotifyplugin.ui.h:18 +#, fuzzy +msgid "2FA notifications" +msgstr "Notificações de Som" + +#: Mailnag/plugins/libnotifyplugin.ui.h:19 +msgid "Enable/disable libnotify 2FA processing" +msgstr "" + +#: Mailnag/plugins/libnotifyplugin.ui.h:20 +msgid "2FA providers" +msgstr "" + +#, fuzzy +#~ msgid "Garmin 2FA LibNotify Notifications" +#~ msgstr "Notificações da LibNotify" + +#, fuzzy +#~ msgid "Shows a popup when Garmin 2FA mails arrive." +#~ msgstr "Mostra um popup quando chegam novos mails." + #~ msgid "Maximum number of visible mails:" #~ msgstr "Número máximo de mails visíveis:" diff --git a/po/pt_BR.po b/po/pt_BR.po index 1f0ca2c..bfa3e1f 100644 --- a/po/pt_BR.po +++ b/po/pt_BR.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: mailnag\n" "Report-Msgid-Bugs-To: https://github.com/tikank/mailnagger/issues\n" -"POT-Creation-Date: 2025-11-10 12:57+0100\n" +"POT-Creation-Date: 2025-11-16 17:15+0100\n" "PO-Revision-Date: 2019-12-25 19:25+0000\n" "Last-Translator: Relaxeaza \n" "Language-Team: Brazilian Portuguese \n" @@ -18,53 +18,90 @@ msgstr "" "X-Launchpad-Export-Date: 2020-06-11 14:44+0000\n" "X-Generator: Launchpad (build b190cebbf563f89e480a8b57f641753c8196bda0)\n" -#: Mailnag/daemon/mails.py:153 +#: Mailnag/daemon/mails.py:183 msgid "No subject" msgstr "Sem assunto" -#: Mailnag/plugins/garmin2FAplugin.py:135 -#, fuzzy -msgid "Garmin 2FA LibNotify Notifications" -msgstr "Notificações da LibNotify" +#: Mailnag/configuration/accountdialog.py:77 +msgid "Mail Account" +msgstr "Conta de mail" -#: Mailnag/plugins/garmin2FAplugin.py:136 -#, fuzzy -msgid "Shows a popup when Garmin 2FA mails arrive." -msgstr "Mostra um popup quando chegam novas mensagens." +#: Mailnag/configuration/accountdialog.py:119 +msgid "optional" +msgstr "opcional" -#: Mailnag/plugins/garmin2FAplugin.py:203 -msgid "Your Security Passcode" +#: Mailnag/configuration/accountdialog.py:123 +#: Mailnag/configuration/configwindow.py:88 +#: Mailnag/configuration/configwindow.py:108 +#: Mailnag/plugins/libnotifyplugin.ui.h:14 +msgid "Enabled" +msgstr "Ativado" + +#: Mailnag/configuration/accountdialog.py:129 +#: Mailnag/configuration/configwindow.py:94 +#: Mailnag/configuration/configwindow.py:114 +msgid "Name" +msgstr "Nome" + +#: Mailnag/configuration/accountdialog.py:252 +msgid "IMAP (Custom)" +msgstr "" + +#: Mailnag/configuration/accountdialog.py:253 +msgid "POP3 (Custom)" msgstr "" -#: Mailnag/plugins/garmin2FAplugin.py:220 +#: Mailnag/configuration/accountdialog.py:254 +msgid "MBox (Custom)" +msgstr "" + +#: Mailnag/configuration/accountdialog.py:255 +msgid "Maildir (Custom)" +msgstr "" + +#: Mailnag/configuration/accountdialog.py:361 +msgid "Connection failed." +msgstr "A ligação falhou." + +#: Mailnag/configuration/configwindow.py:278 +msgid "About Mailnagger" +msgstr "" + +#: Mailnag/configuration/configwindow.py:281 +msgid "An extensible mail notification daemon." +msgstr "" + +#: Mailnag/configuration/configwindow.py:283 #, python-brace-format -msgid "📋 Code: {0}" +msgid "Copyright (c) {years} {author} and contributors." msgstr "" -#: Mailnag/plugins/spamfilterplugin.py:67 -msgid "Spam Filter" -msgstr "Filtro de Spam" +#: Mailnag/configuration/configwindow.py:290 +msgid "Homepage" +msgstr "" -#: Mailnag/plugins/spamfilterplugin.py:68 -msgid "Filters out unwanted mails." -msgstr "Filtra mensagens indesejadas." +#: Mailnag/configuration/configwindow.py:293 +msgid "maintainer" +msgstr "" -#: Mailnag/plugins/spamfilterplugin.py:87 -#, fuzzy -msgid "" -"Mailnagger will ignore mails containing at least one of \n" -"the following words in subject or sender." +#. TRANSLATORS: Translate `translator-credits` to the list of names +#. of translators, or team, or something like that. +#: Mailnag/configuration/configwindow.py:313 +msgid "translator-credits" msgstr "" -"Mailnag ignorará mensagens que contenham pelo menos uma \n" -"das palavras seguintes no assunto ou remetente." +"Launchpad Contributions:\n" +" Patrick Ulbrich https://launchpad.net/~pulb\n" +" Pedro Beja https://launchpad.net/~althaser\n" +" Rafael Neri https://launchpad.net/~rafepel\n" +" Relaxeaza https://launchpad.net/~relaxeaza" -#: Mailnag/plugins/soundplugin.py:66 -msgid "Sound Notifications" -msgstr "Notificações de Som" +#: Mailnag/configuration/configwindow.py:353 +msgid "Delete this account:" +msgstr "Apagar esta conta:" -#: Mailnag/plugins/soundplugin.py:67 -msgid "Plays a sound when new mails arrive." -msgstr "Toca um som quando novas mensagens chegarem." +#: Mailnag/configuration/plugindialog.py:35 +msgid "Plugin Configuration" +msgstr "Configuração de Plugin" #: Mailnag/plugins/userscriptplugin.py:60 msgid "User Script" @@ -97,147 +134,107 @@ msgstr "" "Mailnag passa o total novas mensagens para o script,\n" "seguido por sequências de %s." -#: Mailnag/plugins/libnotifyplugin.py:117 +#: Mailnag/plugins/libnotifyplugin.py:61 +msgid "Your Security Passcode" +msgstr "" + +#: Mailnag/plugins/libnotifyplugin.py:131 msgid "LibNotify Notifications" msgstr "Notificações da LibNotify" -#: Mailnag/plugins/libnotifyplugin.py:118 +#: Mailnag/plugins/libnotifyplugin.py:132 msgid "Shows a popup when new mails arrive." msgstr "Mostra um popup quando chegam novas mensagens." -#: Mailnag/plugins/libnotifyplugin.py:133 -msgid "Count of new mails" -msgstr "Quantidade de mensagens novas" - -#: Mailnag/plugins/libnotifyplugin.py:134 -msgid "Short summary of new mails" -msgstr "Resumo curto de mensagens novas" - -#: Mailnag/plugins/libnotifyplugin.py:135 -msgid "Detailed summary of new mails" -msgstr "Resumo detalhado de mensagens novas" - -#: Mailnag/plugins/libnotifyplugin.py:136 -msgid "One notification per new mail" -msgstr "Uma notificação por mensagem nova" - -#: Mailnag/plugins/libnotifyplugin.py:144 +#: Mailnag/plugins/libnotifyplugin.py:168 msgid "Notification mode:" msgstr "Modo de notificação:" -#: Mailnag/plugins/libnotifyplugin.py:237 -#: Mailnag/plugins/libnotifyplugin.py:273 -#: Mailnag/plugins/libnotifyplugin.py:310 +#: Mailnag/plugins/libnotifyplugin.py:280 +#: Mailnag/plugins/libnotifyplugin.py:316 +#: Mailnag/plugins/libnotifyplugin.py:445 #, python-brace-format msgid "{0} new mails" msgstr "{0} novas mensagens" -#: Mailnag/plugins/libnotifyplugin.py:239 +#: Mailnag/plugins/libnotifyplugin.py:282 #, python-brace-format msgid "from {0} and others." msgstr "de {0} e outros." -#: Mailnag/plugins/libnotifyplugin.py:241 -#: Mailnag/plugins/libnotifyplugin.py:244 +#: Mailnag/plugins/libnotifyplugin.py:284 +#: Mailnag/plugins/libnotifyplugin.py:287 #, python-brace-format msgid "from {0}." msgstr "de {0}." -#: Mailnag/plugins/libnotifyplugin.py:243 -#: Mailnag/plugins/libnotifyplugin.py:275 -#: Mailnag/plugins/libnotifyplugin.py:312 +#: Mailnag/plugins/libnotifyplugin.py:286 +#: Mailnag/plugins/libnotifyplugin.py:318 +#: Mailnag/plugins/libnotifyplugin.py:447 msgid "New mail" msgstr "Novo mail" -#: Mailnag/plugins/libnotifyplugin.py:268 -#: Mailnag/plugins/libnotifyplugin.py:270 +#: Mailnag/plugins/libnotifyplugin.py:311 +#: Mailnag/plugins/libnotifyplugin.py:313 #, python-brace-format msgid "(and {0} more)" msgstr "(e mais {0})" -#: Mailnag/plugins/libnotifyplugin.py:299 -msgid "Mark as read" -msgstr "Marcar como lido" - -#: Mailnag/configuration/accountdialog.py:77 -msgid "Mail Account" -msgstr "Conta de mail" - -#: Mailnag/configuration/accountdialog.py:119 -msgid "optional" -msgstr "opcional" - -#: Mailnag/configuration/accountdialog.py:123 -#: Mailnag/configuration/configwindow.py:88 -#: Mailnag/configuration/configwindow.py:108 -msgid "Enabled" -msgstr "Ativado" - -#: Mailnag/configuration/accountdialog.py:129 -#: Mailnag/configuration/configwindow.py:94 -#: Mailnag/configuration/configwindow.py:114 -msgid "Name" -msgstr "Nome" - -#: Mailnag/configuration/accountdialog.py:252 -msgid "IMAP (Custom)" -msgstr "" - -#: Mailnag/configuration/accountdialog.py:253 -msgid "POP3 (Custom)" -msgstr "" - -#: Mailnag/configuration/accountdialog.py:254 -msgid "MBox (Custom)" +#: Mailnag/plugins/libnotifyplugin.py:390 +#, python-brace-format +msgid "📋 Code: {0}" msgstr "" -#: Mailnag/configuration/accountdialog.py:255 -msgid "Maildir (Custom)" -msgstr "" +#: Mailnag/plugins/libnotifyplugin.py:434 +msgid "Mark as read" +msgstr "Marcar como lido" -#: Mailnag/configuration/accountdialog.py:361 -msgid "Connection failed." -msgstr "A ligação falhou." +#: Mailnag/plugins/libnotifyplugin.py:629 +#, fuzzy +msgid "Delete this provider:" +msgstr "Apagar esta conta:" -#: Mailnag/configuration/configwindow.py:278 -msgid "About Mailnagger" -msgstr "" +#: Mailnag/plugins/libnotifyplugin.py:630 +#: Mailnag/plugins/libnotifyplugin.ui.h:1 +#, fuzzy +msgid "Sender:" +msgstr "remetente" -#: Mailnag/configuration/configwindow.py:281 -msgid "An extensible mail notification daemon." -msgstr "" +#: Mailnag/plugins/libnotifyplugin.py:631 +#: Mailnag/plugins/libnotifyplugin.ui.h:3 +#, fuzzy +msgid "Subject:" +msgstr "assunto" -#: Mailnag/configuration/configwindow.py:283 -#, python-brace-format -msgid "Copyright (c) {years} {author} and contributors." +#: Mailnag/plugins/libnotifyplugin.py:632 +#: Mailnag/plugins/libnotifyplugin.ui.h:5 +msgid "Pattern:" msgstr "" -#: Mailnag/configuration/configwindow.py:290 -msgid "Homepage" -msgstr "" +#: Mailnag/plugins/spamfilterplugin.py:67 +msgid "Spam Filter" +msgstr "Filtro de Spam" -#: Mailnag/configuration/configwindow.py:293 -msgid "maintainer" -msgstr "" +#: Mailnag/plugins/spamfilterplugin.py:68 +msgid "Filters out unwanted mails." +msgstr "Filtra mensagens indesejadas." -#. TRANSLATORS: Translate `translator-credits` to the list of names -#. of translators, or team, or something like that. -#: Mailnag/configuration/configwindow.py:313 -msgid "translator-credits" +#: Mailnag/plugins/spamfilterplugin.py:87 +#, fuzzy +msgid "" +"Mailnagger will ignore mails containing at least one of \n" +"the following words in subject or sender." msgstr "" -"Launchpad Contributions:\n" -" Patrick Ulbrich https://launchpad.net/~pulb\n" -" Pedro Beja https://launchpad.net/~althaser\n" -" Rafael Neri https://launchpad.net/~rafepel\n" -" Relaxeaza https://launchpad.net/~relaxeaza" +"Mailnag ignorará mensagens que contenham pelo menos uma \n" +"das palavras seguintes no assunto ou remetente." -#: Mailnag/configuration/configwindow.py:353 -msgid "Delete this account:" -msgstr "Apagar esta conta:" +#: Mailnag/plugins/soundplugin.py:66 +msgid "Sound Notifications" +msgstr "Notificações de Som" -#: Mailnag/configuration/plugindialog.py:35 -msgid "Plugin Configuration" -msgstr "Configuração de Plugin" +#: Mailnag/plugins/soundplugin.py:67 +msgid "Plays a sound when new mails arrive." +msgstr "Toca um som quando novas mensagens chegarem." #: Mailnag/configuration/ui/account_widget.ui.h:1 msgid "" @@ -321,6 +318,83 @@ msgstr "Plugins" msgid "Info" msgstr "" +#: Mailnag/plugins/libnotifyplugin.ui.h:2 +#, fuzzy +msgid "Sender" +msgstr "remetente" + +#: Mailnag/plugins/libnotifyplugin.ui.h:4 +#, fuzzy +msgid "Subject" +msgstr "assunto" + +#: Mailnag/plugins/libnotifyplugin.ui.h:6 +msgid "Pattern" +msgstr "" + +#: Mailnag/plugins/libnotifyplugin.ui.h:7 +msgid "Edit 2FA provider" +msgstr "" + +#: Mailnag/plugins/libnotifyplugin.ui.h:8 +#, fuzzy +msgid "Enable provider" +msgstr "Ativado" + +#: Mailnag/plugins/libnotifyplugin.ui.h:9 +msgid "Count of new mails" +msgstr "Quantidade de mensagens novas" + +#: Mailnag/plugins/libnotifyplugin.ui.h:10 +msgid "Short summary of new mails" +msgstr "Resumo curto de mensagens novas" + +#: Mailnag/plugins/libnotifyplugin.ui.h:11 +msgid "Detailed summary of new mails" +msgstr "Resumo detalhado de mensagens novas" + +#: Mailnag/plugins/libnotifyplugin.ui.h:12 +msgid "One notification per new mail" +msgstr "Uma notificação por mensagem nova" + +#: Mailnag/plugins/libnotifyplugin.ui.h:13 +#, fuzzy +msgid "Only 2FA notification, when enabled" +msgstr "Uma notificação por mensagem nova" + +#: Mailnag/plugins/libnotifyplugin.ui.h:15 +msgid "Add 2FA Provider" +msgstr "" + +#: Mailnag/plugins/libnotifyplugin.ui.h:16 +msgid "Remove 2FA Provider" +msgstr "" + +#: Mailnag/plugins/libnotifyplugin.ui.h:17 +msgid "Edit 2FA Provider" +msgstr "" + +#: Mailnag/plugins/libnotifyplugin.ui.h:18 +#, fuzzy +msgid "2FA notifications" +msgstr "Notificações de Som" + +#: Mailnag/plugins/libnotifyplugin.ui.h:19 +msgid "Enable/disable libnotify 2FA processing" +msgstr "" + +#: Mailnag/plugins/libnotifyplugin.ui.h:20 +msgid "2FA providers" +msgstr "" + +#, fuzzy +#~ msgid "Garmin 2FA LibNotify Notifications" +#~ msgstr "Notificações da LibNotify" + +#, fuzzy +#~ msgid "Shows a popup when Garmin 2FA mails arrive." +#~ msgstr "Mostra um popup quando chegam novas mensagens." + #~ msgid "MessagingMenu" #~ msgstr "MessagingMenu" diff --git a/po/ru.po b/po/ru.po index 7fa3668..af22262 100644 --- a/po/ru.po +++ b/po/ru.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: mailnag\n" "Report-Msgid-Bugs-To: https://github.com/tikank/mailnagger/issues\n" -"POT-Creation-Date: 2025-11-10 12:57+0100\n" +"POT-Creation-Date: 2025-11-16 17:15+0100\n" "PO-Revision-Date: 2019-03-16 14:48+0000\n" "Last-Translator: Launchpad Translations Administrators \n" "Language-Team: LANGUAGE \n" @@ -17,53 +17,92 @@ msgstr "" "X-Launchpad-Export-Date: 2020-06-11 14:44+0000\n" "X-Generator: Launchpad (build b190cebbf563f89e480a8b57f641753c8196bda0)\n" -#: Mailnag/daemon/mails.py:153 +#: Mailnag/daemon/mails.py:183 msgid "No subject" msgstr "Без темы" -#: Mailnag/plugins/garmin2FAplugin.py:135 -#, fuzzy -msgid "Garmin 2FA LibNotify Notifications" -msgstr "Уведомления LibNotify" +#: Mailnag/configuration/accountdialog.py:77 +msgid "Mail Account" +msgstr "Учетная запись" -#: Mailnag/plugins/garmin2FAplugin.py:136 -#, fuzzy -msgid "Shows a popup when Garmin 2FA mails arrive." -msgstr "Отображение всплывающего уведомления при получении новых писем" +#: Mailnag/configuration/accountdialog.py:119 +msgid "optional" +msgstr "необязательно" -#: Mailnag/plugins/garmin2FAplugin.py:203 -msgid "Your Security Passcode" +#: Mailnag/configuration/accountdialog.py:123 +#: Mailnag/configuration/configwindow.py:88 +#: Mailnag/configuration/configwindow.py:108 +#: Mailnag/plugins/libnotifyplugin.ui.h:14 +msgid "Enabled" +msgstr "Включено" + +#: Mailnag/configuration/accountdialog.py:129 +#: Mailnag/configuration/configwindow.py:94 +#: Mailnag/configuration/configwindow.py:114 +msgid "Name" +msgstr "Имя" + +#: Mailnag/configuration/accountdialog.py:252 +msgid "IMAP (Custom)" +msgstr "" + +#: Mailnag/configuration/accountdialog.py:253 +msgid "POP3 (Custom)" +msgstr "" + +#: Mailnag/configuration/accountdialog.py:254 +msgid "MBox (Custom)" +msgstr "" + +#: Mailnag/configuration/accountdialog.py:255 +msgid "Maildir (Custom)" +msgstr "" + +#: Mailnag/configuration/accountdialog.py:361 +msgid "Connection failed." +msgstr "Ошибка соединения." + +#: Mailnag/configuration/configwindow.py:278 +msgid "About Mailnagger" +msgstr "" + +#: Mailnag/configuration/configwindow.py:281 +msgid "An extensible mail notification daemon." msgstr "" -#: Mailnag/plugins/garmin2FAplugin.py:220 +#: Mailnag/configuration/configwindow.py:283 #, python-brace-format -msgid "📋 Code: {0}" +msgid "Copyright (c) {years} {author} and contributors." msgstr "" -#: Mailnag/plugins/spamfilterplugin.py:67 -msgid "Spam Filter" -msgstr "Спам фильтр" +#: Mailnag/configuration/configwindow.py:290 +msgid "Homepage" +msgstr "" -#: Mailnag/plugins/spamfilterplugin.py:68 -msgid "Filters out unwanted mails." -msgstr "Фильтрует нежелательные сообщения." +#: Mailnag/configuration/configwindow.py:293 +msgid "maintainer" +msgstr "" -#: Mailnag/plugins/spamfilterplugin.py:87 -#, fuzzy -msgid "" -"Mailnagger will ignore mails containing at least one of \n" -"the following words in subject or sender." +#. TRANSLATORS: Translate `translator-credits` to the list of names +#. of translators, or team, or something like that. +#: Mailnag/configuration/configwindow.py:313 +msgid "translator-credits" msgstr "" -"Mailnag проигнорирует письмо, если имя отправителя\n" -"или тема содержит одно из следующих слов" +"Launchpad Contributions:\n" +" Dmitry Shachnev https://launchpad.net/~mitya57\n" +" Hromin https://launchpad.net/~hromin\n" +" Oleg https://launchpad.net/~cheshire-mouse\n" +" Patrick Ulbrich https://launchpad.net/~pulb\n" +" Vyacheslav Sharmanov https://launchpad.net/~vsharmanov\n" +" u-t https://launchpad.net/~fenoform" -#: Mailnag/plugins/soundplugin.py:66 -msgid "Sound Notifications" -msgstr "Звуковые уведомления" +#: Mailnag/configuration/configwindow.py:353 +msgid "Delete this account:" +msgstr "Удалить учетную запись:" -#: Mailnag/plugins/soundplugin.py:67 -msgid "Plays a sound when new mails arrive." -msgstr "Проигрывает мелодию при появлении нового сообщения." +#: Mailnag/configuration/plugindialog.py:35 +msgid "Plugin Configuration" +msgstr "Настройка плагина" #: Mailnag/plugins/userscriptplugin.py:60 msgid "User Script" @@ -96,149 +135,107 @@ msgstr "" "Скрипту передаётся количество сообщений,\n" "за которым следуют: %s" -#: Mailnag/plugins/libnotifyplugin.py:117 +#: Mailnag/plugins/libnotifyplugin.py:61 +msgid "Your Security Passcode" +msgstr "" + +#: Mailnag/plugins/libnotifyplugin.py:131 msgid "LibNotify Notifications" msgstr "Уведомления LibNotify" -#: Mailnag/plugins/libnotifyplugin.py:118 +#: Mailnag/plugins/libnotifyplugin.py:132 msgid "Shows a popup when new mails arrive." msgstr "Отображение всплывающего уведомления при получении новых писем" -#: Mailnag/plugins/libnotifyplugin.py:133 -msgid "Count of new mails" -msgstr "Количество новых писем" - -#: Mailnag/plugins/libnotifyplugin.py:134 -msgid "Short summary of new mails" -msgstr "Краткие сведения о письмах" - -#: Mailnag/plugins/libnotifyplugin.py:135 -msgid "Detailed summary of new mails" -msgstr "Подробные сведения о письмах" - -#: Mailnag/plugins/libnotifyplugin.py:136 -msgid "One notification per new mail" -msgstr "Одно уведомление на письмо" - -#: Mailnag/plugins/libnotifyplugin.py:144 +#: Mailnag/plugins/libnotifyplugin.py:168 msgid "Notification mode:" msgstr "Тип уведомлений:" -#: Mailnag/plugins/libnotifyplugin.py:237 -#: Mailnag/plugins/libnotifyplugin.py:273 -#: Mailnag/plugins/libnotifyplugin.py:310 +#: Mailnag/plugins/libnotifyplugin.py:280 +#: Mailnag/plugins/libnotifyplugin.py:316 +#: Mailnag/plugins/libnotifyplugin.py:445 #, python-brace-format msgid "{0} new mails" msgstr "сообщений: {0}" -#: Mailnag/plugins/libnotifyplugin.py:239 +#: Mailnag/plugins/libnotifyplugin.py:282 #, python-brace-format msgid "from {0} and others." msgstr "от {0} и других." -#: Mailnag/plugins/libnotifyplugin.py:241 -#: Mailnag/plugins/libnotifyplugin.py:244 +#: Mailnag/plugins/libnotifyplugin.py:284 +#: Mailnag/plugins/libnotifyplugin.py:287 #, python-brace-format msgid "from {0}." msgstr "от {0}." -#: Mailnag/plugins/libnotifyplugin.py:243 -#: Mailnag/plugins/libnotifyplugin.py:275 -#: Mailnag/plugins/libnotifyplugin.py:312 +#: Mailnag/plugins/libnotifyplugin.py:286 +#: Mailnag/plugins/libnotifyplugin.py:318 +#: Mailnag/plugins/libnotifyplugin.py:447 msgid "New mail" msgstr "Новое сообщение" -#: Mailnag/plugins/libnotifyplugin.py:268 -#: Mailnag/plugins/libnotifyplugin.py:270 +#: Mailnag/plugins/libnotifyplugin.py:311 +#: Mailnag/plugins/libnotifyplugin.py:313 #, python-brace-format msgid "(and {0} more)" msgstr "(и еще {0})" -#: Mailnag/plugins/libnotifyplugin.py:299 -msgid "Mark as read" -msgstr "Отметить как прочитанное" - -#: Mailnag/configuration/accountdialog.py:77 -msgid "Mail Account" -msgstr "Учетная запись" - -#: Mailnag/configuration/accountdialog.py:119 -msgid "optional" -msgstr "необязательно" - -#: Mailnag/configuration/accountdialog.py:123 -#: Mailnag/configuration/configwindow.py:88 -#: Mailnag/configuration/configwindow.py:108 -msgid "Enabled" -msgstr "Включено" - -#: Mailnag/configuration/accountdialog.py:129 -#: Mailnag/configuration/configwindow.py:94 -#: Mailnag/configuration/configwindow.py:114 -msgid "Name" -msgstr "Имя" - -#: Mailnag/configuration/accountdialog.py:252 -msgid "IMAP (Custom)" -msgstr "" - -#: Mailnag/configuration/accountdialog.py:253 -msgid "POP3 (Custom)" -msgstr "" - -#: Mailnag/configuration/accountdialog.py:254 -msgid "MBox (Custom)" +#: Mailnag/plugins/libnotifyplugin.py:390 +#, python-brace-format +msgid "📋 Code: {0}" msgstr "" -#: Mailnag/configuration/accountdialog.py:255 -msgid "Maildir (Custom)" -msgstr "" +#: Mailnag/plugins/libnotifyplugin.py:434 +msgid "Mark as read" +msgstr "Отметить как прочитанное" -#: Mailnag/configuration/accountdialog.py:361 -msgid "Connection failed." -msgstr "Ошибка соединения." +#: Mailnag/plugins/libnotifyplugin.py:629 +#, fuzzy +msgid "Delete this provider:" +msgstr "Удалить учетную запись:" -#: Mailnag/configuration/configwindow.py:278 -msgid "About Mailnagger" -msgstr "" +#: Mailnag/plugins/libnotifyplugin.py:630 +#: Mailnag/plugins/libnotifyplugin.ui.h:1 +#, fuzzy +msgid "Sender:" +msgstr "отправитель" -#: Mailnag/configuration/configwindow.py:281 -msgid "An extensible mail notification daemon." -msgstr "" +#: Mailnag/plugins/libnotifyplugin.py:631 +#: Mailnag/plugins/libnotifyplugin.ui.h:3 +#, fuzzy +msgid "Subject:" +msgstr "тема" -#: Mailnag/configuration/configwindow.py:283 -#, python-brace-format -msgid "Copyright (c) {years} {author} and contributors." +#: Mailnag/plugins/libnotifyplugin.py:632 +#: Mailnag/plugins/libnotifyplugin.ui.h:5 +msgid "Pattern:" msgstr "" -#: Mailnag/configuration/configwindow.py:290 -msgid "Homepage" -msgstr "" +#: Mailnag/plugins/spamfilterplugin.py:67 +msgid "Spam Filter" +msgstr "Спам фильтр" -#: Mailnag/configuration/configwindow.py:293 -msgid "maintainer" -msgstr "" +#: Mailnag/plugins/spamfilterplugin.py:68 +msgid "Filters out unwanted mails." +msgstr "Фильтрует нежелательные сообщения." -#. TRANSLATORS: Translate `translator-credits` to the list of names -#. of translators, or team, or something like that. -#: Mailnag/configuration/configwindow.py:313 -msgid "translator-credits" +#: Mailnag/plugins/spamfilterplugin.py:87 +#, fuzzy +msgid "" +"Mailnagger will ignore mails containing at least one of \n" +"the following words in subject or sender." msgstr "" -"Launchpad Contributions:\n" -" Dmitry Shachnev https://launchpad.net/~mitya57\n" -" Hromin https://launchpad.net/~hromin\n" -" Oleg https://launchpad.net/~cheshire-mouse\n" -" Patrick Ulbrich https://launchpad.net/~pulb\n" -" Vyacheslav Sharmanov https://launchpad.net/~vsharmanov\n" -" u-t https://launchpad.net/~fenoform" +"Mailnag проигнорирует письмо, если имя отправителя\n" +"или тема содержит одно из следующих слов" -#: Mailnag/configuration/configwindow.py:353 -msgid "Delete this account:" -msgstr "Удалить учетную запись:" +#: Mailnag/plugins/soundplugin.py:66 +msgid "Sound Notifications" +msgstr "Звуковые уведомления" -#: Mailnag/configuration/plugindialog.py:35 -msgid "Plugin Configuration" -msgstr "Настройка плагина" +#: Mailnag/plugins/soundplugin.py:67 +msgid "Plays a sound when new mails arrive." +msgstr "Проигрывает мелодию при появлении нового сообщения." #: Mailnag/configuration/ui/account_widget.ui.h:1 msgid "" @@ -322,5 +319,82 @@ msgstr "Плагины" msgid "Info" msgstr "" +#: Mailnag/plugins/libnotifyplugin.ui.h:2 +#, fuzzy +msgid "Sender" +msgstr "отправитель" + +#: Mailnag/plugins/libnotifyplugin.ui.h:4 +#, fuzzy +msgid "Subject" +msgstr "тема" + +#: Mailnag/plugins/libnotifyplugin.ui.h:6 +msgid "Pattern" +msgstr "" + +#: Mailnag/plugins/libnotifyplugin.ui.h:7 +msgid "Edit 2FA provider" +msgstr "" + +#: Mailnag/plugins/libnotifyplugin.ui.h:8 +#, fuzzy +msgid "Enable provider" +msgstr "Включено" + +#: Mailnag/plugins/libnotifyplugin.ui.h:9 +msgid "Count of new mails" +msgstr "Количество новых писем" + +#: Mailnag/plugins/libnotifyplugin.ui.h:10 +msgid "Short summary of new mails" +msgstr "Краткие сведения о письмах" + +#: Mailnag/plugins/libnotifyplugin.ui.h:11 +msgid "Detailed summary of new mails" +msgstr "Подробные сведения о письмах" + +#: Mailnag/plugins/libnotifyplugin.ui.h:12 +msgid "One notification per new mail" +msgstr "Одно уведомление на письмо" + +#: Mailnag/plugins/libnotifyplugin.ui.h:13 +#, fuzzy +msgid "Only 2FA notification, when enabled" +msgstr "Одно уведомление на письмо" + +#: Mailnag/plugins/libnotifyplugin.ui.h:15 +msgid "Add 2FA Provider" +msgstr "" + +#: Mailnag/plugins/libnotifyplugin.ui.h:16 +msgid "Remove 2FA Provider" +msgstr "" + +#: Mailnag/plugins/libnotifyplugin.ui.h:17 +msgid "Edit 2FA Provider" +msgstr "" + +#: Mailnag/plugins/libnotifyplugin.ui.h:18 +#, fuzzy +msgid "2FA notifications" +msgstr "Звуковые уведомления" + +#: Mailnag/plugins/libnotifyplugin.ui.h:19 +msgid "Enable/disable libnotify 2FA processing" +msgstr "" + +#: Mailnag/plugins/libnotifyplugin.ui.h:20 +msgid "2FA providers" +msgstr "" + +#, fuzzy +#~ msgid "Garmin 2FA LibNotify Notifications" +#~ msgstr "Уведомления LibNotify" + +#, fuzzy +#~ msgid "Shows a popup when Garmin 2FA mails arrive." +#~ msgstr "Отображение всплывающего уведомления при получении новых писем" + #~ msgid "Maximum number of visible mails:" #~ msgstr "Максимальное количество отображаемых писем:" diff --git a/po/sr.po b/po/sr.po index 608d945..897932b 100644 --- a/po/sr.po +++ b/po/sr.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: mailnag\n" "Report-Msgid-Bugs-To: https://github.com/tikank/mailnagger/issues\n" -"POT-Creation-Date: 2025-11-10 12:57+0100\n" +"POT-Creation-Date: 2025-11-16 17:15+0100\n" "PO-Revision-Date: 2021-01-07 11:29+0000\n" "Last-Translator: Burek \n" "Language-Team: Serbian \n" "Language-Team: Swedish \n" "Language-Team: Turkish " -#: Mailnag/plugins/soundplugin.py:67 -msgid "Plays a sound when new mails arrive." -msgstr "Yeni e-posta geldiğinde bir ses çalar." +#: Mailnag/configuration/configwindow.py:353 +msgid "Delete this account:" +msgstr "Bu hesabı sil:" + +#: Mailnag/configuration/plugindialog.py:35 +msgid "Plugin Configuration" +msgstr "Eklenti Yapılandırması" #: Mailnag/plugins/userscriptplugin.py:60 msgid "User Script" @@ -100,144 +134,107 @@ msgstr "" "Mailnag, yeni e-postaların toplam sayısını, ve ardından\n" "%s dizisini bu betiğe iletir." -#: Mailnag/plugins/libnotifyplugin.py:117 +#: Mailnag/plugins/libnotifyplugin.py:61 +msgid "Your Security Passcode" +msgstr "" + +#: Mailnag/plugins/libnotifyplugin.py:131 msgid "LibNotify Notifications" msgstr "LibNotify Bildirimleri" -#: Mailnag/plugins/libnotifyplugin.py:118 +#: Mailnag/plugins/libnotifyplugin.py:132 msgid "Shows a popup when new mails arrive." msgstr "Yeni e-posta geldiğinde bir açılır pencere gösterir." -#: Mailnag/plugins/libnotifyplugin.py:133 -msgid "Count of new mails" -msgstr "Yeni e-posta sayısı" - -#: Mailnag/plugins/libnotifyplugin.py:134 -msgid "Short summary of new mails" -msgstr "Yeni e-postaların kısa özeti" - -#: Mailnag/plugins/libnotifyplugin.py:135 -msgid "Detailed summary of new mails" -msgstr "Yeni e-postaların ayrıntılı özeti" - -#: Mailnag/plugins/libnotifyplugin.py:136 -msgid "One notification per new mail" -msgstr "Her yeni e-posta için bir bildirim" - -#: Mailnag/plugins/libnotifyplugin.py:144 +#: Mailnag/plugins/libnotifyplugin.py:168 msgid "Notification mode:" msgstr "Bildirim modu:" -#: Mailnag/plugins/libnotifyplugin.py:237 -#: Mailnag/plugins/libnotifyplugin.py:273 -#: Mailnag/plugins/libnotifyplugin.py:310 +#: Mailnag/plugins/libnotifyplugin.py:280 +#: Mailnag/plugins/libnotifyplugin.py:316 +#: Mailnag/plugins/libnotifyplugin.py:445 #, python-brace-format msgid "{0} new mails" msgstr "{0} yeni e-posta" -#: Mailnag/plugins/libnotifyplugin.py:239 +#: Mailnag/plugins/libnotifyplugin.py:282 #, python-brace-format msgid "from {0} and others." msgstr "{0} ve diğerlerinden." -#: Mailnag/plugins/libnotifyplugin.py:241 -#: Mailnag/plugins/libnotifyplugin.py:244 +#: Mailnag/plugins/libnotifyplugin.py:284 +#: Mailnag/plugins/libnotifyplugin.py:287 #, python-brace-format msgid "from {0}." msgstr "{0}'den." -#: Mailnag/plugins/libnotifyplugin.py:243 -#: Mailnag/plugins/libnotifyplugin.py:275 -#: Mailnag/plugins/libnotifyplugin.py:312 +#: Mailnag/plugins/libnotifyplugin.py:286 +#: Mailnag/plugins/libnotifyplugin.py:318 +#: Mailnag/plugins/libnotifyplugin.py:447 msgid "New mail" msgstr "Yeni e-posta" -#: Mailnag/plugins/libnotifyplugin.py:268 -#: Mailnag/plugins/libnotifyplugin.py:270 +#: Mailnag/plugins/libnotifyplugin.py:311 +#: Mailnag/plugins/libnotifyplugin.py:313 #, python-brace-format msgid "(and {0} more)" msgstr "(ve {0} tane daha)" -#: Mailnag/plugins/libnotifyplugin.py:299 +#: Mailnag/plugins/libnotifyplugin.py:390 +#, python-brace-format +msgid "📋 Code: {0}" +msgstr "" + +#: Mailnag/plugins/libnotifyplugin.py:434 msgid "Mark as read" msgstr "Okundu olarak işaretle" -#: Mailnag/configuration/accountdialog.py:77 -msgid "Mail Account" -msgstr "E-posta Hesabı" - -#: Mailnag/configuration/accountdialog.py:119 -msgid "optional" -msgstr "isteğe bağlı" - -#: Mailnag/configuration/accountdialog.py:123 -#: Mailnag/configuration/configwindow.py:88 -#: Mailnag/configuration/configwindow.py:108 -msgid "Enabled" -msgstr "Etkin" - -#: Mailnag/configuration/accountdialog.py:129 -#: Mailnag/configuration/configwindow.py:94 -#: Mailnag/configuration/configwindow.py:114 -msgid "Name" -msgstr "Adı" - -#: Mailnag/configuration/accountdialog.py:252 -msgid "IMAP (Custom)" -msgstr "IMAP (Özel)" - -#: Mailnag/configuration/accountdialog.py:253 -msgid "POP3 (Custom)" -msgstr "POP3 (Özel)" - -#: Mailnag/configuration/accountdialog.py:254 -msgid "MBox (Custom)" -msgstr "MBox (Özel)" +#: Mailnag/plugins/libnotifyplugin.py:629 +#, fuzzy +msgid "Delete this provider:" +msgstr "Bu hesabı sil:" -#: Mailnag/configuration/accountdialog.py:255 -msgid "Maildir (Custom)" -msgstr "Maildir (Özel)" +#: Mailnag/plugins/libnotifyplugin.py:630 +#: Mailnag/plugins/libnotifyplugin.ui.h:1 +#, fuzzy +msgid "Sender:" +msgstr "gönderen" -#: Mailnag/configuration/accountdialog.py:361 -msgid "Connection failed." -msgstr "Bağlantı başarısız oldu." +#: Mailnag/plugins/libnotifyplugin.py:631 +#: Mailnag/plugins/libnotifyplugin.ui.h:3 +#, fuzzy +msgid "Subject:" +msgstr "konu" -#: Mailnag/configuration/configwindow.py:278 -msgid "About Mailnagger" +#: Mailnag/plugins/libnotifyplugin.py:632 +#: Mailnag/plugins/libnotifyplugin.ui.h:5 +msgid "Pattern:" msgstr "" -#: Mailnag/configuration/configwindow.py:281 -msgid "An extensible mail notification daemon." -msgstr "Genişletilebilir bir e-posta bildirim arka plan programı." - -#: Mailnag/configuration/configwindow.py:283 -#, fuzzy, python-brace-format -msgid "Copyright (c) {years} {author} and contributors." -msgstr "Telif hakkı (c) 2011 - 2020 Patrick Ulbrich ve katkıda bulunanlar." - -#: Mailnag/configuration/configwindow.py:290 -msgid "Homepage" -msgstr "Ana sayfa" +#: Mailnag/plugins/spamfilterplugin.py:67 +msgid "Spam Filter" +msgstr "Spam Filtresi" -#: Mailnag/configuration/configwindow.py:293 -msgid "maintainer" -msgstr "" +#: Mailnag/plugins/spamfilterplugin.py:68 +msgid "Filters out unwanted mails." +msgstr "İstenmeyen postaları filtreler." -#. TRANSLATORS: Translate `translator-credits` to the list of names -#. of translators, or team, or something like that. -#: Mailnag/configuration/configwindow.py:313 -msgid "translator-credits" +#: Mailnag/plugins/spamfilterplugin.py:87 +#, fuzzy +msgid "" +"Mailnagger will ignore mails containing at least one of \n" +"the following words in subject or sender." msgstr "" -"Aydın Yakar https://launchpad.net/~yakar\n" -"Oğuz Ersen " +"Mailnag, konu veya gönderen kısmında aşağıdaki sözcüklerden\n" +"en az birini içeren e-postaları dikkate almayacaktır." -#: Mailnag/configuration/configwindow.py:353 -msgid "Delete this account:" -msgstr "Bu hesabı sil:" +#: Mailnag/plugins/soundplugin.py:66 +msgid "Sound Notifications" +msgstr "Sesli Bildirimler" -#: Mailnag/configuration/plugindialog.py:35 -msgid "Plugin Configuration" -msgstr "Eklenti Yapılandırması" +#: Mailnag/plugins/soundplugin.py:67 +msgid "Plays a sound when new mails arrive." +msgstr "Yeni e-posta geldiğinde bir ses çalar." #: Mailnag/configuration/ui/account_widget.ui.h:1 msgid "" @@ -322,6 +319,83 @@ msgstr "Eklentiler" msgid "Info" msgstr "Bilgi" +#: Mailnag/plugins/libnotifyplugin.ui.h:2 +#, fuzzy +msgid "Sender" +msgstr "gönderen" + +#: Mailnag/plugins/libnotifyplugin.ui.h:4 +#, fuzzy +msgid "Subject" +msgstr "konu" + +#: Mailnag/plugins/libnotifyplugin.ui.h:6 +msgid "Pattern" +msgstr "" + +#: Mailnag/plugins/libnotifyplugin.ui.h:7 +msgid "Edit 2FA provider" +msgstr "" + +#: Mailnag/plugins/libnotifyplugin.ui.h:8 +#, fuzzy +msgid "Enable provider" +msgstr "Etkin" + +#: Mailnag/plugins/libnotifyplugin.ui.h:9 +msgid "Count of new mails" +msgstr "Yeni e-posta sayısı" + +#: Mailnag/plugins/libnotifyplugin.ui.h:10 +msgid "Short summary of new mails" +msgstr "Yeni e-postaların kısa özeti" + +#: Mailnag/plugins/libnotifyplugin.ui.h:11 +msgid "Detailed summary of new mails" +msgstr "Yeni e-postaların ayrıntılı özeti" + +#: Mailnag/plugins/libnotifyplugin.ui.h:12 +msgid "One notification per new mail" +msgstr "Her yeni e-posta için bir bildirim" + +#: Mailnag/plugins/libnotifyplugin.ui.h:13 +#, fuzzy +msgid "Only 2FA notification, when enabled" +msgstr "Her yeni e-posta için bir bildirim" + +#: Mailnag/plugins/libnotifyplugin.ui.h:15 +msgid "Add 2FA Provider" +msgstr "" + +#: Mailnag/plugins/libnotifyplugin.ui.h:16 +msgid "Remove 2FA Provider" +msgstr "" + +#: Mailnag/plugins/libnotifyplugin.ui.h:17 +msgid "Edit 2FA Provider" +msgstr "" + +#: Mailnag/plugins/libnotifyplugin.ui.h:18 +#, fuzzy +msgid "2FA notifications" +msgstr "Sesli Bildirimler" + +#: Mailnag/plugins/libnotifyplugin.ui.h:19 +msgid "Enable/disable libnotify 2FA processing" +msgstr "" + +#: Mailnag/plugins/libnotifyplugin.ui.h:20 +msgid "2FA providers" +msgstr "" + +#, fuzzy +#~ msgid "Garmin 2FA LibNotify Notifications" +#~ msgstr "LibNotify Bildirimleri" + +#, fuzzy +#~ msgid "Shows a popup when Garmin 2FA mails arrive." +#~ msgstr "Yeni e-posta geldiğinde bir açılır pencere gösterir." + #, python-format #~ msgid "About %s" #~ msgstr "%s hakkında" diff --git a/po/uk.po b/po/uk.po index 9d8cd3f..fb49174 100644 --- a/po/uk.po +++ b/po/uk.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: mailnag\n" "Report-Msgid-Bugs-To: https://github.com/tikank/mailnagger/issues\n" -"POT-Creation-Date: 2025-11-10 12:57+0100\n" +"POT-Creation-Date: 2025-11-16 17:15+0100\n" "PO-Revision-Date: 2019-03-16 14:48+0000\n" "Last-Translator: Launchpad Translations Administrators \n" "Language-Team: Ukrainian \n" @@ -17,53 +17,91 @@ msgstr "" "X-Launchpad-Export-Date: 2020-06-11 14:44+0000\n" "X-Generator: Launchpad (build b190cebbf563f89e480a8b57f641753c8196bda0)\n" -#: Mailnag/daemon/mails.py:153 +#: Mailnag/daemon/mails.py:183 msgid "No subject" msgstr "Без теми" -#: Mailnag/plugins/garmin2FAplugin.py:135 -#, fuzzy -msgid "Garmin 2FA LibNotify Notifications" -msgstr "Сповіщення LibNotify" +#: Mailnag/configuration/accountdialog.py:77 +msgid "Mail Account" +msgstr "Обліковий запис пошти" -#: Mailnag/plugins/garmin2FAplugin.py:136 -#, fuzzy -msgid "Shows a popup when Garmin 2FA mails arrive." -msgstr "Сповіщає про нові листи за допомогою виринаючих повідомлень." +#: Mailnag/configuration/accountdialog.py:119 +msgid "optional" +msgstr "(необов’язково)" -#: Mailnag/plugins/garmin2FAplugin.py:203 -msgid "Your Security Passcode" +#: Mailnag/configuration/accountdialog.py:123 +#: Mailnag/configuration/configwindow.py:88 +#: Mailnag/configuration/configwindow.py:108 +#: Mailnag/plugins/libnotifyplugin.ui.h:14 +msgid "Enabled" +msgstr "Задіяно" + +#: Mailnag/configuration/accountdialog.py:129 +#: Mailnag/configuration/configwindow.py:94 +#: Mailnag/configuration/configwindow.py:114 +msgid "Name" +msgstr "Назва" + +#: Mailnag/configuration/accountdialog.py:252 +msgid "IMAP (Custom)" +msgstr "" + +#: Mailnag/configuration/accountdialog.py:253 +msgid "POP3 (Custom)" msgstr "" -#: Mailnag/plugins/garmin2FAplugin.py:220 +#: Mailnag/configuration/accountdialog.py:254 +msgid "MBox (Custom)" +msgstr "" + +#: Mailnag/configuration/accountdialog.py:255 +msgid "Maildir (Custom)" +msgstr "" + +#: Mailnag/configuration/accountdialog.py:361 +msgid "Connection failed." +msgstr "Не вдалося встановити з'єднання." + +#: Mailnag/configuration/configwindow.py:278 +msgid "About Mailnagger" +msgstr "" + +#: Mailnag/configuration/configwindow.py:281 +msgid "An extensible mail notification daemon." +msgstr "" + +#: Mailnag/configuration/configwindow.py:283 #, python-brace-format -msgid "📋 Code: {0}" +msgid "Copyright (c) {years} {author} and contributors." msgstr "" -#: Mailnag/plugins/spamfilterplugin.py:67 -msgid "Spam Filter" -msgstr "Фільтр спаму" +#: Mailnag/configuration/configwindow.py:290 +msgid "Homepage" +msgstr "" -#: Mailnag/plugins/spamfilterplugin.py:68 -msgid "Filters out unwanted mails." -msgstr "Відфільтровує небажані листи." +#: Mailnag/configuration/configwindow.py:293 +msgid "maintainer" +msgstr "" -#: Mailnag/plugins/spamfilterplugin.py:87 -#, fuzzy -msgid "" -"Mailnagger will ignore mails containing at least one of \n" -"the following words in subject or sender." +#. TRANSLATORS: Translate `translator-credits` to the list of names +#. of translators, or team, or something like that. +#: Mailnag/configuration/configwindow.py:313 +msgid "translator-credits" msgstr "" -"Mailnag буде нехтувати листи, що містять в темі\n" -"чи імени відправника хоча б одне слово з переліку ." +"Launchpad Contributions:\n" +" Andrii Prokopenko https://launchpad.net/~anprok\n" +" Mykola Tkach https://launchpad.net/~stuartlittle1970\n" +" Oleg «Eleidan» Kulyk https://launchpad.net/~helh-saintman\n" +" Patrick Ulbrich https://launchpad.net/~pulb\n" +" Rax https://launchpad.net/~r-a-x" -#: Mailnag/plugins/soundplugin.py:66 -msgid "Sound Notifications" -msgstr "Звукові сповіщення" +#: Mailnag/configuration/configwindow.py:353 +msgid "Delete this account:" +msgstr "Видалити обліковий запис" -#: Mailnag/plugins/soundplugin.py:67 -msgid "Plays a sound when new mails arrive." -msgstr "Супроводжує нові листи звуковим сповіщенням." +#: Mailnag/configuration/plugindialog.py:35 +msgid "Plugin Configuration" +msgstr "Налаштування додатка" #: Mailnag/plugins/userscriptplugin.py:60 msgid "User Script" @@ -93,148 +131,107 @@ msgid "" "followed by %s sequences." msgstr "" -#: Mailnag/plugins/libnotifyplugin.py:117 +#: Mailnag/plugins/libnotifyplugin.py:61 +msgid "Your Security Passcode" +msgstr "" + +#: Mailnag/plugins/libnotifyplugin.py:131 msgid "LibNotify Notifications" msgstr "Сповіщення LibNotify" -#: Mailnag/plugins/libnotifyplugin.py:118 +#: Mailnag/plugins/libnotifyplugin.py:132 msgid "Shows a popup when new mails arrive." msgstr "Сповіщає про нові листи за допомогою виринаючих повідомлень." -#: Mailnag/plugins/libnotifyplugin.py:133 -msgid "Count of new mails" -msgstr "Кількість нових листів" - -#: Mailnag/plugins/libnotifyplugin.py:134 -msgid "Short summary of new mails" -msgstr "" - -#: Mailnag/plugins/libnotifyplugin.py:135 -msgid "Detailed summary of new mails" -msgstr "" - -#: Mailnag/plugins/libnotifyplugin.py:136 -msgid "One notification per new mail" -msgstr "Про кожен лист окремо" - -#: Mailnag/plugins/libnotifyplugin.py:144 +#: Mailnag/plugins/libnotifyplugin.py:168 msgid "Notification mode:" msgstr "Метод сповіщення:" -#: Mailnag/plugins/libnotifyplugin.py:237 -#: Mailnag/plugins/libnotifyplugin.py:273 -#: Mailnag/plugins/libnotifyplugin.py:310 +#: Mailnag/plugins/libnotifyplugin.py:280 +#: Mailnag/plugins/libnotifyplugin.py:316 +#: Mailnag/plugins/libnotifyplugin.py:445 #, python-brace-format msgid "{0} new mails" msgstr "{0} листів" -#: Mailnag/plugins/libnotifyplugin.py:239 +#: Mailnag/plugins/libnotifyplugin.py:282 #, python-brace-format msgid "from {0} and others." msgstr "" -#: Mailnag/plugins/libnotifyplugin.py:241 -#: Mailnag/plugins/libnotifyplugin.py:244 +#: Mailnag/plugins/libnotifyplugin.py:284 +#: Mailnag/plugins/libnotifyplugin.py:287 #, python-brace-format msgid "from {0}." msgstr "" -#: Mailnag/plugins/libnotifyplugin.py:243 -#: Mailnag/plugins/libnotifyplugin.py:275 -#: Mailnag/plugins/libnotifyplugin.py:312 +#: Mailnag/plugins/libnotifyplugin.py:286 +#: Mailnag/plugins/libnotifyplugin.py:318 +#: Mailnag/plugins/libnotifyplugin.py:447 msgid "New mail" msgstr "Новий лист" -#: Mailnag/plugins/libnotifyplugin.py:268 -#: Mailnag/plugins/libnotifyplugin.py:270 +#: Mailnag/plugins/libnotifyplugin.py:311 +#: Mailnag/plugins/libnotifyplugin.py:313 #, python-brace-format msgid "(and {0} more)" msgstr "(і ще {0})" -#: Mailnag/plugins/libnotifyplugin.py:299 -msgid "Mark as read" -msgstr "Позначити як прочитане" - -#: Mailnag/configuration/accountdialog.py:77 -msgid "Mail Account" -msgstr "Обліковий запис пошти" - -#: Mailnag/configuration/accountdialog.py:119 -msgid "optional" -msgstr "(необов’язково)" - -#: Mailnag/configuration/accountdialog.py:123 -#: Mailnag/configuration/configwindow.py:88 -#: Mailnag/configuration/configwindow.py:108 -msgid "Enabled" -msgstr "Задіяно" - -#: Mailnag/configuration/accountdialog.py:129 -#: Mailnag/configuration/configwindow.py:94 -#: Mailnag/configuration/configwindow.py:114 -msgid "Name" -msgstr "Назва" - -#: Mailnag/configuration/accountdialog.py:252 -msgid "IMAP (Custom)" -msgstr "" - -#: Mailnag/configuration/accountdialog.py:253 -msgid "POP3 (Custom)" -msgstr "" - -#: Mailnag/configuration/accountdialog.py:254 -msgid "MBox (Custom)" +#: Mailnag/plugins/libnotifyplugin.py:390 +#, python-brace-format +msgid "📋 Code: {0}" msgstr "" -#: Mailnag/configuration/accountdialog.py:255 -msgid "Maildir (Custom)" -msgstr "" +#: Mailnag/plugins/libnotifyplugin.py:434 +msgid "Mark as read" +msgstr "Позначити як прочитане" -#: Mailnag/configuration/accountdialog.py:361 -msgid "Connection failed." -msgstr "Не вдалося встановити з'єднання." +#: Mailnag/plugins/libnotifyplugin.py:629 +#, fuzzy +msgid "Delete this provider:" +msgstr "Видалити обліковий запис" -#: Mailnag/configuration/configwindow.py:278 -msgid "About Mailnagger" -msgstr "" +#: Mailnag/plugins/libnotifyplugin.py:630 +#: Mailnag/plugins/libnotifyplugin.ui.h:1 +#, fuzzy +msgid "Sender:" +msgstr "відправник" -#: Mailnag/configuration/configwindow.py:281 -msgid "An extensible mail notification daemon." -msgstr "" +#: Mailnag/plugins/libnotifyplugin.py:631 +#: Mailnag/plugins/libnotifyplugin.ui.h:3 +#, fuzzy +msgid "Subject:" +msgstr "тема" -#: Mailnag/configuration/configwindow.py:283 -#, python-brace-format -msgid "Copyright (c) {years} {author} and contributors." +#: Mailnag/plugins/libnotifyplugin.py:632 +#: Mailnag/plugins/libnotifyplugin.ui.h:5 +msgid "Pattern:" msgstr "" -#: Mailnag/configuration/configwindow.py:290 -msgid "Homepage" -msgstr "" +#: Mailnag/plugins/spamfilterplugin.py:67 +msgid "Spam Filter" +msgstr "Фільтр спаму" -#: Mailnag/configuration/configwindow.py:293 -msgid "maintainer" -msgstr "" +#: Mailnag/plugins/spamfilterplugin.py:68 +msgid "Filters out unwanted mails." +msgstr "Відфільтровує небажані листи." -#. TRANSLATORS: Translate `translator-credits` to the list of names -#. of translators, or team, or something like that. -#: Mailnag/configuration/configwindow.py:313 -msgid "translator-credits" +#: Mailnag/plugins/spamfilterplugin.py:87 +#, fuzzy +msgid "" +"Mailnagger will ignore mails containing at least one of \n" +"the following words in subject or sender." msgstr "" -"Launchpad Contributions:\n" -" Andrii Prokopenko https://launchpad.net/~anprok\n" -" Mykola Tkach https://launchpad.net/~stuartlittle1970\n" -" Oleg «Eleidan» Kulyk https://launchpad.net/~helh-saintman\n" -" Patrick Ulbrich https://launchpad.net/~pulb\n" -" Rax https://launchpad.net/~r-a-x" +"Mailnag буде нехтувати листи, що містять в темі\n" +"чи імени відправника хоча б одне слово з переліку ." -#: Mailnag/configuration/configwindow.py:353 -msgid "Delete this account:" -msgstr "Видалити обліковий запис" +#: Mailnag/plugins/soundplugin.py:66 +msgid "Sound Notifications" +msgstr "Звукові сповіщення" -#: Mailnag/configuration/plugindialog.py:35 -msgid "Plugin Configuration" -msgstr "Налаштування додатка" +#: Mailnag/plugins/soundplugin.py:67 +msgid "Plays a sound when new mails arrive." +msgstr "Супроводжує нові листи звуковим сповіщенням." #: Mailnag/configuration/ui/account_widget.ui.h:1 msgid "" @@ -318,6 +315,83 @@ msgstr "Додатки" msgid "Info" msgstr "" +#: Mailnag/plugins/libnotifyplugin.ui.h:2 +#, fuzzy +msgid "Sender" +msgstr "відправник" + +#: Mailnag/plugins/libnotifyplugin.ui.h:4 +#, fuzzy +msgid "Subject" +msgstr "тема" + +#: Mailnag/plugins/libnotifyplugin.ui.h:6 +msgid "Pattern" +msgstr "" + +#: Mailnag/plugins/libnotifyplugin.ui.h:7 +msgid "Edit 2FA provider" +msgstr "" + +#: Mailnag/plugins/libnotifyplugin.ui.h:8 +#, fuzzy +msgid "Enable provider" +msgstr "Задіяно" + +#: Mailnag/plugins/libnotifyplugin.ui.h:9 +msgid "Count of new mails" +msgstr "Кількість нових листів" + +#: Mailnag/plugins/libnotifyplugin.ui.h:10 +msgid "Short summary of new mails" +msgstr "" + +#: Mailnag/plugins/libnotifyplugin.ui.h:11 +msgid "Detailed summary of new mails" +msgstr "" + +#: Mailnag/plugins/libnotifyplugin.ui.h:12 +msgid "One notification per new mail" +msgstr "Про кожен лист окремо" + +#: Mailnag/plugins/libnotifyplugin.ui.h:13 +#, fuzzy +msgid "Only 2FA notification, when enabled" +msgstr "Про кожен лист окремо" + +#: Mailnag/plugins/libnotifyplugin.ui.h:15 +msgid "Add 2FA Provider" +msgstr "" + +#: Mailnag/plugins/libnotifyplugin.ui.h:16 +msgid "Remove 2FA Provider" +msgstr "" + +#: Mailnag/plugins/libnotifyplugin.ui.h:17 +msgid "Edit 2FA Provider" +msgstr "" + +#: Mailnag/plugins/libnotifyplugin.ui.h:18 +#, fuzzy +msgid "2FA notifications" +msgstr "Звукові сповіщення" + +#: Mailnag/plugins/libnotifyplugin.ui.h:19 +msgid "Enable/disable libnotify 2FA processing" +msgstr "" + +#: Mailnag/plugins/libnotifyplugin.ui.h:20 +msgid "2FA providers" +msgstr "" + +#, fuzzy +#~ msgid "Garmin 2FA LibNotify Notifications" +#~ msgstr "Сповіщення LibNotify" + +#, fuzzy +#~ msgid "Shows a popup when Garmin 2FA mails arrive." +#~ msgstr "Сповіщає про нові листи за допомогою виринаючих повідомлень." + #~ msgid "Maximum number of visible mails:" #~ msgstr "Максимальна к-сть листів у списку:" diff --git a/po/zh_CN.po b/po/zh_CN.po index c9b1f0c..58d40c1 100644 --- a/po/zh_CN.po +++ b/po/zh_CN.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: mailnag\n" "Report-Msgid-Bugs-To: https://github.com/tikank/mailnagger/issues\n" -"POT-Creation-Date: 2025-11-10 12:57+0100\n" +"POT-Creation-Date: 2025-11-16 17:15+0100\n" "PO-Revision-Date: 2019-03-16 14:48+0000\n" "Last-Translator: Launchpad Translations Administrators \n" "Language-Team: Chinese (Simplified) \n" @@ -18,50 +18,89 @@ msgstr "" "X-Launchpad-Export-Date: 2020-06-11 14:44+0000\n" "X-Generator: Launchpad (build b190cebbf563f89e480a8b57f641753c8196bda0)\n" -#: Mailnag/daemon/mails.py:153 +#: Mailnag/daemon/mails.py:183 msgid "No subject" msgstr "无主题" -#: Mailnag/plugins/garmin2FAplugin.py:135 -#, fuzzy -msgid "Garmin 2FA LibNotify Notifications" -msgstr "弹出窗口通知" +#: Mailnag/configuration/accountdialog.py:77 +msgid "Mail Account" +msgstr "邮件账户" -#: Mailnag/plugins/garmin2FAplugin.py:136 -#, fuzzy -msgid "Shows a popup when Garmin 2FA mails arrive." -msgstr "当新邮件到达时弹出。" +#: Mailnag/configuration/accountdialog.py:119 +msgid "optional" +msgstr "可选" -#: Mailnag/plugins/garmin2FAplugin.py:203 -msgid "Your Security Passcode" +#: Mailnag/configuration/accountdialog.py:123 +#: Mailnag/configuration/configwindow.py:88 +#: Mailnag/configuration/configwindow.py:108 +#: Mailnag/plugins/libnotifyplugin.ui.h:14 +msgid "Enabled" +msgstr "已启用" + +#: Mailnag/configuration/accountdialog.py:129 +#: Mailnag/configuration/configwindow.py:94 +#: Mailnag/configuration/configwindow.py:114 +msgid "Name" +msgstr "名称" + +#: Mailnag/configuration/accountdialog.py:252 +msgid "IMAP (Custom)" msgstr "" -#: Mailnag/plugins/garmin2FAplugin.py:220 +#: Mailnag/configuration/accountdialog.py:253 +msgid "POP3 (Custom)" +msgstr "" + +#: Mailnag/configuration/accountdialog.py:254 +msgid "MBox (Custom)" +msgstr "" + +#: Mailnag/configuration/accountdialog.py:255 +msgid "Maildir (Custom)" +msgstr "" + +#: Mailnag/configuration/accountdialog.py:361 +msgid "Connection failed." +msgstr "" + +#: Mailnag/configuration/configwindow.py:278 +msgid "About Mailnagger" +msgstr "" + +#: Mailnag/configuration/configwindow.py:281 +msgid "An extensible mail notification daemon." +msgstr "" + +#: Mailnag/configuration/configwindow.py:283 #, python-brace-format -msgid "📋 Code: {0}" +msgid "Copyright (c) {years} {author} and contributors." msgstr "" -#: Mailnag/plugins/spamfilterplugin.py:67 -msgid "Spam Filter" -msgstr "垃圾邮件过滤器" +#: Mailnag/configuration/configwindow.py:290 +msgid "Homepage" +msgstr "" -#: Mailnag/plugins/spamfilterplugin.py:68 -msgid "Filters out unwanted mails." -msgstr "过滤掉不想要的邮件。" +#: Mailnag/configuration/configwindow.py:293 +msgid "maintainer" +msgstr "" -#: Mailnag/plugins/spamfilterplugin.py:87 -msgid "" -"Mailnagger will ignore mails containing at least one of \n" -"the following words in subject or sender." +#. TRANSLATORS: Translate `translator-credits` to the list of names +#. of translators, or team, or something like that. +#: Mailnag/configuration/configwindow.py:313 +msgid "translator-credits" msgstr "" +"Launchpad Contributions:\n" +" Hu Meng https://launchpad.net/~humeng\n" +" Patrick Ulbrich https://launchpad.net/~pulb\n" +" 朱涛 https://launchpad.net/~bill-zt" -#: Mailnag/plugins/soundplugin.py:66 -msgid "Sound Notifications" -msgstr "声音通知" +#: Mailnag/configuration/configwindow.py:353 +msgid "Delete this account:" +msgstr "删除该帐户:" -#: Mailnag/plugins/soundplugin.py:67 -msgid "Plays a sound when new mails arrive." -msgstr "当新邮件到达时播放声音。" +#: Mailnag/configuration/plugindialog.py:35 +msgid "Plugin Configuration" +msgstr "" #: Mailnag/plugins/userscriptplugin.py:60 msgid "User Script" @@ -91,146 +130,104 @@ msgid "" "followed by %s sequences." msgstr "" -#: Mailnag/plugins/libnotifyplugin.py:117 +#: Mailnag/plugins/libnotifyplugin.py:61 +msgid "Your Security Passcode" +msgstr "" + +#: Mailnag/plugins/libnotifyplugin.py:131 msgid "LibNotify Notifications" msgstr "弹出窗口通知" -#: Mailnag/plugins/libnotifyplugin.py:118 +#: Mailnag/plugins/libnotifyplugin.py:132 msgid "Shows a popup when new mails arrive." msgstr "当新邮件到达时弹出。" -#: Mailnag/plugins/libnotifyplugin.py:133 -msgid "Count of new mails" -msgstr "新邮件数量" - -#: Mailnag/plugins/libnotifyplugin.py:134 -msgid "Short summary of new mails" -msgstr "" - -#: Mailnag/plugins/libnotifyplugin.py:135 -msgid "Detailed summary of new mails" -msgstr "" - -#: Mailnag/plugins/libnotifyplugin.py:136 -msgid "One notification per new mail" -msgstr "每封新邮件通知一次" - -#: Mailnag/plugins/libnotifyplugin.py:144 +#: Mailnag/plugins/libnotifyplugin.py:168 msgid "Notification mode:" msgstr "通知模式" -#: Mailnag/plugins/libnotifyplugin.py:237 -#: Mailnag/plugins/libnotifyplugin.py:273 -#: Mailnag/plugins/libnotifyplugin.py:310 +#: Mailnag/plugins/libnotifyplugin.py:280 +#: Mailnag/plugins/libnotifyplugin.py:316 +#: Mailnag/plugins/libnotifyplugin.py:445 #, python-brace-format msgid "{0} new mails" msgstr "" -#: Mailnag/plugins/libnotifyplugin.py:239 +#: Mailnag/plugins/libnotifyplugin.py:282 #, python-brace-format msgid "from {0} and others." msgstr "" -#: Mailnag/plugins/libnotifyplugin.py:241 -#: Mailnag/plugins/libnotifyplugin.py:244 +#: Mailnag/plugins/libnotifyplugin.py:284 +#: Mailnag/plugins/libnotifyplugin.py:287 #, python-brace-format msgid "from {0}." msgstr "" -#: Mailnag/plugins/libnotifyplugin.py:243 -#: Mailnag/plugins/libnotifyplugin.py:275 -#: Mailnag/plugins/libnotifyplugin.py:312 +#: Mailnag/plugins/libnotifyplugin.py:286 +#: Mailnag/plugins/libnotifyplugin.py:318 +#: Mailnag/plugins/libnotifyplugin.py:447 msgid "New mail" msgstr "" -#: Mailnag/plugins/libnotifyplugin.py:268 -#: Mailnag/plugins/libnotifyplugin.py:270 +#: Mailnag/plugins/libnotifyplugin.py:311 +#: Mailnag/plugins/libnotifyplugin.py:313 #, python-brace-format msgid "(and {0} more)" msgstr "( 还有 {0} 条)" -#: Mailnag/plugins/libnotifyplugin.py:299 -msgid "Mark as read" -msgstr "标记为已读" - -#: Mailnag/configuration/accountdialog.py:77 -msgid "Mail Account" -msgstr "邮件账户" - -#: Mailnag/configuration/accountdialog.py:119 -msgid "optional" -msgstr "可选" - -#: Mailnag/configuration/accountdialog.py:123 -#: Mailnag/configuration/configwindow.py:88 -#: Mailnag/configuration/configwindow.py:108 -msgid "Enabled" -msgstr "已启用" - -#: Mailnag/configuration/accountdialog.py:129 -#: Mailnag/configuration/configwindow.py:94 -#: Mailnag/configuration/configwindow.py:114 -msgid "Name" -msgstr "名称" - -#: Mailnag/configuration/accountdialog.py:252 -msgid "IMAP (Custom)" -msgstr "" - -#: Mailnag/configuration/accountdialog.py:253 -msgid "POP3 (Custom)" +#: Mailnag/plugins/libnotifyplugin.py:390 +#, python-brace-format +msgid "📋 Code: {0}" msgstr "" -#: Mailnag/configuration/accountdialog.py:254 -msgid "MBox (Custom)" -msgstr "" +#: Mailnag/plugins/libnotifyplugin.py:434 +msgid "Mark as read" +msgstr "标记为已读" -#: Mailnag/configuration/accountdialog.py:255 -msgid "Maildir (Custom)" -msgstr "" +#: Mailnag/plugins/libnotifyplugin.py:629 +#, fuzzy +msgid "Delete this provider:" +msgstr "删除该帐户:" -#: Mailnag/configuration/accountdialog.py:361 -msgid "Connection failed." -msgstr "" +#: Mailnag/plugins/libnotifyplugin.py:630 +#: Mailnag/plugins/libnotifyplugin.ui.h:1 +#, fuzzy +msgid "Sender:" +msgstr "寄件人" -#: Mailnag/configuration/configwindow.py:278 -msgid "About Mailnagger" -msgstr "" +#: Mailnag/plugins/libnotifyplugin.py:631 +#: Mailnag/plugins/libnotifyplugin.ui.h:3 +#, fuzzy +msgid "Subject:" +msgstr "主题" -#: Mailnag/configuration/configwindow.py:281 -msgid "An extensible mail notification daemon." +#: Mailnag/plugins/libnotifyplugin.py:632 +#: Mailnag/plugins/libnotifyplugin.ui.h:5 +msgid "Pattern:" msgstr "" -#: Mailnag/configuration/configwindow.py:283 -#, python-brace-format -msgid "Copyright (c) {years} {author} and contributors." -msgstr "" +#: Mailnag/plugins/spamfilterplugin.py:67 +msgid "Spam Filter" +msgstr "垃圾邮件过滤器" -#: Mailnag/configuration/configwindow.py:290 -msgid "Homepage" -msgstr "" +#: Mailnag/plugins/spamfilterplugin.py:68 +msgid "Filters out unwanted mails." +msgstr "过滤掉不想要的邮件。" -#: Mailnag/configuration/configwindow.py:293 -msgid "maintainer" +#: Mailnag/plugins/spamfilterplugin.py:87 +msgid "" +"Mailnagger will ignore mails containing at least one of \n" +"the following words in subject or sender." msgstr "" -#. TRANSLATORS: Translate `translator-credits` to the list of names -#. of translators, or team, or something like that. -#: Mailnag/configuration/configwindow.py:313 -msgid "translator-credits" -msgstr "" -"Launchpad Contributions:\n" -" Hu Meng https://launchpad.net/~humeng\n" -" Patrick Ulbrich https://launchpad.net/~pulb\n" -" 朱涛 https://launchpad.net/~bill-zt" - -#: Mailnag/configuration/configwindow.py:353 -msgid "Delete this account:" -msgstr "删除该帐户:" +#: Mailnag/plugins/soundplugin.py:66 +msgid "Sound Notifications" +msgstr "声音通知" -#: Mailnag/configuration/plugindialog.py:35 -msgid "Plugin Configuration" -msgstr "" +#: Mailnag/plugins/soundplugin.py:67 +msgid "Plays a sound when new mails arrive." +msgstr "当新邮件到达时播放声音。" #: Mailnag/configuration/ui/account_widget.ui.h:1 msgid "" @@ -314,5 +311,82 @@ msgstr "" msgid "Info" msgstr "" +#: Mailnag/plugins/libnotifyplugin.ui.h:2 +#, fuzzy +msgid "Sender" +msgstr "寄件人" + +#: Mailnag/plugins/libnotifyplugin.ui.h:4 +#, fuzzy +msgid "Subject" +msgstr "主题" + +#: Mailnag/plugins/libnotifyplugin.ui.h:6 +msgid "Pattern" +msgstr "" + +#: Mailnag/plugins/libnotifyplugin.ui.h:7 +msgid "Edit 2FA provider" +msgstr "" + +#: Mailnag/plugins/libnotifyplugin.ui.h:8 +#, fuzzy +msgid "Enable provider" +msgstr "已启用" + +#: Mailnag/plugins/libnotifyplugin.ui.h:9 +msgid "Count of new mails" +msgstr "新邮件数量" + +#: Mailnag/plugins/libnotifyplugin.ui.h:10 +msgid "Short summary of new mails" +msgstr "" + +#: Mailnag/plugins/libnotifyplugin.ui.h:11 +msgid "Detailed summary of new mails" +msgstr "" + +#: Mailnag/plugins/libnotifyplugin.ui.h:12 +msgid "One notification per new mail" +msgstr "每封新邮件通知一次" + +#: Mailnag/plugins/libnotifyplugin.ui.h:13 +#, fuzzy +msgid "Only 2FA notification, when enabled" +msgstr "每封新邮件通知一次" + +#: Mailnag/plugins/libnotifyplugin.ui.h:15 +msgid "Add 2FA Provider" +msgstr "" + +#: Mailnag/plugins/libnotifyplugin.ui.h:16 +msgid "Remove 2FA Provider" +msgstr "" + +#: Mailnag/plugins/libnotifyplugin.ui.h:17 +msgid "Edit 2FA Provider" +msgstr "" + +#: Mailnag/plugins/libnotifyplugin.ui.h:18 +#, fuzzy +msgid "2FA notifications" +msgstr "声音通知" + +#: Mailnag/plugins/libnotifyplugin.ui.h:19 +msgid "Enable/disable libnotify 2FA processing" +msgstr "" + +#: Mailnag/plugins/libnotifyplugin.ui.h:20 +msgid "2FA providers" +msgstr "" + +#, fuzzy +#~ msgid "Garmin 2FA LibNotify Notifications" +#~ msgstr "弹出窗口通知" + +#, fuzzy +#~ msgid "Shows a popup when Garmin 2FA mails arrive." +#~ msgstr "当新邮件到达时弹出。" + #~ msgid "Maximum number of visible mails:" #~ msgstr "可显示邮件的最大数量" diff --git a/po/zh_TW.po b/po/zh_TW.po index 7868e50..1f641a1 100644 --- a/po/zh_TW.po +++ b/po/zh_TW.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: mailnag\n" "Report-Msgid-Bugs-To: https://github.com/tikank/mailnagger/issues\n" -"POT-Creation-Date: 2025-11-10 12:57+0100\n" +"POT-Creation-Date: 2025-11-16 17:15+0100\n" "PO-Revision-Date: 2019-03-16 14:48+0000\n" "Last-Translator: Launchpad Translations Administrators \n" "Language-Team: Chinese (Traditional) \n" @@ -18,51 +18,87 @@ msgstr "" "X-Launchpad-Export-Date: 2020-06-11 14:44+0000\n" "X-Generator: Launchpad (build b190cebbf563f89e480a8b57f641753c8196bda0)\n" -#: Mailnag/daemon/mails.py:153 +#: Mailnag/daemon/mails.py:183 msgid "No subject" msgstr "無主題" -#: Mailnag/plugins/garmin2FAplugin.py:135 -#, fuzzy -msgid "Garmin 2FA LibNotify Notifications" -msgstr "彈出視窗通知" +#: Mailnag/configuration/accountdialog.py:77 +msgid "Mail Account" +msgstr "郵件賬戶" -#: Mailnag/plugins/garmin2FAplugin.py:136 -#, fuzzy -msgid "Shows a popup when Garmin 2FA mails arrive." -msgstr "當新郵件到達時彈出訊息視窗。" +#: Mailnag/configuration/accountdialog.py:119 +msgid "optional" +msgstr "可選" -#: Mailnag/plugins/garmin2FAplugin.py:203 -msgid "Your Security Passcode" +#: Mailnag/configuration/accountdialog.py:123 +#: Mailnag/configuration/configwindow.py:88 +#: Mailnag/configuration/configwindow.py:108 +#: Mailnag/plugins/libnotifyplugin.ui.h:14 +msgid "Enabled" +msgstr "已啓用" + +#: Mailnag/configuration/accountdialog.py:129 +#: Mailnag/configuration/configwindow.py:94 +#: Mailnag/configuration/configwindow.py:114 +msgid "Name" +msgstr "名稱" + +#: Mailnag/configuration/accountdialog.py:252 +msgid "IMAP (Custom)" msgstr "" -#: Mailnag/plugins/garmin2FAplugin.py:220 +#: Mailnag/configuration/accountdialog.py:253 +msgid "POP3 (Custom)" +msgstr "" + +#: Mailnag/configuration/accountdialog.py:254 +msgid "MBox (Custom)" +msgstr "" + +#: Mailnag/configuration/accountdialog.py:255 +msgid "Maildir (Custom)" +msgstr "" + +#: Mailnag/configuration/accountdialog.py:361 +msgid "Connection failed." +msgstr "" + +#: Mailnag/configuration/configwindow.py:278 +msgid "About Mailnagger" +msgstr "" + +#: Mailnag/configuration/configwindow.py:281 +msgid "An extensible mail notification daemon." +msgstr "" + +#: Mailnag/configuration/configwindow.py:283 #, python-brace-format -msgid "📋 Code: {0}" +msgid "Copyright (c) {years} {author} and contributors." msgstr "" -#: Mailnag/plugins/spamfilterplugin.py:67 -msgid "Spam Filter" -msgstr "垃圾郵件過濾器" +#: Mailnag/configuration/configwindow.py:290 +msgid "Homepage" +msgstr "" -#: Mailnag/plugins/spamfilterplugin.py:68 -msgid "Filters out unwanted mails." -msgstr "過濾掉不想要的郵件。" +#: Mailnag/configuration/configwindow.py:293 +msgid "maintainer" +msgstr "" -#: Mailnag/plugins/spamfilterplugin.py:87 -#, fuzzy -msgid "" -"Mailnagger will ignore mails containing at least one of \n" -"the following words in subject or sender." -msgstr "Mailnag 將會忽略主旨或寄件者裡帶有這些字詞的郵件。" +#. TRANSLATORS: Translate `translator-credits` to the list of names +#. of translators, or team, or something like that. +#: Mailnag/configuration/configwindow.py:313 +msgid "translator-credits" +msgstr "" +"Launchpad Contributions:\n" +" elleryq https://launchpad.net/~elleryq" -#: Mailnag/plugins/soundplugin.py:66 -msgid "Sound Notifications" -msgstr "聲音通知" +#: Mailnag/configuration/configwindow.py:353 +msgid "Delete this account:" +msgstr "刪除該帳戶:" -#: Mailnag/plugins/soundplugin.py:67 -msgid "Plays a sound when new mails arrive." -msgstr "當新郵件到達時播放聲音。" +#: Mailnag/configuration/plugindialog.py:35 +msgid "Plugin Configuration" +msgstr "Plugin 配置" #: Mailnag/plugins/userscriptplugin.py:60 msgid "User Script" @@ -92,144 +128,105 @@ msgid "" "followed by %s sequences." msgstr "" -#: Mailnag/plugins/libnotifyplugin.py:117 +#: Mailnag/plugins/libnotifyplugin.py:61 +msgid "Your Security Passcode" +msgstr "" + +#: Mailnag/plugins/libnotifyplugin.py:131 msgid "LibNotify Notifications" msgstr "彈出視窗通知" -#: Mailnag/plugins/libnotifyplugin.py:118 +#: Mailnag/plugins/libnotifyplugin.py:132 msgid "Shows a popup when new mails arrive." msgstr "當新郵件到達時彈出訊息視窗。" -#: Mailnag/plugins/libnotifyplugin.py:133 -msgid "Count of new mails" -msgstr "新郵件數量" - -#: Mailnag/plugins/libnotifyplugin.py:134 -msgid "Short summary of new mails" -msgstr "" - -#: Mailnag/plugins/libnotifyplugin.py:135 -msgid "Detailed summary of new mails" -msgstr "" - -#: Mailnag/plugins/libnotifyplugin.py:136 -msgid "One notification per new mail" -msgstr "每封新郵件通知一次" - -#: Mailnag/plugins/libnotifyplugin.py:144 +#: Mailnag/plugins/libnotifyplugin.py:168 msgid "Notification mode:" msgstr "通知模式" -#: Mailnag/plugins/libnotifyplugin.py:237 -#: Mailnag/plugins/libnotifyplugin.py:273 -#: Mailnag/plugins/libnotifyplugin.py:310 +#: Mailnag/plugins/libnotifyplugin.py:280 +#: Mailnag/plugins/libnotifyplugin.py:316 +#: Mailnag/plugins/libnotifyplugin.py:445 #, python-brace-format msgid "{0} new mails" msgstr "{0} 封新郵件" -#: Mailnag/plugins/libnotifyplugin.py:239 +#: Mailnag/plugins/libnotifyplugin.py:282 #, python-brace-format msgid "from {0} and others." msgstr "" -#: Mailnag/plugins/libnotifyplugin.py:241 -#: Mailnag/plugins/libnotifyplugin.py:244 +#: Mailnag/plugins/libnotifyplugin.py:284 +#: Mailnag/plugins/libnotifyplugin.py:287 #, python-brace-format msgid "from {0}." msgstr "" -#: Mailnag/plugins/libnotifyplugin.py:243 -#: Mailnag/plugins/libnotifyplugin.py:275 -#: Mailnag/plugins/libnotifyplugin.py:312 +#: Mailnag/plugins/libnotifyplugin.py:286 +#: Mailnag/plugins/libnotifyplugin.py:318 +#: Mailnag/plugins/libnotifyplugin.py:447 msgid "New mail" msgstr "新郵件" -#: Mailnag/plugins/libnotifyplugin.py:268 -#: Mailnag/plugins/libnotifyplugin.py:270 +#: Mailnag/plugins/libnotifyplugin.py:311 +#: Mailnag/plugins/libnotifyplugin.py:313 #, python-brace-format msgid "(and {0} more)" msgstr "( 還有 {0} 條)" -#: Mailnag/plugins/libnotifyplugin.py:299 -msgid "Mark as read" -msgstr "標記爲已讀" - -#: Mailnag/configuration/accountdialog.py:77 -msgid "Mail Account" -msgstr "郵件賬戶" - -#: Mailnag/configuration/accountdialog.py:119 -msgid "optional" -msgstr "可選" - -#: Mailnag/configuration/accountdialog.py:123 -#: Mailnag/configuration/configwindow.py:88 -#: Mailnag/configuration/configwindow.py:108 -msgid "Enabled" -msgstr "已啓用" - -#: Mailnag/configuration/accountdialog.py:129 -#: Mailnag/configuration/configwindow.py:94 -#: Mailnag/configuration/configwindow.py:114 -msgid "Name" -msgstr "名稱" - -#: Mailnag/configuration/accountdialog.py:252 -msgid "IMAP (Custom)" -msgstr "" - -#: Mailnag/configuration/accountdialog.py:253 -msgid "POP3 (Custom)" -msgstr "" - -#: Mailnag/configuration/accountdialog.py:254 -msgid "MBox (Custom)" +#: Mailnag/plugins/libnotifyplugin.py:390 +#, python-brace-format +msgid "📋 Code: {0}" msgstr "" -#: Mailnag/configuration/accountdialog.py:255 -msgid "Maildir (Custom)" -msgstr "" +#: Mailnag/plugins/libnotifyplugin.py:434 +msgid "Mark as read" +msgstr "標記爲已讀" -#: Mailnag/configuration/accountdialog.py:361 -msgid "Connection failed." -msgstr "" +#: Mailnag/plugins/libnotifyplugin.py:629 +#, fuzzy +msgid "Delete this provider:" +msgstr "刪除該帳戶:" -#: Mailnag/configuration/configwindow.py:278 -msgid "About Mailnagger" -msgstr "" +#: Mailnag/plugins/libnotifyplugin.py:630 +#: Mailnag/plugins/libnotifyplugin.ui.h:1 +#, fuzzy +msgid "Sender:" +msgstr "寄件人" -#: Mailnag/configuration/configwindow.py:281 -msgid "An extensible mail notification daemon." -msgstr "" +#: Mailnag/plugins/libnotifyplugin.py:631 +#: Mailnag/plugins/libnotifyplugin.ui.h:3 +#, fuzzy +msgid "Subject:" +msgstr "主題" -#: Mailnag/configuration/configwindow.py:283 -#, python-brace-format -msgid "Copyright (c) {years} {author} and contributors." +#: Mailnag/plugins/libnotifyplugin.py:632 +#: Mailnag/plugins/libnotifyplugin.ui.h:5 +msgid "Pattern:" msgstr "" -#: Mailnag/configuration/configwindow.py:290 -msgid "Homepage" -msgstr "" +#: Mailnag/plugins/spamfilterplugin.py:67 +msgid "Spam Filter" +msgstr "垃圾郵件過濾器" -#: Mailnag/configuration/configwindow.py:293 -msgid "maintainer" -msgstr "" +#: Mailnag/plugins/spamfilterplugin.py:68 +msgid "Filters out unwanted mails." +msgstr "過濾掉不想要的郵件。" -#. TRANSLATORS: Translate `translator-credits` to the list of names -#. of translators, or team, or something like that. -#: Mailnag/configuration/configwindow.py:313 -msgid "translator-credits" -msgstr "" -"Launchpad Contributions:\n" -" elleryq https://launchpad.net/~elleryq" +#: Mailnag/plugins/spamfilterplugin.py:87 +#, fuzzy +msgid "" +"Mailnagger will ignore mails containing at least one of \n" +"the following words in subject or sender." +msgstr "Mailnag 將會忽略主旨或寄件者裡帶有這些字詞的郵件。" -#: Mailnag/configuration/configwindow.py:353 -msgid "Delete this account:" -msgstr "刪除該帳戶:" +#: Mailnag/plugins/soundplugin.py:66 +msgid "Sound Notifications" +msgstr "聲音通知" -#: Mailnag/configuration/plugindialog.py:35 -msgid "Plugin Configuration" -msgstr "Plugin 配置" +#: Mailnag/plugins/soundplugin.py:67 +msgid "Plays a sound when new mails arrive." +msgstr "當新郵件到達時播放聲音。" #: Mailnag/configuration/ui/account_widget.ui.h:1 msgid "" @@ -313,5 +310,82 @@ msgstr "" msgid "Info" msgstr "" +#: Mailnag/plugins/libnotifyplugin.ui.h:2 +#, fuzzy +msgid "Sender" +msgstr "寄件人" + +#: Mailnag/plugins/libnotifyplugin.ui.h:4 +#, fuzzy +msgid "Subject" +msgstr "主題" + +#: Mailnag/plugins/libnotifyplugin.ui.h:6 +msgid "Pattern" +msgstr "" + +#: Mailnag/plugins/libnotifyplugin.ui.h:7 +msgid "Edit 2FA provider" +msgstr "" + +#: Mailnag/plugins/libnotifyplugin.ui.h:8 +#, fuzzy +msgid "Enable provider" +msgstr "已啓用" + +#: Mailnag/plugins/libnotifyplugin.ui.h:9 +msgid "Count of new mails" +msgstr "新郵件數量" + +#: Mailnag/plugins/libnotifyplugin.ui.h:10 +msgid "Short summary of new mails" +msgstr "" + +#: Mailnag/plugins/libnotifyplugin.ui.h:11 +msgid "Detailed summary of new mails" +msgstr "" + +#: Mailnag/plugins/libnotifyplugin.ui.h:12 +msgid "One notification per new mail" +msgstr "每封新郵件通知一次" + +#: Mailnag/plugins/libnotifyplugin.ui.h:13 +#, fuzzy +msgid "Only 2FA notification, when enabled" +msgstr "每封新郵件通知一次" + +#: Mailnag/plugins/libnotifyplugin.ui.h:15 +msgid "Add 2FA Provider" +msgstr "" + +#: Mailnag/plugins/libnotifyplugin.ui.h:16 +msgid "Remove 2FA Provider" +msgstr "" + +#: Mailnag/plugins/libnotifyplugin.ui.h:17 +msgid "Edit 2FA Provider" +msgstr "" + +#: Mailnag/plugins/libnotifyplugin.ui.h:18 +#, fuzzy +msgid "2FA notifications" +msgstr "聲音通知" + +#: Mailnag/plugins/libnotifyplugin.ui.h:19 +msgid "Enable/disable libnotify 2FA processing" +msgstr "" + +#: Mailnag/plugins/libnotifyplugin.ui.h:20 +msgid "2FA providers" +msgstr "" + +#, fuzzy +#~ msgid "Garmin 2FA LibNotify Notifications" +#~ msgstr "彈出視窗通知" + +#, fuzzy +#~ msgid "Shows a popup when Garmin 2FA mails arrive." +#~ msgstr "當新郵件到達時彈出訊息視窗。" + #~ msgid "Maximum number of visible mails:" #~ msgstr "可顯示郵件的最大數量" From 06e62f56be72320a908a9b1c7fa0d2c443cfc8fb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Auzi?= Date: Sun, 16 Nov 2025 19:06:57 +0100 Subject: [PATCH 20/49] Fill-in typing signatures --- Mailnag/plugins/libnotifyplugin.py | 31 +++++++++++++++--------------- 1 file changed, 16 insertions(+), 15 deletions(-) diff --git a/Mailnag/plugins/libnotifyplugin.py b/Mailnag/plugins/libnotifyplugin.py index 3b0b0ed..687470a 100644 --- a/Mailnag/plugins/libnotifyplugin.py +++ b/Mailnag/plugins/libnotifyplugin.py @@ -141,6 +141,7 @@ def get_default_config(self) -> dict[str, Any]: def has_config_ui(self) -> bool: return True + def get_config_ui(self) -> Gtk.Box: builder = Gtk.Builder() builder.set_translation_domain(PACKAGE_NAME) @@ -189,7 +190,7 @@ def get_config_ui(self) -> Gtk.Box: return builder.get_object('box1') @staticmethod - def _eval_2fa_providers(providers): + def _eval_2fa_providers(providers: list|str) -> list: if isinstance(providers,list): return providers if not isinstance(providers,str): @@ -323,7 +324,7 @@ def _notify_summary(self, new_mails: list[Mail], all_mails: list[Mail]) -> None: self._notifications['0'].show() - def _notify_2FA_attempts(self, new_mails, all_mails) -> None: + def _notify_2FA_attempts(self, new_mails: List[Mail], all_mails: List[Mail]) -> None: self._cleanup_notifications_not_in(all_mails) # In single notification mode new mails are @@ -403,7 +404,7 @@ def _record_mail_notification(self, mail: Mail, n: Notify.Notification) -> None: self._notifications[notification_id] = n - def _cleanup_notifications_not_in(self, all_mails) -> None: + def _cleanup_notifications_not_in(self, all_mails: List[Mail]) -> None: # Remove notifications for messages not in all_mails: for k, n in list(self._notifications.items()): if hasattr(n, 'mail') and not (n.mail in all_mails): @@ -412,7 +413,7 @@ def _cleanup_notifications_not_in(self, all_mails) -> None: del self._notifications[k] - def _notify_single(self, new_mails, all_mails): + def _notify_single(self, new_mails: List[Mail], all_mails: List[Mail]) -> None: self._cleanup_notifications_not_in(all_mails) # In single notification mode new mails are @@ -558,25 +559,25 @@ def _is_supported_environment() -> bool: - def _on_close(self, widget): + def _on_close(self, widget: Gtk.Dialog) -> None: logging.debug('on_close') self._dialog.hide() self._dialog.response(Gtk.ResponseType.CLOSE) - def _on_btn_cancel_clicked(self, widget): + def _on_btn_cancel_clicked(self, widget: Gtk.Button) -> None: logging.debug('on_btn_cancel_clicked') self._dialog.hide() self._dialog.response(Gtk.ResponseType.CANCEL) - def _on_btn_ok_clicked(self, widget): + def _on_btn_ok_clicked(self, widget: Gtk.Button) -> None: logging.debug('on_btn_ok_clicked') self._dialog.hide() self._dialog.response(Gtk.ResponseType.OK) - def _on_btn_add_provider_clicked(self, widget): + def _on_btn_add_provider_clicked(self, widget: Gtk.ToolButton) -> None: logging.debug('on_btn_add_provider_clicked') b = self._builder d = self._dialog @@ -600,7 +601,7 @@ def _on_btn_add_provider_clicked(self, widget): self._treeview_2FA_providers.grab_focus() - def _get_selected_provider(self): + def _get_selected_provider(self) -> None: treeselection = self._treeview_2FA_providers.get_selection() selection = treeselection.get_selected() model, iter = selection @@ -614,7 +615,7 @@ def _get_selected_provider(self): return sender, subject, pattern, model, iter - def _show_confirmation_dialog(self, text): + def _show_confirmation_dialog(self, text: str) -> None: message = Gtk.MessageDialog(None, Gtk.DialogFlags.MODAL, Gtk.MessageType.QUESTION, Gtk.ButtonsType.YES_NO, text) resp = message.run() @@ -623,7 +624,7 @@ def _show_confirmation_dialog(self, text): else: return False - def _on_btn_remove_provider_clicked(self, widget): + def _on_btn_remove_provider_clicked(self, widget: Gtk.ToolButton) -> None: logging.debug('on_btn_remove_provider_clicked') sender, subject, pattern, model, iter = self._get_selected_provider() if (iter is None @@ -648,7 +649,7 @@ def _on_btn_remove_provider_clicked(self, widget): model.remove(iter) - def _edit_provider(self): + def _edit_provider(self) -> None: sender, suject, pattern, model, iter = self._get_selected_provider() if iter is None: return @@ -670,19 +671,19 @@ def _edit_provider(self): model.set_value(iter, 3, b.get_object('pattern').get_text()) - def _on_btn_edit_provider_clicked(self, widget): + def _on_btn_edit_provider_clicked(self, widget: Gtk.ToolButton) -> None: logging.debug('on_btn_edit_provider_clicked') self._edit_provider() - def _on_provider_toggled(self, cell, path): + def _on_provider_toggled(self, cell: Gtk.CellRendererToggle, path: Gtk.TreePath) -> None: logging.debug('on_provider_toggled') model = self._liststore_2FA_providers iter = model.get_iter(path) self._liststore_2FA_providers.set_value(iter, 0, not cell.get_active()) - def _on_provider_row_activated(self, view, path, column): + def _on_provider_row_activated(self, view: Gtk.TreeView, path: Gtk.TreePath, column: Gtk.TreeViewColumn) -> None: logging.debug('on_provider_row_activated') From d072701eef2667225b236d590f0ed32c2fd03649 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Auzi?= Date: Sun, 16 Nov 2025 19:30:00 +0100 Subject: [PATCH 21/49] Make libnotifyplugin.ui resource management compliant --- Mailnag/plugins/libnotifyplugin.py | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/Mailnag/plugins/libnotifyplugin.py b/Mailnag/plugins/libnotifyplugin.py index 687470a..c6b3532 100644 --- a/Mailnag/plugins/libnotifyplugin.py +++ b/Mailnag/plugins/libnotifyplugin.py @@ -42,6 +42,8 @@ from Mailnag.common.exceptions import InvalidOperationException from Mailnag.daemon.mails import Mail from Mailnag.common.utils import dbgindent +from mailnagger.resources import get_resource_text +import Mailnag.plugins NOTIFICATION_MODE_COUNT = '0' NOTIFICATION_MODE_SHORT_SUMMARY = '3' @@ -143,10 +145,14 @@ def has_config_ui(self) -> bool: return True def get_config_ui(self) -> Gtk.Box: + libnotifyplugin_ui = get_resource_text( + Mailnag.plugins, + "libnotifyplugin.ui" + ) builder = Gtk.Builder() builder.set_translation_domain(PACKAGE_NAME) - builder.add_from_file( os.path.splitext(__file__)[0]+'.ui') + builder.add_from_string(libnotifyplugin_ui) radio_id_mapping = { NOTIFICATION_MODE_COUNT: 'notification_mode_count', @@ -557,8 +563,6 @@ def _is_supported_environment() -> bool: return False - - def _on_close(self, widget: Gtk.Dialog) -> None: logging.debug('on_close') self._dialog.hide() From b893cd6732fbc2c8770ed9af11e64adc176a6be4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Auzi?= Date: Sun, 16 Nov 2025 19:44:44 +0100 Subject: [PATCH 22/49] Add libnotifyplugin.ui to setup --- setup.py | 3 +++ 1 file changed, 3 insertions(+) mode change 100644 => 100755 setup.py diff --git a/setup.py b/setup.py old mode 100644 new mode 100755 index a149345..522b31e --- a/setup.py +++ b/setup.py @@ -169,6 +169,9 @@ def _add_icon_data(self): 'Mailnag.configuration.desktop': [ 'mailnagger.desktop', ], + 'Mailnag.plugins': [ + 'libnotifyplugin.ui', + ] }, entry_points={ "console_scripts": [ From aa1818f5d97d9b36fe9665ab05e2c63c06398733 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Auzi?= Date: Mon, 17 Nov 2025 19:18:54 +0100 Subject: [PATCH 23/49] Add 2FA provider pattern validity check --- Mailnag/plugins/libnotifyplugin.py | 125 +++++++++++++++++++++-------- 1 file changed, 93 insertions(+), 32 deletions(-) diff --git a/Mailnag/plugins/libnotifyplugin.py b/Mailnag/plugins/libnotifyplugin.py index c6b3532..0f472f0 100644 --- a/Mailnag/plugins/libnotifyplugin.py +++ b/Mailnag/plugins/libnotifyplugin.py @@ -196,13 +196,42 @@ def get_config_ui(self) -> Gtk.Box: return builder.get_object('box1') @staticmethod - def _eval_2fa_providers(providers: list|str) -> list: + def _eval_2fa_providers(providers: list|str) -> list: if isinstance(providers,list): return providers if not isinstance(providers,str): return [] return eval(providers) + @staticmethod + def _check_2fa_provider_pattern(sender: str, subject: str, pattern: str) -> bool: + ret = True + if not '(?P' in pattern: + ret = False + logging.error('missing "code" group pattern: (?P...\n'+ + 'sender: %s, subject: %s\npattern:\n%s', + sender, subject, + pattern) + if ret: + try: + _cre = re.compile(pattern) + except re.PatternError as e: + ret = False + posi = '' + if 'pos' in e.__dict__ and e.pos is not None: + posi = '^' + i = e.pos + while i > 0: + i -= 1 + posi = ' ' + posi + posi = '\n' + posi + logging.error('pattern is incorrect regexp:\n'+ + 'sender: %s, subject: %s\npattern: %s\n%s%s', + sender, subject, e.msg, + pattern, posi) + + return ret + def load_ui_from_config(self, config_ui: Gtk.Widget) -> None: config = self.get_config() @@ -211,6 +240,8 @@ def load_ui_from_config(self, config_ui: Gtk.Widget) -> None: self._switch_2FA_notifications.set_active(config['2fa_notifications']) providers = self._eval_2fa_providers(config['2fa_providers']) for (_enabled, _sender, _subject, _pattern) in providers: + if _enabled and not self._check_2fa_provider_pattern(_sender, _subject, _pattern): + _enabled = False self._liststore_2FA_providers.append([_enabled, _sender, _subject, _pattern]) @@ -593,10 +624,16 @@ def _on_btn_add_provider_clicked(self, widget: Gtk.ToolButton) -> None: if d.run() != Gtk.ResponseType.OK: return - row = [b.get_object('enable').get_active(), - b.get_object('sender').get_text(), - b.get_object('subject').get_text(), - b.get_object('pattern').get_text()] + + _enable = b.get_object('enable').get_active() + _sender = b.get_object('sender').get_text() + _subject = b.get_object('subject').get_text() + _pattern = b.get_object('pattern').get_text() + + if not self._check_2fa_provider_pattern(_sender, _subject, _pattern) and _enabled: + _enabled = False + + row = [_enable, _sender, _subject, _pattern] iter = self._liststore_2FA_providers.append(row) model = self._treeview_2FA_providers.get_model() @@ -607,16 +644,7 @@ def _on_btn_add_provider_clicked(self, widget: Gtk.ToolButton) -> None: def _get_selected_provider(self) -> None: treeselection = self._treeview_2FA_providers.get_selection() - selection = treeselection.get_selected() - model, iter = selection - sender = None - subject = None - pattern = None - if iter != None: - sender = model.get_value(iter, 1) - subject = model.get_value(iter, 2) - pattern = model.get_value(iter, 3) - return sender, subject, pattern, model, iter + return treeselection.get_selected() def _show_confirmation_dialog(self, text: str) -> None: @@ -630,14 +658,23 @@ def _show_confirmation_dialog(self, text: str) -> None: def _on_btn_remove_provider_clicked(self, widget: Gtk.ToolButton) -> None: logging.debug('on_btn_remove_provider_clicked') - sender, subject, pattern, model, iter = self._get_selected_provider() - if (iter is None - or not self._show_confirmation_dialog( + + treeselection = self._treeview_2FA_providers.get_selection() + model, iter = treeselection.get_selected() + + if iter is None: + return + + _sender = model.get_value(iter, 1) + _subject = model.get_value(iter, 2) + _pattern = model.get_value(iter, 3) + + if not self._show_confirmation_dialog( _('Delete this provider:') + '\n' + - '\n' + _("Sender:") + sender + - '\n' + _("Subject:") + subject + - '\n' + _("Pattern:") + - '\n' + pattern)): + '\n ' + _("Sender:") + _sender + + '\n ' + _("Subject:") + _subject + + '\n ' + _("Pattern:") + + '\n ' + _pattern): return # select prev/next account @@ -654,25 +691,40 @@ def _on_btn_remove_provider_clicked(self, widget: Gtk.ToolButton) -> None: def _edit_provider(self) -> None: - sender, suject, pattern, model, iter = self._get_selected_provider() + treeselection = self._treeview_2FA_providers.get_selection() + model, iter = treeselection.get_selected() + if iter is None: return + _enabled = model.get_value(iter, 0) + _sender = model.get_value(iter, 1) + _subject = model.get_value(iter, 2) + _pattern = model.get_value(iter, 3) + b = self._builder d = self._dialog - b.get_object('enable').set_active(model.get_value(iter, 0)) - b.get_object('sender').set_text(model.get_value(iter, 1)) - b.get_object('subject').set_text(model.get_value(iter, 2)) - b.get_object('pattern').set_text(model.get_value(iter, 3)) + b.get_object('enable').set_active(_enabled) + b.get_object('sender').set_text(_sender) + b.get_object('subject').set_text(_subject) + b.get_object('pattern').set_text(_pattern) if d.run() != Gtk.ResponseType.OK: return - model.set_value(iter, 0, b.get_object('enable').get_active()) - model.set_value(iter, 1, b.get_object('sender').get_text()) - model.set_value(iter, 2, b.get_object('subject').get_text()) - model.set_value(iter, 3, b.get_object('pattern').get_text()) + _enabled = b.get_object('enable').get_active() + _sender = b.get_object('sender').get_text() + _subject = b.get_object('subject').get_text() + _pattern = b.get_object('pattern').get_text() + + if not self._check_2fa_provider_pattern(_sender, _subject, _pattern) and _enabled: + _enabled = False + + model.set_value(iter, 0, _enabled) + model.set_value(iter, 1, _sender) + model.set_value(iter, 2, _subject) + model.set_value(iter, 3, _pattern) def _on_btn_edit_provider_clicked(self, widget: Gtk.ToolButton) -> None: @@ -684,7 +736,16 @@ def _on_provider_toggled(self, cell: Gtk.CellRendererToggle, path: Gtk.TreePath) logging.debug('on_provider_toggled') model = self._liststore_2FA_providers iter = model.get_iter(path) - self._liststore_2FA_providers.set_value(iter, 0, not cell.get_active()) + + _enabled = not model.get_value(iter, 0) + _sender = model.get_value(iter, 1) + _subject = model.get_value(iter, 2) + _pattern = model.get_value(iter, 3) + + if _enabled and not self._check_2fa_provider_pattern(_sender, _subject, _pattern): + return + + self._liststore_2FA_providers.set_value(iter, 0, _enabled) def _on_provider_row_activated(self, view: Gtk.TreeView, path: Gtk.TreePath, column: Gtk.TreeViewColumn) -> None: From 85836c8f7e466931a4a40ca1fe5550798f937e28 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Auzi?= Date: Mon, 17 Nov 2025 21:03:25 +0100 Subject: [PATCH 24/49] Cosmetic update --- Mailnag/plugins/libnotifyplugin.py | 4 ++++ Mailnag/plugins/libnotifyplugin.ui | 18 ++++++++++++++---- 2 files changed, 18 insertions(+), 4 deletions(-) diff --git a/Mailnag/plugins/libnotifyplugin.py b/Mailnag/plugins/libnotifyplugin.py index 0f472f0..1b44a67 100644 --- a/Mailnag/plugins/libnotifyplugin.py +++ b/Mailnag/plugins/libnotifyplugin.py @@ -175,6 +175,8 @@ def get_config_ui(self) -> Gtk.Box: label = builder.get_object('notification_modes') label.set_markup('%s' % _('Notification mode:')) + label = builder.get_object('2fa_providers') + label.set_markup('%s' % _('2FA providers')) builder.connect_signals({ 'close': self._on_close, @@ -750,6 +752,8 @@ def _on_provider_toggled(self, cell: Gtk.CellRendererToggle, path: Gtk.TreePath) def _on_provider_row_activated(self, view: Gtk.TreeView, path: Gtk.TreePath, column: Gtk.TreeViewColumn) -> None: logging.debug('on_provider_row_activated') + for id in ('btn_remove_2FA_provider', 'btn_edit_2FA_provider'): + self._builder.get_object(id).set_sensitive(True) def ellipsize(str: str, max_len: int) -> str: diff --git a/Mailnag/plugins/libnotifyplugin.ui b/Mailnag/plugins/libnotifyplugin.ui index 119cc0a..e70a2c2 100644 --- a/Mailnag/plugins/libnotifyplugin.ui +++ b/Mailnag/plugins/libnotifyplugin.ui @@ -3,6 +3,7 @@ + 480 False True True @@ -12,6 +13,8 @@ False + 6 + 6 12 True True @@ -67,6 +70,8 @@ False 12 12 + 11 + 6 True @@ -147,8 +152,8 @@ True 24 6 - 24 - 6 + 36 + 6 True True Pattern @@ -211,6 +216,7 @@ + 480 True False vertical @@ -316,6 +322,7 @@ + -1 True False True @@ -433,6 +440,7 @@ True + False False Remove 2FA Provider list-remove-symbolic @@ -446,6 +454,7 @@ True + False False Edit 2FA Provider text-editor-symbolic @@ -508,9 +517,10 @@ - + False - 2FA providers + <b>2FA providers</b> + True From 92556319778c58c926d66e3dcb98201841ebfe21 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Auzi?= Date: Mon, 17 Nov 2025 21:09:57 +0100 Subject: [PATCH 25/49] Update translations (fr only) --- po/bg.po | 52 +++++++++++++++++++++++------------------------ po/ca.po | 52 +++++++++++++++++++++++------------------------ po/cs.po | 52 +++++++++++++++++++++++------------------------ po/de.po | 52 +++++++++++++++++++++++------------------------ po/es.po | 52 +++++++++++++++++++++++------------------------ po/fi.po | 52 +++++++++++++++++++++++------------------------ po/fr.po | 52 +++++++++++++++++++++++------------------------ po/gl.po | 52 +++++++++++++++++++++++------------------------ po/hr.po | 52 +++++++++++++++++++++++------------------------ po/id.po | 52 +++++++++++++++++++++++------------------------ po/it.po | 52 +++++++++++++++++++++++------------------------ po/mailnagger.pot | 52 +++++++++++++++++++++++------------------------ po/pl.po | 52 +++++++++++++++++++++++------------------------ po/pt.po | 52 +++++++++++++++++++++++------------------------ po/pt_BR.po | 52 +++++++++++++++++++++++------------------------ po/ru.po | 52 +++++++++++++++++++++++------------------------ po/sr.po | 52 +++++++++++++++++++++++------------------------ po/sv.po | 52 +++++++++++++++++++++++------------------------ po/tr.po | 52 +++++++++++++++++++++++------------------------ po/uk.po | 52 +++++++++++++++++++++++------------------------ po/zh_CN.po | 52 +++++++++++++++++++++++------------------------ po/zh_TW.po | 52 +++++++++++++++++++++++------------------------ 22 files changed, 572 insertions(+), 572 deletions(-) diff --git a/po/bg.po b/po/bg.po index 34c60fd..a9989bc 100644 --- a/po/bg.po +++ b/po/bg.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: mailnag\n" "Report-Msgid-Bugs-To: https://github.com/tikank/mailnagger/issues\n" -"POT-Creation-Date: 2025-11-16 17:15+0100\n" +"POT-Creation-Date: 2025-11-17 21:03+0100\n" "PO-Revision-Date: 2019-03-16 14:48+0000\n" "Last-Translator: Launchpad Translations Administrators \n" "Language-Team: Bulgarian \n" @@ -131,79 +131,83 @@ msgstr "" "Mailnag ще предава общия брой имейли на този скрипт,\n" "последвано от %s поредици." -#: Mailnag/plugins/libnotifyplugin.py:61 +#: Mailnag/plugins/libnotifyplugin.py:64 msgid "Your Security Passcode" msgstr "" -#: Mailnag/plugins/libnotifyplugin.py:131 +#: Mailnag/plugins/libnotifyplugin.py:134 msgid "LibNotify Notifications" msgstr "LibNotify известия" -#: Mailnag/plugins/libnotifyplugin.py:132 +#: Mailnag/plugins/libnotifyplugin.py:135 msgid "Shows a popup when new mails arrive." msgstr "Показва изкачащ прозорец при пристигане на имейл." -#: Mailnag/plugins/libnotifyplugin.py:168 +#: Mailnag/plugins/libnotifyplugin.py:177 msgid "Notification mode:" msgstr "Режим на известяване:" -#: Mailnag/plugins/libnotifyplugin.py:280 -#: Mailnag/plugins/libnotifyplugin.py:316 -#: Mailnag/plugins/libnotifyplugin.py:445 +#: Mailnag/plugins/libnotifyplugin.py:179 +msgid "2FA providers" +msgstr "" + +#: Mailnag/plugins/libnotifyplugin.py:322 +#: Mailnag/plugins/libnotifyplugin.py:358 +#: Mailnag/plugins/libnotifyplugin.py:487 #, python-brace-format msgid "{0} new mails" msgstr "{0} нови писма" -#: Mailnag/plugins/libnotifyplugin.py:282 +#: Mailnag/plugins/libnotifyplugin.py:324 #, python-brace-format msgid "from {0} and others." msgstr "от {0} и други." -#: Mailnag/plugins/libnotifyplugin.py:284 -#: Mailnag/plugins/libnotifyplugin.py:287 +#: Mailnag/plugins/libnotifyplugin.py:326 +#: Mailnag/plugins/libnotifyplugin.py:329 #, python-brace-format msgid "from {0}." msgstr "от {0}." -#: Mailnag/plugins/libnotifyplugin.py:286 -#: Mailnag/plugins/libnotifyplugin.py:318 -#: Mailnag/plugins/libnotifyplugin.py:447 +#: Mailnag/plugins/libnotifyplugin.py:328 +#: Mailnag/plugins/libnotifyplugin.py:360 +#: Mailnag/plugins/libnotifyplugin.py:489 msgid "New mail" msgstr "Ново писмо" -#: Mailnag/plugins/libnotifyplugin.py:311 -#: Mailnag/plugins/libnotifyplugin.py:313 +#: Mailnag/plugins/libnotifyplugin.py:353 +#: Mailnag/plugins/libnotifyplugin.py:355 #, python-brace-format msgid "(and {0} more)" msgstr "( и {0} други)" -#: Mailnag/plugins/libnotifyplugin.py:390 +#: Mailnag/plugins/libnotifyplugin.py:432 #, python-brace-format msgid "📋 Code: {0}" msgstr "" -#: Mailnag/plugins/libnotifyplugin.py:434 +#: Mailnag/plugins/libnotifyplugin.py:476 msgid "Mark as read" msgstr "Отбележи като прочетено" -#: Mailnag/plugins/libnotifyplugin.py:629 +#: Mailnag/plugins/libnotifyplugin.py:675 #, fuzzy msgid "Delete this provider:" msgstr "Изтриване на акаунта:" -#: Mailnag/plugins/libnotifyplugin.py:630 +#: Mailnag/plugins/libnotifyplugin.py:676 #: Mailnag/plugins/libnotifyplugin.ui.h:1 #, fuzzy msgid "Sender:" msgstr "изпращач" -#: Mailnag/plugins/libnotifyplugin.py:631 +#: Mailnag/plugins/libnotifyplugin.py:677 #: Mailnag/plugins/libnotifyplugin.ui.h:3 #, fuzzy msgid "Subject:" msgstr "тема" -#: Mailnag/plugins/libnotifyplugin.py:632 +#: Mailnag/plugins/libnotifyplugin.py:678 #: Mailnag/plugins/libnotifyplugin.ui.h:5 msgid "Pattern:" msgstr "" @@ -380,10 +384,6 @@ msgstr "Звукови известия" msgid "Enable/disable libnotify 2FA processing" msgstr "" -#: Mailnag/plugins/libnotifyplugin.ui.h:20 -msgid "2FA providers" -msgstr "" - #, fuzzy #~ msgid "Garmin 2FA LibNotify Notifications" #~ msgstr "LibNotify известия" diff --git a/po/ca.po b/po/ca.po index f0c188a..d50515a 100644 --- a/po/ca.po +++ b/po/ca.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: mailnag\n" "Report-Msgid-Bugs-To: https://github.com/tikank/mailnagger/issues\n" -"POT-Creation-Date: 2025-11-16 17:15+0100\n" +"POT-Creation-Date: 2025-11-17 21:03+0100\n" "PO-Revision-Date: 2020-04-05 12:44+0000\n" "Last-Translator: Marc Riera Irigoyen \n" "Language-Team: Catalan \n" @@ -131,79 +131,83 @@ msgstr "" "El Mailnag passa el nombre total de correus nous a aquest script,\n" "seguit de seqüències %s." -#: Mailnag/plugins/libnotifyplugin.py:61 +#: Mailnag/plugins/libnotifyplugin.py:64 msgid "Your Security Passcode" msgstr "" -#: Mailnag/plugins/libnotifyplugin.py:131 +#: Mailnag/plugins/libnotifyplugin.py:134 msgid "LibNotify Notifications" msgstr "Notificacions del LibNotify" -#: Mailnag/plugins/libnotifyplugin.py:132 +#: Mailnag/plugins/libnotifyplugin.py:135 msgid "Shows a popup when new mails arrive." msgstr "Mostra una finestra emergent quan arriben correus nous." -#: Mailnag/plugins/libnotifyplugin.py:168 +#: Mailnag/plugins/libnotifyplugin.py:177 msgid "Notification mode:" msgstr "Mode de notificació:" -#: Mailnag/plugins/libnotifyplugin.py:280 -#: Mailnag/plugins/libnotifyplugin.py:316 -#: Mailnag/plugins/libnotifyplugin.py:445 +#: Mailnag/plugins/libnotifyplugin.py:179 +msgid "2FA providers" +msgstr "" + +#: Mailnag/plugins/libnotifyplugin.py:322 +#: Mailnag/plugins/libnotifyplugin.py:358 +#: Mailnag/plugins/libnotifyplugin.py:487 #, python-brace-format msgid "{0} new mails" msgstr "{0} correus nous" -#: Mailnag/plugins/libnotifyplugin.py:282 +#: Mailnag/plugins/libnotifyplugin.py:324 #, python-brace-format msgid "from {0} and others." msgstr "de {0} i altres." -#: Mailnag/plugins/libnotifyplugin.py:284 -#: Mailnag/plugins/libnotifyplugin.py:287 +#: Mailnag/plugins/libnotifyplugin.py:326 +#: Mailnag/plugins/libnotifyplugin.py:329 #, python-brace-format msgid "from {0}." msgstr "de {0}." -#: Mailnag/plugins/libnotifyplugin.py:286 -#: Mailnag/plugins/libnotifyplugin.py:318 -#: Mailnag/plugins/libnotifyplugin.py:447 +#: Mailnag/plugins/libnotifyplugin.py:328 +#: Mailnag/plugins/libnotifyplugin.py:360 +#: Mailnag/plugins/libnotifyplugin.py:489 msgid "New mail" msgstr "Correu nou" -#: Mailnag/plugins/libnotifyplugin.py:311 -#: Mailnag/plugins/libnotifyplugin.py:313 +#: Mailnag/plugins/libnotifyplugin.py:353 +#: Mailnag/plugins/libnotifyplugin.py:355 #, python-brace-format msgid "(and {0} more)" msgstr "(i {0} més)" -#: Mailnag/plugins/libnotifyplugin.py:390 +#: Mailnag/plugins/libnotifyplugin.py:432 #, python-brace-format msgid "📋 Code: {0}" msgstr "" -#: Mailnag/plugins/libnotifyplugin.py:434 +#: Mailnag/plugins/libnotifyplugin.py:476 msgid "Mark as read" msgstr "Marca com a llegit" -#: Mailnag/plugins/libnotifyplugin.py:629 +#: Mailnag/plugins/libnotifyplugin.py:675 #, fuzzy msgid "Delete this provider:" msgstr "Suprimeix aquest compte:" -#: Mailnag/plugins/libnotifyplugin.py:630 +#: Mailnag/plugins/libnotifyplugin.py:676 #: Mailnag/plugins/libnotifyplugin.ui.h:1 #, fuzzy msgid "Sender:" msgstr "remitent" -#: Mailnag/plugins/libnotifyplugin.py:631 +#: Mailnag/plugins/libnotifyplugin.py:677 #: Mailnag/plugins/libnotifyplugin.ui.h:3 #, fuzzy msgid "Subject:" msgstr "assumpte" -#: Mailnag/plugins/libnotifyplugin.py:632 +#: Mailnag/plugins/libnotifyplugin.py:678 #: Mailnag/plugins/libnotifyplugin.ui.h:5 msgid "Pattern:" msgstr "" @@ -381,10 +385,6 @@ msgstr "Notificacions sonores" msgid "Enable/disable libnotify 2FA processing" msgstr "" -#: Mailnag/plugins/libnotifyplugin.ui.h:20 -msgid "2FA providers" -msgstr "" - #, fuzzy #~ msgid "Garmin 2FA LibNotify Notifications" #~ msgstr "Notificacions del LibNotify" diff --git a/po/cs.po b/po/cs.po index 769fdd1..6cd4f4d 100644 --- a/po/cs.po +++ b/po/cs.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: mailnag\n" "Report-Msgid-Bugs-To: https://github.com/tikank/mailnagger/issues\n" -"POT-Creation-Date: 2025-11-16 17:15+0100\n" +"POT-Creation-Date: 2025-11-17 21:03+0100\n" "PO-Revision-Date: 2019-03-16 14:48+0000\n" "Last-Translator: Launchpad Translations Administrators \n" "Language-Team: Czech \n" @@ -133,79 +133,83 @@ msgstr "" "Mailnag předá celkové počet nových e-mailů tomuto skriptu,\n" "následovaný %s sekvencemi." -#: Mailnag/plugins/libnotifyplugin.py:61 +#: Mailnag/plugins/libnotifyplugin.py:64 msgid "Your Security Passcode" msgstr "" -#: Mailnag/plugins/libnotifyplugin.py:131 +#: Mailnag/plugins/libnotifyplugin.py:134 msgid "LibNotify Notifications" msgstr "LibNotify notifikace" -#: Mailnag/plugins/libnotifyplugin.py:132 +#: Mailnag/plugins/libnotifyplugin.py:135 msgid "Shows a popup when new mails arrive." msgstr "Zobrazí popup okno při novém e-mailu." -#: Mailnag/plugins/libnotifyplugin.py:168 +#: Mailnag/plugins/libnotifyplugin.py:177 msgid "Notification mode:" msgstr "Notifikační mód:" -#: Mailnag/plugins/libnotifyplugin.py:280 -#: Mailnag/plugins/libnotifyplugin.py:316 -#: Mailnag/plugins/libnotifyplugin.py:445 +#: Mailnag/plugins/libnotifyplugin.py:179 +msgid "2FA providers" +msgstr "" + +#: Mailnag/plugins/libnotifyplugin.py:322 +#: Mailnag/plugins/libnotifyplugin.py:358 +#: Mailnag/plugins/libnotifyplugin.py:487 #, python-brace-format msgid "{0} new mails" msgstr "{0} nových e-mailů" -#: Mailnag/plugins/libnotifyplugin.py:282 +#: Mailnag/plugins/libnotifyplugin.py:324 #, python-brace-format msgid "from {0} and others." msgstr "z {0} a další." -#: Mailnag/plugins/libnotifyplugin.py:284 -#: Mailnag/plugins/libnotifyplugin.py:287 +#: Mailnag/plugins/libnotifyplugin.py:326 +#: Mailnag/plugins/libnotifyplugin.py:329 #, python-brace-format msgid "from {0}." msgstr "z {0}." -#: Mailnag/plugins/libnotifyplugin.py:286 -#: Mailnag/plugins/libnotifyplugin.py:318 -#: Mailnag/plugins/libnotifyplugin.py:447 +#: Mailnag/plugins/libnotifyplugin.py:328 +#: Mailnag/plugins/libnotifyplugin.py:360 +#: Mailnag/plugins/libnotifyplugin.py:489 msgid "New mail" msgstr "Nový mail" -#: Mailnag/plugins/libnotifyplugin.py:311 -#: Mailnag/plugins/libnotifyplugin.py:313 +#: Mailnag/plugins/libnotifyplugin.py:353 +#: Mailnag/plugins/libnotifyplugin.py:355 #, python-brace-format msgid "(and {0} more)" msgstr "(a {0} dalších)" -#: Mailnag/plugins/libnotifyplugin.py:390 +#: Mailnag/plugins/libnotifyplugin.py:432 #, python-brace-format msgid "📋 Code: {0}" msgstr "" -#: Mailnag/plugins/libnotifyplugin.py:434 +#: Mailnag/plugins/libnotifyplugin.py:476 msgid "Mark as read" msgstr "Označit jako přečtený" -#: Mailnag/plugins/libnotifyplugin.py:629 +#: Mailnag/plugins/libnotifyplugin.py:675 #, fuzzy msgid "Delete this provider:" msgstr "Odstranit tento účet:" -#: Mailnag/plugins/libnotifyplugin.py:630 +#: Mailnag/plugins/libnotifyplugin.py:676 #: Mailnag/plugins/libnotifyplugin.ui.h:1 #, fuzzy msgid "Sender:" msgstr "odesílatel" -#: Mailnag/plugins/libnotifyplugin.py:631 +#: Mailnag/plugins/libnotifyplugin.py:677 #: Mailnag/plugins/libnotifyplugin.ui.h:3 #, fuzzy msgid "Subject:" msgstr "předmět" -#: Mailnag/plugins/libnotifyplugin.py:632 +#: Mailnag/plugins/libnotifyplugin.py:678 #: Mailnag/plugins/libnotifyplugin.ui.h:5 msgid "Pattern:" msgstr "" @@ -382,10 +386,6 @@ msgstr "Zvukové notifikace" msgid "Enable/disable libnotify 2FA processing" msgstr "" -#: Mailnag/plugins/libnotifyplugin.ui.h:20 -msgid "2FA providers" -msgstr "" - #, fuzzy #~ msgid "Garmin 2FA LibNotify Notifications" #~ msgstr "LibNotify notifikace" diff --git a/po/de.po b/po/de.po index 5e8b77d..22d97a7 100644 --- a/po/de.po +++ b/po/de.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: mailnag\n" "Report-Msgid-Bugs-To: https://github.com/tikank/mailnagger/issues\n" -"POT-Creation-Date: 2025-11-16 17:15+0100\n" +"POT-Creation-Date: 2025-11-17 21:03+0100\n" "PO-Revision-Date: 2020-10-24 19:26+0000\n" "Last-Translator: J. Lavoie \n" "Language-Team: German \n" "Language-Team: Spanish \n" "Language-Team: \n" @@ -129,79 +129,83 @@ msgstr "" "Mailnagger välittää skriptille uusien postien kokonaismäärän\n" "ja sen perään %s-sarjan." -#: Mailnag/plugins/libnotifyplugin.py:61 +#: Mailnag/plugins/libnotifyplugin.py:64 msgid "Your Security Passcode" msgstr "" -#: Mailnag/plugins/libnotifyplugin.py:131 +#: Mailnag/plugins/libnotifyplugin.py:134 msgid "LibNotify Notifications" msgstr "LibNotify-huomautin" -#: Mailnag/plugins/libnotifyplugin.py:132 +#: Mailnag/plugins/libnotifyplugin.py:135 msgid "Shows a popup when new mails arrive." msgstr "Näyttää huomautuksen, kun uusi sähköposti saapuu." -#: Mailnag/plugins/libnotifyplugin.py:168 +#: Mailnag/plugins/libnotifyplugin.py:177 msgid "Notification mode:" msgstr "Huomautusvalinta:" -#: Mailnag/plugins/libnotifyplugin.py:280 -#: Mailnag/plugins/libnotifyplugin.py:316 -#: Mailnag/plugins/libnotifyplugin.py:445 +#: Mailnag/plugins/libnotifyplugin.py:179 +msgid "2FA providers" +msgstr "" + +#: Mailnag/plugins/libnotifyplugin.py:322 +#: Mailnag/plugins/libnotifyplugin.py:358 +#: Mailnag/plugins/libnotifyplugin.py:487 #, python-brace-format msgid "{0} new mails" msgstr "{0} uutta sähköpostia" -#: Mailnag/plugins/libnotifyplugin.py:282 +#: Mailnag/plugins/libnotifyplugin.py:324 #, python-brace-format msgid "from {0} and others." msgstr "lähettäjältä {0} ja muilta." -#: Mailnag/plugins/libnotifyplugin.py:284 -#: Mailnag/plugins/libnotifyplugin.py:287 +#: Mailnag/plugins/libnotifyplugin.py:326 +#: Mailnag/plugins/libnotifyplugin.py:329 #, python-brace-format msgid "from {0}." msgstr "lähettäjältä {0}." -#: Mailnag/plugins/libnotifyplugin.py:286 -#: Mailnag/plugins/libnotifyplugin.py:318 -#: Mailnag/plugins/libnotifyplugin.py:447 +#: Mailnag/plugins/libnotifyplugin.py:328 +#: Mailnag/plugins/libnotifyplugin.py:360 +#: Mailnag/plugins/libnotifyplugin.py:489 msgid "New mail" msgstr "Uusi sähköposti" -#: Mailnag/plugins/libnotifyplugin.py:311 -#: Mailnag/plugins/libnotifyplugin.py:313 +#: Mailnag/plugins/libnotifyplugin.py:353 +#: Mailnag/plugins/libnotifyplugin.py:355 #, python-brace-format msgid "(and {0} more)" msgstr "(ja {0} muuta)" -#: Mailnag/plugins/libnotifyplugin.py:390 +#: Mailnag/plugins/libnotifyplugin.py:432 #, python-brace-format msgid "📋 Code: {0}" msgstr "" -#: Mailnag/plugins/libnotifyplugin.py:434 +#: Mailnag/plugins/libnotifyplugin.py:476 msgid "Mark as read" msgstr "Merkitse luetuksi" -#: Mailnag/plugins/libnotifyplugin.py:629 +#: Mailnag/plugins/libnotifyplugin.py:675 #, fuzzy msgid "Delete this provider:" msgstr "Poista tämä tili:" -#: Mailnag/plugins/libnotifyplugin.py:630 +#: Mailnag/plugins/libnotifyplugin.py:676 #: Mailnag/plugins/libnotifyplugin.ui.h:1 #, fuzzy msgid "Sender:" msgstr "lähettäjä" -#: Mailnag/plugins/libnotifyplugin.py:631 +#: Mailnag/plugins/libnotifyplugin.py:677 #: Mailnag/plugins/libnotifyplugin.ui.h:3 #, fuzzy msgid "Subject:" msgstr "otsikko" -#: Mailnag/plugins/libnotifyplugin.py:632 +#: Mailnag/plugins/libnotifyplugin.py:678 #: Mailnag/plugins/libnotifyplugin.ui.h:5 msgid "Pattern:" msgstr "" @@ -379,10 +383,6 @@ msgstr "Äänimerkki" msgid "Enable/disable libnotify 2FA processing" msgstr "" -#: Mailnag/plugins/libnotifyplugin.ui.h:20 -msgid "2FA providers" -msgstr "" - #, fuzzy #~ msgid "Garmin 2FA LibNotify Notifications" #~ msgstr "LibNotify-huomautin" diff --git a/po/fr.po b/po/fr.po index f072825..0ff60a8 100644 --- a/po/fr.po +++ b/po/fr.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: mailnag\n" "Report-Msgid-Bugs-To: https://github.com/tikank/mailnagger/issues\n" -"POT-Creation-Date: 2025-11-16 17:15+0100\n" +"POT-Creation-Date: 2025-11-17 21:03+0100\n" "PO-Revision-Date: 2020-10-15 17:26+0000\n" "Last-Translator: J. Lavoie \n" "Language-Team: French \n" "Language-Team: Galician \n" @@ -130,79 +130,83 @@ msgid "" "followed by %s sequences." msgstr "" -#: Mailnag/plugins/libnotifyplugin.py:61 +#: Mailnag/plugins/libnotifyplugin.py:64 msgid "Your Security Passcode" msgstr "" -#: Mailnag/plugins/libnotifyplugin.py:131 +#: Mailnag/plugins/libnotifyplugin.py:134 msgid "LibNotify Notifications" msgstr "Notificacións LibNotify" -#: Mailnag/plugins/libnotifyplugin.py:132 +#: Mailnag/plugins/libnotifyplugin.py:135 msgid "Shows a popup when new mails arrive." msgstr "Mostra unha xanela emerxente ao recibir correos novos." -#: Mailnag/plugins/libnotifyplugin.py:168 +#: Mailnag/plugins/libnotifyplugin.py:177 msgid "Notification mode:" msgstr "Modo Notificación:" -#: Mailnag/plugins/libnotifyplugin.py:280 -#: Mailnag/plugins/libnotifyplugin.py:316 -#: Mailnag/plugins/libnotifyplugin.py:445 +#: Mailnag/plugins/libnotifyplugin.py:179 +msgid "2FA providers" +msgstr "" + +#: Mailnag/plugins/libnotifyplugin.py:322 +#: Mailnag/plugins/libnotifyplugin.py:358 +#: Mailnag/plugins/libnotifyplugin.py:487 #, python-brace-format msgid "{0} new mails" msgstr "{0} novos correos" -#: Mailnag/plugins/libnotifyplugin.py:282 +#: Mailnag/plugins/libnotifyplugin.py:324 #, python-brace-format msgid "from {0} and others." msgstr "" -#: Mailnag/plugins/libnotifyplugin.py:284 -#: Mailnag/plugins/libnotifyplugin.py:287 +#: Mailnag/plugins/libnotifyplugin.py:326 +#: Mailnag/plugins/libnotifyplugin.py:329 #, python-brace-format msgid "from {0}." msgstr "" -#: Mailnag/plugins/libnotifyplugin.py:286 -#: Mailnag/plugins/libnotifyplugin.py:318 -#: Mailnag/plugins/libnotifyplugin.py:447 +#: Mailnag/plugins/libnotifyplugin.py:328 +#: Mailnag/plugins/libnotifyplugin.py:360 +#: Mailnag/plugins/libnotifyplugin.py:489 msgid "New mail" msgstr "Correo novo" -#: Mailnag/plugins/libnotifyplugin.py:311 -#: Mailnag/plugins/libnotifyplugin.py:313 +#: Mailnag/plugins/libnotifyplugin.py:353 +#: Mailnag/plugins/libnotifyplugin.py:355 #, python-brace-format msgid "(and {0} more)" msgstr "(e {0} máis)" -#: Mailnag/plugins/libnotifyplugin.py:390 +#: Mailnag/plugins/libnotifyplugin.py:432 #, python-brace-format msgid "📋 Code: {0}" msgstr "" -#: Mailnag/plugins/libnotifyplugin.py:434 +#: Mailnag/plugins/libnotifyplugin.py:476 msgid "Mark as read" msgstr "Marcar como lido" -#: Mailnag/plugins/libnotifyplugin.py:629 +#: Mailnag/plugins/libnotifyplugin.py:675 #, fuzzy msgid "Delete this provider:" msgstr "Eliminar esta conta:" -#: Mailnag/plugins/libnotifyplugin.py:630 +#: Mailnag/plugins/libnotifyplugin.py:676 #: Mailnag/plugins/libnotifyplugin.ui.h:1 #, fuzzy msgid "Sender:" msgstr "remitente" -#: Mailnag/plugins/libnotifyplugin.py:631 +#: Mailnag/plugins/libnotifyplugin.py:677 #: Mailnag/plugins/libnotifyplugin.ui.h:3 #, fuzzy msgid "Subject:" msgstr "asunto" -#: Mailnag/plugins/libnotifyplugin.py:632 +#: Mailnag/plugins/libnotifyplugin.py:678 #: Mailnag/plugins/libnotifyplugin.ui.h:5 msgid "Pattern:" msgstr "" @@ -379,10 +383,6 @@ msgstr "Notificacións con son" msgid "Enable/disable libnotify 2FA processing" msgstr "" -#: Mailnag/plugins/libnotifyplugin.ui.h:20 -msgid "2FA providers" -msgstr "" - #, fuzzy #~ msgid "Garmin 2FA LibNotify Notifications" #~ msgstr "Notificacións LibNotify" diff --git a/po/hr.po b/po/hr.po index ef8d5be..3b81846 100644 --- a/po/hr.po +++ b/po/hr.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: mailnag\n" "Report-Msgid-Bugs-To: https://github.com/tikank/mailnagger/issues\n" -"POT-Creation-Date: 2025-11-16 17:15+0100\n" +"POT-Creation-Date: 2025-11-17 21:03+0100\n" "PO-Revision-Date: 2021-01-18 00:35+0000\n" "Last-Translator: Milo Ivir \n" "Language-Team: Croatian \n" "Language-Team: Indonesian \n" @@ -128,79 +128,83 @@ msgid "" "followed by %s sequences." msgstr "" -#: Mailnag/plugins/libnotifyplugin.py:61 +#: Mailnag/plugins/libnotifyplugin.py:64 msgid "Your Security Passcode" msgstr "" -#: Mailnag/plugins/libnotifyplugin.py:131 +#: Mailnag/plugins/libnotifyplugin.py:134 msgid "LibNotify Notifications" msgstr "Notifikasi LibNotify" -#: Mailnag/plugins/libnotifyplugin.py:132 +#: Mailnag/plugins/libnotifyplugin.py:135 msgid "Shows a popup when new mails arrive." msgstr "Tampilkan jendela munculan ketika surat baru datang." -#: Mailnag/plugins/libnotifyplugin.py:168 +#: Mailnag/plugins/libnotifyplugin.py:177 msgid "Notification mode:" msgstr "Mode notifikasi:" -#: Mailnag/plugins/libnotifyplugin.py:280 -#: Mailnag/plugins/libnotifyplugin.py:316 -#: Mailnag/plugins/libnotifyplugin.py:445 +#: Mailnag/plugins/libnotifyplugin.py:179 +msgid "2FA providers" +msgstr "" + +#: Mailnag/plugins/libnotifyplugin.py:322 +#: Mailnag/plugins/libnotifyplugin.py:358 +#: Mailnag/plugins/libnotifyplugin.py:487 #, python-brace-format msgid "{0} new mails" msgstr "{0} surat baru" -#: Mailnag/plugins/libnotifyplugin.py:282 +#: Mailnag/plugins/libnotifyplugin.py:324 #, python-brace-format msgid "from {0} and others." msgstr "dari {0} dan lainnya." -#: Mailnag/plugins/libnotifyplugin.py:284 -#: Mailnag/plugins/libnotifyplugin.py:287 +#: Mailnag/plugins/libnotifyplugin.py:326 +#: Mailnag/plugins/libnotifyplugin.py:329 #, python-brace-format msgid "from {0}." msgstr "dari {0}." -#: Mailnag/plugins/libnotifyplugin.py:286 -#: Mailnag/plugins/libnotifyplugin.py:318 -#: Mailnag/plugins/libnotifyplugin.py:447 +#: Mailnag/plugins/libnotifyplugin.py:328 +#: Mailnag/plugins/libnotifyplugin.py:360 +#: Mailnag/plugins/libnotifyplugin.py:489 msgid "New mail" msgstr "Surat baru" -#: Mailnag/plugins/libnotifyplugin.py:311 -#: Mailnag/plugins/libnotifyplugin.py:313 +#: Mailnag/plugins/libnotifyplugin.py:353 +#: Mailnag/plugins/libnotifyplugin.py:355 #, python-brace-format msgid "(and {0} more)" msgstr "(dan {0} lainnya)" -#: Mailnag/plugins/libnotifyplugin.py:390 +#: Mailnag/plugins/libnotifyplugin.py:432 #, python-brace-format msgid "📋 Code: {0}" msgstr "" -#: Mailnag/plugins/libnotifyplugin.py:434 +#: Mailnag/plugins/libnotifyplugin.py:476 msgid "Mark as read" msgstr "Tandai sudah dibaca" -#: Mailnag/plugins/libnotifyplugin.py:629 +#: Mailnag/plugins/libnotifyplugin.py:675 #, fuzzy msgid "Delete this provider:" msgstr "Hapus akun ini:" -#: Mailnag/plugins/libnotifyplugin.py:630 +#: Mailnag/plugins/libnotifyplugin.py:676 #: Mailnag/plugins/libnotifyplugin.ui.h:1 #, fuzzy msgid "Sender:" msgstr "pengirim" -#: Mailnag/plugins/libnotifyplugin.py:631 +#: Mailnag/plugins/libnotifyplugin.py:677 #: Mailnag/plugins/libnotifyplugin.ui.h:3 #, fuzzy msgid "Subject:" msgstr "subyek" -#: Mailnag/plugins/libnotifyplugin.py:632 +#: Mailnag/plugins/libnotifyplugin.py:678 #: Mailnag/plugins/libnotifyplugin.ui.h:5 msgid "Pattern:" msgstr "" @@ -377,10 +381,6 @@ msgstr "Notifikasi Suara" msgid "Enable/disable libnotify 2FA processing" msgstr "" -#: Mailnag/plugins/libnotifyplugin.ui.h:20 -msgid "2FA providers" -msgstr "" - #, fuzzy #~ msgid "Garmin 2FA LibNotify Notifications" #~ msgstr "Notifikasi LibNotify" diff --git a/po/it.po b/po/it.po index a49fd5d..bc6498a 100644 --- a/po/it.po +++ b/po/it.po @@ -2,7 +2,7 @@ msgid "" msgstr "" "Project-Id-Version: mailnag\n" "Report-Msgid-Bugs-To: https://github.com/tikank/mailnagger/issues\n" -"POT-Creation-Date: 2025-11-16 17:15+0100\n" +"POT-Creation-Date: 2025-11-17 21:03+0100\n" "PO-Revision-Date: 2020-10-15 17:26+0000\n" "Last-Translator: J. Lavoie \n" "Language-Team: Italian \n" "Language-Team: LANGUAGE \n" @@ -125,76 +125,80 @@ msgid "" "followed by %s sequences." msgstr "" -#: Mailnag/plugins/libnotifyplugin.py:61 +#: Mailnag/plugins/libnotifyplugin.py:64 msgid "Your Security Passcode" msgstr "" -#: Mailnag/plugins/libnotifyplugin.py:131 +#: Mailnag/plugins/libnotifyplugin.py:134 msgid "LibNotify Notifications" msgstr "" -#: Mailnag/plugins/libnotifyplugin.py:132 +#: Mailnag/plugins/libnotifyplugin.py:135 msgid "Shows a popup when new mails arrive." msgstr "" -#: Mailnag/plugins/libnotifyplugin.py:168 +#: Mailnag/plugins/libnotifyplugin.py:177 msgid "Notification mode:" msgstr "" -#: Mailnag/plugins/libnotifyplugin.py:280 -#: Mailnag/plugins/libnotifyplugin.py:316 -#: Mailnag/plugins/libnotifyplugin.py:445 +#: Mailnag/plugins/libnotifyplugin.py:179 +msgid "2FA providers" +msgstr "" + +#: Mailnag/plugins/libnotifyplugin.py:322 +#: Mailnag/plugins/libnotifyplugin.py:358 +#: Mailnag/plugins/libnotifyplugin.py:487 #, python-brace-format msgid "{0} new mails" msgstr "" -#: Mailnag/plugins/libnotifyplugin.py:282 +#: Mailnag/plugins/libnotifyplugin.py:324 #, python-brace-format msgid "from {0} and others." msgstr "" -#: Mailnag/plugins/libnotifyplugin.py:284 -#: Mailnag/plugins/libnotifyplugin.py:287 +#: Mailnag/plugins/libnotifyplugin.py:326 +#: Mailnag/plugins/libnotifyplugin.py:329 #, python-brace-format msgid "from {0}." msgstr "" -#: Mailnag/plugins/libnotifyplugin.py:286 -#: Mailnag/plugins/libnotifyplugin.py:318 -#: Mailnag/plugins/libnotifyplugin.py:447 +#: Mailnag/plugins/libnotifyplugin.py:328 +#: Mailnag/plugins/libnotifyplugin.py:360 +#: Mailnag/plugins/libnotifyplugin.py:489 msgid "New mail" msgstr "" -#: Mailnag/plugins/libnotifyplugin.py:311 -#: Mailnag/plugins/libnotifyplugin.py:313 +#: Mailnag/plugins/libnotifyplugin.py:353 +#: Mailnag/plugins/libnotifyplugin.py:355 #, python-brace-format msgid "(and {0} more)" msgstr "" -#: Mailnag/plugins/libnotifyplugin.py:390 +#: Mailnag/plugins/libnotifyplugin.py:432 #, python-brace-format msgid "📋 Code: {0}" msgstr "" -#: Mailnag/plugins/libnotifyplugin.py:434 +#: Mailnag/plugins/libnotifyplugin.py:476 msgid "Mark as read" msgstr "" -#: Mailnag/plugins/libnotifyplugin.py:629 +#: Mailnag/plugins/libnotifyplugin.py:675 msgid "Delete this provider:" msgstr "" -#: Mailnag/plugins/libnotifyplugin.py:630 +#: Mailnag/plugins/libnotifyplugin.py:676 #: Mailnag/plugins/libnotifyplugin.ui.h:1 msgid "Sender:" msgstr "" -#: Mailnag/plugins/libnotifyplugin.py:631 +#: Mailnag/plugins/libnotifyplugin.py:677 #: Mailnag/plugins/libnotifyplugin.ui.h:3 msgid "Subject:" msgstr "" -#: Mailnag/plugins/libnotifyplugin.py:632 +#: Mailnag/plugins/libnotifyplugin.py:678 #: Mailnag/plugins/libnotifyplugin.ui.h:5 msgid "Pattern:" msgstr "" @@ -362,7 +366,3 @@ msgstr "" #: Mailnag/plugins/libnotifyplugin.ui.h:19 msgid "Enable/disable libnotify 2FA processing" msgstr "" - -#: Mailnag/plugins/libnotifyplugin.ui.h:20 -msgid "2FA providers" -msgstr "" diff --git a/po/pl.po b/po/pl.po index f1f96db..7dd67a7 100644 --- a/po/pl.po +++ b/po/pl.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: mailnag\n" "Report-Msgid-Bugs-To: https://github.com/tikank/mailnagger/issues\n" -"POT-Creation-Date: 2025-11-16 17:15+0100\n" +"POT-Creation-Date: 2025-11-17 21:03+0100\n" "PO-Revision-Date: 2019-03-16 14:48+0000\n" "Last-Translator: Launchpad Translations Administrators \n" "Language-Team: Polish \n" @@ -133,79 +133,83 @@ msgid "" "followed by %s sequences." msgstr "" -#: Mailnag/plugins/libnotifyplugin.py:61 +#: Mailnag/plugins/libnotifyplugin.py:64 msgid "Your Security Passcode" msgstr "" -#: Mailnag/plugins/libnotifyplugin.py:131 +#: Mailnag/plugins/libnotifyplugin.py:134 msgid "LibNotify Notifications" msgstr "Powiadomienia LibNotify" -#: Mailnag/plugins/libnotifyplugin.py:132 +#: Mailnag/plugins/libnotifyplugin.py:135 msgid "Shows a popup when new mails arrive." msgstr "Pokaż okno kiedy przychodzi nowa poczta." -#: Mailnag/plugins/libnotifyplugin.py:168 +#: Mailnag/plugins/libnotifyplugin.py:177 msgid "Notification mode:" msgstr "Tryb powiadamiania:" -#: Mailnag/plugins/libnotifyplugin.py:280 -#: Mailnag/plugins/libnotifyplugin.py:316 -#: Mailnag/plugins/libnotifyplugin.py:445 +#: Mailnag/plugins/libnotifyplugin.py:179 +msgid "2FA providers" +msgstr "" + +#: Mailnag/plugins/libnotifyplugin.py:322 +#: Mailnag/plugins/libnotifyplugin.py:358 +#: Mailnag/plugins/libnotifyplugin.py:487 #, python-brace-format msgid "{0} new mails" msgstr "{0} nowych wiadomości" -#: Mailnag/plugins/libnotifyplugin.py:282 +#: Mailnag/plugins/libnotifyplugin.py:324 #, python-brace-format msgid "from {0} and others." msgstr "od {0} i innych." -#: Mailnag/plugins/libnotifyplugin.py:284 -#: Mailnag/plugins/libnotifyplugin.py:287 +#: Mailnag/plugins/libnotifyplugin.py:326 +#: Mailnag/plugins/libnotifyplugin.py:329 #, python-brace-format msgid "from {0}." msgstr "od {0}" -#: Mailnag/plugins/libnotifyplugin.py:286 -#: Mailnag/plugins/libnotifyplugin.py:318 -#: Mailnag/plugins/libnotifyplugin.py:447 +#: Mailnag/plugins/libnotifyplugin.py:328 +#: Mailnag/plugins/libnotifyplugin.py:360 +#: Mailnag/plugins/libnotifyplugin.py:489 msgid "New mail" msgstr "Nowa poczta" -#: Mailnag/plugins/libnotifyplugin.py:311 -#: Mailnag/plugins/libnotifyplugin.py:313 +#: Mailnag/plugins/libnotifyplugin.py:353 +#: Mailnag/plugins/libnotifyplugin.py:355 #, python-brace-format msgid "(and {0} more)" msgstr "(i {0} więcej)" -#: Mailnag/plugins/libnotifyplugin.py:390 +#: Mailnag/plugins/libnotifyplugin.py:432 #, python-brace-format msgid "📋 Code: {0}" msgstr "" -#: Mailnag/plugins/libnotifyplugin.py:434 +#: Mailnag/plugins/libnotifyplugin.py:476 msgid "Mark as read" msgstr "Oznacz jako przeczytana" -#: Mailnag/plugins/libnotifyplugin.py:629 +#: Mailnag/plugins/libnotifyplugin.py:675 #, fuzzy msgid "Delete this provider:" msgstr "Usuń to konto:" -#: Mailnag/plugins/libnotifyplugin.py:630 +#: Mailnag/plugins/libnotifyplugin.py:676 #: Mailnag/plugins/libnotifyplugin.ui.h:1 #, fuzzy msgid "Sender:" msgstr "nadawca" -#: Mailnag/plugins/libnotifyplugin.py:631 +#: Mailnag/plugins/libnotifyplugin.py:677 #: Mailnag/plugins/libnotifyplugin.ui.h:3 #, fuzzy msgid "Subject:" msgstr "temat" -#: Mailnag/plugins/libnotifyplugin.py:632 +#: Mailnag/plugins/libnotifyplugin.py:678 #: Mailnag/plugins/libnotifyplugin.ui.h:5 msgid "Pattern:" msgstr "" @@ -379,10 +383,6 @@ msgstr "Dżwięk powiadomienia" msgid "Enable/disable libnotify 2FA processing" msgstr "" -#: Mailnag/plugins/libnotifyplugin.ui.h:20 -msgid "2FA providers" -msgstr "" - #, fuzzy #~ msgid "Garmin 2FA LibNotify Notifications" #~ msgstr "Powiadomienia LibNotify" diff --git a/po/pt.po b/po/pt.po index c192c47..c49936e 100644 --- a/po/pt.po +++ b/po/pt.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: mailnag\n" "Report-Msgid-Bugs-To: https://github.com/tikank/mailnagger/issues\n" -"POT-Creation-Date: 2025-11-16 17:15+0100\n" +"POT-Creation-Date: 2025-11-17 21:03+0100\n" "PO-Revision-Date: 2019-03-16 14:48+0000\n" "Last-Translator: Launchpad Translations Administrators \n" "Language-Team: Portuguese \n" @@ -134,79 +134,83 @@ msgstr "" "O Mailnag passa a quantidade total de mails novos para este script,\n" "seguido por sequências de %s." -#: Mailnag/plugins/libnotifyplugin.py:61 +#: Mailnag/plugins/libnotifyplugin.py:64 msgid "Your Security Passcode" msgstr "" -#: Mailnag/plugins/libnotifyplugin.py:131 +#: Mailnag/plugins/libnotifyplugin.py:134 msgid "LibNotify Notifications" msgstr "Notificações da LibNotify" -#: Mailnag/plugins/libnotifyplugin.py:132 +#: Mailnag/plugins/libnotifyplugin.py:135 msgid "Shows a popup when new mails arrive." msgstr "Mostra um popup quando chegam novos mails." -#: Mailnag/plugins/libnotifyplugin.py:168 +#: Mailnag/plugins/libnotifyplugin.py:177 msgid "Notification mode:" msgstr "Modo de notificação:" -#: Mailnag/plugins/libnotifyplugin.py:280 -#: Mailnag/plugins/libnotifyplugin.py:316 -#: Mailnag/plugins/libnotifyplugin.py:445 +#: Mailnag/plugins/libnotifyplugin.py:179 +msgid "2FA providers" +msgstr "" + +#: Mailnag/plugins/libnotifyplugin.py:322 +#: Mailnag/plugins/libnotifyplugin.py:358 +#: Mailnag/plugins/libnotifyplugin.py:487 #, python-brace-format msgid "{0} new mails" msgstr "{0} novos mails" -#: Mailnag/plugins/libnotifyplugin.py:282 +#: Mailnag/plugins/libnotifyplugin.py:324 #, python-brace-format msgid "from {0} and others." msgstr "de {0} e outros." -#: Mailnag/plugins/libnotifyplugin.py:284 -#: Mailnag/plugins/libnotifyplugin.py:287 +#: Mailnag/plugins/libnotifyplugin.py:326 +#: Mailnag/plugins/libnotifyplugin.py:329 #, python-brace-format msgid "from {0}." msgstr "de {0}." -#: Mailnag/plugins/libnotifyplugin.py:286 -#: Mailnag/plugins/libnotifyplugin.py:318 -#: Mailnag/plugins/libnotifyplugin.py:447 +#: Mailnag/plugins/libnotifyplugin.py:328 +#: Mailnag/plugins/libnotifyplugin.py:360 +#: Mailnag/plugins/libnotifyplugin.py:489 msgid "New mail" msgstr "Novo mail" -#: Mailnag/plugins/libnotifyplugin.py:311 -#: Mailnag/plugins/libnotifyplugin.py:313 +#: Mailnag/plugins/libnotifyplugin.py:353 +#: Mailnag/plugins/libnotifyplugin.py:355 #, python-brace-format msgid "(and {0} more)" msgstr "(e mais {0})" -#: Mailnag/plugins/libnotifyplugin.py:390 +#: Mailnag/plugins/libnotifyplugin.py:432 #, python-brace-format msgid "📋 Code: {0}" msgstr "" -#: Mailnag/plugins/libnotifyplugin.py:434 +#: Mailnag/plugins/libnotifyplugin.py:476 msgid "Mark as read" msgstr "Marcar como lido" -#: Mailnag/plugins/libnotifyplugin.py:629 +#: Mailnag/plugins/libnotifyplugin.py:675 #, fuzzy msgid "Delete this provider:" msgstr "Apagar esta conta:" -#: Mailnag/plugins/libnotifyplugin.py:630 +#: Mailnag/plugins/libnotifyplugin.py:676 #: Mailnag/plugins/libnotifyplugin.ui.h:1 #, fuzzy msgid "Sender:" msgstr "remetente" -#: Mailnag/plugins/libnotifyplugin.py:631 +#: Mailnag/plugins/libnotifyplugin.py:677 #: Mailnag/plugins/libnotifyplugin.ui.h:3 #, fuzzy msgid "Subject:" msgstr "assunto" -#: Mailnag/plugins/libnotifyplugin.py:632 +#: Mailnag/plugins/libnotifyplugin.py:678 #: Mailnag/plugins/libnotifyplugin.ui.h:5 msgid "Pattern:" msgstr "" @@ -383,10 +387,6 @@ msgstr "Notificações de Som" msgid "Enable/disable libnotify 2FA processing" msgstr "" -#: Mailnag/plugins/libnotifyplugin.ui.h:20 -msgid "2FA providers" -msgstr "" - #, fuzzy #~ msgid "Garmin 2FA LibNotify Notifications" #~ msgstr "Notificações da LibNotify" diff --git a/po/pt_BR.po b/po/pt_BR.po index bfa3e1f..4aa3162 100644 --- a/po/pt_BR.po +++ b/po/pt_BR.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: mailnag\n" "Report-Msgid-Bugs-To: https://github.com/tikank/mailnagger/issues\n" -"POT-Creation-Date: 2025-11-16 17:15+0100\n" +"POT-Creation-Date: 2025-11-17 21:03+0100\n" "PO-Revision-Date: 2019-12-25 19:25+0000\n" "Last-Translator: Relaxeaza \n" "Language-Team: Brazilian Portuguese \n" @@ -134,79 +134,83 @@ msgstr "" "Mailnag passa o total novas mensagens para o script,\n" "seguido por sequências de %s." -#: Mailnag/plugins/libnotifyplugin.py:61 +#: Mailnag/plugins/libnotifyplugin.py:64 msgid "Your Security Passcode" msgstr "" -#: Mailnag/plugins/libnotifyplugin.py:131 +#: Mailnag/plugins/libnotifyplugin.py:134 msgid "LibNotify Notifications" msgstr "Notificações da LibNotify" -#: Mailnag/plugins/libnotifyplugin.py:132 +#: Mailnag/plugins/libnotifyplugin.py:135 msgid "Shows a popup when new mails arrive." msgstr "Mostra um popup quando chegam novas mensagens." -#: Mailnag/plugins/libnotifyplugin.py:168 +#: Mailnag/plugins/libnotifyplugin.py:177 msgid "Notification mode:" msgstr "Modo de notificação:" -#: Mailnag/plugins/libnotifyplugin.py:280 -#: Mailnag/plugins/libnotifyplugin.py:316 -#: Mailnag/plugins/libnotifyplugin.py:445 +#: Mailnag/plugins/libnotifyplugin.py:179 +msgid "2FA providers" +msgstr "" + +#: Mailnag/plugins/libnotifyplugin.py:322 +#: Mailnag/plugins/libnotifyplugin.py:358 +#: Mailnag/plugins/libnotifyplugin.py:487 #, python-brace-format msgid "{0} new mails" msgstr "{0} novas mensagens" -#: Mailnag/plugins/libnotifyplugin.py:282 +#: Mailnag/plugins/libnotifyplugin.py:324 #, python-brace-format msgid "from {0} and others." msgstr "de {0} e outros." -#: Mailnag/plugins/libnotifyplugin.py:284 -#: Mailnag/plugins/libnotifyplugin.py:287 +#: Mailnag/plugins/libnotifyplugin.py:326 +#: Mailnag/plugins/libnotifyplugin.py:329 #, python-brace-format msgid "from {0}." msgstr "de {0}." -#: Mailnag/plugins/libnotifyplugin.py:286 -#: Mailnag/plugins/libnotifyplugin.py:318 -#: Mailnag/plugins/libnotifyplugin.py:447 +#: Mailnag/plugins/libnotifyplugin.py:328 +#: Mailnag/plugins/libnotifyplugin.py:360 +#: Mailnag/plugins/libnotifyplugin.py:489 msgid "New mail" msgstr "Novo mail" -#: Mailnag/plugins/libnotifyplugin.py:311 -#: Mailnag/plugins/libnotifyplugin.py:313 +#: Mailnag/plugins/libnotifyplugin.py:353 +#: Mailnag/plugins/libnotifyplugin.py:355 #, python-brace-format msgid "(and {0} more)" msgstr "(e mais {0})" -#: Mailnag/plugins/libnotifyplugin.py:390 +#: Mailnag/plugins/libnotifyplugin.py:432 #, python-brace-format msgid "📋 Code: {0}" msgstr "" -#: Mailnag/plugins/libnotifyplugin.py:434 +#: Mailnag/plugins/libnotifyplugin.py:476 msgid "Mark as read" msgstr "Marcar como lido" -#: Mailnag/plugins/libnotifyplugin.py:629 +#: Mailnag/plugins/libnotifyplugin.py:675 #, fuzzy msgid "Delete this provider:" msgstr "Apagar esta conta:" -#: Mailnag/plugins/libnotifyplugin.py:630 +#: Mailnag/plugins/libnotifyplugin.py:676 #: Mailnag/plugins/libnotifyplugin.ui.h:1 #, fuzzy msgid "Sender:" msgstr "remetente" -#: Mailnag/plugins/libnotifyplugin.py:631 +#: Mailnag/plugins/libnotifyplugin.py:677 #: Mailnag/plugins/libnotifyplugin.ui.h:3 #, fuzzy msgid "Subject:" msgstr "assunto" -#: Mailnag/plugins/libnotifyplugin.py:632 +#: Mailnag/plugins/libnotifyplugin.py:678 #: Mailnag/plugins/libnotifyplugin.ui.h:5 msgid "Pattern:" msgstr "" @@ -383,10 +387,6 @@ msgstr "Notificações de Som" msgid "Enable/disable libnotify 2FA processing" msgstr "" -#: Mailnag/plugins/libnotifyplugin.ui.h:20 -msgid "2FA providers" -msgstr "" - #, fuzzy #~ msgid "Garmin 2FA LibNotify Notifications" #~ msgstr "Notificações da LibNotify" diff --git a/po/ru.po b/po/ru.po index af22262..dd0c2c8 100644 --- a/po/ru.po +++ b/po/ru.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: mailnag\n" "Report-Msgid-Bugs-To: https://github.com/tikank/mailnagger/issues\n" -"POT-Creation-Date: 2025-11-16 17:15+0100\n" +"POT-Creation-Date: 2025-11-17 21:03+0100\n" "PO-Revision-Date: 2019-03-16 14:48+0000\n" "Last-Translator: Launchpad Translations Administrators \n" "Language-Team: LANGUAGE \n" @@ -135,79 +135,83 @@ msgstr "" "Скрипту передаётся количество сообщений,\n" "за которым следуют: %s" -#: Mailnag/plugins/libnotifyplugin.py:61 +#: Mailnag/plugins/libnotifyplugin.py:64 msgid "Your Security Passcode" msgstr "" -#: Mailnag/plugins/libnotifyplugin.py:131 +#: Mailnag/plugins/libnotifyplugin.py:134 msgid "LibNotify Notifications" msgstr "Уведомления LibNotify" -#: Mailnag/plugins/libnotifyplugin.py:132 +#: Mailnag/plugins/libnotifyplugin.py:135 msgid "Shows a popup when new mails arrive." msgstr "Отображение всплывающего уведомления при получении новых писем" -#: Mailnag/plugins/libnotifyplugin.py:168 +#: Mailnag/plugins/libnotifyplugin.py:177 msgid "Notification mode:" msgstr "Тип уведомлений:" -#: Mailnag/plugins/libnotifyplugin.py:280 -#: Mailnag/plugins/libnotifyplugin.py:316 -#: Mailnag/plugins/libnotifyplugin.py:445 +#: Mailnag/plugins/libnotifyplugin.py:179 +msgid "2FA providers" +msgstr "" + +#: Mailnag/plugins/libnotifyplugin.py:322 +#: Mailnag/plugins/libnotifyplugin.py:358 +#: Mailnag/plugins/libnotifyplugin.py:487 #, python-brace-format msgid "{0} new mails" msgstr "сообщений: {0}" -#: Mailnag/plugins/libnotifyplugin.py:282 +#: Mailnag/plugins/libnotifyplugin.py:324 #, python-brace-format msgid "from {0} and others." msgstr "от {0} и других." -#: Mailnag/plugins/libnotifyplugin.py:284 -#: Mailnag/plugins/libnotifyplugin.py:287 +#: Mailnag/plugins/libnotifyplugin.py:326 +#: Mailnag/plugins/libnotifyplugin.py:329 #, python-brace-format msgid "from {0}." msgstr "от {0}." -#: Mailnag/plugins/libnotifyplugin.py:286 -#: Mailnag/plugins/libnotifyplugin.py:318 -#: Mailnag/plugins/libnotifyplugin.py:447 +#: Mailnag/plugins/libnotifyplugin.py:328 +#: Mailnag/plugins/libnotifyplugin.py:360 +#: Mailnag/plugins/libnotifyplugin.py:489 msgid "New mail" msgstr "Новое сообщение" -#: Mailnag/plugins/libnotifyplugin.py:311 -#: Mailnag/plugins/libnotifyplugin.py:313 +#: Mailnag/plugins/libnotifyplugin.py:353 +#: Mailnag/plugins/libnotifyplugin.py:355 #, python-brace-format msgid "(and {0} more)" msgstr "(и еще {0})" -#: Mailnag/plugins/libnotifyplugin.py:390 +#: Mailnag/plugins/libnotifyplugin.py:432 #, python-brace-format msgid "📋 Code: {0}" msgstr "" -#: Mailnag/plugins/libnotifyplugin.py:434 +#: Mailnag/plugins/libnotifyplugin.py:476 msgid "Mark as read" msgstr "Отметить как прочитанное" -#: Mailnag/plugins/libnotifyplugin.py:629 +#: Mailnag/plugins/libnotifyplugin.py:675 #, fuzzy msgid "Delete this provider:" msgstr "Удалить учетную запись:" -#: Mailnag/plugins/libnotifyplugin.py:630 +#: Mailnag/plugins/libnotifyplugin.py:676 #: Mailnag/plugins/libnotifyplugin.ui.h:1 #, fuzzy msgid "Sender:" msgstr "отправитель" -#: Mailnag/plugins/libnotifyplugin.py:631 +#: Mailnag/plugins/libnotifyplugin.py:677 #: Mailnag/plugins/libnotifyplugin.ui.h:3 #, fuzzy msgid "Subject:" msgstr "тема" -#: Mailnag/plugins/libnotifyplugin.py:632 +#: Mailnag/plugins/libnotifyplugin.py:678 #: Mailnag/plugins/libnotifyplugin.ui.h:5 msgid "Pattern:" msgstr "" @@ -384,10 +388,6 @@ msgstr "Звуковые уведомления" msgid "Enable/disable libnotify 2FA processing" msgstr "" -#: Mailnag/plugins/libnotifyplugin.ui.h:20 -msgid "2FA providers" -msgstr "" - #, fuzzy #~ msgid "Garmin 2FA LibNotify Notifications" #~ msgstr "Уведомления LibNotify" diff --git a/po/sr.po b/po/sr.po index 897932b..84a004a 100644 --- a/po/sr.po +++ b/po/sr.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: mailnag\n" "Report-Msgid-Bugs-To: https://github.com/tikank/mailnagger/issues\n" -"POT-Creation-Date: 2025-11-16 17:15+0100\n" +"POT-Creation-Date: 2025-11-17 21:03+0100\n" "PO-Revision-Date: 2021-01-07 11:29+0000\n" "Last-Translator: Burek \n" "Language-Team: Serbian \n" "Language-Team: Swedish \n" "Language-Team: Turkish \n" "Language-Team: Ukrainian \n" @@ -131,79 +131,83 @@ msgid "" "followed by %s sequences." msgstr "" -#: Mailnag/plugins/libnotifyplugin.py:61 +#: Mailnag/plugins/libnotifyplugin.py:64 msgid "Your Security Passcode" msgstr "" -#: Mailnag/plugins/libnotifyplugin.py:131 +#: Mailnag/plugins/libnotifyplugin.py:134 msgid "LibNotify Notifications" msgstr "Сповіщення LibNotify" -#: Mailnag/plugins/libnotifyplugin.py:132 +#: Mailnag/plugins/libnotifyplugin.py:135 msgid "Shows a popup when new mails arrive." msgstr "Сповіщає про нові листи за допомогою виринаючих повідомлень." -#: Mailnag/plugins/libnotifyplugin.py:168 +#: Mailnag/plugins/libnotifyplugin.py:177 msgid "Notification mode:" msgstr "Метод сповіщення:" -#: Mailnag/plugins/libnotifyplugin.py:280 -#: Mailnag/plugins/libnotifyplugin.py:316 -#: Mailnag/plugins/libnotifyplugin.py:445 +#: Mailnag/plugins/libnotifyplugin.py:179 +msgid "2FA providers" +msgstr "" + +#: Mailnag/plugins/libnotifyplugin.py:322 +#: Mailnag/plugins/libnotifyplugin.py:358 +#: Mailnag/plugins/libnotifyplugin.py:487 #, python-brace-format msgid "{0} new mails" msgstr "{0} листів" -#: Mailnag/plugins/libnotifyplugin.py:282 +#: Mailnag/plugins/libnotifyplugin.py:324 #, python-brace-format msgid "from {0} and others." msgstr "" -#: Mailnag/plugins/libnotifyplugin.py:284 -#: Mailnag/plugins/libnotifyplugin.py:287 +#: Mailnag/plugins/libnotifyplugin.py:326 +#: Mailnag/plugins/libnotifyplugin.py:329 #, python-brace-format msgid "from {0}." msgstr "" -#: Mailnag/plugins/libnotifyplugin.py:286 -#: Mailnag/plugins/libnotifyplugin.py:318 -#: Mailnag/plugins/libnotifyplugin.py:447 +#: Mailnag/plugins/libnotifyplugin.py:328 +#: Mailnag/plugins/libnotifyplugin.py:360 +#: Mailnag/plugins/libnotifyplugin.py:489 msgid "New mail" msgstr "Новий лист" -#: Mailnag/plugins/libnotifyplugin.py:311 -#: Mailnag/plugins/libnotifyplugin.py:313 +#: Mailnag/plugins/libnotifyplugin.py:353 +#: Mailnag/plugins/libnotifyplugin.py:355 #, python-brace-format msgid "(and {0} more)" msgstr "(і ще {0})" -#: Mailnag/plugins/libnotifyplugin.py:390 +#: Mailnag/plugins/libnotifyplugin.py:432 #, python-brace-format msgid "📋 Code: {0}" msgstr "" -#: Mailnag/plugins/libnotifyplugin.py:434 +#: Mailnag/plugins/libnotifyplugin.py:476 msgid "Mark as read" msgstr "Позначити як прочитане" -#: Mailnag/plugins/libnotifyplugin.py:629 +#: Mailnag/plugins/libnotifyplugin.py:675 #, fuzzy msgid "Delete this provider:" msgstr "Видалити обліковий запис" -#: Mailnag/plugins/libnotifyplugin.py:630 +#: Mailnag/plugins/libnotifyplugin.py:676 #: Mailnag/plugins/libnotifyplugin.ui.h:1 #, fuzzy msgid "Sender:" msgstr "відправник" -#: Mailnag/plugins/libnotifyplugin.py:631 +#: Mailnag/plugins/libnotifyplugin.py:677 #: Mailnag/plugins/libnotifyplugin.ui.h:3 #, fuzzy msgid "Subject:" msgstr "тема" -#: Mailnag/plugins/libnotifyplugin.py:632 +#: Mailnag/plugins/libnotifyplugin.py:678 #: Mailnag/plugins/libnotifyplugin.ui.h:5 msgid "Pattern:" msgstr "" @@ -380,10 +384,6 @@ msgstr "Звукові сповіщення" msgid "Enable/disable libnotify 2FA processing" msgstr "" -#: Mailnag/plugins/libnotifyplugin.ui.h:20 -msgid "2FA providers" -msgstr "" - #, fuzzy #~ msgid "Garmin 2FA LibNotify Notifications" #~ msgstr "Сповіщення LibNotify" diff --git a/po/zh_CN.po b/po/zh_CN.po index 58d40c1..89bcff5 100644 --- a/po/zh_CN.po +++ b/po/zh_CN.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: mailnag\n" "Report-Msgid-Bugs-To: https://github.com/tikank/mailnagger/issues\n" -"POT-Creation-Date: 2025-11-16 17:15+0100\n" +"POT-Creation-Date: 2025-11-17 21:03+0100\n" "PO-Revision-Date: 2019-03-16 14:48+0000\n" "Last-Translator: Launchpad Translations Administrators \n" "Language-Team: Chinese (Simplified) \n" @@ -130,79 +130,83 @@ msgid "" "followed by %s sequences." msgstr "" -#: Mailnag/plugins/libnotifyplugin.py:61 +#: Mailnag/plugins/libnotifyplugin.py:64 msgid "Your Security Passcode" msgstr "" -#: Mailnag/plugins/libnotifyplugin.py:131 +#: Mailnag/plugins/libnotifyplugin.py:134 msgid "LibNotify Notifications" msgstr "弹出窗口通知" -#: Mailnag/plugins/libnotifyplugin.py:132 +#: Mailnag/plugins/libnotifyplugin.py:135 msgid "Shows a popup when new mails arrive." msgstr "当新邮件到达时弹出。" -#: Mailnag/plugins/libnotifyplugin.py:168 +#: Mailnag/plugins/libnotifyplugin.py:177 msgid "Notification mode:" msgstr "通知模式" -#: Mailnag/plugins/libnotifyplugin.py:280 -#: Mailnag/plugins/libnotifyplugin.py:316 -#: Mailnag/plugins/libnotifyplugin.py:445 +#: Mailnag/plugins/libnotifyplugin.py:179 +msgid "2FA providers" +msgstr "" + +#: Mailnag/plugins/libnotifyplugin.py:322 +#: Mailnag/plugins/libnotifyplugin.py:358 +#: Mailnag/plugins/libnotifyplugin.py:487 #, python-brace-format msgid "{0} new mails" msgstr "" -#: Mailnag/plugins/libnotifyplugin.py:282 +#: Mailnag/plugins/libnotifyplugin.py:324 #, python-brace-format msgid "from {0} and others." msgstr "" -#: Mailnag/plugins/libnotifyplugin.py:284 -#: Mailnag/plugins/libnotifyplugin.py:287 +#: Mailnag/plugins/libnotifyplugin.py:326 +#: Mailnag/plugins/libnotifyplugin.py:329 #, python-brace-format msgid "from {0}." msgstr "" -#: Mailnag/plugins/libnotifyplugin.py:286 -#: Mailnag/plugins/libnotifyplugin.py:318 -#: Mailnag/plugins/libnotifyplugin.py:447 +#: Mailnag/plugins/libnotifyplugin.py:328 +#: Mailnag/plugins/libnotifyplugin.py:360 +#: Mailnag/plugins/libnotifyplugin.py:489 msgid "New mail" msgstr "" -#: Mailnag/plugins/libnotifyplugin.py:311 -#: Mailnag/plugins/libnotifyplugin.py:313 +#: Mailnag/plugins/libnotifyplugin.py:353 +#: Mailnag/plugins/libnotifyplugin.py:355 #, python-brace-format msgid "(and {0} more)" msgstr "( 还有 {0} 条)" -#: Mailnag/plugins/libnotifyplugin.py:390 +#: Mailnag/plugins/libnotifyplugin.py:432 #, python-brace-format msgid "📋 Code: {0}" msgstr "" -#: Mailnag/plugins/libnotifyplugin.py:434 +#: Mailnag/plugins/libnotifyplugin.py:476 msgid "Mark as read" msgstr "标记为已读" -#: Mailnag/plugins/libnotifyplugin.py:629 +#: Mailnag/plugins/libnotifyplugin.py:675 #, fuzzy msgid "Delete this provider:" msgstr "删除该帐户:" -#: Mailnag/plugins/libnotifyplugin.py:630 +#: Mailnag/plugins/libnotifyplugin.py:676 #: Mailnag/plugins/libnotifyplugin.ui.h:1 #, fuzzy msgid "Sender:" msgstr "寄件人" -#: Mailnag/plugins/libnotifyplugin.py:631 +#: Mailnag/plugins/libnotifyplugin.py:677 #: Mailnag/plugins/libnotifyplugin.ui.h:3 #, fuzzy msgid "Subject:" msgstr "主题" -#: Mailnag/plugins/libnotifyplugin.py:632 +#: Mailnag/plugins/libnotifyplugin.py:678 #: Mailnag/plugins/libnotifyplugin.ui.h:5 msgid "Pattern:" msgstr "" @@ -376,10 +380,6 @@ msgstr "声音通知" msgid "Enable/disable libnotify 2FA processing" msgstr "" -#: Mailnag/plugins/libnotifyplugin.ui.h:20 -msgid "2FA providers" -msgstr "" - #, fuzzy #~ msgid "Garmin 2FA LibNotify Notifications" #~ msgstr "弹出窗口通知" diff --git a/po/zh_TW.po b/po/zh_TW.po index 1f641a1..8b2d011 100644 --- a/po/zh_TW.po +++ b/po/zh_TW.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: mailnag\n" "Report-Msgid-Bugs-To: https://github.com/tikank/mailnagger/issues\n" -"POT-Creation-Date: 2025-11-16 17:15+0100\n" +"POT-Creation-Date: 2025-11-17 21:03+0100\n" "PO-Revision-Date: 2019-03-16 14:48+0000\n" "Last-Translator: Launchpad Translations Administrators \n" "Language-Team: Chinese (Traditional) \n" @@ -128,79 +128,83 @@ msgid "" "followed by %s sequences." msgstr "" -#: Mailnag/plugins/libnotifyplugin.py:61 +#: Mailnag/plugins/libnotifyplugin.py:64 msgid "Your Security Passcode" msgstr "" -#: Mailnag/plugins/libnotifyplugin.py:131 +#: Mailnag/plugins/libnotifyplugin.py:134 msgid "LibNotify Notifications" msgstr "彈出視窗通知" -#: Mailnag/plugins/libnotifyplugin.py:132 +#: Mailnag/plugins/libnotifyplugin.py:135 msgid "Shows a popup when new mails arrive." msgstr "當新郵件到達時彈出訊息視窗。" -#: Mailnag/plugins/libnotifyplugin.py:168 +#: Mailnag/plugins/libnotifyplugin.py:177 msgid "Notification mode:" msgstr "通知模式" -#: Mailnag/plugins/libnotifyplugin.py:280 -#: Mailnag/plugins/libnotifyplugin.py:316 -#: Mailnag/plugins/libnotifyplugin.py:445 +#: Mailnag/plugins/libnotifyplugin.py:179 +msgid "2FA providers" +msgstr "" + +#: Mailnag/plugins/libnotifyplugin.py:322 +#: Mailnag/plugins/libnotifyplugin.py:358 +#: Mailnag/plugins/libnotifyplugin.py:487 #, python-brace-format msgid "{0} new mails" msgstr "{0} 封新郵件" -#: Mailnag/plugins/libnotifyplugin.py:282 +#: Mailnag/plugins/libnotifyplugin.py:324 #, python-brace-format msgid "from {0} and others." msgstr "" -#: Mailnag/plugins/libnotifyplugin.py:284 -#: Mailnag/plugins/libnotifyplugin.py:287 +#: Mailnag/plugins/libnotifyplugin.py:326 +#: Mailnag/plugins/libnotifyplugin.py:329 #, python-brace-format msgid "from {0}." msgstr "" -#: Mailnag/plugins/libnotifyplugin.py:286 -#: Mailnag/plugins/libnotifyplugin.py:318 -#: Mailnag/plugins/libnotifyplugin.py:447 +#: Mailnag/plugins/libnotifyplugin.py:328 +#: Mailnag/plugins/libnotifyplugin.py:360 +#: Mailnag/plugins/libnotifyplugin.py:489 msgid "New mail" msgstr "新郵件" -#: Mailnag/plugins/libnotifyplugin.py:311 -#: Mailnag/plugins/libnotifyplugin.py:313 +#: Mailnag/plugins/libnotifyplugin.py:353 +#: Mailnag/plugins/libnotifyplugin.py:355 #, python-brace-format msgid "(and {0} more)" msgstr "( 還有 {0} 條)" -#: Mailnag/plugins/libnotifyplugin.py:390 +#: Mailnag/plugins/libnotifyplugin.py:432 #, python-brace-format msgid "📋 Code: {0}" msgstr "" -#: Mailnag/plugins/libnotifyplugin.py:434 +#: Mailnag/plugins/libnotifyplugin.py:476 msgid "Mark as read" msgstr "標記爲已讀" -#: Mailnag/plugins/libnotifyplugin.py:629 +#: Mailnag/plugins/libnotifyplugin.py:675 #, fuzzy msgid "Delete this provider:" msgstr "刪除該帳戶:" -#: Mailnag/plugins/libnotifyplugin.py:630 +#: Mailnag/plugins/libnotifyplugin.py:676 #: Mailnag/plugins/libnotifyplugin.ui.h:1 #, fuzzy msgid "Sender:" msgstr "寄件人" -#: Mailnag/plugins/libnotifyplugin.py:631 +#: Mailnag/plugins/libnotifyplugin.py:677 #: Mailnag/plugins/libnotifyplugin.ui.h:3 #, fuzzy msgid "Subject:" msgstr "主題" -#: Mailnag/plugins/libnotifyplugin.py:632 +#: Mailnag/plugins/libnotifyplugin.py:678 #: Mailnag/plugins/libnotifyplugin.ui.h:5 msgid "Pattern:" msgstr "" @@ -375,10 +379,6 @@ msgstr "聲音通知" msgid "Enable/disable libnotify 2FA processing" msgstr "" -#: Mailnag/plugins/libnotifyplugin.ui.h:20 -msgid "2FA providers" -msgstr "" - #, fuzzy #~ msgid "Garmin 2FA LibNotify Notifications" #~ msgstr "彈出視窗通知" From f50ff53cf6e87cf4e0f1d55504754611d8fe92bc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Auzi?= Date: Sun, 23 Nov 2025 19:38:39 +0100 Subject: [PATCH 26/49] Fix fetch text content --- Mailnag/backends/imap.py | 76 ++++++++-------- Mailnag/common/accounts.py | 33 ++++++- Mailnag/daemon/mails.py | 135 +++++++++++++++-------------- Mailnag/plugins/libnotifyplugin.py | 8 +- 4 files changed, 149 insertions(+), 103 deletions(-) diff --git a/Mailnag/backends/imap.py b/Mailnag/backends/imap.py index d9a8d64..2fcc2ee 100644 --- a/Mailnag/backends/imap.py +++ b/Mailnag/backends/imap.py @@ -71,10 +71,10 @@ def __init__( def open(self) -> None: if self._conn != None: raise InvalidOperationException("Account is aready open") - + self._conn = self._connect() - + def close(self) -> None: # if conn has already been closed, don't try to close it again if self._conn is not None: @@ -91,7 +91,7 @@ def list_messages(self) -> Iterator[tuple[str, Message, str | None, dict[str, An self._ensure_open() assert self._conn is not None conn = self._conn - + if len(self.folders) == 0: folder_list = ['INBOX'] else: @@ -124,28 +124,29 @@ def list_messages(self) -> Iterator[tuple[str, Message, str | None, dict[str, An yield (folder, header, num.decode("utf-8"), { 'folder' : folder }) def fetch_text(self, mail: Mail) -> str | None: - conn = self._connect() - - typ, msg_data = conn.uid('FETCH', mail.uid.encode('utf-8'), '(BODY.PEEK[TEXT])') # body text (without setting READ flag) + self._ensure_open() + assert self._conn is not None + conn = self._conn + + typ, msg_data = conn.uid('FETCH', mail.uid.encode('utf-8'), '(RFC822)') # body text (without setting READ flag) logging.debug("Msg data (length=%d):\n%s", len(msg_data), dbgindent(msg_data)) - text = [] + + bbb = b'' for response_part in msg_data: if isinstance(response_part, tuple): - if b'BODY[TEXT]' in response_part[0]: - msg = email.message_from_bytes(response_part[1]) - if msg is not None: - t = message_text(msg) - text.append(t) - if len(text): - return ''.join(text).strip() - + bbb += response_part[1] + + msg = email.message_from_bytes(bbb) + if msg is not None: + return message_text(msg) + return None def request_folders(self) -> list[str]: lst = [] - + # Always create a new connection as an existing one may # be used for IMAP IDLE. conn = self._connect() @@ -154,7 +155,7 @@ def request_folders(self) -> list[str]: status, data = conn.list() finally: self._disconnect(conn) - + for d in data: match = re.match(r'.+\s+("."|"?NIL"?)\s+"?([^"]+)"?$', d.decode('utf-8')) @@ -163,7 +164,7 @@ def request_folders(self) -> list[str]: else: folder = match.group(2) lst.append(decode_mutf7(folder)) - + return lst @@ -175,11 +176,11 @@ def mark_as_seen(self, mails: list[Mail]) -> None: # Always create a new connection as an existing one may # be used for IMAP IDLE. conn = self._connect() - + try: sorted_mails = sorted(mails, key = lambda m : m.flags['folder'] if 'folder' in m.flags else '') last_folder = '' - + for m in sorted_mails: if ('uid' in m.flags) and ('folder' in m.flags): try: @@ -193,8 +194,8 @@ def mark_as_seen(self, mails: list[Mail]) -> None: finally: self._disconnect(conn) - - + + def supports_notifications(self) -> bool: """Returns True if mailbox supports notifications. IMAP mailbox supports notifications if idle parameter is True""" @@ -208,7 +209,7 @@ def notify_next_change( ) -> None: self._ensure_open() assert self._conn is not None - + # register idle callback that is called whenever an idle event # arrives (new mail / mail deleted). # the callback is called after minutes at the latest. @@ -221,7 +222,7 @@ def _idle_callback(args: tuple[Any, Any, tuple[str, int]]) -> None: # call actual callback if callback is not None: callback(error) - + self._conn.idle(callback = _idle_callback, timeout = timeout) @@ -230,7 +231,7 @@ def cancel_notifications(self) -> None: # Analogous to close(). # (Otherwise cleanup code like in Idler._idle() will fail) # self._ensure_open() - + try: if self._conn is not None: # Exit possible active idle state. @@ -238,11 +239,11 @@ def cancel_notifications(self) -> None: self._conn.noop() except: pass - - + + def _connect(self) -> imaplib.IMAP4: conn: Optional[imaplib.IMAP4] = None - + try: if self.ssl: if self.port == '': @@ -254,12 +255,12 @@ def _connect(self) -> imaplib.IMAP4: conn = imaplib.IMAP4(self.server) else: conn = imaplib.IMAP4(self.server, int(self.port)) - + if 'STARTTLS' in conn.capabilities: conn.starttls() else: logging.warning("Using unencrypted connection for account '%s'" % self.name) - + if self.oauth2string != '': conn.authenticate('XOAUTH2', lambda x: self.oauth2string) elif 'AUTH=CRAM-MD5' in conn.capabilities: @@ -274,31 +275,30 @@ def _connect(self) -> imaplib.IMAP4: conn.logout() except: pass raise # re-throw exception - + # notify_next_change() (IMAP IDLE) requires a selected folder if conn.state == AUTH: self._select_single_folder(conn) - + return conn def _disconnect(self, conn: imaplib.IMAP4) -> None: try: conn.close() - finally: - # Closing the connection may fail (e.g. wrong state), + finally: + # Closing the connection may fail (e.g. wrong state), # but resources need to be freed anyway. conn.logout() - - + + def _select_single_folder(self, conn: imaplib.IMAP4) -> None: if len(self.folders) == 1: folder = self.folders[0] else: folder = "INBOX" conn.select(f'"{folder}"', readonly = True) - + def _ensure_open(self) -> None: if not self.is_open(): raise InvalidOperationException("Account is not open") - diff --git a/Mailnag/common/accounts.py b/Mailnag/common/accounts.py index c2aeb21..81449d4 100644 --- a/Mailnag/common/accounts.py +++ b/Mailnag/common/accounts.py @@ -137,7 +137,38 @@ def list_messages(self) -> Iterator[tuple[str, Message, str | None, dict[str, An def fetch_text(self, mail: Mail) -> str | None: - return self._get_backend().fetch_text(mail) + ret = None + + # open mailbox for this account + try: + if not self.is_open(): + self.open() + except Exception as ex: + logging.error("Failed to open mailbox for account '%s' (%s)." % (self.name, ex)) + return ret + + try: + ret = self._get_backend().fetch_text(mail) + except Exception as ex: + # Catch exceptions here, so remaining accounts will still be checked + # if a specific account has issues. + # + # Re-throw the exception for accounts that support notifications (i.e. imap IDLE), + # so the calling idler thread can handle the error and reset the connection if needed (see idlers.py). + # NOTE: Idler threads always check single accounts (i.e. len(self._accounts) == 1), + # so there are no remaining accounts to be checked for now. + if self.supports_notifications(): + raise + else: + logging.error("An error occured while processing mails of account '%s' (%s)." % (self.name, ex)) + finally: + # leave account with notifications open, so that it can + # send notifications about new mails + if not self.supports_notifications(): + # disconnect from Email-Server + self.close() + + return ret def supports_notifications(self) -> bool: diff --git a/Mailnag/daemon/mails.py b/Mailnag/daemon/mails.py index 623011a..b82274e 100644 --- a/Mailnag/daemon/mails.py +++ b/Mailnag/daemon/mails.py @@ -43,26 +43,35 @@ def message_text(msg: Message) -> str: """Extract the text body of the given message. - The default method is to flatten the message, skip the header - and unfold the long lines. """ - fp = StringIO() - g = Generator(fp) - g.flatten(msg) - - message = fp.getvalue().splitlines() - - # skip header - n = 0 - for line in message: - n += 1 - if not len(line): - break - - t = '\n'.join(message[n:]) - t = t.replace('=\n', '') - return t.strip() - + + txt = '' + for part in msg.walk(): + if 'text' != part.get_content_maintype(): + continue + + content_transfer_encoding = part.get('Content-Transfer-Encoding') + content_type = part.get_content_type() + charset = part.get_content_charset() + + if charset is None: + charset = 'ascii' + + if content_transfer_encoding == 'quoted-printable': + from quopri import decodestring + txt += decodestring(part.get_payload()).decode(charset) + elif content_transfer_encoding == 'base64': + from base64 import b64decode + txt += b64decode(part.get_payload()).decode(charset) + else: + txt += part.get_payload() + + if not len(txt): + return None + + return txt + + # # Mail class # @@ -84,7 +93,7 @@ def __init__( self.id = id self.flags = flags self.uid = uid - + def fetch_text(self): return self.account.fetch_text(self) @@ -96,12 +105,12 @@ class MailCollector: def __init__(self, cfg: RawConfigParser, accounts: list["Account"]): self._cfg = cfg self._accounts = accounts - - + + def collect_mail(self, sort: bool = True) -> list[Mail]: mail_list: list[Mail] = [] mail_ids: dict[str, None] = {} - + for acc in self._accounts: # open mailbox for this account try: @@ -115,7 +124,7 @@ def collect_mail(self, sort: bool = True) -> list[Mail]: for folder, msg, uid, flags in acc.list_messages(): sender, subject, datetime, msgid = self._get_header(msg) id = self._get_id(msgid, acc, folder, sender, subject, datetime) - + # Discard mails with identical IDs (caused # by mails with a non-unique fallback ID, # i.e. mails received in the same folder with @@ -127,12 +136,12 @@ def collect_mail(self, sort: bool = True) -> list[Mail]: sender, id, acc, uid, flags)) mail_ids[id] = None except Exception as ex: - # Catch exceptions here, so remaining accounts will still be checked + # Catch exceptions here, so remaining accounts will still be checked # if a specific account has issues. # # Re-throw the exception for accounts that support notifications (i.e. imap IDLE), # so the calling idler thread can handle the error and reset the connection if needed (see idlers.py). - # NOTE: Idler threads always check single accounts (i.e. len(self._accounts) == 1), + # NOTE: Idler threads always check single accounts (i.e. len(self._accounts) == 1), # so there are no remaining accounts to be checked for now. if acc.supports_notifications(): raise @@ -145,11 +154,11 @@ def collect_mail(self, sort: bool = True) -> list[Mail]: # disconnect from Email-Server acc.close() - + # sort mails if sort: mail_list.sort(key = lambda m: m.datetime, reverse = True) - + return mail_list @@ -159,18 +168,18 @@ def _get_header( ) -> tuple[tuple[str, str], str, int, str]: # Get sender sender = ('', '') - + try: content = self._get_header_field(msg_dict, 'From') # get the two parts of the sender addr = email.utils.parseaddr(content) - + if len(addr) != 2: logging.warning('Malformed sender field in message.') else: sender_real = self._convert(addr[0]) sender_addr = self._convert(addr[1]) - + sender = (sender_real, sender_addr) except: pass @@ -181,11 +190,11 @@ def _get_header( subject = self._convert(content) except: subject = _('No subject') - + # Get date try: content = self._get_header_field(msg_dict, 'Date') - + # make a 10-tupel (UTC) parsed_date = email.utils.parsedate_tz(content) if parsed_date is not None: @@ -197,16 +206,16 @@ def _get_header( except: logging.warning('Email date set to zero.') datetime = 0 - + # Get message id try: msgid = self._get_header_field(msg_dict, 'Message-ID') except: msgid = '' - + return (sender, subject, datetime, msgid) - - + + def _get_header_field(self, msg_dict: Message, key: str) -> str: if key in msg_dict: value = msg_dict[key] @@ -215,7 +224,7 @@ def _get_header_field(self, msg_dict: Message, key: str) -> str: else: logging.debug("Couldn't get %s from message." % key) raise KeyError - + return value @@ -237,16 +246,16 @@ def _get_id( if len(msgid) > 0: id = hashlib.md5(msgid.encode('utf-8')).hexdigest() else: - # Fallback ID. - # Note: mails received on the same server, - # in the same folder with identical sender and - # subject but *no datetime* will have the same hash id, - # i.e. only the first mail is notified. + # Fallback ID. + # Note: mails received on the same server, + # in the same folder with identical sender and + # subject but *no datetime* will have the same hash id, + # i.e. only the first mail is notified. # (Should happen very rarely). id = hashlib.md5((acc.get_id() + folder + sender[1] + subject + str(datetime)) .encode('utf-8')).hexdigest() - + return id @@ -258,21 +267,21 @@ def __init__(self, cfg: RawConfigParser): self._cfg = cfg self._mails_by_account: dict[str, dict[str, Mail]] = {} self._mail_list: list[Mail] = [] - - + + def sync(self, accounts: list["Account"]) -> list[Mail]: needs_rebuild = False - + # collect mails from given accounts rcv_lst = MailCollector(self._cfg, accounts).collect_mail(sort = False) - + # group received mails by account tmp: dict[str, dict[str, Mail]] = {} for acc in accounts: tmp[acc.get_id()] = {} for mail in rcv_lst: tmp[mail.account.get_id()][mail.id] = mail - + # compare current mails against received mails # and remove those that are gone (probably opened in mail client). for acc_id in self._mails_by_account.keys(): @@ -284,7 +293,7 @@ def sync(self, accounts: list["Account"]) -> list[Mail]: needs_rebuild = True for mail_id in del_ids: del self._mails_by_account[acc_id][mail_id] - + # compare received mails against current mails # and add new mails. for acc_id in tmp: @@ -294,7 +303,7 @@ def sync(self, accounts: list["Account"]) -> list[Mail]: if not (mail_id in self._mails_by_account[acc_id]): self._mails_by_account[acc_id][mail_id] = tmp[acc_id][mail_id] needs_rebuild = True - + # rebuild and sort mail list if needs_rebuild: self._mail_list = [] @@ -302,7 +311,7 @@ def sync(self, accounts: list["Account"]) -> list[Mail]: for mail_id in self._mails_by_account[acc_id]: self._mail_list.append(self._mails_by_account[acc_id][mail_id]) self._mail_list.sort(key = lambda m: m.datetime, reverse = True) - + return self._mail_list @@ -313,15 +322,15 @@ class Memorizer(dict[str, str]): def __init__(self) -> None: dict.__init__(self) self._changed: bool = False - - + + def load(self) -> None: self.clear() self._changed = False - + # load last known messages from mailnag.dat dat_file = os.path.join(cfg_folder, 'mailnag.dat') - + if os.path.exists(dat_file): with open(dat_file, 'r') as f: for line in f: @@ -332,15 +341,15 @@ def load(self) -> None: # add to dict [id : flag] self[pair[0]] = pair[1] - + # save mail ids to a file def save(self, force: bool = False) -> None: if (not self._changed) and (not force): return - + if not os.path.exists(cfg_folder): os.makedirs(cfg_folder) - + dat_file = os.path.join(cfg_folder, 'mailnag.dat') with open(dat_file, 'w') as f: for id, seen_flag in list(self.items()): @@ -356,10 +365,10 @@ def sync(self, mail_list: list[Mail]) -> None: # new mail is not yet known to the memorizer self[m.id] = '0' self._changed = True - + for id in list(self.keys()): found = False - for m in mail_list: + for m in mail_list: if id == m.id: found = True # break inner for loop @@ -367,8 +376,8 @@ def sync(self, mail_list: list[Mail]) -> None: if not found: del self[id] self._changed = True - - + + # check if mail id is in the memorizer list def contains(self, id: str): return (id in self) diff --git a/Mailnag/plugins/libnotifyplugin.py b/Mailnag/plugins/libnotifyplugin.py index 1b44a67..c94c4cd 100644 --- a/Mailnag/plugins/libnotifyplugin.py +++ b/Mailnag/plugins/libnotifyplugin.py @@ -405,6 +405,11 @@ def _notify_2FA_attempt(self, mail, providers) -> bool: # but only once (different patterns may need to be tested) if body is None: body = mail.fetch_text() + + if body is None: + logging.warning("2FA match not achievable: sender=%s, subject=%s\nBody not available.", + sender, subject) + return False m = re.search(_pattern, body) if m is None: @@ -419,7 +424,8 @@ def _notify_2FA_attempt(self, mail, providers) -> bool: else: logging.debug("2FA not matched : sender=%s, subject=%s, body:\n%s", sender, subject, - dbgindent(body)) + #dbgindent(body)) + ' '+'\n '.join(str(body).splitlines())) return False From 5eed570a526d1a4dc8635a39a96184f5bc77ebea Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Auzi?= Date: Sat, 29 Nov 2025 17:04:47 +0100 Subject: [PATCH 27/49] Replace code matching group in pattern with {code} and add match of subject --- Mailnag/plugins/libnotifyplugin.py | 28 +++++++++++++++++++++------- 1 file changed, 21 insertions(+), 7 deletions(-) diff --git a/Mailnag/plugins/libnotifyplugin.py b/Mailnag/plugins/libnotifyplugin.py index c94c4cd..baafe27 100644 --- a/Mailnag/plugins/libnotifyplugin.py +++ b/Mailnag/plugins/libnotifyplugin.py @@ -60,8 +60,8 @@ 'max_visible_mails' : '10', '2fa_notifications' : True, '2fa_providers': [ - (True, 'Garmin', 'Your Security Passcode', r']*>(?P\d+)'), - (True, 'Garmin', _('Your Security Passcode'), r']*>(?P\d+)'), + (True, 'Garmin', 'Your Security Passcode', r']*>{code}'), + (True, 'Garmin', _('Your Security Passcode'), r']*>{code}'), ], } @@ -208,15 +208,15 @@ def _eval_2fa_providers(providers: list|str) -> list: @staticmethod def _check_2fa_provider_pattern(sender: str, subject: str, pattern: str) -> bool: ret = True - if not '(?P' in pattern: + if not '{code}' in pattern: ret = False - logging.error('missing "code" group pattern: (?P...\n'+ + logging.error('missing "code" group pattern: {code}...\n'+ 'sender: %s, subject: %s\npattern:\n%s', sender, subject, pattern) if ret: try: - _cre = re.compile(pattern) + _cre = re.compile(pattern.replace('{code}', r'(?P\d+)')) except re.PatternError as e: ret = False posi = '' @@ -395,6 +395,20 @@ def _notify_2FA_attempt(self, mail, providers) -> bool: if sender != _sender: continue + if _subject != subject and '{code}' in _subject: + m = re.match(_subject.replace('{code}', r'(?P\d+)'), subject) + + if m is None: + continue + + code = m.group('code') + if code: + logging.debug("2FA matched code %s: sender=%s, subject=%s", + code, + sender, subject) + break + + if subject != _subject: continue @@ -405,13 +419,13 @@ def _notify_2FA_attempt(self, mail, providers) -> bool: # but only once (different patterns may need to be tested) if body is None: body = mail.fetch_text() - + if body is None: logging.warning("2FA match not achievable: sender=%s, subject=%s\nBody not available.", sender, subject) return False - m = re.search(_pattern, body) + m = re.search(_pattern.replace('{code}', r'(?P\d+)'), body) if m is None: continue From 332ecf961bd6acc6c63c86630c5808c2cf232143 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Auzi?= Date: Fri, 5 Dec 2025 21:26:51 +0100 Subject: [PATCH 28/49] Treat subject as text, not regular expression --- Mailnag/plugins/libnotifyplugin.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Mailnag/plugins/libnotifyplugin.py b/Mailnag/plugins/libnotifyplugin.py index baafe27..4c12a0b 100644 --- a/Mailnag/plugins/libnotifyplugin.py +++ b/Mailnag/plugins/libnotifyplugin.py @@ -396,7 +396,8 @@ def _notify_2FA_attempt(self, mail, providers) -> bool: continue if _subject != subject and '{code}' in _subject: - m = re.match(_subject.replace('{code}', r'(?P\d+)'), subject) + _pattern = re.escape(_subject).replace(r'\{code\}', r'(?P\d+)') + m = re.match(_pattern, subject) if m is None: continue From 7d56db253145d8bde288c6510643f9099d514f97 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Auzi?= Date: Fri, 5 Dec 2025 22:57:42 +0100 Subject: [PATCH 29/49] Enable multiline patterns --- Mailnag/plugins/libnotifyplugin.py | 8 +- Mailnag/plugins/libnotifyplugin.ui | 403 +++++++++++++++-------------- 2 files changed, 206 insertions(+), 205 deletions(-) diff --git a/Mailnag/plugins/libnotifyplugin.py b/Mailnag/plugins/libnotifyplugin.py index 4c12a0b..2a3cbf5 100644 --- a/Mailnag/plugins/libnotifyplugin.py +++ b/Mailnag/plugins/libnotifyplugin.py @@ -643,7 +643,7 @@ def _on_btn_add_provider_clicked(self, widget: Gtk.ToolButton) -> None: b.get_object('enable').set_active(False) b.get_object('sender').set_text('') b.get_object('subject').set_text('') - b.get_object('pattern').set_text('') + b.get_object('pattern_text_buffer').set_text('') if d.run() != Gtk.ResponseType.OK: return @@ -651,7 +651,7 @@ def _on_btn_add_provider_clicked(self, widget: Gtk.ToolButton) -> None: _enable = b.get_object('enable').get_active() _sender = b.get_object('sender').get_text() _subject = b.get_object('subject').get_text() - _pattern = b.get_object('pattern').get_text() + _pattern = b.get_object('pattern_text_buffer').get_text() if not self._check_2fa_provider_pattern(_sender, _subject, _pattern) and _enabled: _enabled = False @@ -731,7 +731,7 @@ def _edit_provider(self) -> None: b.get_object('enable').set_active(_enabled) b.get_object('sender').set_text(_sender) b.get_object('subject').set_text(_subject) - b.get_object('pattern').set_text(_pattern) + b.get_object('pattern_text_buffer').set_text(_pattern) if d.run() != Gtk.ResponseType.OK: return @@ -739,7 +739,7 @@ def _edit_provider(self) -> None: _enabled = b.get_object('enable').get_active() _sender = b.get_object('sender').get_text() _subject = b.get_object('subject').get_text() - _pattern = b.get_object('pattern').get_text() + _pattern = b.get_object('pattern_text_buffer').get_text() if not self._check_2fa_provider_pattern(_sender, _subject, _pattern) and _enabled: _enabled = False diff --git a/Mailnag/plugins/libnotifyplugin.ui b/Mailnag/plugins/libnotifyplugin.ui index e70a2c2..bc3c86e 100644 --- a/Mailnag/plugins/libnotifyplugin.ui +++ b/Mailnag/plugins/libnotifyplugin.ui @@ -2,207 +2,6 @@ - - 480 - False - True - True - text-editor-symbolic - dialog - - - - False - 6 - 6 - 12 - True - True - vertical - 2 - - - True - False - end - - - gtk-cancel - True - False - False - True - - - - True - True - 0 - - - - - gtk-ok - True - False - True - False - True - - - - True - True - 1 - - - - - False - False - 2 - - - - - - True - False - 12 - 12 - 11 - 6 - - - True - False - end - Sender: - - - 0 - 0 - - - - - True - True - 6 - 6 - True - Sender - - - 1 - 0 - - - - - True - False - end - Subject: - - - 0 - 1 - - - - - True - True - 6 - 6 - True - Subject - - - 1 - 1 - - - - - True - False - end - Pattern: - - - 0 - 2 - - - - - - - - True - True - 0 - - - - - True - True - 24 - 6 - 36 - 6 - True - True - Pattern - - - False - True - 1 - - - - - True - False - 6 - 6 - - - False - True - 3 - - - - - - button1 - button2 - - - - True - False - Edit 2FA provider - - - switch_enable_provider - True - True - Enable provider - - - - - - button1 - button2 - - @@ -531,4 +330,206 @@ + + Pattern + + + 480 + False + True + True + text-editor-symbolic + dialog + + + + False + 6 + 6 + 12 + True + True + vertical + 2 + + + True + False + end + + + gtk-cancel + True + False + False + True + + + + True + True + 0 + + + + + gtk-ok + True + False + True + False + True + + + + True + True + 1 + + + + + False + False + 1 + + + + + + True + False + 12 + 12 + 11 + 6 + + + True + False + end + Sender: + + + 0 + 0 + + + + + True + True + 6 + 6 + True + Sender + + + 1 + 0 + + + + + True + False + end + Subject: + + + 0 + 1 + + + + + True + True + 6 + 6 + True + Subject + + + 1 + 1 + + + + + True + False + end + Pattern: + + + 0 + 2 + + + + + + + + False + True + 0 + + + + + 12 + True + True + 48 + 12 + pattern_text_buffer + + + True + True + 1 + 1 + + + + + True + False + 6 + 6 + + + False + True + 3 + + + + + + button1 + button2 + + + + True + False + Edit 2FA provider + + + switch_enable_provider + True + True + Enable provider + + + + + + button1 + button2 + + From bbb37fc4bb47cd78feead4affae3696344f97a45 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Auzi?= Date: Sun, 8 Feb 2026 09:25:50 +0100 Subject: [PATCH 30/49] Add GOA account id and OAuth2 refresh token --- Mailnag/backends/imap.py | 47 +++++++++++++++++++++++++++++++++++++- Mailnag/backends/pop3.py | 2 ++ Mailnag/common/accounts.py | 2 ++ tests/test_account.py | 6 ++++- 4 files changed, 55 insertions(+), 2 deletions(-) diff --git a/Mailnag/backends/imap.py b/Mailnag/backends/imap.py index 2fcc2ee..d3f6aaf 100644 --- a/Mailnag/backends/imap.py +++ b/Mailnag/backends/imap.py @@ -39,6 +39,7 @@ from Mailnag.daemon.mails import Mail, message_text from Mailnag.common.utils import dbgindent +_LOGGER = logging.getLogger(__name__) class IMAPMailboxBackend(MailboxBackend): """Implementation of IMAP mail boxes.""" @@ -54,6 +55,7 @@ def __init__( ssl: bool = True, folders: list[str] = [], idle: bool = True, + goa_account_id: str = '', **kw ): self.name = name @@ -65,9 +67,9 @@ def __init__( self.ssl = ssl # bool self.folders = [encode_mutf7(folder) for folder in folders] self.idle = idle + self.goa_account_id = goa_account_id self._conn: Optional[imaplib.IMAP4] = None - def open(self) -> None: if self._conn != None: raise InvalidOperationException("Account is aready open") @@ -125,6 +127,13 @@ def list_messages(self) -> Iterator[tuple[str, Message, str | None, dict[str, An def fetch_text(self, mail: Mail) -> str | None: self._ensure_open() + text = self._fetch_text(mail) + if text: + return text + + return self._fetch_text(mail) + + def _fetch_text(self, mail: Mail) -> str | None: assert self._conn is not None conn = self._conn @@ -241,6 +250,41 @@ def cancel_notifications(self) -> None: pass + def _refresh_token(self): + if not self.goa_account_id: + return False + try: + from gi.repository import Goa + client = Goa.Client.new_sync(None) + accounts = client.get_accounts() + targt_obj = None + for obj in accounts: + account = obj.get_account() + if not account: + continue + account_id = account.get_property('id') + if account_id == self.goa_account_id: + target_obj = obj + break + else: + _LOGGER.error("GOA account not found, id: %s", self.goa_account_id) + return False + + oauth2 = target_obj.get_oauth2_based() + if not oauth2: + _LOGGER.error("GOA account does not support OAuth2, id: %s", self.goa_account_id) + return False + + token = oauth2.call_get_access_token_sync(None) + oauth2string = 'user=%s\1auth=Bearer %s\1\1' % (self.user, token[0]) + if oauth2string != self.oauth2string: + self.oauth2string = oauth2string + _LOGGER.info("Token refreshed") + return True + except Exception as e: + _LOGGER.error("Exception in refresh_token: %s", str(e)) + + def _connect(self) -> imaplib.IMAP4: conn: Optional[imaplib.IMAP4] = None @@ -262,6 +306,7 @@ def _connect(self) -> imaplib.IMAP4: logging.warning("Using unencrypted connection for account '%s'" % self.name) if self.oauth2string != '': + self._refresh_token() conn.authenticate('XOAUTH2', lambda x: self.oauth2string) elif 'AUTH=CRAM-MD5' in conn.capabilities: # use CRAM-MD5 auth if available diff --git a/Mailnag/backends/pop3.py b/Mailnag/backends/pop3.py index 39117cc..07f00f7 100644 --- a/Mailnag/backends/pop3.py +++ b/Mailnag/backends/pop3.py @@ -45,6 +45,7 @@ def __init__( server: str = '', port: str = '', ssl: bool = True, + goa_account_id: str = '', **kw ): self.name = name @@ -54,6 +55,7 @@ def __init__( self.server = server self.port = port self.ssl = ssl # bool + self.goa_account_id = goa_account_id self._conn: Optional[poplib.POP3] = None diff --git a/Mailnag/common/accounts.py b/Mailnag/common/accounts.py index 81449d4..90e4211 100644 --- a/Mailnag/common/accounts.py +++ b/Mailnag/common/accounts.py @@ -95,6 +95,7 @@ def set_config( self.imap = config.get('imap', True) self.idle = config.get('idle', False) self.folders = config.get('folders', []) + self.goa_account_id = config.get('goa_account_id', '') self._rest_of_config = config if self._backend and self._backend.is_open(): self._backend.close() @@ -241,6 +242,7 @@ def _get_backend_config(self) -> dict[str, Any]: 'imap': self.imap, 'idle': self.idle, 'folders': self.folders, + 'goa_account_id': self.goa_account_id, } config.update(imap_pop_config) config.update(self._rest_of_config) diff --git a/tests/test_account.py b/tests/test_account.py index 6a97d0c..820b125 100644 --- a/tests/test_account.py +++ b/tests/test_account.py @@ -59,7 +59,8 @@ def test_account_should_keep_configuration(): imap=True, idle=True, folders=['a', 'b'], - mailbox_type='mybox' + mailbox_type='mybox', + goa_account_id='account_12345' ) config = account.get_config() expected_config = { @@ -75,6 +76,7 @@ def test_account_should_keep_configuration(): 'idle': True, 'folders': ['a', 'b'], 'mailbox_type': 'mybox', + 'goa_account_id': 'account_12345' } assert expected_config == config @@ -90,6 +92,7 @@ def test_account_should_store_configuration(): 'imap': True, 'idle': True, 'folders': ['a', 'b'], + 'goa_account_id': 'account_56789', } account = Account() account.set_config(mailbox_type='mybox', name='my name', enabled=True, config=new_config) @@ -107,6 +110,7 @@ def test_account_should_store_configuration(): 'idle': True, 'folders': ['a', 'b'], 'mailbox_type': 'mybox', + 'goa_account_id': 'account_56789', } assert expected_config == config From 892816d4ed808209ca636d63e71f223f881e5ce9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Auzi?= Date: Sun, 8 Feb 2026 12:30:53 +0100 Subject: [PATCH 31/49] Identify GOA account for refresh token internally --- Mailnag/backends/imap.py | 78 ++++++++++++++++++++------------------ Mailnag/backends/pop3.py | 2 - Mailnag/common/accounts.py | 2 - Mailnag/common/utils.py | 52 +++++++++++++++++++++++-- tests/test_account.py | 4 -- 5 files changed, 90 insertions(+), 48 deletions(-) diff --git a/Mailnag/backends/imap.py b/Mailnag/backends/imap.py index d3f6aaf..887e71f 100644 --- a/Mailnag/backends/imap.py +++ b/Mailnag/backends/imap.py @@ -27,6 +27,7 @@ import email import logging import re +import time from collections.abc import Callable from email.message import Message from typing import Any, Iterator, Optional @@ -37,13 +38,15 @@ from Mailnag.common.exceptions import InvalidOperationException from Mailnag.common.mutf7 import encode_mutf7, decode_mutf7 from Mailnag.daemon.mails import Mail, message_text -from Mailnag.common.utils import dbgindent +from Mailnag.common.utils import dbgindent, get_goa_account_id, refresh_goa_token _LOGGER = logging.getLogger(__name__) class IMAPMailboxBackend(MailboxBackend): """Implementation of IMAP mail boxes.""" + THROTTLE_TIME=0.25 + def __init__( self, name: str = '', @@ -55,7 +58,6 @@ def __init__( ssl: bool = True, folders: list[str] = [], idle: bool = True, - goa_account_id: str = '', **kw ): self.name = name @@ -67,8 +69,12 @@ def __init__( self.ssl = ssl # bool self.folders = [encode_mutf7(folder) for folder in folders] self.idle = idle - self.goa_account_id = goa_account_id self._conn: Optional[imaplib.IMAP4] = None + self._last_access = None + + self.goa_account_id = None + if self.oauth2string: + self.goa_account_id = get_goa_account_id(name, user) def open(self) -> None: if self._conn != None: @@ -88,7 +94,7 @@ def close(self) -> None: def is_open(self) -> bool: return self._conn != None - + def list_messages(self) -> Iterator[tuple[str, Message, str | None, dict[str, Any]]]: self._ensure_open() assert self._conn is not None @@ -111,6 +117,7 @@ def list_messages(self) -> Iterator[tuple[str, Message, str | None, dict[str, An if status != 'OK' or None in [d for d in data]: logging.debug('Folder %s in status %s | Data: %s', (folder, status, data)) continue # Bugfix LP-735071 + for num in data[0].split(): typ, msg_data = conn.uid('FETCH', num, '(BODY.PEEK[HEADER])') # header (without setting READ flag) logging.debug("Msg data (length=%d):\n%s", len(msg_data), @@ -126,14 +133,17 @@ def list_messages(self) -> Iterator[tuple[str, Message, str | None, dict[str, An yield (folder, header, num.decode("utf-8"), { 'folder' : folder }) def fetch_text(self, mail: Mail) -> str | None: - self._ensure_open() text = self._fetch_text(mail) - if text: + + # NOTE: Sometimes a server does not return the text immediately + if text is not None: return text + loggin.warning('Retry fetch_text.') return self._fetch_text(mail) def _fetch_text(self, mail: Mail) -> str | None: + self._ensure_open() assert self._conn is not None conn = self._conn @@ -250,41 +260,34 @@ def cancel_notifications(self) -> None: pass + def _throttle(self, reset=False): + if not reset and self._last_access is not None: + duration = time.time() - self._last_access + if duration < self.THROTTLE_TIME: + time.sleep(self.THROTTLE_TIME - duration) + self._last_access = time.time() + + def _refresh_token(self): + _LOGGER.debug("Refresh token...") if not self.goa_account_id: + return True + + token = refresh_goa_token(self.goa_account_id) + if token is None: + _LOGGER.debug("Refresh GOA token did not return token.") return False - try: - from gi.repository import Goa - client = Goa.Client.new_sync(None) - accounts = client.get_accounts() - targt_obj = None - for obj in accounts: - account = obj.get_account() - if not account: - continue - account_id = account.get_property('id') - if account_id == self.goa_account_id: - target_obj = obj - break - else: - _LOGGER.error("GOA account not found, id: %s", self.goa_account_id) - return False - - oauth2 = target_obj.get_oauth2_based() - if not oauth2: - _LOGGER.error("GOA account does not support OAuth2, id: %s", self.goa_account_id) - return False - - token = oauth2.call_get_access_token_sync(None) - oauth2string = 'user=%s\1auth=Bearer %s\1\1' % (self.user, token[0]) - if oauth2string != self.oauth2string: - self.oauth2string = oauth2string - _LOGGER.info("Token refreshed") + + oauth2string = 'user=%s\1auth=Bearer %s\1\1' % (self.user, token[0]) + if oauth2string == self.oauth2string: + _LOGGER.debug("OAuth2string did not change.") return True - except Exception as e: - _LOGGER.error("Exception in refresh_token: %s", str(e)) - + + self.oauth2string = oauth2string + _LOGGER.debug("Token refreshed") + return True + def _connect(self) -> imaplib.IMAP4: conn: Optional[imaplib.IMAP4] = None @@ -313,6 +316,8 @@ def _connect(self) -> imaplib.IMAP4: conn.login_cram_md5(self.user, self.password) else: conn.login(self.user, self.password) + + self._throttle(reset=True) except: try: if conn is not None: @@ -347,3 +352,4 @@ def _select_single_folder(self, conn: imaplib.IMAP4) -> None: def _ensure_open(self) -> None: if not self.is_open(): raise InvalidOperationException("Account is not open") + self._throttle() diff --git a/Mailnag/backends/pop3.py b/Mailnag/backends/pop3.py index 07f00f7..39117cc 100644 --- a/Mailnag/backends/pop3.py +++ b/Mailnag/backends/pop3.py @@ -45,7 +45,6 @@ def __init__( server: str = '', port: str = '', ssl: bool = True, - goa_account_id: str = '', **kw ): self.name = name @@ -55,7 +54,6 @@ def __init__( self.server = server self.port = port self.ssl = ssl # bool - self.goa_account_id = goa_account_id self._conn: Optional[poplib.POP3] = None diff --git a/Mailnag/common/accounts.py b/Mailnag/common/accounts.py index 90e4211..81449d4 100644 --- a/Mailnag/common/accounts.py +++ b/Mailnag/common/accounts.py @@ -95,7 +95,6 @@ def set_config( self.imap = config.get('imap', True) self.idle = config.get('idle', False) self.folders = config.get('folders', []) - self.goa_account_id = config.get('goa_account_id', '') self._rest_of_config = config if self._backend and self._backend.is_open(): self._backend.close() @@ -242,7 +241,6 @@ def _get_backend_config(self) -> dict[str, Any]: 'imap': self.imap, 'idle': self.idle, 'folders': self.folders, - 'goa_account_id': self.goa_account_id, } config.update(imap_pop_config) config.update(self._rest_of_config) diff --git a/Mailnag/common/utils.py b/Mailnag/common/utils.py index 2b8b68f..2f0a98a 100644 --- a/Mailnag/common/utils.py +++ b/Mailnag/common/utils.py @@ -27,12 +27,16 @@ from collections.abc import Callable from typing import TypeVar +import gi +gi.require_version('Goa', '1.0') +from gi.repository import Goa from Mailnag.common.dist_cfg import DBUS_BUS_NAME, DBUS_OBJ_PATH LOG_FORMAT = '%(levelname)s (%(asctime)s): %(message)s' LOG_DATE_FORMAT = '%Y-%m-%d %H:%M:%S' +_LOGGER = logging.getLogger(__name__) def init_logging( enable_stdout: bool = True, @@ -103,11 +107,51 @@ def shutdown_existing_instance(wait_for_completion: bool = True) -> None: print('FAILED') +def get_goa_account_id(name, user): + _LOGGER.debug("Get GOA account: name: %s, user: %s", name, user) + + client = Goa.Client.new_sync(None) + goa_accounts = client.get_accounts() + + for obj in goa_accounts: + account = obj.get_account() + if account is None or account.props.mail_disabled: + continue + mail = obj.get_mail() + if mail is None or not mail.props.imap_supported: + continue + + _LOGGER.debug(" account: name: %s, user: %s", + mail.props.email_address, + mail.props.imap_user_name) + if (name == mail.props.email_address + and user == mail.props.imap_user_name): + identity = account.get_property('id') + _LOGGER.debug(" account: name: %s, user: %s, id: %s", + mail.props.email_address, + mail.props.imap_user_name, + identity) + return identity + return None + +def refresh_goa_token(account_id): + client = Goa.Client.new_sync(None) + obj = client.lookup_by_id(account_id) + if obj is None: + return None + + oauth2_based = obj.get_oauth2_based() + if oauth2_based is None: + return None + + return oauth2_based.call_get_access_token_sync(None) + + def strlimit(txt: str) -> str: - txt = str(txt) - return txt[:min(80, len(txt))] + '...' + txt = str(txt) + return txt[:min(80, len(txt))] + '...' def dbgindent(txt: str) -> str: - txt = strlimit(str(txt).strip()) - return ' ' + '\n '.join(txt.splitlines()) + txt = strlimit(str(txt).strip()) + return ' ' + '\n '.join(txt.splitlines()) diff --git a/tests/test_account.py b/tests/test_account.py index 820b125..f2e227a 100644 --- a/tests/test_account.py +++ b/tests/test_account.py @@ -60,7 +60,6 @@ def test_account_should_keep_configuration(): idle=True, folders=['a', 'b'], mailbox_type='mybox', - goa_account_id='account_12345' ) config = account.get_config() expected_config = { @@ -76,7 +75,6 @@ def test_account_should_keep_configuration(): 'idle': True, 'folders': ['a', 'b'], 'mailbox_type': 'mybox', - 'goa_account_id': 'account_12345' } assert expected_config == config @@ -92,7 +90,6 @@ def test_account_should_store_configuration(): 'imap': True, 'idle': True, 'folders': ['a', 'b'], - 'goa_account_id': 'account_56789', } account = Account() account.set_config(mailbox_type='mybox', name='my name', enabled=True, config=new_config) @@ -110,7 +107,6 @@ def test_account_should_store_configuration(): 'idle': True, 'folders': ['a', 'b'], 'mailbox_type': 'mybox', - 'goa_account_id': 'account_56789', } assert expected_config == config From 3a37c553bd8a61d0ad45bf5fba13685e365de821 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Auzi?= Date: Sun, 8 Feb 2026 14:12:29 +0100 Subject: [PATCH 32/49] Standarize _LOGGER named by __name__ --- Mailnag/backends/imap.py | 16 ++++++------ Mailnag/backends/pop3.py | 16 ++++++------ Mailnag/common/accounts.py | 10 +++++--- Mailnag/common/plugins.py | 5 ++-- Mailnag/common/subproc.py | 14 ++++++----- Mailnag/common/utils.py | 2 +- Mailnag/configuration/configwindow.py | 4 ++- Mailnag/daemon/dbus.py | 4 ++- Mailnag/daemon/idlers.py | 27 +++++++++++---------- Mailnag/daemon/mailchecker.py | 7 ++++-- Mailnag/daemon/mailnagdaemon.py | 21 ++++++++-------- Mailnag/daemon/mails.py | 14 ++++++----- Mailnag/plugins/libnotifyplugin.py | 35 ++++++++++++++------------- mailnagger/daemon/__init__.py | 10 +++++--- setup.py | 6 ++--- 15 files changed, 106 insertions(+), 85 deletions(-) diff --git a/Mailnag/backends/imap.py b/Mailnag/backends/imap.py index 887e71f..8863efa 100644 --- a/Mailnag/backends/imap.py +++ b/Mailnag/backends/imap.py @@ -111,16 +111,16 @@ def list_messages(self) -> Iterator[tuple[str, Message, str | None, dict[str, An try: status, data = conn.uid('SEARCH', None, '(UNSEEN)') # ALL or UNSEEN except: - logging.warning('Folder %s does not exist.', folder) + _LOGGER.warning('Folder %s does not exist.', folder) continue if status != 'OK' or None in [d for d in data]: - logging.debug('Folder %s in status %s | Data: %s', (folder, status, data)) + _LOGGER.debug('Folder %s in status %s | Data: %s', (folder, status, data)) continue # Bugfix LP-735071 for num in data[0].split(): typ, msg_data = conn.uid('FETCH', num, '(BODY.PEEK[HEADER])') # header (without setting READ flag) - logging.debug("Msg data (length=%d):\n%s", len(msg_data), + _LOGGER.debug("Msg data (length=%d):\n%s", len(msg_data), dbgindent(msg_data)) header = None for response_part in msg_data: @@ -128,7 +128,7 @@ def list_messages(self) -> Iterator[tuple[str, Message, str | None, dict[str, An if b'BODY[HEADER]' in response_part[0]: header = email.message_from_bytes(response_part[1]) if header: - logging.debug("Msg header:\n%s", + _LOGGER.debug("Msg header:\n%s", dbgindent(header)) yield (folder, header, num.decode("utf-8"), { 'folder' : folder }) @@ -148,7 +148,7 @@ def _fetch_text(self, mail: Mail) -> str | None: conn = self._conn typ, msg_data = conn.uid('FETCH', mail.uid.encode('utf-8'), '(RFC822)') # body text (without setting READ flag) - logging.debug("Msg data (length=%d):\n%s", len(msg_data), + _LOGGER.debug("Msg data (length=%d):\n%s", len(msg_data), dbgindent(msg_data)) bbb = b'' @@ -179,7 +179,7 @@ def request_folders(self) -> list[str]: match = re.match(r'.+\s+("."|"?NIL"?)\s+"?([^"]+)"?$', d.decode('utf-8')) if match is None: - logging.warning("Folder format not supported.") + _LOGGER.warning("Folder format not supported.") else: folder = match.group(2) lst.append(decode_mutf7(folder)) @@ -209,7 +209,7 @@ def mark_as_seen(self, mails: list[Mail]) -> None: last_folder = folder status, data = conn.uid("STORE", m.flags['uid'], "+FLAGS", r"(\Seen)") except: - logging.warning("Failed to set mail with uid %s to seen on server (account: '%s').", m.flags['uid'], self.name) + _LOGGER.warning("Failed to set mail with uid %s to seen on server (account: '%s').", m.flags['uid'], self.name) finally: self._disconnect(conn) @@ -306,7 +306,7 @@ def _connect(self) -> imaplib.IMAP4: if 'STARTTLS' in conn.capabilities: conn.starttls() else: - logging.warning("Using unencrypted connection for account '%s'" % self.name) + _LOGGER.warning("Using unencrypted connection for account '%s'" % self.name) if self.oauth2string != '': self._refresh_token() diff --git a/Mailnag/backends/pop3.py b/Mailnag/backends/pop3.py index 39117cc..1684079 100644 --- a/Mailnag/backends/pop3.py +++ b/Mailnag/backends/pop3.py @@ -33,6 +33,8 @@ from Mailnag.common.exceptions import InvalidOperationException from Mailnag.daemon.mails import message_text +_LOGGER = logging.getLogger(__name__) + class POP3MailboxBackend(MailboxBackend): """Implementation of POP3 mail boxes.""" @@ -78,7 +80,7 @@ def open(self) -> None: try: conn.stls() except: - logging.warning("Using unencrypted connection for account '%s'" % self.name) + _LOGGER.warning("Using unencrypted connection for account '%s'" % self.name) conn.getwelcome() conn.user(self.user) @@ -117,7 +119,7 @@ def list_messages(self) -> Iterator[tuple[str, Message, str | None, dict[str, An # header plus first 0 lines from body message = conn.top(i, 0)[1] except: - logging.debug("Couldn't get POP message.") + _LOGGER.debug("Couldn't get POP message.") continue uid = None @@ -125,7 +127,7 @@ def list_messages(self) -> Iterator[tuple[str, Message, str | None, dict[str, An # uid of message uid = conn.uidl(i).split()[3] except: - logging.debug("Couldn't get POP message uid.") + _LOGGER.debug("Couldn't get POP message uid.") # convert list to byte sequence message_bytes = b'\n'.join(message) @@ -133,7 +135,7 @@ def list_messages(self) -> Iterator[tuple[str, Message, str | None, dict[str, An try: msg = email.message_from_bytes(message_bytes) except: - logging.debug("Couldn't get msg from POP message.") + _LOGGER.debug("Couldn't get msg from POP message.") continue yield (folder, msg, uid, {}) @@ -153,14 +155,14 @@ def fetch_text(self, mail: Mail) -> str | None: # get message size size = int(conn.stat(i)[1]) except: - logging.debug("Couldn't get msg size from POP.") + _LOGGER.debug("Couldn't get msg size from POP.") break try: # header plus lines from body message = conn.top(i, size)[1] except: - logging.debug("Couldn't get POP message.") + _LOGGER.debug("Couldn't get POP message.") break message_bytes = b'\n'.join(message) @@ -169,7 +171,7 @@ def fetch_text(self, mail: Mail) -> str | None: msg = email.message_from_bytes(message_bytes) return message_text(msg) except: - logging.debug("Couldn't get msg from POP message.") + _LOGGER.debug("Couldn't get msg from POP message.") break break diff --git a/Mailnag/common/accounts.py b/Mailnag/common/accounts.py index 81449d4..5026f0b 100644 --- a/Mailnag/common/accounts.py +++ b/Mailnag/common/accounts.py @@ -35,6 +35,8 @@ from Mailnag.common.dist_cfg import PACKAGE_NAME from Mailnag.daemon.mails import Mail +_LOGGER = logging.getLogger(__name__) + account_defaults = { 'enabled' : '0', 'type' : 'imap', @@ -144,7 +146,7 @@ def fetch_text(self, mail: Mail) -> str | None: if not self.is_open(): self.open() except Exception as ex: - logging.error("Failed to open mailbox for account '%s' (%s)." % (self.name, ex)) + _LOGGER.error("Failed to open mailbox for account '%s' (%s)." % (self.name, ex)) return ret try: @@ -160,7 +162,7 @@ def fetch_text(self, mail: Mail) -> str | None: if self.supports_notifications(): raise else: - logging.error("An error occured while processing mails of account '%s' (%s)." % (self.name, ex)) + _LOGGER.error("An error occured while processing mails of account '%s' (%s)." % (self.name, ex)) finally: # leave account with notifications open, so that it can # send notifications about new mails @@ -259,7 +261,7 @@ def __init__(self) -> None: self._secretstore = SecretStore.get_default() if self._secretstore is None: - logging.warning("Failed to create secretstore - account passwords will be stored in plaintext config file.") + _LOGGER.warning("Failed to create secretstore - account passwords will be stored in plaintext config file.") def __len__(self) -> int: @@ -374,7 +376,7 @@ def save_to_cfg(self, cfg: RawConfigParser) -> None: i = 1 for acc in self._accounts: if acc.oauth2string != '': - logging.warning("Saving of OAuth2 based accounts is not supported. Account '%s' skipped." % acc.name) + _LOGGER.warning("Saving of OAuth2 based accounts is not supported. Account '%s' skipped." % acc.name) continue section_name = "account" + str(i) diff --git a/Mailnag/common/plugins.py b/Mailnag/common/plugins.py index f6ef94b..6ada7f0 100644 --- a/Mailnag/common/plugins.py +++ b/Mailnag/common/plugins.py @@ -34,6 +34,7 @@ gi.require_version('Gtk', '3.0') from gi.repository import Gtk +_LOGGER = logging.getLogger(__name__) # # All known hook types. @@ -268,7 +269,7 @@ def load_plugins( p.init(modname, cfg, mailnag_controller) plugins.append(p) except: - logging.exception("Failed to instantiate plugin '%s'" % modname) + _LOGGER.exception("Failed to instantiate plugin '%s'" % modname) return plugins @@ -309,6 +310,6 @@ def _load_plugin_types() -> list[tuple[str, type["Plugin"]]]: if issubclass(attr, Plugin) and attr != Plugin: plugin_types.append((modname, attr)) except: - logging.exception("Error while opening plugin file '%s'" % f) + _LOGGER.exception("Error while opening plugin file '%s'" % f) return plugin_types diff --git a/Mailnag/common/subproc.py b/Mailnag/common/subproc.py index 3e654f4..ac530e4 100644 --- a/Mailnag/common/subproc.py +++ b/Mailnag/common/subproc.py @@ -23,6 +23,8 @@ from collections.abc import Callable from typing import Optional, Union +_LOGGER = logging.getLogger(__name__) + # Note : All functions of this module *are* thread-safe. # Protects access to the proc dictionary. @@ -63,7 +65,7 @@ def thread() -> None: pid = -1 try: p = subprocess.Popen(args, shell = shell) - except: logging.exception('Caught an exception.') + except: _LOGGER.exception('Caught an exception.') if p is not None: pid = p.pid @@ -96,7 +98,7 @@ def terminate_subprocesses(timeout: float = 3.0) -> None: # waiting for p.wait(). # Note : terminate() does not block. try: p.terminate() - except: logging.debug('p.terminate() failed') + except: _LOGGER.debug('p.terminate() failed') # Start a watchdog thread that will kill # all processes that didn't terminate within seconds. @@ -110,7 +112,7 @@ def terminate_subprocesses(timeout: float = 3.0) -> None: wd.stop() if not wd.triggered: - logging.info('All subprocesses exited normally.') + _LOGGER.info('All subprocesses exited normally.') # Internal Watchdog class @@ -125,7 +127,7 @@ def __init__(self, timeout: float): def run(self) -> None: self._event.wait(self._timeout) if not self._event.is_set(): - logging.warning('Process termination took too long - watchdog starts killing...') + _LOGGER.warning('Process termination took too long - watchdog starts killing...') self.triggered = True with _proc_lock: for t, p in _procs.items(): @@ -133,8 +135,8 @@ def run(self) -> None: # Kill process p and quit the thread # waiting for p to terminate (p.wait()). p.kill() - logging.info('Watchdog killed process %s' % p.pid) - except: logging.debug('p.kill() failed') + _LOGGER.info('Watchdog killed process %s' % p.pid) + except: _LOGGER.debug('p.kill() failed') def stop(self) -> None: diff --git a/Mailnag/common/utils.py b/Mailnag/common/utils.py index 2f0a98a..f000581 100644 --- a/Mailnag/common/utils.py +++ b/Mailnag/common/utils.py @@ -81,7 +81,7 @@ def try_call(f: Callable[[], T], err_retval: T) -> T: try: return f() except: - logging.exception('Caught an exception.') + _LOGGER.exception('Caught an exception.') return err_retval diff --git a/Mailnag/configuration/configwindow.py b/Mailnag/configuration/configwindow.py index 5260fed..30cd57b 100644 --- a/Mailnag/configuration/configwindow.py +++ b/Mailnag/configuration/configwindow.py @@ -21,6 +21,7 @@ import gi gi.require_version('Gtk', '3.0') +import logging import os import xdg.BaseDirectory as bd from gi.repository import Gtk @@ -35,6 +36,7 @@ import Mailnag.configuration.ui import Mailnag.configuration.desktop +_LOGGER = logging.getLogger(__name__) class ConfigWindow: def __init__(self, app): @@ -262,7 +264,7 @@ def _create_autostart(self): f.write(strn) except Exception as e: import logging - logging.info(f"failed setting autostart: {e}") + _LOGGER.info(f"failed setting autostart: {e}") return diff --git a/Mailnag/daemon/dbus.py b/Mailnag/daemon/dbus.py index 8735dce..5c4184a 100644 --- a/Mailnag/daemon/dbus.py +++ b/Mailnag/daemon/dbus.py @@ -25,6 +25,8 @@ from Mailnag.common.plugins import MailnagController from Mailnag.daemon.mails import Mail +_LOGGER = logging.getLogger(__name__) + MAX_INT32 = ((0xFFFFFFFF // 2) - 1) @@ -113,7 +115,7 @@ def _convert_mails(self, mails: list[Mail]) -> list[dict[str, Union[str, int]]]: name, addr = m.sender if m.datetime > MAX_INT32: - logging.warning('dbusservice: datetime out of range (mailnag dbus api uses int32 timestamps).') + _LOGGER.warning('dbusservice: datetime out of range (mailnag dbus api uses int32 timestamps).') datetime = 0 else: datetime = m.datetime diff --git a/Mailnag/daemon/idlers.py b/Mailnag/daemon/idlers.py index 11816eb..93944cc 100644 --- a/Mailnag/daemon/idlers.py +++ b/Mailnag/daemon/idlers.py @@ -26,6 +26,7 @@ from Mailnag.common.exceptions import InvalidOperationException from Mailnag.common.accounts import Account +_LOGGER = logging.getLogger(__name__) # # Idler class @@ -64,7 +65,7 @@ def dispose(self) -> None: self._thread.join() self._disposed = True - logging.info('Idler closed') + _LOGGER.info('Idler closed') # idle thread @@ -74,8 +75,8 @@ def _idle(self) -> None: try: self._account.open() except Exception as ex: - logging.error("Failed to open mailbox for account '%s' (%s)." % (self._account.name, ex)) - logging.info("Trying to reconnect Idler thread for account '%s' in %s minutes" % + _LOGGER.error("Failed to open mailbox for account '%s' (%s)." % (self._account.name, ex)) + _LOGGER.info("Trying to reconnect Idler thread for account '%s' in %s minutes" % (self._account.name, str(self.RECONNECT_RETRY_INTERVAL))) self._wait(60 * self.RECONNECT_RETRY_INTERVAL) # don't hammer the server @@ -90,7 +91,7 @@ def _idle(self) -> None: # (in idle callback or in dispose()) self._event.wait() except: - logging.exception('Caught an exception.') + _LOGGER.exception('Caught an exception.') # Reset current connection if the call to notify_next_change() fails # as this is probably connection related (e.g. conn terminated). self._reset_conn() @@ -109,7 +110,7 @@ def _idle(self) -> None: # Fetch and sync mails from account self._sync_callback(self._account) except: - logging.exception('Caught an exception.') + _LOGGER.exception('Caught an exception.') # Reset current connection if the call to sync_callback() (mail sync) fails. # An immediate sync has already been performed successfully on startup, # so if an error occurs here, it may be connection related (e.g. conn terminated). @@ -126,7 +127,7 @@ def _idle_callback(self, error: Optional[tuple[str, int]]) -> None: # flag the need for a connection reset in case of an error (e.g. conn terminated) if error is not None: error_type, error_val = error - logging.error("Idle callback for account '%s' returned an error (%s - %s)." % (self._account.name, error_type, str(error_val))) + _LOGGER.error("Idle callback for account '%s' returned an error (%s - %s)." % (self._account.name, error_type, str(error_val))) self._needreset = True # trigger waiting _idle thread @@ -135,7 +136,7 @@ def _idle_callback(self, error: Optional[tuple[str, int]]) -> None: def _reset_conn(self) -> None: # Try to reset the connection to recover from a possible connection error (e.g. after system suspend) - logging.info("Resetting connection for account '%s'" % self._account.name) + _LOGGER.info("Resetting connection for account '%s'" % self._account.name) try: self._account.close() except: pass self._reconnect() @@ -143,16 +144,16 @@ def _reset_conn(self) -> None: def _reconnect(self) -> None: # connection has been reset by provider -> try to reconnect - logging.info("Idler thread for account '%s' has been disconnected" % self._account.name) + _LOGGER.info("Idler thread for account '%s' has been disconnected" % self._account.name) while (not self._account.is_open()) and (not self._disposing): - logging.info("Trying to reconnect Idler thread for account '%s'." % self._account.name) + _LOGGER.info("Trying to reconnect Idler thread for account '%s'." % self._account.name) try: self._account.open() - logging.info("Successfully reconnected Idler thread for account '%s'." % self._account.name) + _LOGGER.info("Successfully reconnected Idler thread for account '%s'." % self._account.name) except Exception as ex: - logging.error("Failed to reconnect Idler thread for account '%s' (%s)." % (self._account.name, ex)) - logging.info("Trying to reconnect Idler thread for account '%s' in %s minutes" % + _LOGGER.error("Failed to reconnect Idler thread for account '%s' (%s)." % (self._account.name, ex)) + _LOGGER.info("Trying to reconnect Idler thread for account '%s' in %s minutes" % (self._account.name, str(self.RECONNECT_RETRY_INTERVAL))) self._wait(60 * self.RECONNECT_RETRY_INTERVAL) # don't hammer the server @@ -187,7 +188,7 @@ def start(self) -> None: idler.start() self._idlerlist.append(idler) except Exception as ex: - logging.error("Error: Failed to create an idler thread for account '%s' (%s)" % (acc.name, ex)) + _LOGGER.error("Error: Failed to create an idler thread for account '%s' (%s)" % (acc.name, ex)) def dispose(self) -> None: diff --git a/Mailnag/daemon/mailchecker.py b/Mailnag/daemon/mailchecker.py index e09d196..d5a8e7f 100644 --- a/Mailnag/daemon/mailchecker.py +++ b/Mailnag/daemon/mailchecker.py @@ -30,6 +30,7 @@ from Mailnag.daemon.dbus import DBusService from Mailnag.daemon.mails import MailSyncer, Memorizer, Mail +_LOGGER = logging.getLogger(__name__) class MailChecker: @@ -56,13 +57,15 @@ def check(self, accounts: list[Account]) -> None: # make sure multiple threads (idler and polling thread) # don't check for mails simultaneously. with self._mailcheck_lock: - logging.info('Checking %s email account(s).' % len(accounts)) + _LOGGER.info('Checking %s email account(s).' % len(accounts)) + if _LOGGER.getEffectiveLevel() == logging.DEBUG and len(accounts): + _LOGGER.debug("Accounts:\n - %s", '\n - '.join([a.name for a in accounts])) for f in self._hookreg.get_hook_funcs(HookTypes.MAIL_CHECK): try_call(f, None) if self._conntest.is_offline(): - logging.warning('No internet connection.') + _LOGGER.warning('No internet connection.') return all_mails = self._mailsyncer.sync(accounts) diff --git a/Mailnag/daemon/mailnagdaemon.py b/Mailnag/daemon/mailnagdaemon.py index 516c928..dee4aa3 100644 --- a/Mailnag/daemon/mailnagdaemon.py +++ b/Mailnag/daemon/mailnagdaemon.py @@ -39,6 +39,7 @@ from Mailnag.common.config import read_cfg from Mailnag.common.utils import try_call +_LOGGER = logging.getLogger(__name__) testmode_mapping = { 'auto' : TestModes.NETWORKMONITOR, # Legacy, deprecated @@ -107,12 +108,12 @@ def dispose(self) -> None: # clean up resources if (self._start_thread != None) and (self._start_thread.is_alive()): self._start_thread.join() - logging.info('Starter thread exited successfully.') + _LOGGER.info('Starter thread exited successfully.') if (self._poll_thread is not None) and (self._poll_thread.is_alive()): self._poll_thread_stop.set() self._poll_thread.join() - logging.info('Polling thread exited successfully.') + _LOGGER.info('Polling thread exited successfully.') if self._idlrunner is not None: self._idlrunner.dispose() @@ -190,7 +191,7 @@ def _start(self) -> None: try: self._mailchecker.check(self._accounts) except: - logging.exception('Caught an exception.') + _LOGGER.exception('Caught an exception.') idle_accounts = self._get_idle_accounts(self._accounts) non_idle_accounts = self._get_non_idle_accounts(self._accounts) @@ -210,7 +211,7 @@ def poll_func() -> None: try: self._mailchecker.check(non_idle_accounts) except: - logging.exception('Caught an exception.') + _LOGGER.exception('Caught an exception.') self._poll_thread = threading.Thread(target = poll_func) self._poll_thread.start() @@ -225,7 +226,7 @@ def sync_func(account: Account) -> None: self._idlrunner = IdlerRunner(idle_accounts, sync_func, idle_timeout) self._idlrunner.start() except Exception as ex: - logging.exception('Caught an exception.') + _LOGGER.exception('Caught an exception.') if self._fatal_error_handler is not None: self._fatal_error_handler(ex) @@ -233,7 +234,7 @@ def sync_func(account: Account) -> None: def _wait_for_inet_connection(self) -> bool: """Wait that internet connection is available.""" if self._conntest.is_offline(): - logging.info('Waiting for internet connection...') + _LOGGER.info('Waiting for internet connection...') while True: if self._disposed: @@ -266,9 +267,9 @@ def _load_plugins(self, cfg: RawConfigParser) -> None: for p in self._plugins: try: p.enable() - logging.info("Successfully enabled plugin '%s'." % p.get_modname()) + _LOGGER.info("Successfully enabled plugin '%s'." % p.get_modname()) except: - logging.error("Failed to enable plugin '%s'." % p.get_modname()) + _LOGGER.error("Failed to enable plugin '%s'." % p.get_modname()) def _unload_plugins(self) -> None: @@ -281,9 +282,9 @@ def _unload_plugins(self) -> None: p.disable() except: err = True - logging.error("Failed to disable plugin '%s'." % p.get_modname()) + _LOGGER.error("Failed to disable plugin '%s'." % p.get_modname()) if not err: - logging.info('Plugins disabled successfully.') + _LOGGER.info('Plugins disabled successfully.') diff --git a/Mailnag/daemon/mails.py b/Mailnag/daemon/mails.py index b82274e..d4b78e4 100644 --- a/Mailnag/daemon/mails.py +++ b/Mailnag/daemon/mails.py @@ -37,6 +37,8 @@ from Mailnag.common.i18n import _ from Mailnag.common.config import cfg_folder +_LOGGER = logging.getLogger(__name__) + if TYPE_CHECKING: from Mailnag.common.accounts import Account @@ -117,7 +119,7 @@ def collect_mail(self, sort: bool = True) -> list[Mail]: if not acc.is_open(): acc.open() except Exception as ex: - logging.error("Failed to open mailbox for account '%s' (%s)." % (acc.name, ex)) + _LOGGER.error("Failed to open mailbox for account '%s' (%s)." % (acc.name, ex)) continue try: @@ -146,7 +148,7 @@ def collect_mail(self, sort: bool = True) -> list[Mail]: if acc.supports_notifications(): raise else: - logging.error("An error occured while processing mails of account '%s' (%s)." % (acc.name, ex)) + _LOGGER.error("An error occured while processing mails of account '%s' (%s)." % (acc.name, ex)) finally: # leave account with notifications open, so that it can # send notifications about new mails @@ -175,7 +177,7 @@ def _get_header( addr = email.utils.parseaddr(content) if len(addr) != 2: - logging.warning('Malformed sender field in message.') + _LOGGER.warning('Malformed sender field in message.') else: sender_real = self._convert(addr[0]) sender_addr = self._convert(addr[1]) @@ -201,10 +203,10 @@ def _get_header( # convert 10-tupel to seconds incl. timezone shift datetime = email.utils.mktime_tz(parsed_date) else: - logging.warning('Email date set to zero.') + _LOGGER.warning('Email date set to zero.') datetime = 0 except: - logging.warning('Email date set to zero.') + _LOGGER.warning('Email date set to zero.') datetime = 0 # Get message id @@ -222,7 +224,7 @@ def _get_header_field(self, msg_dict: Message, key: str) -> str: elif key.lower() in msg_dict: value = msg_dict[key.lower()] else: - logging.debug("Couldn't get %s from message." % key) + _LOGGER.debug("Couldn't get %s from message." % key) raise KeyError return value diff --git a/Mailnag/plugins/libnotifyplugin.py b/Mailnag/plugins/libnotifyplugin.py index 2a3cbf5..a2605a7 100644 --- a/Mailnag/plugins/libnotifyplugin.py +++ b/Mailnag/plugins/libnotifyplugin.py @@ -51,6 +51,7 @@ NOTIFICATION_MODE_SINGLE = '2' NOTIFICATION_MODE_SILENT = '4' +_LOGGER = logging.getLogger(__name__) DESKTOP_ENV_VARS_FOR_SUPPORT_TEST = ('XDG_CURRENT_DESKTOP', 'GDMSESSION') SUPPORTED_DESKTOP_ENVIRONMENTS = ("gnome", "cinnamon") @@ -210,7 +211,7 @@ def _check_2fa_provider_pattern(sender: str, subject: str, pattern: str) -> bool ret = True if not '{code}' in pattern: ret = False - logging.error('missing "code" group pattern: {code}...\n'+ + _LOGGER.error('missing "code" group pattern: {code}...\n'+ 'sender: %s, subject: %s\npattern:\n%s', sender, subject, pattern) @@ -227,7 +228,7 @@ def _check_2fa_provider_pattern(sender: str, subject: str, pattern: str) -> bool i -= 1 posi = ' ' + posi posi = '\n' + posi - logging.error('pattern is incorrect regexp:\n'+ + _LOGGER.error('pattern is incorrect regexp:\n'+ 'sender: %s, subject: %s\npattern: %s\n%s%s', sender, subject, e.msg, pattern, posi) @@ -404,7 +405,7 @@ def _notify_2FA_attempt(self, mail, providers) -> bool: code = m.group('code') if code: - logging.debug("2FA matched code %s: sender=%s, subject=%s", + _LOGGER.debug("2FA matched code %s: sender=%s, subject=%s", code, sender, subject) break @@ -413,7 +414,7 @@ def _notify_2FA_attempt(self, mail, providers) -> bool: if subject != _subject: continue - logging.debug("2FA pre-matched : sender=%s, subject=%s", + _LOGGER.debug("2FA pre-matched : sender=%s, subject=%s", sender, subject) # fetch the body text only when sender and subject match @@ -422,7 +423,7 @@ def _notify_2FA_attempt(self, mail, providers) -> bool: body = mail.fetch_text() if body is None: - logging.warning("2FA match not achievable: sender=%s, subject=%s\nBody not available.", + _LOGGER.warning("2FA match not achievable: sender=%s, subject=%s\nBody not available.", sender, subject) return False @@ -431,13 +432,13 @@ def _notify_2FA_attempt(self, mail, providers) -> bool: continue code = m.group('code') - logging.debug("2FA matched code %s: sender=%s, subject=%s, body:\n%s", + _LOGGER.debug("2FA matched code %s: sender=%s, subject=%s, body:\n%s", code, sender, subject, dbgindent(body)) break else: - logging.debug("2FA not matched : sender=%s, subject=%s, body:\n%s", + _LOGGER.debug("2FA not matched : sender=%s, subject=%s, body:\n%s", sender, subject, #dbgindent(body)) ' '+'\n '.join(str(body).splitlines())) @@ -579,9 +580,9 @@ def _notification_action_handler( stdin=PIPE, close_fds=True) pipe.communicate(input=code.encode('utf-8')) - logging.debug('xclip set text:%s', code) + _LOGGER.debug('xclip set text:%s', code) except: - logging.exception('xclip set text failed.') + _LOGGER.exception('xclip set text failed.') controller.mark_mail_as_read(user_data[0].id) except InvalidOperationException: @@ -618,25 +619,25 @@ def _is_supported_environment() -> bool: def _on_close(self, widget: Gtk.Dialog) -> None: - logging.debug('on_close') + _LOGGER.debug('on_close') self._dialog.hide() self._dialog.response(Gtk.ResponseType.CLOSE) def _on_btn_cancel_clicked(self, widget: Gtk.Button) -> None: - logging.debug('on_btn_cancel_clicked') + _LOGGER.debug('on_btn_cancel_clicked') self._dialog.hide() self._dialog.response(Gtk.ResponseType.CANCEL) def _on_btn_ok_clicked(self, widget: Gtk.Button) -> None: - logging.debug('on_btn_ok_clicked') + _LOGGER.debug('on_btn_ok_clicked') self._dialog.hide() self._dialog.response(Gtk.ResponseType.OK) def _on_btn_add_provider_clicked(self, widget: Gtk.ToolButton) -> None: - logging.debug('on_btn_add_provider_clicked') + _LOGGER.debug('on_btn_add_provider_clicked') b = self._builder d = self._dialog @@ -680,7 +681,7 @@ def _show_confirmation_dialog(self, text: str) -> None: def _on_btn_remove_provider_clicked(self, widget: Gtk.ToolButton) -> None: - logging.debug('on_btn_remove_provider_clicked') + _LOGGER.debug('on_btn_remove_provider_clicked') treeselection = self._treeview_2FA_providers.get_selection() model, iter = treeselection.get_selected() @@ -751,12 +752,12 @@ def _edit_provider(self) -> None: def _on_btn_edit_provider_clicked(self, widget: Gtk.ToolButton) -> None: - logging.debug('on_btn_edit_provider_clicked') + _LOGGER.debug('on_btn_edit_provider_clicked') self._edit_provider() def _on_provider_toggled(self, cell: Gtk.CellRendererToggle, path: Gtk.TreePath) -> None: - logging.debug('on_provider_toggled') + _LOGGER.debug('on_provider_toggled') model = self._liststore_2FA_providers iter = model.get_iter(path) @@ -772,7 +773,7 @@ def _on_provider_toggled(self, cell: Gtk.CellRendererToggle, path: Gtk.TreePath) def _on_provider_row_activated(self, view: Gtk.TreeView, path: Gtk.TreePath, column: Gtk.TreeViewColumn) -> None: - logging.debug('on_provider_row_activated') + _LOGGER.debug('on_provider_row_activated') for id in ('btn_remove_2FA_provider', 'btn_edit_2FA_provider'): self._builder.get_object(id).set_sensitive(True) diff --git a/mailnagger/daemon/__init__.py b/mailnagger/daemon/__init__.py index 50d11c7..09e41f9 100755 --- a/mailnagger/daemon/__init__.py +++ b/mailnagger/daemon/__init__.py @@ -42,6 +42,8 @@ from Mailnag.common.exceptions import InvalidOperationException from Mailnag.daemon.mailnagdaemon import MailnagDaemon +_LOGGER = logging.getLogger(__name__) + PROGNAME = 'mailnagger' LOG_LEVEL = logging.DEBUG @@ -62,11 +64,11 @@ def thread() -> None: event.wait(10.0) if not event.is_set(): - logging.warning('Cleanup takes too long. Enforcing termination.') + _LOGGER.warning('Cleanup takes too long. Enforcing termination.') os._exit(os.EX_SOFTWARE) if threading.active_count() > 1: - logging.warning('There are still active threads. Enforcing termination.') + _LOGGER.warning('There are still active threads. Enforcing termination.') os._exit(os.EX_SOFTWARE) @@ -122,7 +124,7 @@ def main() -> int: try: if not cfg_exists(): - logging.critical( + _LOGGER.critical( "Cannot find configuration file. " + "Please run mailnagger-config first.") exit(1) @@ -150,7 +152,7 @@ def shutdown_request_hdlr() -> None: except KeyboardInterrupt: pass # ctrl+c pressed finally: - logging.info('Shutting down...') + _LOGGER.info('Shutting down...') cleanup(daemon) return os.EX_OK diff --git a/setup.py b/setup.py index 522b31e..ae6c2e9 100755 --- a/setup.py +++ b/setup.py @@ -27,7 +27,7 @@ long_description = (this_directory / "README.md").read_text() -logger = logging.getLogger(__name__) +_LOGGER = logging.getLogger(__name__) # TODO : This hack won't work with --user and --home options PREFIX = sysconfig.get_path('data') @@ -56,8 +56,8 @@ def run(self): else: err = "UNKNOWN_ERR" raise Warning("gen_locales returned %d (%s)" % (rc, err)) except Exception as e: - logger.error("Building locales failed.") - logger.error("Error: %s" % str(e)) + _LOGGER.error("Building locales failed.") + _LOGGER.error("Error: %s" % str(e)) sys.exit(1) # remove patch dir (if existing) From 7db8a4cdae8cc0de316a127c14f7cb284efe7ada Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Auzi?= Date: Sun, 8 Feb 2026 18:47:02 +0100 Subject: [PATCH 33/49] Improve configuration (file and UI) --- Mailnag/plugins/libnotifyplugin.py | 97 +++++++++++++++++++++++++++--- Mailnag/plugins/libnotifyplugin.ui | 1 + 2 files changed, 91 insertions(+), 7 deletions(-) diff --git a/Mailnag/plugins/libnotifyplugin.py b/Mailnag/plugins/libnotifyplugin.py index a2605a7..b3d83e1 100644 --- a/Mailnag/plugins/libnotifyplugin.py +++ b/Mailnag/plugins/libnotifyplugin.py @@ -32,6 +32,9 @@ import re from subprocess import Popen, PIPE import logging +import json +import csv +import copy from collections.abc import Callable from typing import Any, Optional from gi.repository import Notify, Gio, Gtk @@ -42,6 +45,7 @@ from Mailnag.common.exceptions import InvalidOperationException from Mailnag.daemon.mails import Mail from Mailnag.common.utils import dbgindent +from Mailnag.common.config import cfg_folder from mailnagger.resources import get_resource_text import Mailnag.plugins @@ -56,16 +60,21 @@ DESKTOP_ENV_VARS_FOR_SUPPORT_TEST = ('XDG_CURRENT_DESKTOP', 'GDMSESSION') SUPPORTED_DESKTOP_ENVIRONMENTS = ("gnome", "cinnamon") +cfg_2fa_providers_file_json = os.path.join(cfg_folder, '2fa_providers.json') +cfg_2fa_providers_file = os.path.join(cfg_folder, '2fa_providers.tsv') + plugin_defaults = { 'notification_mode' : NOTIFICATION_MODE_SHORT_SUMMARY, 'max_visible_mails' : '10', '2fa_notifications' : True, - '2fa_providers': [ - (True, 'Garmin', 'Your Security Passcode', r']*>{code}'), - (True, 'Garmin', _('Your Security Passcode'), r']*>{code}'), - ], } +_2fa_providers_keys = ('enabled', 'provider', 'subject_re', 'text_re') +default_2fa_providers = [ + (True, 'Garmin', 'Your Security Passcode', r']*>{code}'), + (True, 'Garmin', _('Your Security Passcode'), r']*>{code}'), +] + class LibNotifyPlugin(Plugin): def __init__(self) -> None: # dict that tracks all notifications that need to be closed @@ -188,6 +197,7 @@ def get_config_ui(self) -> Gtk.Box: 'btn_edit_provider_clicked': self._on_btn_edit_provider_clicked, 'provider_toggled': self._on_provider_toggled, 'provider_row_activated': self._on_provider_row_activated, + 'expander_2fa_providers_expanded': self._on_expander_2fa_providers_expanded, }) self._builder = builder @@ -196,8 +206,17 @@ def get_config_ui(self) -> Gtk.Box: self._switch_2FA_notifications = builder.get_object('switch_2FA_notifications') self._liststore_2FA_providers = builder.get_object('liststore_2FA_providers') self._treeview_2FA_providers = builder.get_object('treeview_2FA_providers') + + self._scrolled_window = builder.get_object('scrolledwindow1') + self._scrolled_window.set_min_content_height(120) + self._scrolled_window.set_min_content_width(348) + self._scrolled_window.set_propagate_natural_height(True) + self._scrolled_window.set_propagate_natural_width(True) + self._scrolled_window.set_max_content_height(348) + return builder.get_object('box1') + @staticmethod def _eval_2fa_providers(providers: list|str) -> list: if isinstance(providers,list): @@ -235,18 +254,74 @@ def _check_2fa_provider_pattern(sender: str, subject: str, pattern: str) -> bool return ret + def get_config(self): + config = super().get_config() + config['2fa_providers'] = self._load_2fa_provider_from_config(config) + return config + + def _load_2fa_provider_from_config(self, config): + lv = None + try: + # Version CSV + with open(cfg_2fa_providers_file, 'r', encoding='utf-8') as fin: + lv = list(csv.DictReader(fin, fieldnames=_2fa_providers_keys, delimiter='\t')) + except FileNotFoundError: + pass + # Version json + with open(cfg_2fa_providers_file_json, 'r', encoding='utf-8') as fin: + lv = json.load(fin) + except FileNotFoundError: + pass + if lv is not None: + providers = [] + for v in lv: + values = [] + if isinstance(v, dict): + for k in _2fa_providers_keys: + if k in v: + values.append(v[k]) + elif isinstance(v, list): + values = copy.deepcopy(v) + + if isinstance(values[0], str): + if values[0].lower() in ('y', 'yes', 'true', 'on'): + values[0] = True + else: + values[0] = False + if len(values) == len(_2fa_providers_keys): + providers.append(values) + return providers + + if '2fa_providers' in config: + return self._eval_2fa_providers(config['2fa_providers']) + + return copy.deepcopy(default_2fa_providers) def load_ui_from_config(self, config_ui: Gtk.Widget) -> None: config = self.get_config() radio = [r for m, r in self._radio_mapping if m == config['notification_mode']][0] radio.set_active(True) self._switch_2FA_notifications.set_active(config['2fa_notifications']) - providers = self._eval_2fa_providers(config['2fa_providers']) + providers = config['2fa_providers'] for (_enabled, _sender, _subject, _pattern) in providers: if _enabled and not self._check_2fa_provider_pattern(_sender, _subject, _pattern): _enabled = False self._liststore_2FA_providers.append([_enabled, _sender, _subject, _pattern]) + def _save_2fa_provider_to_config(self, providers): + named_providers = [] + for v in providers: + nv = dict() + for i in range(len(_2fa_providers_keys)): + k = _2fa_providers_keys[i] + nv[k] = v[i] + named_providers.append(nv) + with open(cfg_2fa_providers_file, 'wt', encoding='utf-8') as fout: + #json.dump(named_providers, fout, indent=2, ensure_ascii=False) + w = csv.DictWriter(fout, fieldnames=_2fa_providers_keys, delimiter='\t') + w.writeheader() + w.writerows(named_providers) + def save_ui_to_config(self, config_ui: Gtk.Widget) -> None: config = self.get_config() @@ -256,8 +331,9 @@ def save_ui_to_config(self, config_ui: Gtk.Widget) -> None: providers = [] for row in self._liststore_2FA_providers: providers.append(tuple(row)) - config['2fa_providers']=providers - + self._save_2fa_provider_to_config(providers) + if '2fa_providers' in config: + del config['2fa_providers'] def _notify_async(self, new_mails: list[Mail], all_mails: list[Mail]) -> None: @@ -778,6 +854,13 @@ def _on_provider_row_activated(self, view: Gtk.TreeView, path: Gtk.TreePath, col self._builder.get_object(id).set_sensitive(True) + def _on_expander_2fa_providers_expanded(self, expander, pspec) -> None: + wnd = expander.get_toplevel() + + w = wnd.get_size().width + wnd.resize(w, 1) + + def ellipsize(str: str, max_len: int) -> str: if max_len < 3: max_len = 3 if len(str) <= max_len: diff --git a/Mailnag/plugins/libnotifyplugin.ui b/Mailnag/plugins/libnotifyplugin.ui index bc3c86e..dd489f3 100644 --- a/Mailnag/plugins/libnotifyplugin.ui +++ b/Mailnag/plugins/libnotifyplugin.ui @@ -126,6 +126,7 @@ False True True + True From 3c275843932689cdd56dcf063b58786e2a8f7905 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Auzi?= Date: Wed, 11 Feb 2026 22:02:06 +0100 Subject: [PATCH 34/49] Fix logging and use BODY.PEEK for lightness --- Mailnag/backends/imap.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/Mailnag/backends/imap.py b/Mailnag/backends/imap.py index 8863efa..2cd2a37 100644 --- a/Mailnag/backends/imap.py +++ b/Mailnag/backends/imap.py @@ -139,7 +139,7 @@ def fetch_text(self, mail: Mail) -> str | None: if text is not None: return text - loggin.warning('Retry fetch_text.') + _LOGGER.warning('Retry fetch_text.') return self._fetch_text(mail) def _fetch_text(self, mail: Mail) -> str | None: @@ -147,7 +147,8 @@ def _fetch_text(self, mail: Mail) -> str | None: assert self._conn is not None conn = self._conn - typ, msg_data = conn.uid('FETCH', mail.uid.encode('utf-8'), '(RFC822)') # body text (without setting READ flag) + #AAU#typ, msg_data = conn.uid('FETCH', mail.uid.encode('utf-8'), '(RFC822)') # body text (setting READ flag) + typ, msg_data = conn.uid('FETCH', mail.uid.encode('utf-8'), '(BODY.PEEK[])') # body text (without setting READ flag) _LOGGER.debug("Msg data (length=%d):\n%s", len(msg_data), dbgindent(msg_data)) From a919b23b4bd6312a02556998e7081726ebb6c7df Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Auzi?= Date: Wed, 11 Feb 2026 22:06:03 +0100 Subject: [PATCH 35/49] Improve message (html-)text processing --- Mailnag/daemon/mails.py | 127 ++++++++++++++++++++++++++++++++++------ 1 file changed, 108 insertions(+), 19 deletions(-) diff --git a/Mailnag/daemon/mails.py b/Mailnag/daemon/mails.py index d4b78e4..8c4b3af 100644 --- a/Mailnag/daemon/mails.py +++ b/Mailnag/daemon/mails.py @@ -27,6 +27,9 @@ import os import logging import hashlib +import re +import html +from html.parser import HTMLParser from io import StringIO from configparser import RawConfigParser @@ -42,36 +45,122 @@ if TYPE_CHECKING: from Mailnag.common.accounts import Account - -def message_text(msg: Message) -> str: +def clean_html(raw_html: str) -> str: + if not raw_html: + return '' + + class HTMLTextExtractor(HTMLParser): + BLOCK_TAGS = { + 'p', 'div', 'br', 'hr', 'h1', 'h2', 'h3', + 'h4', 'h5', 'h6', 'li', 'tr', 'header', 'footer' + } + START_SPACED_TAGS = {'a'} + END_SPACED_TAGS = {'td', 'th', 'a'} + IGNORE_TAGS = {'style', 'script', 'head', 'meta', 'title'} + + def __init__(self): + super().__init__() + self.result = [] + self.ignore = False + + def _handle_newline(self): + if self.result and self.result[-1] != '\n': + self.result.append('\n') + + def _handle_space(self): + if (self.result + and not self.result[-1][-1:].isdigit() + and self.result[-1] != '\n'): + self.result.append(' ') + + def handle_starttag(self, tag, attrs): + if tag in self.IGNORE_TAGS: + self.ignore = True + + if self.ignore: + return + + if tag in self.START_SPACED_TAGS: + self._handle_space() + + def handle_endtag(self, tag): + if tag in self.IGNORE_TAGS: + self.ignore = False + return + + if self.ignore: + return + + if tag in self.END_SPACED_TAGS: + self._handle_space() + elif tag in self.BLOCK_TAGS: + self._handle_newline() + + def handle_data(self, data): + if self.ignore: + return + + cleaned_data = data.strip() + if cleaned_data: + self.result.append(cleaned_data) + + def get_text(self): + full_text = "".join(self.result) + + lines = [line.strip() for line in full_text.splitlines()] + clean_text = "\n".join(lines) + clean_text = re.sub(r'[ \t]+', ' ', clean_text) + return re.sub(r'\n{2,}', '\n\n', clean_text).strip() + + parser = HTMLTextExtractor() + parser.feed(raw_html) + return parser.get_text() + +def dumps(text): + with open('dumps.txt', 'w', encoding='utf-8') as fout: + fout.write(text) + return text + +def message_text(msg: Message) -> str | None: """Extract the text body of the given message. """ - txt = '' + txt = None + html_txt = None for part in msg.walk(): - if 'text' != part.get_content_maintype(): + if part.is_multipart(): continue - content_transfer_encoding = part.get('Content-Transfer-Encoding') content_type = part.get_content_type() - charset = part.get_content_charset() - if charset is None: - charset = 'ascii' + if content_type not in ('text/plain', 'text/html'): + continue - if content_transfer_encoding == 'quoted-printable': - from quopri import decodestring - txt += decodestring(part.get_payload()).decode(charset) - elif content_transfer_encoding == 'base64': - from base64 import b64decode - txt += b64decode(part.get_payload()).decode(charset) - else: - txt += part.get_payload() + payload = part.get_payload(decode=True) + if not payload: + continue + + charset = part.get_content_charset() or 'utf-8' + try: + content = payload.decode(charset, errors='replace') + except Exception: + content = payload.decode('latin-1', errors='replace') + + if content_type == 'text/plain': + # On a trouvé la version texte brut, c'est l'idéal pour les codes ! + txt = content.strip() + if txt: + break + elif content_type == 'text/html': + html_txt = content.strip() + + if txt: + return txt - if not len(txt): - return None + if html_txt: + return clean_html(html_txt) - return txt + return None # From 167db09a6920bf1c67fc5a436f058a976b26e07e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Auzi?= Date: Wed, 11 Feb 2026 22:07:16 +0100 Subject: [PATCH 36/49] Cleanup configuration processing --- Mailnag/plugins/libnotifyplugin.py | 12 ++---------- 1 file changed, 2 insertions(+), 10 deletions(-) diff --git a/Mailnag/plugins/libnotifyplugin.py b/Mailnag/plugins/libnotifyplugin.py index b3d83e1..450ccb3 100644 --- a/Mailnag/plugins/libnotifyplugin.py +++ b/Mailnag/plugins/libnotifyplugin.py @@ -60,7 +60,6 @@ DESKTOP_ENV_VARS_FOR_SUPPORT_TEST = ('XDG_CURRENT_DESKTOP', 'GDMSESSION') SUPPORTED_DESKTOP_ENVIRONMENTS = ("gnome", "cinnamon") -cfg_2fa_providers_file_json = os.path.join(cfg_folder, '2fa_providers.json') cfg_2fa_providers_file = os.path.join(cfg_folder, '2fa_providers.tsv') plugin_defaults = { @@ -71,8 +70,8 @@ _2fa_providers_keys = ('enabled', 'provider', 'subject_re', 'text_re') default_2fa_providers = [ - (True, 'Garmin', 'Your Security Passcode', r']*>{code}'), - (True, 'Garmin', _('Your Security Passcode'), r']*>{code}'), + (True, 'Garmin', 'Your Security Passcode', r'Use this one-time code for your account\n{code}\n'), + (True, 'Garmin', _('Your Security Passcode'), r'voici votre code de sécurité.\n{code}\n'), ] class LibNotifyPlugin(Plugin): @@ -262,14 +261,8 @@ def get_config(self): def _load_2fa_provider_from_config(self, config): lv = None try: - # Version CSV with open(cfg_2fa_providers_file, 'r', encoding='utf-8') as fin: lv = list(csv.DictReader(fin, fieldnames=_2fa_providers_keys, delimiter='\t')) - except FileNotFoundError: - pass - # Version json - with open(cfg_2fa_providers_file_json, 'r', encoding='utf-8') as fin: - lv = json.load(fin) except FileNotFoundError: pass if lv is not None: @@ -317,7 +310,6 @@ def _save_2fa_provider_to_config(self, providers): nv[k] = v[i] named_providers.append(nv) with open(cfg_2fa_providers_file, 'wt', encoding='utf-8') as fout: - #json.dump(named_providers, fout, indent=2, ensure_ascii=False) w = csv.DictWriter(fout, fieldnames=_2fa_providers_keys, delimiter='\t') w.writeheader() w.writerows(named_providers) From 1f5dc004a4949e3c830bdc4a0017cb083c159e03 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Auzi?= Date: Wed, 11 Feb 2026 23:27:11 +0100 Subject: [PATCH 37/49] Update messages --- po/bg.po | 144 +++++++++++++++++++++++----------------------- po/ca.po | 144 +++++++++++++++++++++++----------------------- po/cs.po | 144 +++++++++++++++++++++++----------------------- po/de.po | 144 +++++++++++++++++++++++----------------------- po/es.po | 144 +++++++++++++++++++++++----------------------- po/fi.po | 144 +++++++++++++++++++++++----------------------- po/fr.po | 138 ++++++++++++++++++++++---------------------- po/gl.po | 144 +++++++++++++++++++++++----------------------- po/hr.po | 144 +++++++++++++++++++++++----------------------- po/id.po | 144 +++++++++++++++++++++++----------------------- po/it.po | 144 +++++++++++++++++++++++----------------------- po/mailnagger.pot | 124 +++++++++++++++++++-------------------- po/pl.po | 144 +++++++++++++++++++++++----------------------- po/pt.po | 144 +++++++++++++++++++++++----------------------- po/pt_BR.po | 144 +++++++++++++++++++++++----------------------- po/ru.po | 144 +++++++++++++++++++++++----------------------- po/sr.po | 144 +++++++++++++++++++++++----------------------- po/sv.po | 144 +++++++++++++++++++++++----------------------- po/tr.po | 144 +++++++++++++++++++++++----------------------- po/uk.po | 144 +++++++++++++++++++++++----------------------- po/zh_CN.po | 144 +++++++++++++++++++++++----------------------- po/zh_TW.po | 144 +++++++++++++++++++++++----------------------- 22 files changed, 1571 insertions(+), 1571 deletions(-) diff --git a/po/bg.po b/po/bg.po index a9989bc..bf35946 100644 --- a/po/bg.po +++ b/po/bg.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: mailnag\n" "Report-Msgid-Bugs-To: https://github.com/tikank/mailnagger/issues\n" -"POT-Creation-Date: 2025-11-17 21:03+0100\n" +"POT-Creation-Date: 2026-02-11 23:22+0100\n" "PO-Revision-Date: 2019-03-16 14:48+0000\n" "Last-Translator: Launchpad Translations Administrators \n" "Language-Team: Bulgarian \n" @@ -18,7 +18,7 @@ msgstr "" "X-Launchpad-Export-Date: 2020-06-11 14:44+0000\n" "X-Generator: Launchpad (build b190cebbf563f89e480a8b57f641753c8196bda0)\n" -#: Mailnag/daemon/mails.py:183 +#: Mailnag/daemon/mails.py:283 msgid "No subject" msgstr "Без тема" @@ -31,15 +31,15 @@ msgid "optional" msgstr "незадължително" #: Mailnag/configuration/accountdialog.py:123 -#: Mailnag/configuration/configwindow.py:88 -#: Mailnag/configuration/configwindow.py:108 -#: Mailnag/plugins/libnotifyplugin.ui.h:14 +#: Mailnag/configuration/configwindow.py:90 +#: Mailnag/configuration/configwindow.py:110 +#: Mailnag/plugins/libnotifyplugin.ui.h:6 msgid "Enabled" msgstr "Включено" #: Mailnag/configuration/accountdialog.py:129 -#: Mailnag/configuration/configwindow.py:94 -#: Mailnag/configuration/configwindow.py:114 +#: Mailnag/configuration/configwindow.py:96 +#: Mailnag/configuration/configwindow.py:116 msgid "Name" msgstr "Име" @@ -63,36 +63,36 @@ msgstr "" msgid "Connection failed." msgstr "Връзката се разпадна." -#: Mailnag/configuration/configwindow.py:278 +#: Mailnag/configuration/configwindow.py:280 msgid "About Mailnagger" msgstr "" -#: Mailnag/configuration/configwindow.py:281 +#: Mailnag/configuration/configwindow.py:283 msgid "An extensible mail notification daemon." msgstr "" -#: Mailnag/configuration/configwindow.py:283 +#: Mailnag/configuration/configwindow.py:285 #, python-brace-format msgid "Copyright (c) {years} {author} and contributors." msgstr "" -#: Mailnag/configuration/configwindow.py:290 +#: Mailnag/configuration/configwindow.py:292 msgid "Homepage" msgstr "" -#: Mailnag/configuration/configwindow.py:293 +#: Mailnag/configuration/configwindow.py:295 msgid "maintainer" msgstr "" #. TRANSLATORS: Translate `translator-credits` to the list of names #. of translators, or team, or something like that. -#: Mailnag/configuration/configwindow.py:313 +#: Mailnag/configuration/configwindow.py:315 msgid "translator-credits" msgstr "" "Launchpad Contributions:\n" " spacy01 https://launchpad.net/~spacy00001" -#: Mailnag/configuration/configwindow.py:353 +#: Mailnag/configuration/configwindow.py:355 msgid "Delete this account:" msgstr "Изтриване на акаунта:" @@ -131,84 +131,84 @@ msgstr "" "Mailnag ще предава общия брой имейли на този скрипт,\n" "последвано от %s поредици." -#: Mailnag/plugins/libnotifyplugin.py:64 +#: Mailnag/plugins/libnotifyplugin.py:74 msgid "Your Security Passcode" msgstr "" -#: Mailnag/plugins/libnotifyplugin.py:134 +#: Mailnag/plugins/libnotifyplugin.py:143 msgid "LibNotify Notifications" msgstr "LibNotify известия" -#: Mailnag/plugins/libnotifyplugin.py:135 +#: Mailnag/plugins/libnotifyplugin.py:144 msgid "Shows a popup when new mails arrive." msgstr "Показва изкачащ прозорец при пристигане на имейл." -#: Mailnag/plugins/libnotifyplugin.py:177 +#: Mailnag/plugins/libnotifyplugin.py:186 msgid "Notification mode:" msgstr "Режим на известяване:" -#: Mailnag/plugins/libnotifyplugin.py:179 +#: Mailnag/plugins/libnotifyplugin.py:188 msgid "2FA providers" msgstr "" -#: Mailnag/plugins/libnotifyplugin.py:322 -#: Mailnag/plugins/libnotifyplugin.py:358 -#: Mailnag/plugins/libnotifyplugin.py:487 +#: Mailnag/plugins/libnotifyplugin.py:391 +#: Mailnag/plugins/libnotifyplugin.py:427 +#: Mailnag/plugins/libnotifyplugin.py:577 #, python-brace-format msgid "{0} new mails" msgstr "{0} нови писма" -#: Mailnag/plugins/libnotifyplugin.py:324 +#: Mailnag/plugins/libnotifyplugin.py:393 #, python-brace-format msgid "from {0} and others." msgstr "от {0} и други." -#: Mailnag/plugins/libnotifyplugin.py:326 -#: Mailnag/plugins/libnotifyplugin.py:329 +#: Mailnag/plugins/libnotifyplugin.py:395 +#: Mailnag/plugins/libnotifyplugin.py:398 #, python-brace-format msgid "from {0}." msgstr "от {0}." -#: Mailnag/plugins/libnotifyplugin.py:328 -#: Mailnag/plugins/libnotifyplugin.py:360 -#: Mailnag/plugins/libnotifyplugin.py:489 +#: Mailnag/plugins/libnotifyplugin.py:397 +#: Mailnag/plugins/libnotifyplugin.py:429 +#: Mailnag/plugins/libnotifyplugin.py:579 msgid "New mail" msgstr "Ново писмо" -#: Mailnag/plugins/libnotifyplugin.py:353 -#: Mailnag/plugins/libnotifyplugin.py:355 +#: Mailnag/plugins/libnotifyplugin.py:422 +#: Mailnag/plugins/libnotifyplugin.py:424 #, python-brace-format msgid "(and {0} more)" msgstr "( и {0} други)" -#: Mailnag/plugins/libnotifyplugin.py:432 +#: Mailnag/plugins/libnotifyplugin.py:522 #, python-brace-format msgid "📋 Code: {0}" msgstr "" -#: Mailnag/plugins/libnotifyplugin.py:476 +#: Mailnag/plugins/libnotifyplugin.py:566 msgid "Mark as read" msgstr "Отбележи като прочетено" -#: Mailnag/plugins/libnotifyplugin.py:675 +#: Mailnag/plugins/libnotifyplugin.py:765 #, fuzzy msgid "Delete this provider:" msgstr "Изтриване на акаунта:" -#: Mailnag/plugins/libnotifyplugin.py:676 -#: Mailnag/plugins/libnotifyplugin.ui.h:1 +#: Mailnag/plugins/libnotifyplugin.py:766 +#: Mailnag/plugins/libnotifyplugin.ui.h:15 #, fuzzy msgid "Sender:" msgstr "изпращач" -#: Mailnag/plugins/libnotifyplugin.py:677 -#: Mailnag/plugins/libnotifyplugin.ui.h:3 +#: Mailnag/plugins/libnotifyplugin.py:767 +#: Mailnag/plugins/libnotifyplugin.ui.h:16 #, fuzzy msgid "Subject:" msgstr "тема" -#: Mailnag/plugins/libnotifyplugin.py:678 -#: Mailnag/plugins/libnotifyplugin.ui.h:5 +#: Mailnag/plugins/libnotifyplugin.py:768 +#: Mailnag/plugins/libnotifyplugin.ui.h:17 msgid "Pattern:" msgstr "" @@ -319,71 +319,71 @@ msgstr "Плъгини" msgid "Info" msgstr "" -#: Mailnag/plugins/libnotifyplugin.ui.h:2 -#, fuzzy -msgid "Sender" -msgstr "изпращач" - -#: Mailnag/plugins/libnotifyplugin.ui.h:4 -#, fuzzy -msgid "Subject" -msgstr "тема" - -#: Mailnag/plugins/libnotifyplugin.ui.h:6 -msgid "Pattern" -msgstr "" - -#: Mailnag/plugins/libnotifyplugin.ui.h:7 -msgid "Edit 2FA provider" -msgstr "" - -#: Mailnag/plugins/libnotifyplugin.ui.h:8 -#, fuzzy -msgid "Enable provider" -msgstr "Включено" - -#: Mailnag/plugins/libnotifyplugin.ui.h:9 +#: Mailnag/plugins/libnotifyplugin.ui.h:1 msgid "Count of new mails" msgstr "Брой на нови писма" -#: Mailnag/plugins/libnotifyplugin.ui.h:10 +#: Mailnag/plugins/libnotifyplugin.ui.h:2 msgid "Short summary of new mails" msgstr "Кратка извадка от новите писма" -#: Mailnag/plugins/libnotifyplugin.ui.h:11 +#: Mailnag/plugins/libnotifyplugin.ui.h:3 msgid "Detailed summary of new mails" msgstr "Подробна извадка от новите писма" -#: Mailnag/plugins/libnotifyplugin.ui.h:12 +#: Mailnag/plugins/libnotifyplugin.ui.h:4 msgid "One notification per new mail" msgstr "Едно известие за имейл" -#: Mailnag/plugins/libnotifyplugin.ui.h:13 +#: Mailnag/plugins/libnotifyplugin.ui.h:5 #, fuzzy msgid "Only 2FA notification, when enabled" msgstr "Едно известие за имейл" -#: Mailnag/plugins/libnotifyplugin.ui.h:15 +#: Mailnag/plugins/libnotifyplugin.ui.h:7 +#, fuzzy +msgid "Sender" +msgstr "изпращач" + +#: Mailnag/plugins/libnotifyplugin.ui.h:8 +#, fuzzy +msgid "Subject" +msgstr "тема" + +#: Mailnag/plugins/libnotifyplugin.ui.h:9 +msgid "Pattern" +msgstr "" + +#: Mailnag/plugins/libnotifyplugin.ui.h:10 msgid "Add 2FA Provider" msgstr "" -#: Mailnag/plugins/libnotifyplugin.ui.h:16 +#: Mailnag/plugins/libnotifyplugin.ui.h:11 msgid "Remove 2FA Provider" msgstr "" -#: Mailnag/plugins/libnotifyplugin.ui.h:17 +#: Mailnag/plugins/libnotifyplugin.ui.h:12 msgid "Edit 2FA Provider" msgstr "" -#: Mailnag/plugins/libnotifyplugin.ui.h:18 +#: Mailnag/plugins/libnotifyplugin.ui.h:13 #, fuzzy msgid "2FA notifications" msgstr "Звукови известия" -#: Mailnag/plugins/libnotifyplugin.ui.h:19 +#: Mailnag/plugins/libnotifyplugin.ui.h:14 msgid "Enable/disable libnotify 2FA processing" msgstr "" +#: Mailnag/plugins/libnotifyplugin.ui.h:18 +msgid "Edit 2FA provider" +msgstr "" + +#: Mailnag/plugins/libnotifyplugin.ui.h:19 +#, fuzzy +msgid "Enable provider" +msgstr "Включено" + #, fuzzy #~ msgid "Garmin 2FA LibNotify Notifications" #~ msgstr "LibNotify известия" diff --git a/po/ca.po b/po/ca.po index d50515a..5093970 100644 --- a/po/ca.po +++ b/po/ca.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: mailnag\n" "Report-Msgid-Bugs-To: https://github.com/tikank/mailnagger/issues\n" -"POT-Creation-Date: 2025-11-17 21:03+0100\n" +"POT-Creation-Date: 2026-02-11 23:22+0100\n" "PO-Revision-Date: 2020-04-05 12:44+0000\n" "Last-Translator: Marc Riera Irigoyen \n" "Language-Team: Catalan \n" @@ -18,7 +18,7 @@ msgstr "" "X-Launchpad-Export-Date: 2020-06-11 14:44+0000\n" "X-Generator: Launchpad (build b190cebbf563f89e480a8b57f641753c8196bda0)\n" -#: Mailnag/daemon/mails.py:183 +#: Mailnag/daemon/mails.py:283 msgid "No subject" msgstr "Sense assumpte" @@ -31,15 +31,15 @@ msgid "optional" msgstr "opcional" #: Mailnag/configuration/accountdialog.py:123 -#: Mailnag/configuration/configwindow.py:88 -#: Mailnag/configuration/configwindow.py:108 -#: Mailnag/plugins/libnotifyplugin.ui.h:14 +#: Mailnag/configuration/configwindow.py:90 +#: Mailnag/configuration/configwindow.py:110 +#: Mailnag/plugins/libnotifyplugin.ui.h:6 msgid "Enabled" msgstr "Habilitat" #: Mailnag/configuration/accountdialog.py:129 -#: Mailnag/configuration/configwindow.py:94 -#: Mailnag/configuration/configwindow.py:114 +#: Mailnag/configuration/configwindow.py:96 +#: Mailnag/configuration/configwindow.py:116 msgid "Name" msgstr "Nom" @@ -63,36 +63,36 @@ msgstr "Maildir (personalitzat)" msgid "Connection failed." msgstr "No s'ha pogut connectar." -#: Mailnag/configuration/configwindow.py:278 +#: Mailnag/configuration/configwindow.py:280 msgid "About Mailnagger" msgstr "" -#: Mailnag/configuration/configwindow.py:281 +#: Mailnag/configuration/configwindow.py:283 msgid "An extensible mail notification daemon." msgstr "Un dimoni de notificacions de correu extensible." -#: Mailnag/configuration/configwindow.py:283 +#: Mailnag/configuration/configwindow.py:285 #, python-brace-format msgid "Copyright (c) {years} {author} and contributors." msgstr "" -#: Mailnag/configuration/configwindow.py:290 +#: Mailnag/configuration/configwindow.py:292 msgid "Homepage" msgstr "Lloc web" -#: Mailnag/configuration/configwindow.py:293 +#: Mailnag/configuration/configwindow.py:295 msgid "maintainer" msgstr "" #. TRANSLATORS: Translate `translator-credits` to the list of names #. of translators, or team, or something like that. -#: Mailnag/configuration/configwindow.py:313 +#: Mailnag/configuration/configwindow.py:315 msgid "translator-credits" msgstr "" "Launchpad Contributions:\n" " Marc Riera Irigoyen https://launchpad.net/~marcriera" -#: Mailnag/configuration/configwindow.py:353 +#: Mailnag/configuration/configwindow.py:355 msgid "Delete this account:" msgstr "Suprimeix aquest compte:" @@ -131,84 +131,84 @@ msgstr "" "El Mailnag passa el nombre total de correus nous a aquest script,\n" "seguit de seqüències %s." -#: Mailnag/plugins/libnotifyplugin.py:64 +#: Mailnag/plugins/libnotifyplugin.py:74 msgid "Your Security Passcode" msgstr "" -#: Mailnag/plugins/libnotifyplugin.py:134 +#: Mailnag/plugins/libnotifyplugin.py:143 msgid "LibNotify Notifications" msgstr "Notificacions del LibNotify" -#: Mailnag/plugins/libnotifyplugin.py:135 +#: Mailnag/plugins/libnotifyplugin.py:144 msgid "Shows a popup when new mails arrive." msgstr "Mostra una finestra emergent quan arriben correus nous." -#: Mailnag/plugins/libnotifyplugin.py:177 +#: Mailnag/plugins/libnotifyplugin.py:186 msgid "Notification mode:" msgstr "Mode de notificació:" -#: Mailnag/plugins/libnotifyplugin.py:179 +#: Mailnag/plugins/libnotifyplugin.py:188 msgid "2FA providers" msgstr "" -#: Mailnag/plugins/libnotifyplugin.py:322 -#: Mailnag/plugins/libnotifyplugin.py:358 -#: Mailnag/plugins/libnotifyplugin.py:487 +#: Mailnag/plugins/libnotifyplugin.py:391 +#: Mailnag/plugins/libnotifyplugin.py:427 +#: Mailnag/plugins/libnotifyplugin.py:577 #, python-brace-format msgid "{0} new mails" msgstr "{0} correus nous" -#: Mailnag/plugins/libnotifyplugin.py:324 +#: Mailnag/plugins/libnotifyplugin.py:393 #, python-brace-format msgid "from {0} and others." msgstr "de {0} i altres." -#: Mailnag/plugins/libnotifyplugin.py:326 -#: Mailnag/plugins/libnotifyplugin.py:329 +#: Mailnag/plugins/libnotifyplugin.py:395 +#: Mailnag/plugins/libnotifyplugin.py:398 #, python-brace-format msgid "from {0}." msgstr "de {0}." -#: Mailnag/plugins/libnotifyplugin.py:328 -#: Mailnag/plugins/libnotifyplugin.py:360 -#: Mailnag/plugins/libnotifyplugin.py:489 +#: Mailnag/plugins/libnotifyplugin.py:397 +#: Mailnag/plugins/libnotifyplugin.py:429 +#: Mailnag/plugins/libnotifyplugin.py:579 msgid "New mail" msgstr "Correu nou" -#: Mailnag/plugins/libnotifyplugin.py:353 -#: Mailnag/plugins/libnotifyplugin.py:355 +#: Mailnag/plugins/libnotifyplugin.py:422 +#: Mailnag/plugins/libnotifyplugin.py:424 #, python-brace-format msgid "(and {0} more)" msgstr "(i {0} més)" -#: Mailnag/plugins/libnotifyplugin.py:432 +#: Mailnag/plugins/libnotifyplugin.py:522 #, python-brace-format msgid "📋 Code: {0}" msgstr "" -#: Mailnag/plugins/libnotifyplugin.py:476 +#: Mailnag/plugins/libnotifyplugin.py:566 msgid "Mark as read" msgstr "Marca com a llegit" -#: Mailnag/plugins/libnotifyplugin.py:675 +#: Mailnag/plugins/libnotifyplugin.py:765 #, fuzzy msgid "Delete this provider:" msgstr "Suprimeix aquest compte:" -#: Mailnag/plugins/libnotifyplugin.py:676 -#: Mailnag/plugins/libnotifyplugin.ui.h:1 +#: Mailnag/plugins/libnotifyplugin.py:766 +#: Mailnag/plugins/libnotifyplugin.ui.h:15 #, fuzzy msgid "Sender:" msgstr "remitent" -#: Mailnag/plugins/libnotifyplugin.py:677 -#: Mailnag/plugins/libnotifyplugin.ui.h:3 +#: Mailnag/plugins/libnotifyplugin.py:767 +#: Mailnag/plugins/libnotifyplugin.ui.h:16 #, fuzzy msgid "Subject:" msgstr "assumpte" -#: Mailnag/plugins/libnotifyplugin.py:678 -#: Mailnag/plugins/libnotifyplugin.ui.h:5 +#: Mailnag/plugins/libnotifyplugin.py:768 +#: Mailnag/plugins/libnotifyplugin.ui.h:17 msgid "Pattern:" msgstr "" @@ -320,71 +320,71 @@ msgstr "Connectors" msgid "Info" msgstr "Informació" -#: Mailnag/plugins/libnotifyplugin.ui.h:2 -#, fuzzy -msgid "Sender" -msgstr "remitent" - -#: Mailnag/plugins/libnotifyplugin.ui.h:4 -#, fuzzy -msgid "Subject" -msgstr "assumpte" - -#: Mailnag/plugins/libnotifyplugin.ui.h:6 -msgid "Pattern" -msgstr "" - -#: Mailnag/plugins/libnotifyplugin.ui.h:7 -msgid "Edit 2FA provider" -msgstr "" - -#: Mailnag/plugins/libnotifyplugin.ui.h:8 -#, fuzzy -msgid "Enable provider" -msgstr "Habilitat" - -#: Mailnag/plugins/libnotifyplugin.ui.h:9 +#: Mailnag/plugins/libnotifyplugin.ui.h:1 msgid "Count of new mails" msgstr "Recompte de correus nous" -#: Mailnag/plugins/libnotifyplugin.ui.h:10 +#: Mailnag/plugins/libnotifyplugin.ui.h:2 msgid "Short summary of new mails" msgstr "Resum breu dels correus nous" -#: Mailnag/plugins/libnotifyplugin.ui.h:11 +#: Mailnag/plugins/libnotifyplugin.ui.h:3 msgid "Detailed summary of new mails" msgstr "Resum detallat dels correus nous" -#: Mailnag/plugins/libnotifyplugin.ui.h:12 +#: Mailnag/plugins/libnotifyplugin.ui.h:4 msgid "One notification per new mail" msgstr "Una notificació per correu nou" -#: Mailnag/plugins/libnotifyplugin.ui.h:13 +#: Mailnag/plugins/libnotifyplugin.ui.h:5 #, fuzzy msgid "Only 2FA notification, when enabled" msgstr "Una notificació per correu nou" -#: Mailnag/plugins/libnotifyplugin.ui.h:15 +#: Mailnag/plugins/libnotifyplugin.ui.h:7 +#, fuzzy +msgid "Sender" +msgstr "remitent" + +#: Mailnag/plugins/libnotifyplugin.ui.h:8 +#, fuzzy +msgid "Subject" +msgstr "assumpte" + +#: Mailnag/plugins/libnotifyplugin.ui.h:9 +msgid "Pattern" +msgstr "" + +#: Mailnag/plugins/libnotifyplugin.ui.h:10 msgid "Add 2FA Provider" msgstr "" -#: Mailnag/plugins/libnotifyplugin.ui.h:16 +#: Mailnag/plugins/libnotifyplugin.ui.h:11 msgid "Remove 2FA Provider" msgstr "" -#: Mailnag/plugins/libnotifyplugin.ui.h:17 +#: Mailnag/plugins/libnotifyplugin.ui.h:12 msgid "Edit 2FA Provider" msgstr "" -#: Mailnag/plugins/libnotifyplugin.ui.h:18 +#: Mailnag/plugins/libnotifyplugin.ui.h:13 #, fuzzy msgid "2FA notifications" msgstr "Notificacions sonores" -#: Mailnag/plugins/libnotifyplugin.ui.h:19 +#: Mailnag/plugins/libnotifyplugin.ui.h:14 msgid "Enable/disable libnotify 2FA processing" msgstr "" +#: Mailnag/plugins/libnotifyplugin.ui.h:18 +msgid "Edit 2FA provider" +msgstr "" + +#: Mailnag/plugins/libnotifyplugin.ui.h:19 +#, fuzzy +msgid "Enable provider" +msgstr "Habilitat" + #, fuzzy #~ msgid "Garmin 2FA LibNotify Notifications" #~ msgstr "Notificacions del LibNotify" diff --git a/po/cs.po b/po/cs.po index 6cd4f4d..073b783 100644 --- a/po/cs.po +++ b/po/cs.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: mailnag\n" "Report-Msgid-Bugs-To: https://github.com/tikank/mailnagger/issues\n" -"POT-Creation-Date: 2025-11-17 21:03+0100\n" +"POT-Creation-Date: 2026-02-11 23:22+0100\n" "PO-Revision-Date: 2019-03-16 14:48+0000\n" "Last-Translator: Launchpad Translations Administrators \n" "Language-Team: Czech \n" @@ -18,7 +18,7 @@ msgstr "" "X-Launchpad-Export-Date: 2020-06-11 14:44+0000\n" "X-Generator: Launchpad (build b190cebbf563f89e480a8b57f641753c8196bda0)\n" -#: Mailnag/daemon/mails.py:183 +#: Mailnag/daemon/mails.py:283 msgid "No subject" msgstr "Žádný předmět" @@ -31,15 +31,15 @@ msgid "optional" msgstr "volitelně" #: Mailnag/configuration/accountdialog.py:123 -#: Mailnag/configuration/configwindow.py:88 -#: Mailnag/configuration/configwindow.py:108 -#: Mailnag/plugins/libnotifyplugin.ui.h:14 +#: Mailnag/configuration/configwindow.py:90 +#: Mailnag/configuration/configwindow.py:110 +#: Mailnag/plugins/libnotifyplugin.ui.h:6 msgid "Enabled" msgstr "Povoleno" #: Mailnag/configuration/accountdialog.py:129 -#: Mailnag/configuration/configwindow.py:94 -#: Mailnag/configuration/configwindow.py:114 +#: Mailnag/configuration/configwindow.py:96 +#: Mailnag/configuration/configwindow.py:116 msgid "Name" msgstr "Název" @@ -63,30 +63,30 @@ msgstr "" msgid "Connection failed." msgstr "Spojení selhalo." -#: Mailnag/configuration/configwindow.py:278 +#: Mailnag/configuration/configwindow.py:280 msgid "About Mailnagger" msgstr "" -#: Mailnag/configuration/configwindow.py:281 +#: Mailnag/configuration/configwindow.py:283 msgid "An extensible mail notification daemon." msgstr "" -#: Mailnag/configuration/configwindow.py:283 +#: Mailnag/configuration/configwindow.py:285 #, python-brace-format msgid "Copyright (c) {years} {author} and contributors." msgstr "" -#: Mailnag/configuration/configwindow.py:290 +#: Mailnag/configuration/configwindow.py:292 msgid "Homepage" msgstr "" -#: Mailnag/configuration/configwindow.py:293 +#: Mailnag/configuration/configwindow.py:295 msgid "maintainer" msgstr "" #. TRANSLATORS: Translate `translator-credits` to the list of names #. of translators, or team, or something like that. -#: Mailnag/configuration/configwindow.py:313 +#: Mailnag/configuration/configwindow.py:315 msgid "translator-credits" msgstr "" "Launchpad Contributions:\n" @@ -94,7 +94,7 @@ msgstr "" " Patrick Ulbrich https://launchpad.net/~pulb\n" " Radek Otáhal https://launchpad.net/~radek-otahal" -#: Mailnag/configuration/configwindow.py:353 +#: Mailnag/configuration/configwindow.py:355 msgid "Delete this account:" msgstr "Odstranit tento účet:" @@ -133,84 +133,84 @@ msgstr "" "Mailnag předá celkové počet nových e-mailů tomuto skriptu,\n" "následovaný %s sekvencemi." -#: Mailnag/plugins/libnotifyplugin.py:64 +#: Mailnag/plugins/libnotifyplugin.py:74 msgid "Your Security Passcode" msgstr "" -#: Mailnag/plugins/libnotifyplugin.py:134 +#: Mailnag/plugins/libnotifyplugin.py:143 msgid "LibNotify Notifications" msgstr "LibNotify notifikace" -#: Mailnag/plugins/libnotifyplugin.py:135 +#: Mailnag/plugins/libnotifyplugin.py:144 msgid "Shows a popup when new mails arrive." msgstr "Zobrazí popup okno při novém e-mailu." -#: Mailnag/plugins/libnotifyplugin.py:177 +#: Mailnag/plugins/libnotifyplugin.py:186 msgid "Notification mode:" msgstr "Notifikační mód:" -#: Mailnag/plugins/libnotifyplugin.py:179 +#: Mailnag/plugins/libnotifyplugin.py:188 msgid "2FA providers" msgstr "" -#: Mailnag/plugins/libnotifyplugin.py:322 -#: Mailnag/plugins/libnotifyplugin.py:358 -#: Mailnag/plugins/libnotifyplugin.py:487 +#: Mailnag/plugins/libnotifyplugin.py:391 +#: Mailnag/plugins/libnotifyplugin.py:427 +#: Mailnag/plugins/libnotifyplugin.py:577 #, python-brace-format msgid "{0} new mails" msgstr "{0} nových e-mailů" -#: Mailnag/plugins/libnotifyplugin.py:324 +#: Mailnag/plugins/libnotifyplugin.py:393 #, python-brace-format msgid "from {0} and others." msgstr "z {0} a další." -#: Mailnag/plugins/libnotifyplugin.py:326 -#: Mailnag/plugins/libnotifyplugin.py:329 +#: Mailnag/plugins/libnotifyplugin.py:395 +#: Mailnag/plugins/libnotifyplugin.py:398 #, python-brace-format msgid "from {0}." msgstr "z {0}." -#: Mailnag/plugins/libnotifyplugin.py:328 -#: Mailnag/plugins/libnotifyplugin.py:360 -#: Mailnag/plugins/libnotifyplugin.py:489 +#: Mailnag/plugins/libnotifyplugin.py:397 +#: Mailnag/plugins/libnotifyplugin.py:429 +#: Mailnag/plugins/libnotifyplugin.py:579 msgid "New mail" msgstr "Nový mail" -#: Mailnag/plugins/libnotifyplugin.py:353 -#: Mailnag/plugins/libnotifyplugin.py:355 +#: Mailnag/plugins/libnotifyplugin.py:422 +#: Mailnag/plugins/libnotifyplugin.py:424 #, python-brace-format msgid "(and {0} more)" msgstr "(a {0} dalších)" -#: Mailnag/plugins/libnotifyplugin.py:432 +#: Mailnag/plugins/libnotifyplugin.py:522 #, python-brace-format msgid "📋 Code: {0}" msgstr "" -#: Mailnag/plugins/libnotifyplugin.py:476 +#: Mailnag/plugins/libnotifyplugin.py:566 msgid "Mark as read" msgstr "Označit jako přečtený" -#: Mailnag/plugins/libnotifyplugin.py:675 +#: Mailnag/plugins/libnotifyplugin.py:765 #, fuzzy msgid "Delete this provider:" msgstr "Odstranit tento účet:" -#: Mailnag/plugins/libnotifyplugin.py:676 -#: Mailnag/plugins/libnotifyplugin.ui.h:1 +#: Mailnag/plugins/libnotifyplugin.py:766 +#: Mailnag/plugins/libnotifyplugin.ui.h:15 #, fuzzy msgid "Sender:" msgstr "odesílatel" -#: Mailnag/plugins/libnotifyplugin.py:677 -#: Mailnag/plugins/libnotifyplugin.ui.h:3 +#: Mailnag/plugins/libnotifyplugin.py:767 +#: Mailnag/plugins/libnotifyplugin.ui.h:16 #, fuzzy msgid "Subject:" msgstr "předmět" -#: Mailnag/plugins/libnotifyplugin.py:678 -#: Mailnag/plugins/libnotifyplugin.ui.h:5 +#: Mailnag/plugins/libnotifyplugin.py:768 +#: Mailnag/plugins/libnotifyplugin.ui.h:17 msgid "Pattern:" msgstr "" @@ -321,71 +321,71 @@ msgstr "Pluginy" msgid "Info" msgstr "" -#: Mailnag/plugins/libnotifyplugin.ui.h:2 -#, fuzzy -msgid "Sender" -msgstr "odesílatel" - -#: Mailnag/plugins/libnotifyplugin.ui.h:4 -#, fuzzy -msgid "Subject" -msgstr "předmět" - -#: Mailnag/plugins/libnotifyplugin.ui.h:6 -msgid "Pattern" -msgstr "" - -#: Mailnag/plugins/libnotifyplugin.ui.h:7 -msgid "Edit 2FA provider" -msgstr "" - -#: Mailnag/plugins/libnotifyplugin.ui.h:8 -#, fuzzy -msgid "Enable provider" -msgstr "Povoleno" - -#: Mailnag/plugins/libnotifyplugin.ui.h:9 +#: Mailnag/plugins/libnotifyplugin.ui.h:1 msgid "Count of new mails" msgstr "Počet nových e-mailů" -#: Mailnag/plugins/libnotifyplugin.ui.h:10 +#: Mailnag/plugins/libnotifyplugin.ui.h:2 msgid "Short summary of new mails" msgstr "Krátký přehled nových e-mailů" -#: Mailnag/plugins/libnotifyplugin.ui.h:11 +#: Mailnag/plugins/libnotifyplugin.ui.h:3 msgid "Detailed summary of new mails" msgstr "Detailní přehled nových e-mailů" -#: Mailnag/plugins/libnotifyplugin.ui.h:12 +#: Mailnag/plugins/libnotifyplugin.ui.h:4 msgid "One notification per new mail" msgstr "Jedna notifikace pro nový e-mail" -#: Mailnag/plugins/libnotifyplugin.ui.h:13 +#: Mailnag/plugins/libnotifyplugin.ui.h:5 #, fuzzy msgid "Only 2FA notification, when enabled" msgstr "Jedna notifikace pro nový e-mail" -#: Mailnag/plugins/libnotifyplugin.ui.h:15 +#: Mailnag/plugins/libnotifyplugin.ui.h:7 +#, fuzzy +msgid "Sender" +msgstr "odesílatel" + +#: Mailnag/plugins/libnotifyplugin.ui.h:8 +#, fuzzy +msgid "Subject" +msgstr "předmět" + +#: Mailnag/plugins/libnotifyplugin.ui.h:9 +msgid "Pattern" +msgstr "" + +#: Mailnag/plugins/libnotifyplugin.ui.h:10 msgid "Add 2FA Provider" msgstr "" -#: Mailnag/plugins/libnotifyplugin.ui.h:16 +#: Mailnag/plugins/libnotifyplugin.ui.h:11 msgid "Remove 2FA Provider" msgstr "" -#: Mailnag/plugins/libnotifyplugin.ui.h:17 +#: Mailnag/plugins/libnotifyplugin.ui.h:12 msgid "Edit 2FA Provider" msgstr "" -#: Mailnag/plugins/libnotifyplugin.ui.h:18 +#: Mailnag/plugins/libnotifyplugin.ui.h:13 #, fuzzy msgid "2FA notifications" msgstr "Zvukové notifikace" -#: Mailnag/plugins/libnotifyplugin.ui.h:19 +#: Mailnag/plugins/libnotifyplugin.ui.h:14 msgid "Enable/disable libnotify 2FA processing" msgstr "" +#: Mailnag/plugins/libnotifyplugin.ui.h:18 +msgid "Edit 2FA provider" +msgstr "" + +#: Mailnag/plugins/libnotifyplugin.ui.h:19 +#, fuzzy +msgid "Enable provider" +msgstr "Povoleno" + #, fuzzy #~ msgid "Garmin 2FA LibNotify Notifications" #~ msgstr "LibNotify notifikace" diff --git a/po/de.po b/po/de.po index 22d97a7..5ec7ec1 100644 --- a/po/de.po +++ b/po/de.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: mailnag\n" "Report-Msgid-Bugs-To: https://github.com/tikank/mailnagger/issues\n" -"POT-Creation-Date: 2025-11-17 21:03+0100\n" +"POT-Creation-Date: 2026-02-11 23:22+0100\n" "PO-Revision-Date: 2020-10-24 19:26+0000\n" "Last-Translator: J. Lavoie \n" "Language-Team: German \n" "Language-Team: Spanish \n" "Language-Team: \n" @@ -18,7 +18,7 @@ msgstr "" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Poedit 3.5\n" -#: Mailnag/daemon/mails.py:183 +#: Mailnag/daemon/mails.py:283 msgid "No subject" msgstr "Ei otsikkoa" @@ -31,15 +31,15 @@ msgid "optional" msgstr "valinnainen" #: Mailnag/configuration/accountdialog.py:123 -#: Mailnag/configuration/configwindow.py:88 -#: Mailnag/configuration/configwindow.py:108 -#: Mailnag/plugins/libnotifyplugin.ui.h:14 +#: Mailnag/configuration/configwindow.py:90 +#: Mailnag/configuration/configwindow.py:110 +#: Mailnag/plugins/libnotifyplugin.ui.h:6 msgid "Enabled" msgstr "Käytössä" #: Mailnag/configuration/accountdialog.py:129 -#: Mailnag/configuration/configwindow.py:94 -#: Mailnag/configuration/configwindow.py:114 +#: Mailnag/configuration/configwindow.py:96 +#: Mailnag/configuration/configwindow.py:116 msgid "Name" msgstr "Nimi" @@ -63,34 +63,34 @@ msgstr "Maildir" msgid "Connection failed." msgstr "Yhteydenotto epäonnistui." -#: Mailnag/configuration/configwindow.py:278 +#: Mailnag/configuration/configwindow.py:280 msgid "About Mailnagger" msgstr "Tietoja Mailnaggerista" -#: Mailnag/configuration/configwindow.py:281 +#: Mailnag/configuration/configwindow.py:283 msgid "An extensible mail notification daemon." msgstr "Laajennettava sähköpostihuomautin." -#: Mailnag/configuration/configwindow.py:283 +#: Mailnag/configuration/configwindow.py:285 #, python-brace-format msgid "Copyright (c) {years} {author} and contributors." msgstr "Copyright (c) {years} {author} ja muut tekijät." -#: Mailnag/configuration/configwindow.py:290 +#: Mailnag/configuration/configwindow.py:292 msgid "Homepage" msgstr "Kotisivu" -#: Mailnag/configuration/configwindow.py:293 +#: Mailnag/configuration/configwindow.py:295 msgid "maintainer" msgstr "ylläpitäjä" #. TRANSLATORS: Translate `translator-credits` to the list of names #. of translators, or team, or something like that. -#: Mailnag/configuration/configwindow.py:313 +#: Mailnag/configuration/configwindow.py:315 msgid "translator-credits" msgstr "Timo Kankare" -#: Mailnag/configuration/configwindow.py:353 +#: Mailnag/configuration/configwindow.py:355 msgid "Delete this account:" msgstr "Poista tämä tili:" @@ -129,84 +129,84 @@ msgstr "" "Mailnagger välittää skriptille uusien postien kokonaismäärän\n" "ja sen perään %s-sarjan." -#: Mailnag/plugins/libnotifyplugin.py:64 +#: Mailnag/plugins/libnotifyplugin.py:74 msgid "Your Security Passcode" msgstr "" -#: Mailnag/plugins/libnotifyplugin.py:134 +#: Mailnag/plugins/libnotifyplugin.py:143 msgid "LibNotify Notifications" msgstr "LibNotify-huomautin" -#: Mailnag/plugins/libnotifyplugin.py:135 +#: Mailnag/plugins/libnotifyplugin.py:144 msgid "Shows a popup when new mails arrive." msgstr "Näyttää huomautuksen, kun uusi sähköposti saapuu." -#: Mailnag/plugins/libnotifyplugin.py:177 +#: Mailnag/plugins/libnotifyplugin.py:186 msgid "Notification mode:" msgstr "Huomautusvalinta:" -#: Mailnag/plugins/libnotifyplugin.py:179 +#: Mailnag/plugins/libnotifyplugin.py:188 msgid "2FA providers" msgstr "" -#: Mailnag/plugins/libnotifyplugin.py:322 -#: Mailnag/plugins/libnotifyplugin.py:358 -#: Mailnag/plugins/libnotifyplugin.py:487 +#: Mailnag/plugins/libnotifyplugin.py:391 +#: Mailnag/plugins/libnotifyplugin.py:427 +#: Mailnag/plugins/libnotifyplugin.py:577 #, python-brace-format msgid "{0} new mails" msgstr "{0} uutta sähköpostia" -#: Mailnag/plugins/libnotifyplugin.py:324 +#: Mailnag/plugins/libnotifyplugin.py:393 #, python-brace-format msgid "from {0} and others." msgstr "lähettäjältä {0} ja muilta." -#: Mailnag/plugins/libnotifyplugin.py:326 -#: Mailnag/plugins/libnotifyplugin.py:329 +#: Mailnag/plugins/libnotifyplugin.py:395 +#: Mailnag/plugins/libnotifyplugin.py:398 #, python-brace-format msgid "from {0}." msgstr "lähettäjältä {0}." -#: Mailnag/plugins/libnotifyplugin.py:328 -#: Mailnag/plugins/libnotifyplugin.py:360 -#: Mailnag/plugins/libnotifyplugin.py:489 +#: Mailnag/plugins/libnotifyplugin.py:397 +#: Mailnag/plugins/libnotifyplugin.py:429 +#: Mailnag/plugins/libnotifyplugin.py:579 msgid "New mail" msgstr "Uusi sähköposti" -#: Mailnag/plugins/libnotifyplugin.py:353 -#: Mailnag/plugins/libnotifyplugin.py:355 +#: Mailnag/plugins/libnotifyplugin.py:422 +#: Mailnag/plugins/libnotifyplugin.py:424 #, python-brace-format msgid "(and {0} more)" msgstr "(ja {0} muuta)" -#: Mailnag/plugins/libnotifyplugin.py:432 +#: Mailnag/plugins/libnotifyplugin.py:522 #, python-brace-format msgid "📋 Code: {0}" msgstr "" -#: Mailnag/plugins/libnotifyplugin.py:476 +#: Mailnag/plugins/libnotifyplugin.py:566 msgid "Mark as read" msgstr "Merkitse luetuksi" -#: Mailnag/plugins/libnotifyplugin.py:675 +#: Mailnag/plugins/libnotifyplugin.py:765 #, fuzzy msgid "Delete this provider:" msgstr "Poista tämä tili:" -#: Mailnag/plugins/libnotifyplugin.py:676 -#: Mailnag/plugins/libnotifyplugin.ui.h:1 +#: Mailnag/plugins/libnotifyplugin.py:766 +#: Mailnag/plugins/libnotifyplugin.ui.h:15 #, fuzzy msgid "Sender:" msgstr "lähettäjä" -#: Mailnag/plugins/libnotifyplugin.py:677 -#: Mailnag/plugins/libnotifyplugin.ui.h:3 +#: Mailnag/plugins/libnotifyplugin.py:767 +#: Mailnag/plugins/libnotifyplugin.ui.h:16 #, fuzzy msgid "Subject:" msgstr "otsikko" -#: Mailnag/plugins/libnotifyplugin.py:678 -#: Mailnag/plugins/libnotifyplugin.ui.h:5 +#: Mailnag/plugins/libnotifyplugin.py:768 +#: Mailnag/plugins/libnotifyplugin.ui.h:17 msgid "Pattern:" msgstr "" @@ -318,71 +318,71 @@ msgstr "Lisäosat" msgid "Info" msgstr "Tietoja" -#: Mailnag/plugins/libnotifyplugin.ui.h:2 -#, fuzzy -msgid "Sender" -msgstr "lähettäjä" - -#: Mailnag/plugins/libnotifyplugin.ui.h:4 -#, fuzzy -msgid "Subject" -msgstr "otsikko" - -#: Mailnag/plugins/libnotifyplugin.ui.h:6 -msgid "Pattern" -msgstr "" - -#: Mailnag/plugins/libnotifyplugin.ui.h:7 -msgid "Edit 2FA provider" -msgstr "" - -#: Mailnag/plugins/libnotifyplugin.ui.h:8 -#, fuzzy -msgid "Enable provider" -msgstr "Käytössä" - -#: Mailnag/plugins/libnotifyplugin.ui.h:9 +#: Mailnag/plugins/libnotifyplugin.ui.h:1 msgid "Count of new mails" msgstr "Uusien sähköpostien lukumäärä" -#: Mailnag/plugins/libnotifyplugin.ui.h:10 +#: Mailnag/plugins/libnotifyplugin.ui.h:2 msgid "Short summary of new mails" msgstr "Lyhyt yhteenveto uusista sähköposteista" -#: Mailnag/plugins/libnotifyplugin.ui.h:11 +#: Mailnag/plugins/libnotifyplugin.ui.h:3 msgid "Detailed summary of new mails" msgstr "Yksityiskohtainen yhteenveto uusista sähköposteista" -#: Mailnag/plugins/libnotifyplugin.ui.h:12 +#: Mailnag/plugins/libnotifyplugin.ui.h:4 msgid "One notification per new mail" msgstr "Oma huomautus kustakin uudesta sähköpostista" -#: Mailnag/plugins/libnotifyplugin.ui.h:13 +#: Mailnag/plugins/libnotifyplugin.ui.h:5 #, fuzzy msgid "Only 2FA notification, when enabled" msgstr "Oma huomautus kustakin uudesta sähköpostista" -#: Mailnag/plugins/libnotifyplugin.ui.h:15 +#: Mailnag/plugins/libnotifyplugin.ui.h:7 +#, fuzzy +msgid "Sender" +msgstr "lähettäjä" + +#: Mailnag/plugins/libnotifyplugin.ui.h:8 +#, fuzzy +msgid "Subject" +msgstr "otsikko" + +#: Mailnag/plugins/libnotifyplugin.ui.h:9 +msgid "Pattern" +msgstr "" + +#: Mailnag/plugins/libnotifyplugin.ui.h:10 msgid "Add 2FA Provider" msgstr "" -#: Mailnag/plugins/libnotifyplugin.ui.h:16 +#: Mailnag/plugins/libnotifyplugin.ui.h:11 msgid "Remove 2FA Provider" msgstr "" -#: Mailnag/plugins/libnotifyplugin.ui.h:17 +#: Mailnag/plugins/libnotifyplugin.ui.h:12 msgid "Edit 2FA Provider" msgstr "" -#: Mailnag/plugins/libnotifyplugin.ui.h:18 +#: Mailnag/plugins/libnotifyplugin.ui.h:13 #, fuzzy msgid "2FA notifications" msgstr "Äänimerkki" -#: Mailnag/plugins/libnotifyplugin.ui.h:19 +#: Mailnag/plugins/libnotifyplugin.ui.h:14 msgid "Enable/disable libnotify 2FA processing" msgstr "" +#: Mailnag/plugins/libnotifyplugin.ui.h:18 +msgid "Edit 2FA provider" +msgstr "" + +#: Mailnag/plugins/libnotifyplugin.ui.h:19 +#, fuzzy +msgid "Enable provider" +msgstr "Käytössä" + #, fuzzy #~ msgid "Garmin 2FA LibNotify Notifications" #~ msgstr "LibNotify-huomautin" diff --git a/po/fr.po b/po/fr.po index 0ff60a8..b26b259 100644 --- a/po/fr.po +++ b/po/fr.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: mailnag\n" "Report-Msgid-Bugs-To: https://github.com/tikank/mailnagger/issues\n" -"POT-Creation-Date: 2025-11-17 21:03+0100\n" +"POT-Creation-Date: 2026-02-11 23:22+0100\n" "PO-Revision-Date: 2020-10-15 17:26+0000\n" "Last-Translator: J. Lavoie \n" "Language-Team: French \n" "Language-Team: Galician \n" @@ -18,7 +18,7 @@ msgstr "" "X-Launchpad-Export-Date: 2020-06-11 14:44+0000\n" "X-Generator: Launchpad (build b190cebbf563f89e480a8b57f641753c8196bda0)\n" -#: Mailnag/daemon/mails.py:183 +#: Mailnag/daemon/mails.py:283 msgid "No subject" msgstr "Sen asunto" @@ -31,15 +31,15 @@ msgid "optional" msgstr "opcional" #: Mailnag/configuration/accountdialog.py:123 -#: Mailnag/configuration/configwindow.py:88 -#: Mailnag/configuration/configwindow.py:108 -#: Mailnag/plugins/libnotifyplugin.ui.h:14 +#: Mailnag/configuration/configwindow.py:90 +#: Mailnag/configuration/configwindow.py:110 +#: Mailnag/plugins/libnotifyplugin.ui.h:6 msgid "Enabled" msgstr "Activado" #: Mailnag/configuration/accountdialog.py:129 -#: Mailnag/configuration/configwindow.py:94 -#: Mailnag/configuration/configwindow.py:114 +#: Mailnag/configuration/configwindow.py:96 +#: Mailnag/configuration/configwindow.py:116 msgid "Name" msgstr "Nome" @@ -63,30 +63,30 @@ msgstr "" msgid "Connection failed." msgstr "" -#: Mailnag/configuration/configwindow.py:278 +#: Mailnag/configuration/configwindow.py:280 msgid "About Mailnagger" msgstr "" -#: Mailnag/configuration/configwindow.py:281 +#: Mailnag/configuration/configwindow.py:283 msgid "An extensible mail notification daemon." msgstr "" -#: Mailnag/configuration/configwindow.py:283 +#: Mailnag/configuration/configwindow.py:285 #, python-brace-format msgid "Copyright (c) {years} {author} and contributors." msgstr "" -#: Mailnag/configuration/configwindow.py:290 +#: Mailnag/configuration/configwindow.py:292 msgid "Homepage" msgstr "" -#: Mailnag/configuration/configwindow.py:293 +#: Mailnag/configuration/configwindow.py:295 msgid "maintainer" msgstr "" #. TRANSLATORS: Translate `translator-credits` to the list of names #. of translators, or team, or something like that. -#: Mailnag/configuration/configwindow.py:313 +#: Mailnag/configuration/configwindow.py:315 msgid "translator-credits" msgstr "" "Launchpad Contributions:\n" @@ -94,7 +94,7 @@ msgstr "" " Marcos Lans https://launchpad.net/~markooss\n" " Patrick Ulbrich https://launchpad.net/~pulb" -#: Mailnag/configuration/configwindow.py:353 +#: Mailnag/configuration/configwindow.py:355 msgid "Delete this account:" msgstr "Eliminar esta conta:" @@ -130,84 +130,84 @@ msgid "" "followed by %s sequences." msgstr "" -#: Mailnag/plugins/libnotifyplugin.py:64 +#: Mailnag/plugins/libnotifyplugin.py:74 msgid "Your Security Passcode" msgstr "" -#: Mailnag/plugins/libnotifyplugin.py:134 +#: Mailnag/plugins/libnotifyplugin.py:143 msgid "LibNotify Notifications" msgstr "Notificacións LibNotify" -#: Mailnag/plugins/libnotifyplugin.py:135 +#: Mailnag/plugins/libnotifyplugin.py:144 msgid "Shows a popup when new mails arrive." msgstr "Mostra unha xanela emerxente ao recibir correos novos." -#: Mailnag/plugins/libnotifyplugin.py:177 +#: Mailnag/plugins/libnotifyplugin.py:186 msgid "Notification mode:" msgstr "Modo Notificación:" -#: Mailnag/plugins/libnotifyplugin.py:179 +#: Mailnag/plugins/libnotifyplugin.py:188 msgid "2FA providers" msgstr "" -#: Mailnag/plugins/libnotifyplugin.py:322 -#: Mailnag/plugins/libnotifyplugin.py:358 -#: Mailnag/plugins/libnotifyplugin.py:487 +#: Mailnag/plugins/libnotifyplugin.py:391 +#: Mailnag/plugins/libnotifyplugin.py:427 +#: Mailnag/plugins/libnotifyplugin.py:577 #, python-brace-format msgid "{0} new mails" msgstr "{0} novos correos" -#: Mailnag/plugins/libnotifyplugin.py:324 +#: Mailnag/plugins/libnotifyplugin.py:393 #, python-brace-format msgid "from {0} and others." msgstr "" -#: Mailnag/plugins/libnotifyplugin.py:326 -#: Mailnag/plugins/libnotifyplugin.py:329 +#: Mailnag/plugins/libnotifyplugin.py:395 +#: Mailnag/plugins/libnotifyplugin.py:398 #, python-brace-format msgid "from {0}." msgstr "" -#: Mailnag/plugins/libnotifyplugin.py:328 -#: Mailnag/plugins/libnotifyplugin.py:360 -#: Mailnag/plugins/libnotifyplugin.py:489 +#: Mailnag/plugins/libnotifyplugin.py:397 +#: Mailnag/plugins/libnotifyplugin.py:429 +#: Mailnag/plugins/libnotifyplugin.py:579 msgid "New mail" msgstr "Correo novo" -#: Mailnag/plugins/libnotifyplugin.py:353 -#: Mailnag/plugins/libnotifyplugin.py:355 +#: Mailnag/plugins/libnotifyplugin.py:422 +#: Mailnag/plugins/libnotifyplugin.py:424 #, python-brace-format msgid "(and {0} more)" msgstr "(e {0} máis)" -#: Mailnag/plugins/libnotifyplugin.py:432 +#: Mailnag/plugins/libnotifyplugin.py:522 #, python-brace-format msgid "📋 Code: {0}" msgstr "" -#: Mailnag/plugins/libnotifyplugin.py:476 +#: Mailnag/plugins/libnotifyplugin.py:566 msgid "Mark as read" msgstr "Marcar como lido" -#: Mailnag/plugins/libnotifyplugin.py:675 +#: Mailnag/plugins/libnotifyplugin.py:765 #, fuzzy msgid "Delete this provider:" msgstr "Eliminar esta conta:" -#: Mailnag/plugins/libnotifyplugin.py:676 -#: Mailnag/plugins/libnotifyplugin.ui.h:1 +#: Mailnag/plugins/libnotifyplugin.py:766 +#: Mailnag/plugins/libnotifyplugin.ui.h:15 #, fuzzy msgid "Sender:" msgstr "remitente" -#: Mailnag/plugins/libnotifyplugin.py:677 -#: Mailnag/plugins/libnotifyplugin.ui.h:3 +#: Mailnag/plugins/libnotifyplugin.py:767 +#: Mailnag/plugins/libnotifyplugin.ui.h:16 #, fuzzy msgid "Subject:" msgstr "asunto" -#: Mailnag/plugins/libnotifyplugin.py:678 -#: Mailnag/plugins/libnotifyplugin.ui.h:5 +#: Mailnag/plugins/libnotifyplugin.py:768 +#: Mailnag/plugins/libnotifyplugin.ui.h:17 msgid "Pattern:" msgstr "" @@ -318,71 +318,71 @@ msgstr "Complementos" msgid "Info" msgstr "" -#: Mailnag/plugins/libnotifyplugin.ui.h:2 -#, fuzzy -msgid "Sender" -msgstr "remitente" - -#: Mailnag/plugins/libnotifyplugin.ui.h:4 -#, fuzzy -msgid "Subject" -msgstr "asunto" - -#: Mailnag/plugins/libnotifyplugin.ui.h:6 -msgid "Pattern" -msgstr "" - -#: Mailnag/plugins/libnotifyplugin.ui.h:7 -msgid "Edit 2FA provider" -msgstr "" - -#: Mailnag/plugins/libnotifyplugin.ui.h:8 -#, fuzzy -msgid "Enable provider" -msgstr "Activado" - -#: Mailnag/plugins/libnotifyplugin.ui.h:9 +#: Mailnag/plugins/libnotifyplugin.ui.h:1 msgid "Count of new mails" msgstr "Total de novos correos" -#: Mailnag/plugins/libnotifyplugin.ui.h:10 +#: Mailnag/plugins/libnotifyplugin.ui.h:2 msgid "Short summary of new mails" msgstr "" -#: Mailnag/plugins/libnotifyplugin.ui.h:11 +#: Mailnag/plugins/libnotifyplugin.ui.h:3 msgid "Detailed summary of new mails" msgstr "" -#: Mailnag/plugins/libnotifyplugin.ui.h:12 +#: Mailnag/plugins/libnotifyplugin.ui.h:4 msgid "One notification per new mail" msgstr "Unha notificación por cada novo correo" -#: Mailnag/plugins/libnotifyplugin.ui.h:13 +#: Mailnag/plugins/libnotifyplugin.ui.h:5 #, fuzzy msgid "Only 2FA notification, when enabled" msgstr "Unha notificación por cada novo correo" -#: Mailnag/plugins/libnotifyplugin.ui.h:15 +#: Mailnag/plugins/libnotifyplugin.ui.h:7 +#, fuzzy +msgid "Sender" +msgstr "remitente" + +#: Mailnag/plugins/libnotifyplugin.ui.h:8 +#, fuzzy +msgid "Subject" +msgstr "asunto" + +#: Mailnag/plugins/libnotifyplugin.ui.h:9 +msgid "Pattern" +msgstr "" + +#: Mailnag/plugins/libnotifyplugin.ui.h:10 msgid "Add 2FA Provider" msgstr "" -#: Mailnag/plugins/libnotifyplugin.ui.h:16 +#: Mailnag/plugins/libnotifyplugin.ui.h:11 msgid "Remove 2FA Provider" msgstr "" -#: Mailnag/plugins/libnotifyplugin.ui.h:17 +#: Mailnag/plugins/libnotifyplugin.ui.h:12 msgid "Edit 2FA Provider" msgstr "" -#: Mailnag/plugins/libnotifyplugin.ui.h:18 +#: Mailnag/plugins/libnotifyplugin.ui.h:13 #, fuzzy msgid "2FA notifications" msgstr "Notificacións con son" -#: Mailnag/plugins/libnotifyplugin.ui.h:19 +#: Mailnag/plugins/libnotifyplugin.ui.h:14 msgid "Enable/disable libnotify 2FA processing" msgstr "" +#: Mailnag/plugins/libnotifyplugin.ui.h:18 +msgid "Edit 2FA provider" +msgstr "" + +#: Mailnag/plugins/libnotifyplugin.ui.h:19 +#, fuzzy +msgid "Enable provider" +msgstr "Activado" + #, fuzzy #~ msgid "Garmin 2FA LibNotify Notifications" #~ msgstr "Notificacións LibNotify" diff --git a/po/hr.po b/po/hr.po index 3b81846..af6cead 100644 --- a/po/hr.po +++ b/po/hr.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: mailnag\n" "Report-Msgid-Bugs-To: https://github.com/tikank/mailnagger/issues\n" -"POT-Creation-Date: 2025-11-17 21:03+0100\n" +"POT-Creation-Date: 2026-02-11 23:22+0100\n" "PO-Revision-Date: 2021-01-18 00:35+0000\n" "Last-Translator: Milo Ivir \n" "Language-Team: Croatian \n" "Language-Team: Indonesian \n" @@ -18,7 +18,7 @@ msgstr "" "X-Launchpad-Export-Date: 2020-06-11 14:44+0000\n" "X-Generator: Launchpad (build b190cebbf563f89e480a8b57f641753c8196bda0)\n" -#: Mailnag/daemon/mails.py:183 +#: Mailnag/daemon/mails.py:283 msgid "No subject" msgstr "Tidak ada subyek" @@ -31,15 +31,15 @@ msgid "optional" msgstr "opsional" #: Mailnag/configuration/accountdialog.py:123 -#: Mailnag/configuration/configwindow.py:88 -#: Mailnag/configuration/configwindow.py:108 -#: Mailnag/plugins/libnotifyplugin.ui.h:14 +#: Mailnag/configuration/configwindow.py:90 +#: Mailnag/configuration/configwindow.py:110 +#: Mailnag/plugins/libnotifyplugin.ui.h:6 msgid "Enabled" msgstr "Aktifkan" #: Mailnag/configuration/accountdialog.py:129 -#: Mailnag/configuration/configwindow.py:94 -#: Mailnag/configuration/configwindow.py:114 +#: Mailnag/configuration/configwindow.py:96 +#: Mailnag/configuration/configwindow.py:116 msgid "Name" msgstr "Nama" @@ -63,36 +63,36 @@ msgstr "" msgid "Connection failed." msgstr "Koneksi gagal." -#: Mailnag/configuration/configwindow.py:278 +#: Mailnag/configuration/configwindow.py:280 msgid "About Mailnagger" msgstr "" -#: Mailnag/configuration/configwindow.py:281 +#: Mailnag/configuration/configwindow.py:283 msgid "An extensible mail notification daemon." msgstr "" -#: Mailnag/configuration/configwindow.py:283 +#: Mailnag/configuration/configwindow.py:285 #, python-brace-format msgid "Copyright (c) {years} {author} and contributors." msgstr "" -#: Mailnag/configuration/configwindow.py:290 +#: Mailnag/configuration/configwindow.py:292 msgid "Homepage" msgstr "" -#: Mailnag/configuration/configwindow.py:293 +#: Mailnag/configuration/configwindow.py:295 msgid "maintainer" msgstr "" #. TRANSLATORS: Translate `translator-credits` to the list of names #. of translators, or team, or something like that. -#: Mailnag/configuration/configwindow.py:313 +#: Mailnag/configuration/configwindow.py:315 msgid "translator-credits" msgstr "" "Launchpad Contributions:\n" " zmni https://launchpad.net/~zmni-deactivatedaccount" -#: Mailnag/configuration/configwindow.py:353 +#: Mailnag/configuration/configwindow.py:355 msgid "Delete this account:" msgstr "Hapus akun ini:" @@ -128,84 +128,84 @@ msgid "" "followed by %s sequences." msgstr "" -#: Mailnag/plugins/libnotifyplugin.py:64 +#: Mailnag/plugins/libnotifyplugin.py:74 msgid "Your Security Passcode" msgstr "" -#: Mailnag/plugins/libnotifyplugin.py:134 +#: Mailnag/plugins/libnotifyplugin.py:143 msgid "LibNotify Notifications" msgstr "Notifikasi LibNotify" -#: Mailnag/plugins/libnotifyplugin.py:135 +#: Mailnag/plugins/libnotifyplugin.py:144 msgid "Shows a popup when new mails arrive." msgstr "Tampilkan jendela munculan ketika surat baru datang." -#: Mailnag/plugins/libnotifyplugin.py:177 +#: Mailnag/plugins/libnotifyplugin.py:186 msgid "Notification mode:" msgstr "Mode notifikasi:" -#: Mailnag/plugins/libnotifyplugin.py:179 +#: Mailnag/plugins/libnotifyplugin.py:188 msgid "2FA providers" msgstr "" -#: Mailnag/plugins/libnotifyplugin.py:322 -#: Mailnag/plugins/libnotifyplugin.py:358 -#: Mailnag/plugins/libnotifyplugin.py:487 +#: Mailnag/plugins/libnotifyplugin.py:391 +#: Mailnag/plugins/libnotifyplugin.py:427 +#: Mailnag/plugins/libnotifyplugin.py:577 #, python-brace-format msgid "{0} new mails" msgstr "{0} surat baru" -#: Mailnag/plugins/libnotifyplugin.py:324 +#: Mailnag/plugins/libnotifyplugin.py:393 #, python-brace-format msgid "from {0} and others." msgstr "dari {0} dan lainnya." -#: Mailnag/plugins/libnotifyplugin.py:326 -#: Mailnag/plugins/libnotifyplugin.py:329 +#: Mailnag/plugins/libnotifyplugin.py:395 +#: Mailnag/plugins/libnotifyplugin.py:398 #, python-brace-format msgid "from {0}." msgstr "dari {0}." -#: Mailnag/plugins/libnotifyplugin.py:328 -#: Mailnag/plugins/libnotifyplugin.py:360 -#: Mailnag/plugins/libnotifyplugin.py:489 +#: Mailnag/plugins/libnotifyplugin.py:397 +#: Mailnag/plugins/libnotifyplugin.py:429 +#: Mailnag/plugins/libnotifyplugin.py:579 msgid "New mail" msgstr "Surat baru" -#: Mailnag/plugins/libnotifyplugin.py:353 -#: Mailnag/plugins/libnotifyplugin.py:355 +#: Mailnag/plugins/libnotifyplugin.py:422 +#: Mailnag/plugins/libnotifyplugin.py:424 #, python-brace-format msgid "(and {0} more)" msgstr "(dan {0} lainnya)" -#: Mailnag/plugins/libnotifyplugin.py:432 +#: Mailnag/plugins/libnotifyplugin.py:522 #, python-brace-format msgid "📋 Code: {0}" msgstr "" -#: Mailnag/plugins/libnotifyplugin.py:476 +#: Mailnag/plugins/libnotifyplugin.py:566 msgid "Mark as read" msgstr "Tandai sudah dibaca" -#: Mailnag/plugins/libnotifyplugin.py:675 +#: Mailnag/plugins/libnotifyplugin.py:765 #, fuzzy msgid "Delete this provider:" msgstr "Hapus akun ini:" -#: Mailnag/plugins/libnotifyplugin.py:676 -#: Mailnag/plugins/libnotifyplugin.ui.h:1 +#: Mailnag/plugins/libnotifyplugin.py:766 +#: Mailnag/plugins/libnotifyplugin.ui.h:15 #, fuzzy msgid "Sender:" msgstr "pengirim" -#: Mailnag/plugins/libnotifyplugin.py:677 -#: Mailnag/plugins/libnotifyplugin.ui.h:3 +#: Mailnag/plugins/libnotifyplugin.py:767 +#: Mailnag/plugins/libnotifyplugin.ui.h:16 #, fuzzy msgid "Subject:" msgstr "subyek" -#: Mailnag/plugins/libnotifyplugin.py:678 -#: Mailnag/plugins/libnotifyplugin.ui.h:5 +#: Mailnag/plugins/libnotifyplugin.py:768 +#: Mailnag/plugins/libnotifyplugin.ui.h:17 msgid "Pattern:" msgstr "" @@ -316,71 +316,71 @@ msgstr "Plugin" msgid "Info" msgstr "" -#: Mailnag/plugins/libnotifyplugin.ui.h:2 -#, fuzzy -msgid "Sender" -msgstr "pengirim" - -#: Mailnag/plugins/libnotifyplugin.ui.h:4 -#, fuzzy -msgid "Subject" -msgstr "subyek" - -#: Mailnag/plugins/libnotifyplugin.ui.h:6 -msgid "Pattern" -msgstr "" - -#: Mailnag/plugins/libnotifyplugin.ui.h:7 -msgid "Edit 2FA provider" -msgstr "" - -#: Mailnag/plugins/libnotifyplugin.ui.h:8 -#, fuzzy -msgid "Enable provider" -msgstr "Aktifkan" - -#: Mailnag/plugins/libnotifyplugin.ui.h:9 +#: Mailnag/plugins/libnotifyplugin.ui.h:1 msgid "Count of new mails" msgstr "Jumlah surat baru" -#: Mailnag/plugins/libnotifyplugin.ui.h:10 +#: Mailnag/plugins/libnotifyplugin.ui.h:2 msgid "Short summary of new mails" msgstr "Ringkasan singkat surel baru" -#: Mailnag/plugins/libnotifyplugin.ui.h:11 +#: Mailnag/plugins/libnotifyplugin.ui.h:3 msgid "Detailed summary of new mails" msgstr "Ringkasan detail surel baru" -#: Mailnag/plugins/libnotifyplugin.ui.h:12 +#: Mailnag/plugins/libnotifyplugin.ui.h:4 msgid "One notification per new mail" msgstr "Satu notifikasi per surat baru" -#: Mailnag/plugins/libnotifyplugin.ui.h:13 +#: Mailnag/plugins/libnotifyplugin.ui.h:5 #, fuzzy msgid "Only 2FA notification, when enabled" msgstr "Satu notifikasi per surat baru" -#: Mailnag/plugins/libnotifyplugin.ui.h:15 +#: Mailnag/plugins/libnotifyplugin.ui.h:7 +#, fuzzy +msgid "Sender" +msgstr "pengirim" + +#: Mailnag/plugins/libnotifyplugin.ui.h:8 +#, fuzzy +msgid "Subject" +msgstr "subyek" + +#: Mailnag/plugins/libnotifyplugin.ui.h:9 +msgid "Pattern" +msgstr "" + +#: Mailnag/plugins/libnotifyplugin.ui.h:10 msgid "Add 2FA Provider" msgstr "" -#: Mailnag/plugins/libnotifyplugin.ui.h:16 +#: Mailnag/plugins/libnotifyplugin.ui.h:11 msgid "Remove 2FA Provider" msgstr "" -#: Mailnag/plugins/libnotifyplugin.ui.h:17 +#: Mailnag/plugins/libnotifyplugin.ui.h:12 msgid "Edit 2FA Provider" msgstr "" -#: Mailnag/plugins/libnotifyplugin.ui.h:18 +#: Mailnag/plugins/libnotifyplugin.ui.h:13 #, fuzzy msgid "2FA notifications" msgstr "Notifikasi Suara" -#: Mailnag/plugins/libnotifyplugin.ui.h:19 +#: Mailnag/plugins/libnotifyplugin.ui.h:14 msgid "Enable/disable libnotify 2FA processing" msgstr "" +#: Mailnag/plugins/libnotifyplugin.ui.h:18 +msgid "Edit 2FA provider" +msgstr "" + +#: Mailnag/plugins/libnotifyplugin.ui.h:19 +#, fuzzy +msgid "Enable provider" +msgstr "Aktifkan" + #, fuzzy #~ msgid "Garmin 2FA LibNotify Notifications" #~ msgstr "Notifikasi LibNotify" diff --git a/po/it.po b/po/it.po index bc6498a..3349829 100644 --- a/po/it.po +++ b/po/it.po @@ -2,7 +2,7 @@ msgid "" msgstr "" "Project-Id-Version: mailnag\n" "Report-Msgid-Bugs-To: https://github.com/tikank/mailnagger/issues\n" -"POT-Creation-Date: 2025-11-17 21:03+0100\n" +"POT-Creation-Date: 2026-02-11 23:22+0100\n" "PO-Revision-Date: 2020-10-15 17:26+0000\n" "Last-Translator: J. Lavoie \n" "Language-Team: Italian \n" "Language-Team: LANGUAGE \n" @@ -17,7 +17,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -#: Mailnag/daemon/mails.py:183 +#: Mailnag/daemon/mails.py:283 msgid "No subject" msgstr "" @@ -30,15 +30,15 @@ msgid "optional" msgstr "" #: Mailnag/configuration/accountdialog.py:123 -#: Mailnag/configuration/configwindow.py:88 -#: Mailnag/configuration/configwindow.py:108 -#: Mailnag/plugins/libnotifyplugin.ui.h:14 +#: Mailnag/configuration/configwindow.py:90 +#: Mailnag/configuration/configwindow.py:110 +#: Mailnag/plugins/libnotifyplugin.ui.h:6 msgid "Enabled" msgstr "" #: Mailnag/configuration/accountdialog.py:129 -#: Mailnag/configuration/configwindow.py:94 -#: Mailnag/configuration/configwindow.py:114 +#: Mailnag/configuration/configwindow.py:96 +#: Mailnag/configuration/configwindow.py:116 msgid "Name" msgstr "" @@ -62,34 +62,34 @@ msgstr "" msgid "Connection failed." msgstr "" -#: Mailnag/configuration/configwindow.py:278 +#: Mailnag/configuration/configwindow.py:280 msgid "About Mailnagger" msgstr "" -#: Mailnag/configuration/configwindow.py:281 +#: Mailnag/configuration/configwindow.py:283 msgid "An extensible mail notification daemon." msgstr "" -#: Mailnag/configuration/configwindow.py:283 +#: Mailnag/configuration/configwindow.py:285 #, python-brace-format msgid "Copyright (c) {years} {author} and contributors." msgstr "" -#: Mailnag/configuration/configwindow.py:290 +#: Mailnag/configuration/configwindow.py:292 msgid "Homepage" msgstr "" -#: Mailnag/configuration/configwindow.py:293 +#: Mailnag/configuration/configwindow.py:295 msgid "maintainer" msgstr "" #. TRANSLATORS: Translate `translator-credits` to the list of names #. of translators, or team, or something like that. -#: Mailnag/configuration/configwindow.py:313 +#: Mailnag/configuration/configwindow.py:315 msgid "translator-credits" msgstr "" -#: Mailnag/configuration/configwindow.py:353 +#: Mailnag/configuration/configwindow.py:355 msgid "Delete this account:" msgstr "" @@ -125,81 +125,81 @@ msgid "" "followed by %s sequences." msgstr "" -#: Mailnag/plugins/libnotifyplugin.py:64 +#: Mailnag/plugins/libnotifyplugin.py:74 msgid "Your Security Passcode" msgstr "" -#: Mailnag/plugins/libnotifyplugin.py:134 +#: Mailnag/plugins/libnotifyplugin.py:143 msgid "LibNotify Notifications" msgstr "" -#: Mailnag/plugins/libnotifyplugin.py:135 +#: Mailnag/plugins/libnotifyplugin.py:144 msgid "Shows a popup when new mails arrive." msgstr "" -#: Mailnag/plugins/libnotifyplugin.py:177 +#: Mailnag/plugins/libnotifyplugin.py:186 msgid "Notification mode:" msgstr "" -#: Mailnag/plugins/libnotifyplugin.py:179 +#: Mailnag/plugins/libnotifyplugin.py:188 msgid "2FA providers" msgstr "" -#: Mailnag/plugins/libnotifyplugin.py:322 -#: Mailnag/plugins/libnotifyplugin.py:358 -#: Mailnag/plugins/libnotifyplugin.py:487 +#: Mailnag/plugins/libnotifyplugin.py:391 +#: Mailnag/plugins/libnotifyplugin.py:427 +#: Mailnag/plugins/libnotifyplugin.py:577 #, python-brace-format msgid "{0} new mails" msgstr "" -#: Mailnag/plugins/libnotifyplugin.py:324 +#: Mailnag/plugins/libnotifyplugin.py:393 #, python-brace-format msgid "from {0} and others." msgstr "" -#: Mailnag/plugins/libnotifyplugin.py:326 -#: Mailnag/plugins/libnotifyplugin.py:329 +#: Mailnag/plugins/libnotifyplugin.py:395 +#: Mailnag/plugins/libnotifyplugin.py:398 #, python-brace-format msgid "from {0}." msgstr "" -#: Mailnag/plugins/libnotifyplugin.py:328 -#: Mailnag/plugins/libnotifyplugin.py:360 -#: Mailnag/plugins/libnotifyplugin.py:489 +#: Mailnag/plugins/libnotifyplugin.py:397 +#: Mailnag/plugins/libnotifyplugin.py:429 +#: Mailnag/plugins/libnotifyplugin.py:579 msgid "New mail" msgstr "" -#: Mailnag/plugins/libnotifyplugin.py:353 -#: Mailnag/plugins/libnotifyplugin.py:355 +#: Mailnag/plugins/libnotifyplugin.py:422 +#: Mailnag/plugins/libnotifyplugin.py:424 #, python-brace-format msgid "(and {0} more)" msgstr "" -#: Mailnag/plugins/libnotifyplugin.py:432 +#: Mailnag/plugins/libnotifyplugin.py:522 #, python-brace-format msgid "📋 Code: {0}" msgstr "" -#: Mailnag/plugins/libnotifyplugin.py:476 +#: Mailnag/plugins/libnotifyplugin.py:566 msgid "Mark as read" msgstr "" -#: Mailnag/plugins/libnotifyplugin.py:675 +#: Mailnag/plugins/libnotifyplugin.py:765 msgid "Delete this provider:" msgstr "" -#: Mailnag/plugins/libnotifyplugin.py:676 -#: Mailnag/plugins/libnotifyplugin.ui.h:1 +#: Mailnag/plugins/libnotifyplugin.py:766 +#: Mailnag/plugins/libnotifyplugin.ui.h:15 msgid "Sender:" msgstr "" -#: Mailnag/plugins/libnotifyplugin.py:677 -#: Mailnag/plugins/libnotifyplugin.ui.h:3 +#: Mailnag/plugins/libnotifyplugin.py:767 +#: Mailnag/plugins/libnotifyplugin.ui.h:16 msgid "Subject:" msgstr "" -#: Mailnag/plugins/libnotifyplugin.py:678 -#: Mailnag/plugins/libnotifyplugin.ui.h:5 +#: Mailnag/plugins/libnotifyplugin.py:768 +#: Mailnag/plugins/libnotifyplugin.ui.h:17 msgid "Pattern:" msgstr "" @@ -307,62 +307,62 @@ msgstr "" msgid "Info" msgstr "" +#: Mailnag/plugins/libnotifyplugin.ui.h:1 +msgid "Count of new mails" +msgstr "" + #: Mailnag/plugins/libnotifyplugin.ui.h:2 -msgid "Sender" +msgid "Short summary of new mails" +msgstr "" + +#: Mailnag/plugins/libnotifyplugin.ui.h:3 +msgid "Detailed summary of new mails" msgstr "" #: Mailnag/plugins/libnotifyplugin.ui.h:4 -msgid "Subject" +msgid "One notification per new mail" msgstr "" -#: Mailnag/plugins/libnotifyplugin.ui.h:6 -msgid "Pattern" +#: Mailnag/plugins/libnotifyplugin.ui.h:5 +msgid "Only 2FA notification, when enabled" msgstr "" #: Mailnag/plugins/libnotifyplugin.ui.h:7 -msgid "Edit 2FA provider" +msgid "Sender" msgstr "" #: Mailnag/plugins/libnotifyplugin.ui.h:8 -msgid "Enable provider" +msgid "Subject" msgstr "" #: Mailnag/plugins/libnotifyplugin.ui.h:9 -msgid "Count of new mails" +msgid "Pattern" msgstr "" #: Mailnag/plugins/libnotifyplugin.ui.h:10 -msgid "Short summary of new mails" +msgid "Add 2FA Provider" msgstr "" #: Mailnag/plugins/libnotifyplugin.ui.h:11 -msgid "Detailed summary of new mails" +msgid "Remove 2FA Provider" msgstr "" #: Mailnag/plugins/libnotifyplugin.ui.h:12 -msgid "One notification per new mail" +msgid "Edit 2FA Provider" msgstr "" #: Mailnag/plugins/libnotifyplugin.ui.h:13 -msgid "Only 2FA notification, when enabled" -msgstr "" - -#: Mailnag/plugins/libnotifyplugin.ui.h:15 -msgid "Add 2FA Provider" -msgstr "" - -#: Mailnag/plugins/libnotifyplugin.ui.h:16 -msgid "Remove 2FA Provider" +msgid "2FA notifications" msgstr "" -#: Mailnag/plugins/libnotifyplugin.ui.h:17 -msgid "Edit 2FA Provider" +#: Mailnag/plugins/libnotifyplugin.ui.h:14 +msgid "Enable/disable libnotify 2FA processing" msgstr "" #: Mailnag/plugins/libnotifyplugin.ui.h:18 -msgid "2FA notifications" +msgid "Edit 2FA provider" msgstr "" #: Mailnag/plugins/libnotifyplugin.ui.h:19 -msgid "Enable/disable libnotify 2FA processing" +msgid "Enable provider" msgstr "" diff --git a/po/pl.po b/po/pl.po index 7dd67a7..20388ac 100644 --- a/po/pl.po +++ b/po/pl.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: mailnag\n" "Report-Msgid-Bugs-To: https://github.com/tikank/mailnagger/issues\n" -"POT-Creation-Date: 2025-11-17 21:03+0100\n" +"POT-Creation-Date: 2026-02-11 23:22+0100\n" "PO-Revision-Date: 2019-03-16 14:48+0000\n" "Last-Translator: Launchpad Translations Administrators \n" "Language-Team: Polish \n" @@ -18,7 +18,7 @@ msgstr "" "X-Launchpad-Export-Date: 2020-06-11 14:44+0000\n" "X-Generator: Launchpad (build b190cebbf563f89e480a8b57f641753c8196bda0)\n" -#: Mailnag/daemon/mails.py:183 +#: Mailnag/daemon/mails.py:283 msgid "No subject" msgstr "Brak tematu" @@ -31,15 +31,15 @@ msgid "optional" msgstr "opcjonalny" #: Mailnag/configuration/accountdialog.py:123 -#: Mailnag/configuration/configwindow.py:88 -#: Mailnag/configuration/configwindow.py:108 -#: Mailnag/plugins/libnotifyplugin.ui.h:14 +#: Mailnag/configuration/configwindow.py:90 +#: Mailnag/configuration/configwindow.py:110 +#: Mailnag/plugins/libnotifyplugin.ui.h:6 msgid "Enabled" msgstr "Włączone" #: Mailnag/configuration/accountdialog.py:129 -#: Mailnag/configuration/configwindow.py:94 -#: Mailnag/configuration/configwindow.py:114 +#: Mailnag/configuration/configwindow.py:96 +#: Mailnag/configuration/configwindow.py:116 msgid "Name" msgstr "Nazwa" @@ -63,30 +63,30 @@ msgstr "" msgid "Connection failed." msgstr "Połączenie nie powiodło się." -#: Mailnag/configuration/configwindow.py:278 +#: Mailnag/configuration/configwindow.py:280 msgid "About Mailnagger" msgstr "" -#: Mailnag/configuration/configwindow.py:281 +#: Mailnag/configuration/configwindow.py:283 msgid "An extensible mail notification daemon." msgstr "" -#: Mailnag/configuration/configwindow.py:283 +#: Mailnag/configuration/configwindow.py:285 #, python-brace-format msgid "Copyright (c) {years} {author} and contributors." msgstr "" -#: Mailnag/configuration/configwindow.py:290 +#: Mailnag/configuration/configwindow.py:292 msgid "Homepage" msgstr "" -#: Mailnag/configuration/configwindow.py:293 +#: Mailnag/configuration/configwindow.py:295 msgid "maintainer" msgstr "" #. TRANSLATORS: Translate `translator-credits` to the list of names #. of translators, or team, or something like that. -#: Mailnag/configuration/configwindow.py:313 +#: Mailnag/configuration/configwindow.py:315 msgid "translator-credits" msgstr "" "Launchpad Contributions:\n" @@ -97,7 +97,7 @@ msgstr "" " Szymon Nieznański https://launchpad.net/~isamu715\n" " vbert https://launchpad.net/~wsobczak" -#: Mailnag/configuration/configwindow.py:353 +#: Mailnag/configuration/configwindow.py:355 msgid "Delete this account:" msgstr "Usuń to konto:" @@ -133,84 +133,84 @@ msgid "" "followed by %s sequences." msgstr "" -#: Mailnag/plugins/libnotifyplugin.py:64 +#: Mailnag/plugins/libnotifyplugin.py:74 msgid "Your Security Passcode" msgstr "" -#: Mailnag/plugins/libnotifyplugin.py:134 +#: Mailnag/plugins/libnotifyplugin.py:143 msgid "LibNotify Notifications" msgstr "Powiadomienia LibNotify" -#: Mailnag/plugins/libnotifyplugin.py:135 +#: Mailnag/plugins/libnotifyplugin.py:144 msgid "Shows a popup when new mails arrive." msgstr "Pokaż okno kiedy przychodzi nowa poczta." -#: Mailnag/plugins/libnotifyplugin.py:177 +#: Mailnag/plugins/libnotifyplugin.py:186 msgid "Notification mode:" msgstr "Tryb powiadamiania:" -#: Mailnag/plugins/libnotifyplugin.py:179 +#: Mailnag/plugins/libnotifyplugin.py:188 msgid "2FA providers" msgstr "" -#: Mailnag/plugins/libnotifyplugin.py:322 -#: Mailnag/plugins/libnotifyplugin.py:358 -#: Mailnag/plugins/libnotifyplugin.py:487 +#: Mailnag/plugins/libnotifyplugin.py:391 +#: Mailnag/plugins/libnotifyplugin.py:427 +#: Mailnag/plugins/libnotifyplugin.py:577 #, python-brace-format msgid "{0} new mails" msgstr "{0} nowych wiadomości" -#: Mailnag/plugins/libnotifyplugin.py:324 +#: Mailnag/plugins/libnotifyplugin.py:393 #, python-brace-format msgid "from {0} and others." msgstr "od {0} i innych." -#: Mailnag/plugins/libnotifyplugin.py:326 -#: Mailnag/plugins/libnotifyplugin.py:329 +#: Mailnag/plugins/libnotifyplugin.py:395 +#: Mailnag/plugins/libnotifyplugin.py:398 #, python-brace-format msgid "from {0}." msgstr "od {0}" -#: Mailnag/plugins/libnotifyplugin.py:328 -#: Mailnag/plugins/libnotifyplugin.py:360 -#: Mailnag/plugins/libnotifyplugin.py:489 +#: Mailnag/plugins/libnotifyplugin.py:397 +#: Mailnag/plugins/libnotifyplugin.py:429 +#: Mailnag/plugins/libnotifyplugin.py:579 msgid "New mail" msgstr "Nowa poczta" -#: Mailnag/plugins/libnotifyplugin.py:353 -#: Mailnag/plugins/libnotifyplugin.py:355 +#: Mailnag/plugins/libnotifyplugin.py:422 +#: Mailnag/plugins/libnotifyplugin.py:424 #, python-brace-format msgid "(and {0} more)" msgstr "(i {0} więcej)" -#: Mailnag/plugins/libnotifyplugin.py:432 +#: Mailnag/plugins/libnotifyplugin.py:522 #, python-brace-format msgid "📋 Code: {0}" msgstr "" -#: Mailnag/plugins/libnotifyplugin.py:476 +#: Mailnag/plugins/libnotifyplugin.py:566 msgid "Mark as read" msgstr "Oznacz jako przeczytana" -#: Mailnag/plugins/libnotifyplugin.py:675 +#: Mailnag/plugins/libnotifyplugin.py:765 #, fuzzy msgid "Delete this provider:" msgstr "Usuń to konto:" -#: Mailnag/plugins/libnotifyplugin.py:676 -#: Mailnag/plugins/libnotifyplugin.ui.h:1 +#: Mailnag/plugins/libnotifyplugin.py:766 +#: Mailnag/plugins/libnotifyplugin.ui.h:15 #, fuzzy msgid "Sender:" msgstr "nadawca" -#: Mailnag/plugins/libnotifyplugin.py:677 -#: Mailnag/plugins/libnotifyplugin.ui.h:3 +#: Mailnag/plugins/libnotifyplugin.py:767 +#: Mailnag/plugins/libnotifyplugin.ui.h:16 #, fuzzy msgid "Subject:" msgstr "temat" -#: Mailnag/plugins/libnotifyplugin.py:678 -#: Mailnag/plugins/libnotifyplugin.ui.h:5 +#: Mailnag/plugins/libnotifyplugin.py:768 +#: Mailnag/plugins/libnotifyplugin.ui.h:17 msgid "Pattern:" msgstr "" @@ -318,71 +318,71 @@ msgstr "Wtyczki" msgid "Info" msgstr "" -#: Mailnag/plugins/libnotifyplugin.ui.h:2 -#, fuzzy -msgid "Sender" -msgstr "nadawca" - -#: Mailnag/plugins/libnotifyplugin.ui.h:4 -#, fuzzy -msgid "Subject" -msgstr "temat" - -#: Mailnag/plugins/libnotifyplugin.ui.h:6 -msgid "Pattern" -msgstr "" - -#: Mailnag/plugins/libnotifyplugin.ui.h:7 -msgid "Edit 2FA provider" -msgstr "" - -#: Mailnag/plugins/libnotifyplugin.ui.h:8 -#, fuzzy -msgid "Enable provider" -msgstr "Włączone" - -#: Mailnag/plugins/libnotifyplugin.ui.h:9 +#: Mailnag/plugins/libnotifyplugin.ui.h:1 msgid "Count of new mails" msgstr "Liczba nowych wiadomości" -#: Mailnag/plugins/libnotifyplugin.ui.h:10 +#: Mailnag/plugins/libnotifyplugin.ui.h:2 msgid "Short summary of new mails" msgstr "Krótkie podsumowanie nowych wiadomości e-mail" -#: Mailnag/plugins/libnotifyplugin.ui.h:11 +#: Mailnag/plugins/libnotifyplugin.ui.h:3 msgid "Detailed summary of new mails" msgstr "Szczegółowe podsumowanie nowych wiadomości e-mail" -#: Mailnag/plugins/libnotifyplugin.ui.h:12 +#: Mailnag/plugins/libnotifyplugin.ui.h:4 msgid "One notification per new mail" msgstr "Jedno powiadomienie dla jednej wiadomości" -#: Mailnag/plugins/libnotifyplugin.ui.h:13 +#: Mailnag/plugins/libnotifyplugin.ui.h:5 #, fuzzy msgid "Only 2FA notification, when enabled" msgstr "Jedno powiadomienie dla jednej wiadomości" -#: Mailnag/plugins/libnotifyplugin.ui.h:15 +#: Mailnag/plugins/libnotifyplugin.ui.h:7 +#, fuzzy +msgid "Sender" +msgstr "nadawca" + +#: Mailnag/plugins/libnotifyplugin.ui.h:8 +#, fuzzy +msgid "Subject" +msgstr "temat" + +#: Mailnag/plugins/libnotifyplugin.ui.h:9 +msgid "Pattern" +msgstr "" + +#: Mailnag/plugins/libnotifyplugin.ui.h:10 msgid "Add 2FA Provider" msgstr "" -#: Mailnag/plugins/libnotifyplugin.ui.h:16 +#: Mailnag/plugins/libnotifyplugin.ui.h:11 msgid "Remove 2FA Provider" msgstr "" -#: Mailnag/plugins/libnotifyplugin.ui.h:17 +#: Mailnag/plugins/libnotifyplugin.ui.h:12 msgid "Edit 2FA Provider" msgstr "" -#: Mailnag/plugins/libnotifyplugin.ui.h:18 +#: Mailnag/plugins/libnotifyplugin.ui.h:13 #, fuzzy msgid "2FA notifications" msgstr "Dżwięk powiadomienia" -#: Mailnag/plugins/libnotifyplugin.ui.h:19 +#: Mailnag/plugins/libnotifyplugin.ui.h:14 msgid "Enable/disable libnotify 2FA processing" msgstr "" +#: Mailnag/plugins/libnotifyplugin.ui.h:18 +msgid "Edit 2FA provider" +msgstr "" + +#: Mailnag/plugins/libnotifyplugin.ui.h:19 +#, fuzzy +msgid "Enable provider" +msgstr "Włączone" + #, fuzzy #~ msgid "Garmin 2FA LibNotify Notifications" #~ msgstr "Powiadomienia LibNotify" diff --git a/po/pt.po b/po/pt.po index c49936e..8f15cd6 100644 --- a/po/pt.po +++ b/po/pt.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: mailnag\n" "Report-Msgid-Bugs-To: https://github.com/tikank/mailnagger/issues\n" -"POT-Creation-Date: 2025-11-17 21:03+0100\n" +"POT-Creation-Date: 2026-02-11 23:22+0100\n" "PO-Revision-Date: 2019-03-16 14:48+0000\n" "Last-Translator: Launchpad Translations Administrators \n" "Language-Team: Portuguese \n" @@ -18,7 +18,7 @@ msgstr "" "X-Launchpad-Export-Date: 2020-06-11 14:44+0000\n" "X-Generator: Launchpad (build b190cebbf563f89e480a8b57f641753c8196bda0)\n" -#: Mailnag/daemon/mails.py:183 +#: Mailnag/daemon/mails.py:283 msgid "No subject" msgstr "Sem assunto" @@ -31,15 +31,15 @@ msgid "optional" msgstr "opcional" #: Mailnag/configuration/accountdialog.py:123 -#: Mailnag/configuration/configwindow.py:88 -#: Mailnag/configuration/configwindow.py:108 -#: Mailnag/plugins/libnotifyplugin.ui.h:14 +#: Mailnag/configuration/configwindow.py:90 +#: Mailnag/configuration/configwindow.py:110 +#: Mailnag/plugins/libnotifyplugin.ui.h:6 msgid "Enabled" msgstr "Ativado" #: Mailnag/configuration/accountdialog.py:129 -#: Mailnag/configuration/configwindow.py:94 -#: Mailnag/configuration/configwindow.py:114 +#: Mailnag/configuration/configwindow.py:96 +#: Mailnag/configuration/configwindow.py:116 msgid "Name" msgstr "Nome" @@ -63,30 +63,30 @@ msgstr "" msgid "Connection failed." msgstr "A ligação falhou." -#: Mailnag/configuration/configwindow.py:278 +#: Mailnag/configuration/configwindow.py:280 msgid "About Mailnagger" msgstr "" -#: Mailnag/configuration/configwindow.py:281 +#: Mailnag/configuration/configwindow.py:283 msgid "An extensible mail notification daemon." msgstr "" -#: Mailnag/configuration/configwindow.py:283 +#: Mailnag/configuration/configwindow.py:285 #, python-brace-format msgid "Copyright (c) {years} {author} and contributors." msgstr "" -#: Mailnag/configuration/configwindow.py:290 +#: Mailnag/configuration/configwindow.py:292 msgid "Homepage" msgstr "" -#: Mailnag/configuration/configwindow.py:293 +#: Mailnag/configuration/configwindow.py:295 msgid "maintainer" msgstr "" #. TRANSLATORS: Translate `translator-credits` to the list of names #. of translators, or team, or something like that. -#: Mailnag/configuration/configwindow.py:313 +#: Mailnag/configuration/configwindow.py:315 msgid "translator-credits" msgstr "" "Launchpad Contributions:\n" @@ -95,7 +95,7 @@ msgstr "" " Pedro Beja https://launchpad.net/~althaser\n" " Rafael Neri https://launchpad.net/~rafepel" -#: Mailnag/configuration/configwindow.py:353 +#: Mailnag/configuration/configwindow.py:355 msgid "Delete this account:" msgstr "Apagar esta conta:" @@ -134,84 +134,84 @@ msgstr "" "O Mailnag passa a quantidade total de mails novos para este script,\n" "seguido por sequências de %s." -#: Mailnag/plugins/libnotifyplugin.py:64 +#: Mailnag/plugins/libnotifyplugin.py:74 msgid "Your Security Passcode" msgstr "" -#: Mailnag/plugins/libnotifyplugin.py:134 +#: Mailnag/plugins/libnotifyplugin.py:143 msgid "LibNotify Notifications" msgstr "Notificações da LibNotify" -#: Mailnag/plugins/libnotifyplugin.py:135 +#: Mailnag/plugins/libnotifyplugin.py:144 msgid "Shows a popup when new mails arrive." msgstr "Mostra um popup quando chegam novos mails." -#: Mailnag/plugins/libnotifyplugin.py:177 +#: Mailnag/plugins/libnotifyplugin.py:186 msgid "Notification mode:" msgstr "Modo de notificação:" -#: Mailnag/plugins/libnotifyplugin.py:179 +#: Mailnag/plugins/libnotifyplugin.py:188 msgid "2FA providers" msgstr "" -#: Mailnag/plugins/libnotifyplugin.py:322 -#: Mailnag/plugins/libnotifyplugin.py:358 -#: Mailnag/plugins/libnotifyplugin.py:487 +#: Mailnag/plugins/libnotifyplugin.py:391 +#: Mailnag/plugins/libnotifyplugin.py:427 +#: Mailnag/plugins/libnotifyplugin.py:577 #, python-brace-format msgid "{0} new mails" msgstr "{0} novos mails" -#: Mailnag/plugins/libnotifyplugin.py:324 +#: Mailnag/plugins/libnotifyplugin.py:393 #, python-brace-format msgid "from {0} and others." msgstr "de {0} e outros." -#: Mailnag/plugins/libnotifyplugin.py:326 -#: Mailnag/plugins/libnotifyplugin.py:329 +#: Mailnag/plugins/libnotifyplugin.py:395 +#: Mailnag/plugins/libnotifyplugin.py:398 #, python-brace-format msgid "from {0}." msgstr "de {0}." -#: Mailnag/plugins/libnotifyplugin.py:328 -#: Mailnag/plugins/libnotifyplugin.py:360 -#: Mailnag/plugins/libnotifyplugin.py:489 +#: Mailnag/plugins/libnotifyplugin.py:397 +#: Mailnag/plugins/libnotifyplugin.py:429 +#: Mailnag/plugins/libnotifyplugin.py:579 msgid "New mail" msgstr "Novo mail" -#: Mailnag/plugins/libnotifyplugin.py:353 -#: Mailnag/plugins/libnotifyplugin.py:355 +#: Mailnag/plugins/libnotifyplugin.py:422 +#: Mailnag/plugins/libnotifyplugin.py:424 #, python-brace-format msgid "(and {0} more)" msgstr "(e mais {0})" -#: Mailnag/plugins/libnotifyplugin.py:432 +#: Mailnag/plugins/libnotifyplugin.py:522 #, python-brace-format msgid "📋 Code: {0}" msgstr "" -#: Mailnag/plugins/libnotifyplugin.py:476 +#: Mailnag/plugins/libnotifyplugin.py:566 msgid "Mark as read" msgstr "Marcar como lido" -#: Mailnag/plugins/libnotifyplugin.py:675 +#: Mailnag/plugins/libnotifyplugin.py:765 #, fuzzy msgid "Delete this provider:" msgstr "Apagar esta conta:" -#: Mailnag/plugins/libnotifyplugin.py:676 -#: Mailnag/plugins/libnotifyplugin.ui.h:1 +#: Mailnag/plugins/libnotifyplugin.py:766 +#: Mailnag/plugins/libnotifyplugin.ui.h:15 #, fuzzy msgid "Sender:" msgstr "remetente" -#: Mailnag/plugins/libnotifyplugin.py:677 -#: Mailnag/plugins/libnotifyplugin.ui.h:3 +#: Mailnag/plugins/libnotifyplugin.py:767 +#: Mailnag/plugins/libnotifyplugin.ui.h:16 #, fuzzy msgid "Subject:" msgstr "assunto" -#: Mailnag/plugins/libnotifyplugin.py:678 -#: Mailnag/plugins/libnotifyplugin.ui.h:5 +#: Mailnag/plugins/libnotifyplugin.py:768 +#: Mailnag/plugins/libnotifyplugin.ui.h:17 msgid "Pattern:" msgstr "" @@ -322,71 +322,71 @@ msgstr "Plugins" msgid "Info" msgstr "" -#: Mailnag/plugins/libnotifyplugin.ui.h:2 -#, fuzzy -msgid "Sender" -msgstr "remetente" - -#: Mailnag/plugins/libnotifyplugin.ui.h:4 -#, fuzzy -msgid "Subject" -msgstr "assunto" - -#: Mailnag/plugins/libnotifyplugin.ui.h:6 -msgid "Pattern" -msgstr "" - -#: Mailnag/plugins/libnotifyplugin.ui.h:7 -msgid "Edit 2FA provider" -msgstr "" - -#: Mailnag/plugins/libnotifyplugin.ui.h:8 -#, fuzzy -msgid "Enable provider" -msgstr "Ativado" - -#: Mailnag/plugins/libnotifyplugin.ui.h:9 +#: Mailnag/plugins/libnotifyplugin.ui.h:1 msgid "Count of new mails" msgstr "Quantidade de mails novos" -#: Mailnag/plugins/libnotifyplugin.ui.h:10 +#: Mailnag/plugins/libnotifyplugin.ui.h:2 msgid "Short summary of new mails" msgstr "Resumo curto de mails novos" -#: Mailnag/plugins/libnotifyplugin.ui.h:11 +#: Mailnag/plugins/libnotifyplugin.ui.h:3 msgid "Detailed summary of new mails" msgstr "Resumo detalhado de mails novos" -#: Mailnag/plugins/libnotifyplugin.ui.h:12 +#: Mailnag/plugins/libnotifyplugin.ui.h:4 msgid "One notification per new mail" msgstr "Uma notificação por novo mail" -#: Mailnag/plugins/libnotifyplugin.ui.h:13 +#: Mailnag/plugins/libnotifyplugin.ui.h:5 #, fuzzy msgid "Only 2FA notification, when enabled" msgstr "Uma notificação por novo mail" -#: Mailnag/plugins/libnotifyplugin.ui.h:15 +#: Mailnag/plugins/libnotifyplugin.ui.h:7 +#, fuzzy +msgid "Sender" +msgstr "remetente" + +#: Mailnag/plugins/libnotifyplugin.ui.h:8 +#, fuzzy +msgid "Subject" +msgstr "assunto" + +#: Mailnag/plugins/libnotifyplugin.ui.h:9 +msgid "Pattern" +msgstr "" + +#: Mailnag/plugins/libnotifyplugin.ui.h:10 msgid "Add 2FA Provider" msgstr "" -#: Mailnag/plugins/libnotifyplugin.ui.h:16 +#: Mailnag/plugins/libnotifyplugin.ui.h:11 msgid "Remove 2FA Provider" msgstr "" -#: Mailnag/plugins/libnotifyplugin.ui.h:17 +#: Mailnag/plugins/libnotifyplugin.ui.h:12 msgid "Edit 2FA Provider" msgstr "" -#: Mailnag/plugins/libnotifyplugin.ui.h:18 +#: Mailnag/plugins/libnotifyplugin.ui.h:13 #, fuzzy msgid "2FA notifications" msgstr "Notificações de Som" -#: Mailnag/plugins/libnotifyplugin.ui.h:19 +#: Mailnag/plugins/libnotifyplugin.ui.h:14 msgid "Enable/disable libnotify 2FA processing" msgstr "" +#: Mailnag/plugins/libnotifyplugin.ui.h:18 +msgid "Edit 2FA provider" +msgstr "" + +#: Mailnag/plugins/libnotifyplugin.ui.h:19 +#, fuzzy +msgid "Enable provider" +msgstr "Ativado" + #, fuzzy #~ msgid "Garmin 2FA LibNotify Notifications" #~ msgstr "Notificações da LibNotify" diff --git a/po/pt_BR.po b/po/pt_BR.po index 4aa3162..22cd226 100644 --- a/po/pt_BR.po +++ b/po/pt_BR.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: mailnag\n" "Report-Msgid-Bugs-To: https://github.com/tikank/mailnagger/issues\n" -"POT-Creation-Date: 2025-11-17 21:03+0100\n" +"POT-Creation-Date: 2026-02-11 23:22+0100\n" "PO-Revision-Date: 2019-12-25 19:25+0000\n" "Last-Translator: Relaxeaza \n" "Language-Team: Brazilian Portuguese \n" @@ -18,7 +18,7 @@ msgstr "" "X-Launchpad-Export-Date: 2020-06-11 14:44+0000\n" "X-Generator: Launchpad (build b190cebbf563f89e480a8b57f641753c8196bda0)\n" -#: Mailnag/daemon/mails.py:183 +#: Mailnag/daemon/mails.py:283 msgid "No subject" msgstr "Sem assunto" @@ -31,15 +31,15 @@ msgid "optional" msgstr "opcional" #: Mailnag/configuration/accountdialog.py:123 -#: Mailnag/configuration/configwindow.py:88 -#: Mailnag/configuration/configwindow.py:108 -#: Mailnag/plugins/libnotifyplugin.ui.h:14 +#: Mailnag/configuration/configwindow.py:90 +#: Mailnag/configuration/configwindow.py:110 +#: Mailnag/plugins/libnotifyplugin.ui.h:6 msgid "Enabled" msgstr "Ativado" #: Mailnag/configuration/accountdialog.py:129 -#: Mailnag/configuration/configwindow.py:94 -#: Mailnag/configuration/configwindow.py:114 +#: Mailnag/configuration/configwindow.py:96 +#: Mailnag/configuration/configwindow.py:116 msgid "Name" msgstr "Nome" @@ -63,30 +63,30 @@ msgstr "" msgid "Connection failed." msgstr "A ligação falhou." -#: Mailnag/configuration/configwindow.py:278 +#: Mailnag/configuration/configwindow.py:280 msgid "About Mailnagger" msgstr "" -#: Mailnag/configuration/configwindow.py:281 +#: Mailnag/configuration/configwindow.py:283 msgid "An extensible mail notification daemon." msgstr "" -#: Mailnag/configuration/configwindow.py:283 +#: Mailnag/configuration/configwindow.py:285 #, python-brace-format msgid "Copyright (c) {years} {author} and contributors." msgstr "" -#: Mailnag/configuration/configwindow.py:290 +#: Mailnag/configuration/configwindow.py:292 msgid "Homepage" msgstr "" -#: Mailnag/configuration/configwindow.py:293 +#: Mailnag/configuration/configwindow.py:295 msgid "maintainer" msgstr "" #. TRANSLATORS: Translate `translator-credits` to the list of names #. of translators, or team, or something like that. -#: Mailnag/configuration/configwindow.py:313 +#: Mailnag/configuration/configwindow.py:315 msgid "translator-credits" msgstr "" "Launchpad Contributions:\n" @@ -95,7 +95,7 @@ msgstr "" " Rafael Neri https://launchpad.net/~rafepel\n" " Relaxeaza https://launchpad.net/~relaxeaza" -#: Mailnag/configuration/configwindow.py:353 +#: Mailnag/configuration/configwindow.py:355 msgid "Delete this account:" msgstr "Apagar esta conta:" @@ -134,84 +134,84 @@ msgstr "" "Mailnag passa o total novas mensagens para o script,\n" "seguido por sequências de %s." -#: Mailnag/plugins/libnotifyplugin.py:64 +#: Mailnag/plugins/libnotifyplugin.py:74 msgid "Your Security Passcode" msgstr "" -#: Mailnag/plugins/libnotifyplugin.py:134 +#: Mailnag/plugins/libnotifyplugin.py:143 msgid "LibNotify Notifications" msgstr "Notificações da LibNotify" -#: Mailnag/plugins/libnotifyplugin.py:135 +#: Mailnag/plugins/libnotifyplugin.py:144 msgid "Shows a popup when new mails arrive." msgstr "Mostra um popup quando chegam novas mensagens." -#: Mailnag/plugins/libnotifyplugin.py:177 +#: Mailnag/plugins/libnotifyplugin.py:186 msgid "Notification mode:" msgstr "Modo de notificação:" -#: Mailnag/plugins/libnotifyplugin.py:179 +#: Mailnag/plugins/libnotifyplugin.py:188 msgid "2FA providers" msgstr "" -#: Mailnag/plugins/libnotifyplugin.py:322 -#: Mailnag/plugins/libnotifyplugin.py:358 -#: Mailnag/plugins/libnotifyplugin.py:487 +#: Mailnag/plugins/libnotifyplugin.py:391 +#: Mailnag/plugins/libnotifyplugin.py:427 +#: Mailnag/plugins/libnotifyplugin.py:577 #, python-brace-format msgid "{0} new mails" msgstr "{0} novas mensagens" -#: Mailnag/plugins/libnotifyplugin.py:324 +#: Mailnag/plugins/libnotifyplugin.py:393 #, python-brace-format msgid "from {0} and others." msgstr "de {0} e outros." -#: Mailnag/plugins/libnotifyplugin.py:326 -#: Mailnag/plugins/libnotifyplugin.py:329 +#: Mailnag/plugins/libnotifyplugin.py:395 +#: Mailnag/plugins/libnotifyplugin.py:398 #, python-brace-format msgid "from {0}." msgstr "de {0}." -#: Mailnag/plugins/libnotifyplugin.py:328 -#: Mailnag/plugins/libnotifyplugin.py:360 -#: Mailnag/plugins/libnotifyplugin.py:489 +#: Mailnag/plugins/libnotifyplugin.py:397 +#: Mailnag/plugins/libnotifyplugin.py:429 +#: Mailnag/plugins/libnotifyplugin.py:579 msgid "New mail" msgstr "Novo mail" -#: Mailnag/plugins/libnotifyplugin.py:353 -#: Mailnag/plugins/libnotifyplugin.py:355 +#: Mailnag/plugins/libnotifyplugin.py:422 +#: Mailnag/plugins/libnotifyplugin.py:424 #, python-brace-format msgid "(and {0} more)" msgstr "(e mais {0})" -#: Mailnag/plugins/libnotifyplugin.py:432 +#: Mailnag/plugins/libnotifyplugin.py:522 #, python-brace-format msgid "📋 Code: {0}" msgstr "" -#: Mailnag/plugins/libnotifyplugin.py:476 +#: Mailnag/plugins/libnotifyplugin.py:566 msgid "Mark as read" msgstr "Marcar como lido" -#: Mailnag/plugins/libnotifyplugin.py:675 +#: Mailnag/plugins/libnotifyplugin.py:765 #, fuzzy msgid "Delete this provider:" msgstr "Apagar esta conta:" -#: Mailnag/plugins/libnotifyplugin.py:676 -#: Mailnag/plugins/libnotifyplugin.ui.h:1 +#: Mailnag/plugins/libnotifyplugin.py:766 +#: Mailnag/plugins/libnotifyplugin.ui.h:15 #, fuzzy msgid "Sender:" msgstr "remetente" -#: Mailnag/plugins/libnotifyplugin.py:677 -#: Mailnag/plugins/libnotifyplugin.ui.h:3 +#: Mailnag/plugins/libnotifyplugin.py:767 +#: Mailnag/plugins/libnotifyplugin.ui.h:16 #, fuzzy msgid "Subject:" msgstr "assunto" -#: Mailnag/plugins/libnotifyplugin.py:678 -#: Mailnag/plugins/libnotifyplugin.ui.h:5 +#: Mailnag/plugins/libnotifyplugin.py:768 +#: Mailnag/plugins/libnotifyplugin.ui.h:17 msgid "Pattern:" msgstr "" @@ -322,71 +322,71 @@ msgstr "Plugins" msgid "Info" msgstr "" -#: Mailnag/plugins/libnotifyplugin.ui.h:2 -#, fuzzy -msgid "Sender" -msgstr "remetente" - -#: Mailnag/plugins/libnotifyplugin.ui.h:4 -#, fuzzy -msgid "Subject" -msgstr "assunto" - -#: Mailnag/plugins/libnotifyplugin.ui.h:6 -msgid "Pattern" -msgstr "" - -#: Mailnag/plugins/libnotifyplugin.ui.h:7 -msgid "Edit 2FA provider" -msgstr "" - -#: Mailnag/plugins/libnotifyplugin.ui.h:8 -#, fuzzy -msgid "Enable provider" -msgstr "Ativado" - -#: Mailnag/plugins/libnotifyplugin.ui.h:9 +#: Mailnag/plugins/libnotifyplugin.ui.h:1 msgid "Count of new mails" msgstr "Quantidade de mensagens novas" -#: Mailnag/plugins/libnotifyplugin.ui.h:10 +#: Mailnag/plugins/libnotifyplugin.ui.h:2 msgid "Short summary of new mails" msgstr "Resumo curto de mensagens novas" -#: Mailnag/plugins/libnotifyplugin.ui.h:11 +#: Mailnag/plugins/libnotifyplugin.ui.h:3 msgid "Detailed summary of new mails" msgstr "Resumo detalhado de mensagens novas" -#: Mailnag/plugins/libnotifyplugin.ui.h:12 +#: Mailnag/plugins/libnotifyplugin.ui.h:4 msgid "One notification per new mail" msgstr "Uma notificação por mensagem nova" -#: Mailnag/plugins/libnotifyplugin.ui.h:13 +#: Mailnag/plugins/libnotifyplugin.ui.h:5 #, fuzzy msgid "Only 2FA notification, when enabled" msgstr "Uma notificação por mensagem nova" -#: Mailnag/plugins/libnotifyplugin.ui.h:15 +#: Mailnag/plugins/libnotifyplugin.ui.h:7 +#, fuzzy +msgid "Sender" +msgstr "remetente" + +#: Mailnag/plugins/libnotifyplugin.ui.h:8 +#, fuzzy +msgid "Subject" +msgstr "assunto" + +#: Mailnag/plugins/libnotifyplugin.ui.h:9 +msgid "Pattern" +msgstr "" + +#: Mailnag/plugins/libnotifyplugin.ui.h:10 msgid "Add 2FA Provider" msgstr "" -#: Mailnag/plugins/libnotifyplugin.ui.h:16 +#: Mailnag/plugins/libnotifyplugin.ui.h:11 msgid "Remove 2FA Provider" msgstr "" -#: Mailnag/plugins/libnotifyplugin.ui.h:17 +#: Mailnag/plugins/libnotifyplugin.ui.h:12 msgid "Edit 2FA Provider" msgstr "" -#: Mailnag/plugins/libnotifyplugin.ui.h:18 +#: Mailnag/plugins/libnotifyplugin.ui.h:13 #, fuzzy msgid "2FA notifications" msgstr "Notificações de Som" -#: Mailnag/plugins/libnotifyplugin.ui.h:19 +#: Mailnag/plugins/libnotifyplugin.ui.h:14 msgid "Enable/disable libnotify 2FA processing" msgstr "" +#: Mailnag/plugins/libnotifyplugin.ui.h:18 +msgid "Edit 2FA provider" +msgstr "" + +#: Mailnag/plugins/libnotifyplugin.ui.h:19 +#, fuzzy +msgid "Enable provider" +msgstr "Ativado" + #, fuzzy #~ msgid "Garmin 2FA LibNotify Notifications" #~ msgstr "Notificações da LibNotify" diff --git a/po/ru.po b/po/ru.po index dd0c2c8..b895d14 100644 --- a/po/ru.po +++ b/po/ru.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: mailnag\n" "Report-Msgid-Bugs-To: https://github.com/tikank/mailnagger/issues\n" -"POT-Creation-Date: 2025-11-17 21:03+0100\n" +"POT-Creation-Date: 2026-02-11 23:22+0100\n" "PO-Revision-Date: 2019-03-16 14:48+0000\n" "Last-Translator: Launchpad Translations Administrators \n" "Language-Team: LANGUAGE \n" @@ -17,7 +17,7 @@ msgstr "" "X-Launchpad-Export-Date: 2020-06-11 14:44+0000\n" "X-Generator: Launchpad (build b190cebbf563f89e480a8b57f641753c8196bda0)\n" -#: Mailnag/daemon/mails.py:183 +#: Mailnag/daemon/mails.py:283 msgid "No subject" msgstr "Без темы" @@ -30,15 +30,15 @@ msgid "optional" msgstr "необязательно" #: Mailnag/configuration/accountdialog.py:123 -#: Mailnag/configuration/configwindow.py:88 -#: Mailnag/configuration/configwindow.py:108 -#: Mailnag/plugins/libnotifyplugin.ui.h:14 +#: Mailnag/configuration/configwindow.py:90 +#: Mailnag/configuration/configwindow.py:110 +#: Mailnag/plugins/libnotifyplugin.ui.h:6 msgid "Enabled" msgstr "Включено" #: Mailnag/configuration/accountdialog.py:129 -#: Mailnag/configuration/configwindow.py:94 -#: Mailnag/configuration/configwindow.py:114 +#: Mailnag/configuration/configwindow.py:96 +#: Mailnag/configuration/configwindow.py:116 msgid "Name" msgstr "Имя" @@ -62,30 +62,30 @@ msgstr "" msgid "Connection failed." msgstr "Ошибка соединения." -#: Mailnag/configuration/configwindow.py:278 +#: Mailnag/configuration/configwindow.py:280 msgid "About Mailnagger" msgstr "" -#: Mailnag/configuration/configwindow.py:281 +#: Mailnag/configuration/configwindow.py:283 msgid "An extensible mail notification daemon." msgstr "" -#: Mailnag/configuration/configwindow.py:283 +#: Mailnag/configuration/configwindow.py:285 #, python-brace-format msgid "Copyright (c) {years} {author} and contributors." msgstr "" -#: Mailnag/configuration/configwindow.py:290 +#: Mailnag/configuration/configwindow.py:292 msgid "Homepage" msgstr "" -#: Mailnag/configuration/configwindow.py:293 +#: Mailnag/configuration/configwindow.py:295 msgid "maintainer" msgstr "" #. TRANSLATORS: Translate `translator-credits` to the list of names #. of translators, or team, or something like that. -#: Mailnag/configuration/configwindow.py:313 +#: Mailnag/configuration/configwindow.py:315 msgid "translator-credits" msgstr "" "Launchpad Contributions:\n" @@ -96,7 +96,7 @@ msgstr "" " Vyacheslav Sharmanov https://launchpad.net/~vsharmanov\n" " u-t https://launchpad.net/~fenoform" -#: Mailnag/configuration/configwindow.py:353 +#: Mailnag/configuration/configwindow.py:355 msgid "Delete this account:" msgstr "Удалить учетную запись:" @@ -135,84 +135,84 @@ msgstr "" "Скрипту передаётся количество сообщений,\n" "за которым следуют: %s" -#: Mailnag/plugins/libnotifyplugin.py:64 +#: Mailnag/plugins/libnotifyplugin.py:74 msgid "Your Security Passcode" msgstr "" -#: Mailnag/plugins/libnotifyplugin.py:134 +#: Mailnag/plugins/libnotifyplugin.py:143 msgid "LibNotify Notifications" msgstr "Уведомления LibNotify" -#: Mailnag/plugins/libnotifyplugin.py:135 +#: Mailnag/plugins/libnotifyplugin.py:144 msgid "Shows a popup when new mails arrive." msgstr "Отображение всплывающего уведомления при получении новых писем" -#: Mailnag/plugins/libnotifyplugin.py:177 +#: Mailnag/plugins/libnotifyplugin.py:186 msgid "Notification mode:" msgstr "Тип уведомлений:" -#: Mailnag/plugins/libnotifyplugin.py:179 +#: Mailnag/plugins/libnotifyplugin.py:188 msgid "2FA providers" msgstr "" -#: Mailnag/plugins/libnotifyplugin.py:322 -#: Mailnag/plugins/libnotifyplugin.py:358 -#: Mailnag/plugins/libnotifyplugin.py:487 +#: Mailnag/plugins/libnotifyplugin.py:391 +#: Mailnag/plugins/libnotifyplugin.py:427 +#: Mailnag/plugins/libnotifyplugin.py:577 #, python-brace-format msgid "{0} new mails" msgstr "сообщений: {0}" -#: Mailnag/plugins/libnotifyplugin.py:324 +#: Mailnag/plugins/libnotifyplugin.py:393 #, python-brace-format msgid "from {0} and others." msgstr "от {0} и других." -#: Mailnag/plugins/libnotifyplugin.py:326 -#: Mailnag/plugins/libnotifyplugin.py:329 +#: Mailnag/plugins/libnotifyplugin.py:395 +#: Mailnag/plugins/libnotifyplugin.py:398 #, python-brace-format msgid "from {0}." msgstr "от {0}." -#: Mailnag/plugins/libnotifyplugin.py:328 -#: Mailnag/plugins/libnotifyplugin.py:360 -#: Mailnag/plugins/libnotifyplugin.py:489 +#: Mailnag/plugins/libnotifyplugin.py:397 +#: Mailnag/plugins/libnotifyplugin.py:429 +#: Mailnag/plugins/libnotifyplugin.py:579 msgid "New mail" msgstr "Новое сообщение" -#: Mailnag/plugins/libnotifyplugin.py:353 -#: Mailnag/plugins/libnotifyplugin.py:355 +#: Mailnag/plugins/libnotifyplugin.py:422 +#: Mailnag/plugins/libnotifyplugin.py:424 #, python-brace-format msgid "(and {0} more)" msgstr "(и еще {0})" -#: Mailnag/plugins/libnotifyplugin.py:432 +#: Mailnag/plugins/libnotifyplugin.py:522 #, python-brace-format msgid "📋 Code: {0}" msgstr "" -#: Mailnag/plugins/libnotifyplugin.py:476 +#: Mailnag/plugins/libnotifyplugin.py:566 msgid "Mark as read" msgstr "Отметить как прочитанное" -#: Mailnag/plugins/libnotifyplugin.py:675 +#: Mailnag/plugins/libnotifyplugin.py:765 #, fuzzy msgid "Delete this provider:" msgstr "Удалить учетную запись:" -#: Mailnag/plugins/libnotifyplugin.py:676 -#: Mailnag/plugins/libnotifyplugin.ui.h:1 +#: Mailnag/plugins/libnotifyplugin.py:766 +#: Mailnag/plugins/libnotifyplugin.ui.h:15 #, fuzzy msgid "Sender:" msgstr "отправитель" -#: Mailnag/plugins/libnotifyplugin.py:677 -#: Mailnag/plugins/libnotifyplugin.ui.h:3 +#: Mailnag/plugins/libnotifyplugin.py:767 +#: Mailnag/plugins/libnotifyplugin.ui.h:16 #, fuzzy msgid "Subject:" msgstr "тема" -#: Mailnag/plugins/libnotifyplugin.py:678 -#: Mailnag/plugins/libnotifyplugin.ui.h:5 +#: Mailnag/plugins/libnotifyplugin.py:768 +#: Mailnag/plugins/libnotifyplugin.ui.h:17 msgid "Pattern:" msgstr "" @@ -323,71 +323,71 @@ msgstr "Плагины" msgid "Info" msgstr "" -#: Mailnag/plugins/libnotifyplugin.ui.h:2 -#, fuzzy -msgid "Sender" -msgstr "отправитель" - -#: Mailnag/plugins/libnotifyplugin.ui.h:4 -#, fuzzy -msgid "Subject" -msgstr "тема" - -#: Mailnag/plugins/libnotifyplugin.ui.h:6 -msgid "Pattern" -msgstr "" - -#: Mailnag/plugins/libnotifyplugin.ui.h:7 -msgid "Edit 2FA provider" -msgstr "" - -#: Mailnag/plugins/libnotifyplugin.ui.h:8 -#, fuzzy -msgid "Enable provider" -msgstr "Включено" - -#: Mailnag/plugins/libnotifyplugin.ui.h:9 +#: Mailnag/plugins/libnotifyplugin.ui.h:1 msgid "Count of new mails" msgstr "Количество новых писем" -#: Mailnag/plugins/libnotifyplugin.ui.h:10 +#: Mailnag/plugins/libnotifyplugin.ui.h:2 msgid "Short summary of new mails" msgstr "Краткие сведения о письмах" -#: Mailnag/plugins/libnotifyplugin.ui.h:11 +#: Mailnag/plugins/libnotifyplugin.ui.h:3 msgid "Detailed summary of new mails" msgstr "Подробные сведения о письмах" -#: Mailnag/plugins/libnotifyplugin.ui.h:12 +#: Mailnag/plugins/libnotifyplugin.ui.h:4 msgid "One notification per new mail" msgstr "Одно уведомление на письмо" -#: Mailnag/plugins/libnotifyplugin.ui.h:13 +#: Mailnag/plugins/libnotifyplugin.ui.h:5 #, fuzzy msgid "Only 2FA notification, when enabled" msgstr "Одно уведомление на письмо" -#: Mailnag/plugins/libnotifyplugin.ui.h:15 +#: Mailnag/plugins/libnotifyplugin.ui.h:7 +#, fuzzy +msgid "Sender" +msgstr "отправитель" + +#: Mailnag/plugins/libnotifyplugin.ui.h:8 +#, fuzzy +msgid "Subject" +msgstr "тема" + +#: Mailnag/plugins/libnotifyplugin.ui.h:9 +msgid "Pattern" +msgstr "" + +#: Mailnag/plugins/libnotifyplugin.ui.h:10 msgid "Add 2FA Provider" msgstr "" -#: Mailnag/plugins/libnotifyplugin.ui.h:16 +#: Mailnag/plugins/libnotifyplugin.ui.h:11 msgid "Remove 2FA Provider" msgstr "" -#: Mailnag/plugins/libnotifyplugin.ui.h:17 +#: Mailnag/plugins/libnotifyplugin.ui.h:12 msgid "Edit 2FA Provider" msgstr "" -#: Mailnag/plugins/libnotifyplugin.ui.h:18 +#: Mailnag/plugins/libnotifyplugin.ui.h:13 #, fuzzy msgid "2FA notifications" msgstr "Звуковые уведомления" -#: Mailnag/plugins/libnotifyplugin.ui.h:19 +#: Mailnag/plugins/libnotifyplugin.ui.h:14 msgid "Enable/disable libnotify 2FA processing" msgstr "" +#: Mailnag/plugins/libnotifyplugin.ui.h:18 +msgid "Edit 2FA provider" +msgstr "" + +#: Mailnag/plugins/libnotifyplugin.ui.h:19 +#, fuzzy +msgid "Enable provider" +msgstr "Включено" + #, fuzzy #~ msgid "Garmin 2FA LibNotify Notifications" #~ msgstr "Уведомления LibNotify" diff --git a/po/sr.po b/po/sr.po index 84a004a..79dee93 100644 --- a/po/sr.po +++ b/po/sr.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: mailnag\n" "Report-Msgid-Bugs-To: https://github.com/tikank/mailnagger/issues\n" -"POT-Creation-Date: 2025-11-17 21:03+0100\n" +"POT-Creation-Date: 2026-02-11 23:22+0100\n" "PO-Revision-Date: 2021-01-07 11:29+0000\n" "Last-Translator: Burek \n" "Language-Team: Serbian \n" "Language-Team: Swedish \n" "Language-Team: Turkish " -#: Mailnag/configuration/configwindow.py:353 +#: Mailnag/configuration/configwindow.py:355 msgid "Delete this account:" msgstr "Bu hesabı sil:" @@ -134,84 +134,84 @@ msgstr "" "Mailnag, yeni e-postaların toplam sayısını, ve ardından\n" "%s dizisini bu betiğe iletir." -#: Mailnag/plugins/libnotifyplugin.py:64 +#: Mailnag/plugins/libnotifyplugin.py:74 msgid "Your Security Passcode" msgstr "" -#: Mailnag/plugins/libnotifyplugin.py:134 +#: Mailnag/plugins/libnotifyplugin.py:143 msgid "LibNotify Notifications" msgstr "LibNotify Bildirimleri" -#: Mailnag/plugins/libnotifyplugin.py:135 +#: Mailnag/plugins/libnotifyplugin.py:144 msgid "Shows a popup when new mails arrive." msgstr "Yeni e-posta geldiğinde bir açılır pencere gösterir." -#: Mailnag/plugins/libnotifyplugin.py:177 +#: Mailnag/plugins/libnotifyplugin.py:186 msgid "Notification mode:" msgstr "Bildirim modu:" -#: Mailnag/plugins/libnotifyplugin.py:179 +#: Mailnag/plugins/libnotifyplugin.py:188 msgid "2FA providers" msgstr "" -#: Mailnag/plugins/libnotifyplugin.py:322 -#: Mailnag/plugins/libnotifyplugin.py:358 -#: Mailnag/plugins/libnotifyplugin.py:487 +#: Mailnag/plugins/libnotifyplugin.py:391 +#: Mailnag/plugins/libnotifyplugin.py:427 +#: Mailnag/plugins/libnotifyplugin.py:577 #, python-brace-format msgid "{0} new mails" msgstr "{0} yeni e-posta" -#: Mailnag/plugins/libnotifyplugin.py:324 +#: Mailnag/plugins/libnotifyplugin.py:393 #, python-brace-format msgid "from {0} and others." msgstr "{0} ve diğerlerinden." -#: Mailnag/plugins/libnotifyplugin.py:326 -#: Mailnag/plugins/libnotifyplugin.py:329 +#: Mailnag/plugins/libnotifyplugin.py:395 +#: Mailnag/plugins/libnotifyplugin.py:398 #, python-brace-format msgid "from {0}." msgstr "{0}'den." -#: Mailnag/plugins/libnotifyplugin.py:328 -#: Mailnag/plugins/libnotifyplugin.py:360 -#: Mailnag/plugins/libnotifyplugin.py:489 +#: Mailnag/plugins/libnotifyplugin.py:397 +#: Mailnag/plugins/libnotifyplugin.py:429 +#: Mailnag/plugins/libnotifyplugin.py:579 msgid "New mail" msgstr "Yeni e-posta" -#: Mailnag/plugins/libnotifyplugin.py:353 -#: Mailnag/plugins/libnotifyplugin.py:355 +#: Mailnag/plugins/libnotifyplugin.py:422 +#: Mailnag/plugins/libnotifyplugin.py:424 #, python-brace-format msgid "(and {0} more)" msgstr "(ve {0} tane daha)" -#: Mailnag/plugins/libnotifyplugin.py:432 +#: Mailnag/plugins/libnotifyplugin.py:522 #, python-brace-format msgid "📋 Code: {0}" msgstr "" -#: Mailnag/plugins/libnotifyplugin.py:476 +#: Mailnag/plugins/libnotifyplugin.py:566 msgid "Mark as read" msgstr "Okundu olarak işaretle" -#: Mailnag/plugins/libnotifyplugin.py:675 +#: Mailnag/plugins/libnotifyplugin.py:765 #, fuzzy msgid "Delete this provider:" msgstr "Bu hesabı sil:" -#: Mailnag/plugins/libnotifyplugin.py:676 -#: Mailnag/plugins/libnotifyplugin.ui.h:1 +#: Mailnag/plugins/libnotifyplugin.py:766 +#: Mailnag/plugins/libnotifyplugin.ui.h:15 #, fuzzy msgid "Sender:" msgstr "gönderen" -#: Mailnag/plugins/libnotifyplugin.py:677 -#: Mailnag/plugins/libnotifyplugin.ui.h:3 +#: Mailnag/plugins/libnotifyplugin.py:767 +#: Mailnag/plugins/libnotifyplugin.ui.h:16 #, fuzzy msgid "Subject:" msgstr "konu" -#: Mailnag/plugins/libnotifyplugin.py:678 -#: Mailnag/plugins/libnotifyplugin.ui.h:5 +#: Mailnag/plugins/libnotifyplugin.py:768 +#: Mailnag/plugins/libnotifyplugin.ui.h:17 msgid "Pattern:" msgstr "" @@ -323,71 +323,71 @@ msgstr "Eklentiler" msgid "Info" msgstr "Bilgi" -#: Mailnag/plugins/libnotifyplugin.ui.h:2 -#, fuzzy -msgid "Sender" -msgstr "gönderen" - -#: Mailnag/plugins/libnotifyplugin.ui.h:4 -#, fuzzy -msgid "Subject" -msgstr "konu" - -#: Mailnag/plugins/libnotifyplugin.ui.h:6 -msgid "Pattern" -msgstr "" - -#: Mailnag/plugins/libnotifyplugin.ui.h:7 -msgid "Edit 2FA provider" -msgstr "" - -#: Mailnag/plugins/libnotifyplugin.ui.h:8 -#, fuzzy -msgid "Enable provider" -msgstr "Etkin" - -#: Mailnag/plugins/libnotifyplugin.ui.h:9 +#: Mailnag/plugins/libnotifyplugin.ui.h:1 msgid "Count of new mails" msgstr "Yeni e-posta sayısı" -#: Mailnag/plugins/libnotifyplugin.ui.h:10 +#: Mailnag/plugins/libnotifyplugin.ui.h:2 msgid "Short summary of new mails" msgstr "Yeni e-postaların kısa özeti" -#: Mailnag/plugins/libnotifyplugin.ui.h:11 +#: Mailnag/plugins/libnotifyplugin.ui.h:3 msgid "Detailed summary of new mails" msgstr "Yeni e-postaların ayrıntılı özeti" -#: Mailnag/plugins/libnotifyplugin.ui.h:12 +#: Mailnag/plugins/libnotifyplugin.ui.h:4 msgid "One notification per new mail" msgstr "Her yeni e-posta için bir bildirim" -#: Mailnag/plugins/libnotifyplugin.ui.h:13 +#: Mailnag/plugins/libnotifyplugin.ui.h:5 #, fuzzy msgid "Only 2FA notification, when enabled" msgstr "Her yeni e-posta için bir bildirim" -#: Mailnag/plugins/libnotifyplugin.ui.h:15 +#: Mailnag/plugins/libnotifyplugin.ui.h:7 +#, fuzzy +msgid "Sender" +msgstr "gönderen" + +#: Mailnag/plugins/libnotifyplugin.ui.h:8 +#, fuzzy +msgid "Subject" +msgstr "konu" + +#: Mailnag/plugins/libnotifyplugin.ui.h:9 +msgid "Pattern" +msgstr "" + +#: Mailnag/plugins/libnotifyplugin.ui.h:10 msgid "Add 2FA Provider" msgstr "" -#: Mailnag/plugins/libnotifyplugin.ui.h:16 +#: Mailnag/plugins/libnotifyplugin.ui.h:11 msgid "Remove 2FA Provider" msgstr "" -#: Mailnag/plugins/libnotifyplugin.ui.h:17 +#: Mailnag/plugins/libnotifyplugin.ui.h:12 msgid "Edit 2FA Provider" msgstr "" -#: Mailnag/plugins/libnotifyplugin.ui.h:18 +#: Mailnag/plugins/libnotifyplugin.ui.h:13 #, fuzzy msgid "2FA notifications" msgstr "Sesli Bildirimler" -#: Mailnag/plugins/libnotifyplugin.ui.h:19 +#: Mailnag/plugins/libnotifyplugin.ui.h:14 msgid "Enable/disable libnotify 2FA processing" msgstr "" +#: Mailnag/plugins/libnotifyplugin.ui.h:18 +msgid "Edit 2FA provider" +msgstr "" + +#: Mailnag/plugins/libnotifyplugin.ui.h:19 +#, fuzzy +msgid "Enable provider" +msgstr "Etkin" + #, fuzzy #~ msgid "Garmin 2FA LibNotify Notifications" #~ msgstr "LibNotify Bildirimleri" diff --git a/po/uk.po b/po/uk.po index ce89a01..fbde81b 100644 --- a/po/uk.po +++ b/po/uk.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: mailnag\n" "Report-Msgid-Bugs-To: https://github.com/tikank/mailnagger/issues\n" -"POT-Creation-Date: 2025-11-17 21:03+0100\n" +"POT-Creation-Date: 2026-02-11 23:22+0100\n" "PO-Revision-Date: 2019-03-16 14:48+0000\n" "Last-Translator: Launchpad Translations Administrators \n" "Language-Team: Ukrainian \n" @@ -17,7 +17,7 @@ msgstr "" "X-Launchpad-Export-Date: 2020-06-11 14:44+0000\n" "X-Generator: Launchpad (build b190cebbf563f89e480a8b57f641753c8196bda0)\n" -#: Mailnag/daemon/mails.py:183 +#: Mailnag/daemon/mails.py:283 msgid "No subject" msgstr "Без теми" @@ -30,15 +30,15 @@ msgid "optional" msgstr "(необов’язково)" #: Mailnag/configuration/accountdialog.py:123 -#: Mailnag/configuration/configwindow.py:88 -#: Mailnag/configuration/configwindow.py:108 -#: Mailnag/plugins/libnotifyplugin.ui.h:14 +#: Mailnag/configuration/configwindow.py:90 +#: Mailnag/configuration/configwindow.py:110 +#: Mailnag/plugins/libnotifyplugin.ui.h:6 msgid "Enabled" msgstr "Задіяно" #: Mailnag/configuration/accountdialog.py:129 -#: Mailnag/configuration/configwindow.py:94 -#: Mailnag/configuration/configwindow.py:114 +#: Mailnag/configuration/configwindow.py:96 +#: Mailnag/configuration/configwindow.py:116 msgid "Name" msgstr "Назва" @@ -62,30 +62,30 @@ msgstr "" msgid "Connection failed." msgstr "Не вдалося встановити з'єднання." -#: Mailnag/configuration/configwindow.py:278 +#: Mailnag/configuration/configwindow.py:280 msgid "About Mailnagger" msgstr "" -#: Mailnag/configuration/configwindow.py:281 +#: Mailnag/configuration/configwindow.py:283 msgid "An extensible mail notification daemon." msgstr "" -#: Mailnag/configuration/configwindow.py:283 +#: Mailnag/configuration/configwindow.py:285 #, python-brace-format msgid "Copyright (c) {years} {author} and contributors." msgstr "" -#: Mailnag/configuration/configwindow.py:290 +#: Mailnag/configuration/configwindow.py:292 msgid "Homepage" msgstr "" -#: Mailnag/configuration/configwindow.py:293 +#: Mailnag/configuration/configwindow.py:295 msgid "maintainer" msgstr "" #. TRANSLATORS: Translate `translator-credits` to the list of names #. of translators, or team, or something like that. -#: Mailnag/configuration/configwindow.py:313 +#: Mailnag/configuration/configwindow.py:315 msgid "translator-credits" msgstr "" "Launchpad Contributions:\n" @@ -95,7 +95,7 @@ msgstr "" " Patrick Ulbrich https://launchpad.net/~pulb\n" " Rax https://launchpad.net/~r-a-x" -#: Mailnag/configuration/configwindow.py:353 +#: Mailnag/configuration/configwindow.py:355 msgid "Delete this account:" msgstr "Видалити обліковий запис" @@ -131,84 +131,84 @@ msgid "" "followed by %s sequences." msgstr "" -#: Mailnag/plugins/libnotifyplugin.py:64 +#: Mailnag/plugins/libnotifyplugin.py:74 msgid "Your Security Passcode" msgstr "" -#: Mailnag/plugins/libnotifyplugin.py:134 +#: Mailnag/plugins/libnotifyplugin.py:143 msgid "LibNotify Notifications" msgstr "Сповіщення LibNotify" -#: Mailnag/plugins/libnotifyplugin.py:135 +#: Mailnag/plugins/libnotifyplugin.py:144 msgid "Shows a popup when new mails arrive." msgstr "Сповіщає про нові листи за допомогою виринаючих повідомлень." -#: Mailnag/plugins/libnotifyplugin.py:177 +#: Mailnag/plugins/libnotifyplugin.py:186 msgid "Notification mode:" msgstr "Метод сповіщення:" -#: Mailnag/plugins/libnotifyplugin.py:179 +#: Mailnag/plugins/libnotifyplugin.py:188 msgid "2FA providers" msgstr "" -#: Mailnag/plugins/libnotifyplugin.py:322 -#: Mailnag/plugins/libnotifyplugin.py:358 -#: Mailnag/plugins/libnotifyplugin.py:487 +#: Mailnag/plugins/libnotifyplugin.py:391 +#: Mailnag/plugins/libnotifyplugin.py:427 +#: Mailnag/plugins/libnotifyplugin.py:577 #, python-brace-format msgid "{0} new mails" msgstr "{0} листів" -#: Mailnag/plugins/libnotifyplugin.py:324 +#: Mailnag/plugins/libnotifyplugin.py:393 #, python-brace-format msgid "from {0} and others." msgstr "" -#: Mailnag/plugins/libnotifyplugin.py:326 -#: Mailnag/plugins/libnotifyplugin.py:329 +#: Mailnag/plugins/libnotifyplugin.py:395 +#: Mailnag/plugins/libnotifyplugin.py:398 #, python-brace-format msgid "from {0}." msgstr "" -#: Mailnag/plugins/libnotifyplugin.py:328 -#: Mailnag/plugins/libnotifyplugin.py:360 -#: Mailnag/plugins/libnotifyplugin.py:489 +#: Mailnag/plugins/libnotifyplugin.py:397 +#: Mailnag/plugins/libnotifyplugin.py:429 +#: Mailnag/plugins/libnotifyplugin.py:579 msgid "New mail" msgstr "Новий лист" -#: Mailnag/plugins/libnotifyplugin.py:353 -#: Mailnag/plugins/libnotifyplugin.py:355 +#: Mailnag/plugins/libnotifyplugin.py:422 +#: Mailnag/plugins/libnotifyplugin.py:424 #, python-brace-format msgid "(and {0} more)" msgstr "(і ще {0})" -#: Mailnag/plugins/libnotifyplugin.py:432 +#: Mailnag/plugins/libnotifyplugin.py:522 #, python-brace-format msgid "📋 Code: {0}" msgstr "" -#: Mailnag/plugins/libnotifyplugin.py:476 +#: Mailnag/plugins/libnotifyplugin.py:566 msgid "Mark as read" msgstr "Позначити як прочитане" -#: Mailnag/plugins/libnotifyplugin.py:675 +#: Mailnag/plugins/libnotifyplugin.py:765 #, fuzzy msgid "Delete this provider:" msgstr "Видалити обліковий запис" -#: Mailnag/plugins/libnotifyplugin.py:676 -#: Mailnag/plugins/libnotifyplugin.ui.h:1 +#: Mailnag/plugins/libnotifyplugin.py:766 +#: Mailnag/plugins/libnotifyplugin.ui.h:15 #, fuzzy msgid "Sender:" msgstr "відправник" -#: Mailnag/plugins/libnotifyplugin.py:677 -#: Mailnag/plugins/libnotifyplugin.ui.h:3 +#: Mailnag/plugins/libnotifyplugin.py:767 +#: Mailnag/plugins/libnotifyplugin.ui.h:16 #, fuzzy msgid "Subject:" msgstr "тема" -#: Mailnag/plugins/libnotifyplugin.py:678 -#: Mailnag/plugins/libnotifyplugin.ui.h:5 +#: Mailnag/plugins/libnotifyplugin.py:768 +#: Mailnag/plugins/libnotifyplugin.ui.h:17 msgid "Pattern:" msgstr "" @@ -319,71 +319,71 @@ msgstr "Додатки" msgid "Info" msgstr "" -#: Mailnag/plugins/libnotifyplugin.ui.h:2 -#, fuzzy -msgid "Sender" -msgstr "відправник" - -#: Mailnag/plugins/libnotifyplugin.ui.h:4 -#, fuzzy -msgid "Subject" -msgstr "тема" - -#: Mailnag/plugins/libnotifyplugin.ui.h:6 -msgid "Pattern" -msgstr "" - -#: Mailnag/plugins/libnotifyplugin.ui.h:7 -msgid "Edit 2FA provider" -msgstr "" - -#: Mailnag/plugins/libnotifyplugin.ui.h:8 -#, fuzzy -msgid "Enable provider" -msgstr "Задіяно" - -#: Mailnag/plugins/libnotifyplugin.ui.h:9 +#: Mailnag/plugins/libnotifyplugin.ui.h:1 msgid "Count of new mails" msgstr "Кількість нових листів" -#: Mailnag/plugins/libnotifyplugin.ui.h:10 +#: Mailnag/plugins/libnotifyplugin.ui.h:2 msgid "Short summary of new mails" msgstr "" -#: Mailnag/plugins/libnotifyplugin.ui.h:11 +#: Mailnag/plugins/libnotifyplugin.ui.h:3 msgid "Detailed summary of new mails" msgstr "" -#: Mailnag/plugins/libnotifyplugin.ui.h:12 +#: Mailnag/plugins/libnotifyplugin.ui.h:4 msgid "One notification per new mail" msgstr "Про кожен лист окремо" -#: Mailnag/plugins/libnotifyplugin.ui.h:13 +#: Mailnag/plugins/libnotifyplugin.ui.h:5 #, fuzzy msgid "Only 2FA notification, when enabled" msgstr "Про кожен лист окремо" -#: Mailnag/plugins/libnotifyplugin.ui.h:15 +#: Mailnag/plugins/libnotifyplugin.ui.h:7 +#, fuzzy +msgid "Sender" +msgstr "відправник" + +#: Mailnag/plugins/libnotifyplugin.ui.h:8 +#, fuzzy +msgid "Subject" +msgstr "тема" + +#: Mailnag/plugins/libnotifyplugin.ui.h:9 +msgid "Pattern" +msgstr "" + +#: Mailnag/plugins/libnotifyplugin.ui.h:10 msgid "Add 2FA Provider" msgstr "" -#: Mailnag/plugins/libnotifyplugin.ui.h:16 +#: Mailnag/plugins/libnotifyplugin.ui.h:11 msgid "Remove 2FA Provider" msgstr "" -#: Mailnag/plugins/libnotifyplugin.ui.h:17 +#: Mailnag/plugins/libnotifyplugin.ui.h:12 msgid "Edit 2FA Provider" msgstr "" -#: Mailnag/plugins/libnotifyplugin.ui.h:18 +#: Mailnag/plugins/libnotifyplugin.ui.h:13 #, fuzzy msgid "2FA notifications" msgstr "Звукові сповіщення" -#: Mailnag/plugins/libnotifyplugin.ui.h:19 +#: Mailnag/plugins/libnotifyplugin.ui.h:14 msgid "Enable/disable libnotify 2FA processing" msgstr "" +#: Mailnag/plugins/libnotifyplugin.ui.h:18 +msgid "Edit 2FA provider" +msgstr "" + +#: Mailnag/plugins/libnotifyplugin.ui.h:19 +#, fuzzy +msgid "Enable provider" +msgstr "Задіяно" + #, fuzzy #~ msgid "Garmin 2FA LibNotify Notifications" #~ msgstr "Сповіщення LibNotify" diff --git a/po/zh_CN.po b/po/zh_CN.po index 89bcff5..605a139 100644 --- a/po/zh_CN.po +++ b/po/zh_CN.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: mailnag\n" "Report-Msgid-Bugs-To: https://github.com/tikank/mailnagger/issues\n" -"POT-Creation-Date: 2025-11-17 21:03+0100\n" +"POT-Creation-Date: 2026-02-11 23:22+0100\n" "PO-Revision-Date: 2019-03-16 14:48+0000\n" "Last-Translator: Launchpad Translations Administrators \n" "Language-Team: Chinese (Simplified) \n" @@ -18,7 +18,7 @@ msgstr "" "X-Launchpad-Export-Date: 2020-06-11 14:44+0000\n" "X-Generator: Launchpad (build b190cebbf563f89e480a8b57f641753c8196bda0)\n" -#: Mailnag/daemon/mails.py:183 +#: Mailnag/daemon/mails.py:283 msgid "No subject" msgstr "无主题" @@ -31,15 +31,15 @@ msgid "optional" msgstr "可选" #: Mailnag/configuration/accountdialog.py:123 -#: Mailnag/configuration/configwindow.py:88 -#: Mailnag/configuration/configwindow.py:108 -#: Mailnag/plugins/libnotifyplugin.ui.h:14 +#: Mailnag/configuration/configwindow.py:90 +#: Mailnag/configuration/configwindow.py:110 +#: Mailnag/plugins/libnotifyplugin.ui.h:6 msgid "Enabled" msgstr "已启用" #: Mailnag/configuration/accountdialog.py:129 -#: Mailnag/configuration/configwindow.py:94 -#: Mailnag/configuration/configwindow.py:114 +#: Mailnag/configuration/configwindow.py:96 +#: Mailnag/configuration/configwindow.py:116 msgid "Name" msgstr "名称" @@ -63,30 +63,30 @@ msgstr "" msgid "Connection failed." msgstr "" -#: Mailnag/configuration/configwindow.py:278 +#: Mailnag/configuration/configwindow.py:280 msgid "About Mailnagger" msgstr "" -#: Mailnag/configuration/configwindow.py:281 +#: Mailnag/configuration/configwindow.py:283 msgid "An extensible mail notification daemon." msgstr "" -#: Mailnag/configuration/configwindow.py:283 +#: Mailnag/configuration/configwindow.py:285 #, python-brace-format msgid "Copyright (c) {years} {author} and contributors." msgstr "" -#: Mailnag/configuration/configwindow.py:290 +#: Mailnag/configuration/configwindow.py:292 msgid "Homepage" msgstr "" -#: Mailnag/configuration/configwindow.py:293 +#: Mailnag/configuration/configwindow.py:295 msgid "maintainer" msgstr "" #. TRANSLATORS: Translate `translator-credits` to the list of names #. of translators, or team, or something like that. -#: Mailnag/configuration/configwindow.py:313 +#: Mailnag/configuration/configwindow.py:315 msgid "translator-credits" msgstr "" "Launchpad Contributions:\n" @@ -94,7 +94,7 @@ msgstr "" " Patrick Ulbrich https://launchpad.net/~pulb\n" " 朱涛 https://launchpad.net/~bill-zt" -#: Mailnag/configuration/configwindow.py:353 +#: Mailnag/configuration/configwindow.py:355 msgid "Delete this account:" msgstr "删除该帐户:" @@ -130,84 +130,84 @@ msgid "" "followed by %s sequences." msgstr "" -#: Mailnag/plugins/libnotifyplugin.py:64 +#: Mailnag/plugins/libnotifyplugin.py:74 msgid "Your Security Passcode" msgstr "" -#: Mailnag/plugins/libnotifyplugin.py:134 +#: Mailnag/plugins/libnotifyplugin.py:143 msgid "LibNotify Notifications" msgstr "弹出窗口通知" -#: Mailnag/plugins/libnotifyplugin.py:135 +#: Mailnag/plugins/libnotifyplugin.py:144 msgid "Shows a popup when new mails arrive." msgstr "当新邮件到达时弹出。" -#: Mailnag/plugins/libnotifyplugin.py:177 +#: Mailnag/plugins/libnotifyplugin.py:186 msgid "Notification mode:" msgstr "通知模式" -#: Mailnag/plugins/libnotifyplugin.py:179 +#: Mailnag/plugins/libnotifyplugin.py:188 msgid "2FA providers" msgstr "" -#: Mailnag/plugins/libnotifyplugin.py:322 -#: Mailnag/plugins/libnotifyplugin.py:358 -#: Mailnag/plugins/libnotifyplugin.py:487 +#: Mailnag/plugins/libnotifyplugin.py:391 +#: Mailnag/plugins/libnotifyplugin.py:427 +#: Mailnag/plugins/libnotifyplugin.py:577 #, python-brace-format msgid "{0} new mails" msgstr "" -#: Mailnag/plugins/libnotifyplugin.py:324 +#: Mailnag/plugins/libnotifyplugin.py:393 #, python-brace-format msgid "from {0} and others." msgstr "" -#: Mailnag/plugins/libnotifyplugin.py:326 -#: Mailnag/plugins/libnotifyplugin.py:329 +#: Mailnag/plugins/libnotifyplugin.py:395 +#: Mailnag/plugins/libnotifyplugin.py:398 #, python-brace-format msgid "from {0}." msgstr "" -#: Mailnag/plugins/libnotifyplugin.py:328 -#: Mailnag/plugins/libnotifyplugin.py:360 -#: Mailnag/plugins/libnotifyplugin.py:489 +#: Mailnag/plugins/libnotifyplugin.py:397 +#: Mailnag/plugins/libnotifyplugin.py:429 +#: Mailnag/plugins/libnotifyplugin.py:579 msgid "New mail" msgstr "" -#: Mailnag/plugins/libnotifyplugin.py:353 -#: Mailnag/plugins/libnotifyplugin.py:355 +#: Mailnag/plugins/libnotifyplugin.py:422 +#: Mailnag/plugins/libnotifyplugin.py:424 #, python-brace-format msgid "(and {0} more)" msgstr "( 还有 {0} 条)" -#: Mailnag/plugins/libnotifyplugin.py:432 +#: Mailnag/plugins/libnotifyplugin.py:522 #, python-brace-format msgid "📋 Code: {0}" msgstr "" -#: Mailnag/plugins/libnotifyplugin.py:476 +#: Mailnag/plugins/libnotifyplugin.py:566 msgid "Mark as read" msgstr "标记为已读" -#: Mailnag/plugins/libnotifyplugin.py:675 +#: Mailnag/plugins/libnotifyplugin.py:765 #, fuzzy msgid "Delete this provider:" msgstr "删除该帐户:" -#: Mailnag/plugins/libnotifyplugin.py:676 -#: Mailnag/plugins/libnotifyplugin.ui.h:1 +#: Mailnag/plugins/libnotifyplugin.py:766 +#: Mailnag/plugins/libnotifyplugin.ui.h:15 #, fuzzy msgid "Sender:" msgstr "寄件人" -#: Mailnag/plugins/libnotifyplugin.py:677 -#: Mailnag/plugins/libnotifyplugin.ui.h:3 +#: Mailnag/plugins/libnotifyplugin.py:767 +#: Mailnag/plugins/libnotifyplugin.ui.h:16 #, fuzzy msgid "Subject:" msgstr "主题" -#: Mailnag/plugins/libnotifyplugin.py:678 -#: Mailnag/plugins/libnotifyplugin.ui.h:5 +#: Mailnag/plugins/libnotifyplugin.py:768 +#: Mailnag/plugins/libnotifyplugin.ui.h:17 msgid "Pattern:" msgstr "" @@ -315,71 +315,71 @@ msgstr "" msgid "Info" msgstr "" -#: Mailnag/plugins/libnotifyplugin.ui.h:2 -#, fuzzy -msgid "Sender" -msgstr "寄件人" - -#: Mailnag/plugins/libnotifyplugin.ui.h:4 -#, fuzzy -msgid "Subject" -msgstr "主题" - -#: Mailnag/plugins/libnotifyplugin.ui.h:6 -msgid "Pattern" -msgstr "" - -#: Mailnag/plugins/libnotifyplugin.ui.h:7 -msgid "Edit 2FA provider" -msgstr "" - -#: Mailnag/plugins/libnotifyplugin.ui.h:8 -#, fuzzy -msgid "Enable provider" -msgstr "已启用" - -#: Mailnag/plugins/libnotifyplugin.ui.h:9 +#: Mailnag/plugins/libnotifyplugin.ui.h:1 msgid "Count of new mails" msgstr "新邮件数量" -#: Mailnag/plugins/libnotifyplugin.ui.h:10 +#: Mailnag/plugins/libnotifyplugin.ui.h:2 msgid "Short summary of new mails" msgstr "" -#: Mailnag/plugins/libnotifyplugin.ui.h:11 +#: Mailnag/plugins/libnotifyplugin.ui.h:3 msgid "Detailed summary of new mails" msgstr "" -#: Mailnag/plugins/libnotifyplugin.ui.h:12 +#: Mailnag/plugins/libnotifyplugin.ui.h:4 msgid "One notification per new mail" msgstr "每封新邮件通知一次" -#: Mailnag/plugins/libnotifyplugin.ui.h:13 +#: Mailnag/plugins/libnotifyplugin.ui.h:5 #, fuzzy msgid "Only 2FA notification, when enabled" msgstr "每封新邮件通知一次" -#: Mailnag/plugins/libnotifyplugin.ui.h:15 +#: Mailnag/plugins/libnotifyplugin.ui.h:7 +#, fuzzy +msgid "Sender" +msgstr "寄件人" + +#: Mailnag/plugins/libnotifyplugin.ui.h:8 +#, fuzzy +msgid "Subject" +msgstr "主题" + +#: Mailnag/plugins/libnotifyplugin.ui.h:9 +msgid "Pattern" +msgstr "" + +#: Mailnag/plugins/libnotifyplugin.ui.h:10 msgid "Add 2FA Provider" msgstr "" -#: Mailnag/plugins/libnotifyplugin.ui.h:16 +#: Mailnag/plugins/libnotifyplugin.ui.h:11 msgid "Remove 2FA Provider" msgstr "" -#: Mailnag/plugins/libnotifyplugin.ui.h:17 +#: Mailnag/plugins/libnotifyplugin.ui.h:12 msgid "Edit 2FA Provider" msgstr "" -#: Mailnag/plugins/libnotifyplugin.ui.h:18 +#: Mailnag/plugins/libnotifyplugin.ui.h:13 #, fuzzy msgid "2FA notifications" msgstr "声音通知" -#: Mailnag/plugins/libnotifyplugin.ui.h:19 +#: Mailnag/plugins/libnotifyplugin.ui.h:14 msgid "Enable/disable libnotify 2FA processing" msgstr "" +#: Mailnag/plugins/libnotifyplugin.ui.h:18 +msgid "Edit 2FA provider" +msgstr "" + +#: Mailnag/plugins/libnotifyplugin.ui.h:19 +#, fuzzy +msgid "Enable provider" +msgstr "已启用" + #, fuzzy #~ msgid "Garmin 2FA LibNotify Notifications" #~ msgstr "弹出窗口通知" diff --git a/po/zh_TW.po b/po/zh_TW.po index 8b2d011..c5d35f4 100644 --- a/po/zh_TW.po +++ b/po/zh_TW.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: mailnag\n" "Report-Msgid-Bugs-To: https://github.com/tikank/mailnagger/issues\n" -"POT-Creation-Date: 2025-11-17 21:03+0100\n" +"POT-Creation-Date: 2026-02-11 23:22+0100\n" "PO-Revision-Date: 2019-03-16 14:48+0000\n" "Last-Translator: Launchpad Translations Administrators \n" "Language-Team: Chinese (Traditional) \n" @@ -18,7 +18,7 @@ msgstr "" "X-Launchpad-Export-Date: 2020-06-11 14:44+0000\n" "X-Generator: Launchpad (build b190cebbf563f89e480a8b57f641753c8196bda0)\n" -#: Mailnag/daemon/mails.py:183 +#: Mailnag/daemon/mails.py:283 msgid "No subject" msgstr "無主題" @@ -31,15 +31,15 @@ msgid "optional" msgstr "可選" #: Mailnag/configuration/accountdialog.py:123 -#: Mailnag/configuration/configwindow.py:88 -#: Mailnag/configuration/configwindow.py:108 -#: Mailnag/plugins/libnotifyplugin.ui.h:14 +#: Mailnag/configuration/configwindow.py:90 +#: Mailnag/configuration/configwindow.py:110 +#: Mailnag/plugins/libnotifyplugin.ui.h:6 msgid "Enabled" msgstr "已啓用" #: Mailnag/configuration/accountdialog.py:129 -#: Mailnag/configuration/configwindow.py:94 -#: Mailnag/configuration/configwindow.py:114 +#: Mailnag/configuration/configwindow.py:96 +#: Mailnag/configuration/configwindow.py:116 msgid "Name" msgstr "名稱" @@ -63,36 +63,36 @@ msgstr "" msgid "Connection failed." msgstr "" -#: Mailnag/configuration/configwindow.py:278 +#: Mailnag/configuration/configwindow.py:280 msgid "About Mailnagger" msgstr "" -#: Mailnag/configuration/configwindow.py:281 +#: Mailnag/configuration/configwindow.py:283 msgid "An extensible mail notification daemon." msgstr "" -#: Mailnag/configuration/configwindow.py:283 +#: Mailnag/configuration/configwindow.py:285 #, python-brace-format msgid "Copyright (c) {years} {author} and contributors." msgstr "" -#: Mailnag/configuration/configwindow.py:290 +#: Mailnag/configuration/configwindow.py:292 msgid "Homepage" msgstr "" -#: Mailnag/configuration/configwindow.py:293 +#: Mailnag/configuration/configwindow.py:295 msgid "maintainer" msgstr "" #. TRANSLATORS: Translate `translator-credits` to the list of names #. of translators, or team, or something like that. -#: Mailnag/configuration/configwindow.py:313 +#: Mailnag/configuration/configwindow.py:315 msgid "translator-credits" msgstr "" "Launchpad Contributions:\n" " elleryq https://launchpad.net/~elleryq" -#: Mailnag/configuration/configwindow.py:353 +#: Mailnag/configuration/configwindow.py:355 msgid "Delete this account:" msgstr "刪除該帳戶:" @@ -128,84 +128,84 @@ msgid "" "followed by %s sequences." msgstr "" -#: Mailnag/plugins/libnotifyplugin.py:64 +#: Mailnag/plugins/libnotifyplugin.py:74 msgid "Your Security Passcode" msgstr "" -#: Mailnag/plugins/libnotifyplugin.py:134 +#: Mailnag/plugins/libnotifyplugin.py:143 msgid "LibNotify Notifications" msgstr "彈出視窗通知" -#: Mailnag/plugins/libnotifyplugin.py:135 +#: Mailnag/plugins/libnotifyplugin.py:144 msgid "Shows a popup when new mails arrive." msgstr "當新郵件到達時彈出訊息視窗。" -#: Mailnag/plugins/libnotifyplugin.py:177 +#: Mailnag/plugins/libnotifyplugin.py:186 msgid "Notification mode:" msgstr "通知模式" -#: Mailnag/plugins/libnotifyplugin.py:179 +#: Mailnag/plugins/libnotifyplugin.py:188 msgid "2FA providers" msgstr "" -#: Mailnag/plugins/libnotifyplugin.py:322 -#: Mailnag/plugins/libnotifyplugin.py:358 -#: Mailnag/plugins/libnotifyplugin.py:487 +#: Mailnag/plugins/libnotifyplugin.py:391 +#: Mailnag/plugins/libnotifyplugin.py:427 +#: Mailnag/plugins/libnotifyplugin.py:577 #, python-brace-format msgid "{0} new mails" msgstr "{0} 封新郵件" -#: Mailnag/plugins/libnotifyplugin.py:324 +#: Mailnag/plugins/libnotifyplugin.py:393 #, python-brace-format msgid "from {0} and others." msgstr "" -#: Mailnag/plugins/libnotifyplugin.py:326 -#: Mailnag/plugins/libnotifyplugin.py:329 +#: Mailnag/plugins/libnotifyplugin.py:395 +#: Mailnag/plugins/libnotifyplugin.py:398 #, python-brace-format msgid "from {0}." msgstr "" -#: Mailnag/plugins/libnotifyplugin.py:328 -#: Mailnag/plugins/libnotifyplugin.py:360 -#: Mailnag/plugins/libnotifyplugin.py:489 +#: Mailnag/plugins/libnotifyplugin.py:397 +#: Mailnag/plugins/libnotifyplugin.py:429 +#: Mailnag/plugins/libnotifyplugin.py:579 msgid "New mail" msgstr "新郵件" -#: Mailnag/plugins/libnotifyplugin.py:353 -#: Mailnag/plugins/libnotifyplugin.py:355 +#: Mailnag/plugins/libnotifyplugin.py:422 +#: Mailnag/plugins/libnotifyplugin.py:424 #, python-brace-format msgid "(and {0} more)" msgstr "( 還有 {0} 條)" -#: Mailnag/plugins/libnotifyplugin.py:432 +#: Mailnag/plugins/libnotifyplugin.py:522 #, python-brace-format msgid "📋 Code: {0}" msgstr "" -#: Mailnag/plugins/libnotifyplugin.py:476 +#: Mailnag/plugins/libnotifyplugin.py:566 msgid "Mark as read" msgstr "標記爲已讀" -#: Mailnag/plugins/libnotifyplugin.py:675 +#: Mailnag/plugins/libnotifyplugin.py:765 #, fuzzy msgid "Delete this provider:" msgstr "刪除該帳戶:" -#: Mailnag/plugins/libnotifyplugin.py:676 -#: Mailnag/plugins/libnotifyplugin.ui.h:1 +#: Mailnag/plugins/libnotifyplugin.py:766 +#: Mailnag/plugins/libnotifyplugin.ui.h:15 #, fuzzy msgid "Sender:" msgstr "寄件人" -#: Mailnag/plugins/libnotifyplugin.py:677 -#: Mailnag/plugins/libnotifyplugin.ui.h:3 +#: Mailnag/plugins/libnotifyplugin.py:767 +#: Mailnag/plugins/libnotifyplugin.ui.h:16 #, fuzzy msgid "Subject:" msgstr "主題" -#: Mailnag/plugins/libnotifyplugin.py:678 -#: Mailnag/plugins/libnotifyplugin.ui.h:5 +#: Mailnag/plugins/libnotifyplugin.py:768 +#: Mailnag/plugins/libnotifyplugin.ui.h:17 msgid "Pattern:" msgstr "" @@ -314,71 +314,71 @@ msgstr "" msgid "Info" msgstr "" -#: Mailnag/plugins/libnotifyplugin.ui.h:2 -#, fuzzy -msgid "Sender" -msgstr "寄件人" - -#: Mailnag/plugins/libnotifyplugin.ui.h:4 -#, fuzzy -msgid "Subject" -msgstr "主題" - -#: Mailnag/plugins/libnotifyplugin.ui.h:6 -msgid "Pattern" -msgstr "" - -#: Mailnag/plugins/libnotifyplugin.ui.h:7 -msgid "Edit 2FA provider" -msgstr "" - -#: Mailnag/plugins/libnotifyplugin.ui.h:8 -#, fuzzy -msgid "Enable provider" -msgstr "已啓用" - -#: Mailnag/plugins/libnotifyplugin.ui.h:9 +#: Mailnag/plugins/libnotifyplugin.ui.h:1 msgid "Count of new mails" msgstr "新郵件數量" -#: Mailnag/plugins/libnotifyplugin.ui.h:10 +#: Mailnag/plugins/libnotifyplugin.ui.h:2 msgid "Short summary of new mails" msgstr "" -#: Mailnag/plugins/libnotifyplugin.ui.h:11 +#: Mailnag/plugins/libnotifyplugin.ui.h:3 msgid "Detailed summary of new mails" msgstr "" -#: Mailnag/plugins/libnotifyplugin.ui.h:12 +#: Mailnag/plugins/libnotifyplugin.ui.h:4 msgid "One notification per new mail" msgstr "每封新郵件通知一次" -#: Mailnag/plugins/libnotifyplugin.ui.h:13 +#: Mailnag/plugins/libnotifyplugin.ui.h:5 #, fuzzy msgid "Only 2FA notification, when enabled" msgstr "每封新郵件通知一次" -#: Mailnag/plugins/libnotifyplugin.ui.h:15 +#: Mailnag/plugins/libnotifyplugin.ui.h:7 +#, fuzzy +msgid "Sender" +msgstr "寄件人" + +#: Mailnag/plugins/libnotifyplugin.ui.h:8 +#, fuzzy +msgid "Subject" +msgstr "主題" + +#: Mailnag/plugins/libnotifyplugin.ui.h:9 +msgid "Pattern" +msgstr "" + +#: Mailnag/plugins/libnotifyplugin.ui.h:10 msgid "Add 2FA Provider" msgstr "" -#: Mailnag/plugins/libnotifyplugin.ui.h:16 +#: Mailnag/plugins/libnotifyplugin.ui.h:11 msgid "Remove 2FA Provider" msgstr "" -#: Mailnag/plugins/libnotifyplugin.ui.h:17 +#: Mailnag/plugins/libnotifyplugin.ui.h:12 msgid "Edit 2FA Provider" msgstr "" -#: Mailnag/plugins/libnotifyplugin.ui.h:18 +#: Mailnag/plugins/libnotifyplugin.ui.h:13 #, fuzzy msgid "2FA notifications" msgstr "聲音通知" -#: Mailnag/plugins/libnotifyplugin.ui.h:19 +#: Mailnag/plugins/libnotifyplugin.ui.h:14 msgid "Enable/disable libnotify 2FA processing" msgstr "" +#: Mailnag/plugins/libnotifyplugin.ui.h:18 +msgid "Edit 2FA provider" +msgstr "" + +#: Mailnag/plugins/libnotifyplugin.ui.h:19 +#, fuzzy +msgid "Enable provider" +msgstr "已啓用" + #, fuzzy #~ msgid "Garmin 2FA LibNotify Notifications" #~ msgstr "彈出視窗通知" From 112b05e650dc9d0b76b5365d9e26351a7d61f3e1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Auzi?= Date: Thu, 12 Feb 2026 20:34:27 +0100 Subject: [PATCH 38/49] Configure [logger_levels] --- Mailnag/common/config.py | 1 + Mailnag/common/utils.py | 70 +++++++++++++++++++++++++++-------- mailnagger/config/__init__.py | 10 ++--- mailnagger/daemon/__init__.py | 2 +- 4 files changed, 62 insertions(+), 21 deletions(-) diff --git a/Mailnag/common/config.py b/Mailnag/common/config.py index 2d2a443..bab914f 100644 --- a/Mailnag/common/config.py +++ b/Mailnag/common/config.py @@ -44,6 +44,7 @@ def cfg_exists() -> bool: def read_cfg() -> RawConfigParser: cfg = RawConfigParser() + cfg.optionxform = str cfg.read_dict(mailnag_defaults) if os.path.exists(cfg_file): diff --git a/Mailnag/common/utils.py b/Mailnag/common/utils.py index f000581..64102b3 100644 --- a/Mailnag/common/utils.py +++ b/Mailnag/common/utils.py @@ -23,6 +23,7 @@ import time import dbus import logging +import logging.config import logging.handlers from collections.abc import Callable from typing import TypeVar @@ -31,6 +32,7 @@ gi.require_version('Goa', '1.0') from gi.repository import Goa +from Mailnag.common.config import read_cfg from Mailnag.common.dist_cfg import DBUS_BUS_NAME, DBUS_OBJ_PATH LOG_FORMAT = '%(levelname)s (%(asctime)s): %(message)s' @@ -47,20 +49,57 @@ def init_logging( format = LOG_FORMAT, datefmt = LOG_DATE_FORMAT, level = log_level) - + logger = logging.getLogger('') - + if not enable_stdout: stdout_handler = logger.handlers[0] logger.removeHandler(stdout_handler) - + if enable_syslog: syslog_handler = logging.handlers.SysLogHandler(address='/dev/log') syslog_handler.setLevel(log_level) syslog_handler.setFormatter(logging.Formatter(LOG_FORMAT, LOG_DATE_FORMAT)) - + logger.addHandler(syslog_handler) + configure_logging() + +def configure_logging() -> None: + VALID_LEVELS = {"DEBUG", "INFO", "WARNING", "ERROR", "CRITICAL"} + + config = { + "version": 1, + "disable_existing_loggers": False, + "incremental": True, + "root": { + "level": logging.getLevelName(logging.getLogger().getEffectiveLevel()) + }, + "loggers": {}, + } + + cfg = read_cfg() + + if not 'logger_levels' in cfg: + return + + raw_levels = dict(cfg.items('logger_levels')) + for name, level in raw_levels.items(): + clean_level = str(level).upper().strip() + + if clean_level not in VALID_LEVELS: + continue + + if name == "root": + config["root"]["level"] = clean_level + else: + config["loggers"][name] = { + "level": clean_level, + "propagate": True + } + + logging.config.dictConfig(config) + def splitstr(strn: str, delimeter: str) -> list[str]: return [s.strip() for s in strn.split(delimeter) if s.strip()] @@ -87,21 +126,21 @@ def try_call(f: Callable[[], T], err_retval: T) -> T: def shutdown_existing_instance(wait_for_completion: bool = True) -> None: bus = dbus.SessionBus() - + if bus.name_has_owner(DBUS_BUS_NAME): sys.stdout.write('Shutting down existing Mailnagger process...') sys.stdout.flush() - + try: proxy = bus.get_object(DBUS_BUS_NAME, DBUS_OBJ_PATH) shutdown = proxy.get_dbus_method('Shutdown', DBUS_BUS_NAME) - + shutdown() - + if wait_for_completion: while bus.name_has_owner(DBUS_BUS_NAME): time.sleep(2) - + print('OK') except: print('FAILED') @@ -109,10 +148,10 @@ def shutdown_existing_instance(wait_for_completion: bool = True) -> None: def get_goa_account_id(name, user): _LOGGER.debug("Get GOA account: name: %s, user: %s", name, user) - + client = Goa.Client.new_sync(None) goa_accounts = client.get_accounts() - + for obj in goa_accounts: account = obj.get_account() if account is None or account.props.mail_disabled: @@ -122,8 +161,8 @@ def get_goa_account_id(name, user): continue _LOGGER.debug(" account: name: %s, user: %s", - mail.props.email_address, - mail.props.imap_user_name) + mail.props.email_address, + mail.props.imap_user_name) if (name == mail.props.email_address and user == mail.props.imap_user_name): identity = account.get_property('id') @@ -134,6 +173,7 @@ def get_goa_account_id(name, user): return identity return None + def refresh_goa_token(account_id): client = Goa.Client.new_sync(None) obj = client.lookup_by_id(account_id) @@ -143,9 +183,9 @@ def refresh_goa_token(account_id): oauth2_based = obj.get_oauth2_based() if oauth2_based is None: return None - + return oauth2_based.call_get_access_token_sync(None) - + def strlimit(txt: str) -> str: txt = str(txt) diff --git a/mailnagger/config/__init__.py b/mailnagger/config/__init__.py index bae3fff..dfecd37 100755 --- a/mailnagger/config/__init__.py +++ b/mailnagger/config/__init__.py @@ -35,7 +35,7 @@ from Mailnag.configuration.configwindow import ConfigWindow from mailnagger.resources import get_icon_paths -LOG_LEVEL = logging.DEBUG +LOG_LEVEL = logging.WARNING class App(Gtk.Application): @@ -49,8 +49,8 @@ def __init__(self): def do_startup(self) -> None: Gtk.Application.do_startup(self) - # Add icons in alternative data paths (e.g. ./data/icons) - # to the icon search path in case Mailnag is launched + # Add icons in alternative data paths (e.g. ./data/icons) + # to the icon search path in case Mailnag is launched # from a local directory (without installing). icon_theme = Gtk.IconTheme.get_default() for path in get_icon_paths(): @@ -69,7 +69,7 @@ def do_shutdown(self) -> None: if self.win.get_daemon_enabled(): try: - # the launched daemon shuts down + # the launched daemon shuts down # an already running daemon print("Launching Mailnagger daemon.") try: @@ -88,7 +88,7 @@ def main() -> int: set_procname("mailnagger-config") init_logging(enable_stdout = True, enable_syslog = False, log_level = LOG_LEVEL) + app = App() app.run(None) return os.EX_OK - diff --git a/mailnagger/daemon/__init__.py b/mailnagger/daemon/__init__.py index 09e41f9..d1b4901 100755 --- a/mailnagger/daemon/__init__.py +++ b/mailnagger/daemon/__init__.py @@ -45,7 +45,7 @@ _LOGGER = logging.getLogger(__name__) PROGNAME = 'mailnagger' -LOG_LEVEL = logging.DEBUG +LOG_LEVEL = logging.WARNING def cleanup(daemon: Optional[MailnagDaemon]) -> None: From ac9bf8b3f0ee8bc20c916c56eb4c49687c476ada Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Auzi?= Date: Thu, 12 Feb 2026 20:56:11 +0100 Subject: [PATCH 39/49] Add "Mailnag.plugins." prefix to libnotify logger name --- Mailnag/plugins/libnotifyplugin.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Mailnag/plugins/libnotifyplugin.py b/Mailnag/plugins/libnotifyplugin.py index 450ccb3..f3814ee 100644 --- a/Mailnag/plugins/libnotifyplugin.py +++ b/Mailnag/plugins/libnotifyplugin.py @@ -55,7 +55,7 @@ NOTIFICATION_MODE_SINGLE = '2' NOTIFICATION_MODE_SILENT = '4' -_LOGGER = logging.getLogger(__name__) +_LOGGER = logging.getLogger('Mailnag.plugins.' + __name__) DESKTOP_ENV_VARS_FOR_SUPPORT_TEST = ('XDG_CURRENT_DESKTOP', 'GDMSESSION') SUPPORTED_DESKTOP_ENVIRONMENTS = ("gnome", "cinnamon") From 190f023950905ad30af903a8f07ae39b01642464 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Auzi?= Date: Sat, 14 Feb 2026 08:32:41 +0100 Subject: [PATCH 40/49] Add Mailnag.plugins or Config.plugins prefixes to plugins modules for logger identification --- Mailnag/common/plugins.py | 136 ++++++++++++++++------------- Mailnag/plugins/libnotifyplugin.py | 2 +- 2 files changed, 74 insertions(+), 64 deletions(-) diff --git a/Mailnag/common/plugins.py b/Mailnag/common/plugins.py index 6ada7f0..383822d 100644 --- a/Mailnag/common/plugins.py +++ b/Mailnag/common/plugins.py @@ -40,15 +40,15 @@ # All known hook types. # class HookTypes(Enum): - # func signature: + # func signature: # IN: List of loaded accounts # OUT: None ACCOUNTS_LOADED = 'accounts-loaded' - # func signature: + # func signature: # IN: None # OUT: None MAIL_CHECK = 'mail-check' - # func signature: + # func signature: # IN: new mails, all mails # OUT: None MAILS_ADDED = 'mails-added' @@ -66,7 +66,7 @@ class HookTypes(Enum): # Registry class for plugin hooks. # # Registered hook functions must not block the mailnag daemon. -# Hook functions with an execution time > 1s should be +# Hook functions with an execution time > 1s should be # implemented non-blocking (i. e. asynchronously). class HookRegistry: def __init__(self) -> None: @@ -75,9 +75,9 @@ def __init__(self) -> None: HookTypes.MAIL_CHECK : [], HookTypes.MAILS_ADDED : [], HookTypes.MAILS_REMOVED : [], - HookTypes.FILTER_MAILS : [] + HookTypes.FILTER_MAILS : [] } - + # Priority should be an integer value fom 0 (very high) to 100 (very low) # Plugin hooks will be called in order from high to low priority. def register_hook_func( @@ -87,21 +87,21 @@ def register_hook_func( priority: int = 100 ) -> None: self._hooks[hooktype].append((priority, func)) - - + + def unregister_hook_func(self, hooktype: HookTypes, func: Callable) -> None: pairs = self._hooks[hooktype] pair = next(pa for pa in pairs if (pa[1] == func)) pairs.remove(pair) - - + + def get_hook_funcs(self, hooktype: HookTypes) -> list[Callable]: pairs_by_prio = sorted(self._hooks[hooktype], key = lambda p: p[0]) funcs = [f for p, f in pairs_by_prio] return funcs -# Abstract base class for a MailnagController instance +# Abstract base class for a MailnagController instance # passed to plugins. class MailnagController(ABC): # Returns a HookRegistry object. @@ -130,74 +130,74 @@ def mark_mail_as_read(self, mail_id: str) -> None: # class Plugin: def __init__(self) -> None: - # Plugins shouldn't do anything in the constructor. - # They are expected to start living if they are actually + # Plugins shouldn't do anything in the constructor. + # They are expected to start living if they are actually # enabled (i.e. in the enable() method). # Plugin data isn't enabled yet and call to methods like # get_mailnag_controller() or get_config(). pass - + # - # Abstract methods, + # Abstract methods, # to be overriden by derived plugin types. # def enable(self) -> None: # Plugins are expected to # register all hooks here. raise NotImplementedError - - + + def disable(self) -> None: # Plugins are expected to - # unregister all hooks here, - # free all allocated resources, + # unregister all hooks here, + # free all allocated resources, # and terminate threads (if any). raise NotImplementedError - - + + def get_manifest(self) -> tuple[str, str, str, str]: # Plugins are expected to # return a tuple of the following form: # (name, description, version, author). raise NotImplementedError - - + + def get_default_config(self) -> dict[str, Any]: # Plugins are expected to return a # dictionary with default values. raise NotImplementedError - - + + def has_config_ui(self) -> bool: # Plugins are expected to return True if # they provide a configuration widget, # otherwise they must return False. raise NotImplementedError - - + + def get_config_ui(self) -> Optional[Gtk.Widget]: # Plugins are expected to # return a GTK widget here. - # Return None if the plugin + # Return None if the plugin # does not need a config widget. raise NotImplementedError - + def load_ui_from_config(self, config_ui: Gtk.Widget) -> None: # Plugins are expected to - # load their config values (get_config()) + # load their config values (get_config()) # in the widget returned by get_config_ui(). raise NotImplementedError - - + + def save_ui_to_config(self, config_ui: Gtk.Widget) -> None: # Plugins are expected to # save the config values of the widget # returned by get_config_ui() to their config # (get_config()). raise NotImplementedError - - + + # # Public methods # @@ -208,50 +208,50 @@ def init( mailnag_controller: Optional[MailnagController] ) -> None: config = {} - + # try to load plugin config if cfg.has_section(modname): for name, value in cfg.items(modname): config[name] = value - + # sync with default config default_config = self.get_default_config() for k, v in default_config.items(): if k not in config: config[k] = v - + self._modname = modname self._config = config self._mailnag_controller = mailnag_controller - - + + def get_name(self) -> str: name = self.get_manifest()[0] return name - - + + def get_modname(self) -> str: return self._modname - - + + def get_config(self) -> dict[str, Any]: return self._config - - + + # # Protected methods # def get_mailnag_controller(self) -> MailnagController: assert self._mailnag_controller is not None, "Plugin is not initialized with valid MailnagController" return self._mailnag_controller - - + + # # Static methods # - - # Note : Plugin instances do not own - # a reference to MailnagController object + + # Note : Plugin instances do not own + # a reference to MailnagController object # when instantiated in *config mode*. @staticmethod def load_plugins( @@ -261,8 +261,8 @@ def load_plugins( ) -> list["Plugin"]: plugins = [] plugin_types = Plugin._load_plugin_types() - - for modname, t in plugin_types: + + for modname, t in plugin_types: try: if (filter_names is None) or (modname in filter_names): p = t() @@ -270,32 +270,42 @@ def load_plugins( plugins.append(p) except: _LOGGER.exception("Failed to instantiate plugin '%s'" % modname) - + return plugins - - + + @staticmethod def _load_plugin_types() -> list[tuple[str, type["Plugin"]]]: plugin_types = [] - - for path in get_plugin_paths(): + + plugin_paths = get_plugin_paths() + modname_prefixes = { + plugin_paths[0]: 'Mailnag.plugins.', + plugin_paths[1]: 'Config.plugins.' + } + + for path in plugin_paths: if not path.is_dir(): continue - + + modname_p = modname_prefixes.get(path, None) + for f in path.iterdir(): mod = None modname, ext = os.path.splitext(f.name) filename = str(path / f.name) - + + full_modname = modname_p + modname if modname_p else modname + try: if ext.lower() == '.py': - loader: importlib.abc.SourceLoader = importlib.machinery.SourceFileLoader(modname, filename) + loader: importlib.abc.SourceLoader = importlib.machinery.SourceFileLoader(full_modname, filename) elif ext.lower() == '.pyc': - loader = importlib.machinery.SourcelessFileLoader(modname, filename) + loader = importlib.machinery.SourcelessFileLoader(full_modname, filename) else: continue - spec = importlib.util.spec_from_file_location(modname, filename, loader=loader) + spec = importlib.util.spec_from_file_location(full_modname, filename, loader=loader) if spec is None: continue @@ -311,5 +321,5 @@ def _load_plugin_types() -> list[tuple[str, type["Plugin"]]]: plugin_types.append((modname, attr)) except: _LOGGER.exception("Error while opening plugin file '%s'" % f) - + return plugin_types diff --git a/Mailnag/plugins/libnotifyplugin.py b/Mailnag/plugins/libnotifyplugin.py index f3814ee..450ccb3 100644 --- a/Mailnag/plugins/libnotifyplugin.py +++ b/Mailnag/plugins/libnotifyplugin.py @@ -55,7 +55,7 @@ NOTIFICATION_MODE_SINGLE = '2' NOTIFICATION_MODE_SILENT = '4' -_LOGGER = logging.getLogger('Mailnag.plugins.' + __name__) +_LOGGER = logging.getLogger(__name__) DESKTOP_ENV_VARS_FOR_SUPPORT_TEST = ('XDG_CURRENT_DESKTOP', 'GDMSESSION') SUPPORTED_DESKTOP_ENVIRONMENTS = ("gnome", "cinnamon") From f64fcf12e3c4d54106d029ca8ed775eea29f079b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Auzi?= Date: Sat, 14 Feb 2026 09:21:22 +0100 Subject: [PATCH 41/49] Robustness in logger formats (mainly against formatting char % in data) --- Mailnag/backends/imap.py | 10 +++++----- Mailnag/backends/pop3.py | 2 +- Mailnag/common/accounts.py | 6 +++--- Mailnag/common/plugins.py | 4 ++-- Mailnag/common/subproc.py | 2 +- Mailnag/daemon/idlers.py | 25 +++++++++++++------------ Mailnag/daemon/mailchecker.py | 2 +- Mailnag/daemon/mailnagdaemon.py | 6 +++--- Mailnag/daemon/mails.py | 6 +++--- setup.py | 2 +- 10 files changed, 33 insertions(+), 32 deletions(-) diff --git a/Mailnag/backends/imap.py b/Mailnag/backends/imap.py index 2cd2a37..0db0915 100644 --- a/Mailnag/backends/imap.py +++ b/Mailnag/backends/imap.py @@ -115,7 +115,7 @@ def list_messages(self) -> Iterator[tuple[str, Message, str | None, dict[str, An continue if status != 'OK' or None in [d for d in data]: - _LOGGER.debug('Folder %s in status %s | Data: %s', (folder, status, data)) + _LOGGER.debug('Folder %s in status %s | Data: %s', folder, status, data) continue # Bugfix LP-735071 for num in data[0].split(): @@ -128,8 +128,7 @@ def list_messages(self) -> Iterator[tuple[str, Message, str | None, dict[str, An if b'BODY[HEADER]' in response_part[0]: header = email.message_from_bytes(response_part[1]) if header: - _LOGGER.debug("Msg header:\n%s", - dbgindent(header)) + _LOGGER.debug("Msg header:\n%s", dbgindent(header)) yield (folder, header, num.decode("utf-8"), { 'folder' : folder }) def fetch_text(self, mail: Mail) -> str | None: @@ -210,7 +209,8 @@ def mark_as_seen(self, mails: list[Mail]) -> None: last_folder = folder status, data = conn.uid("STORE", m.flags['uid'], "+FLAGS", r"(\Seen)") except: - _LOGGER.warning("Failed to set mail with uid %s to seen on server (account: '%s').", m.flags['uid'], self.name) + _LOGGER.warning("Failed to set mail with uid %s to seen on server (account: '%s').", + m.flags['uid'], self.name) finally: self._disconnect(conn) @@ -307,7 +307,7 @@ def _connect(self) -> imaplib.IMAP4: if 'STARTTLS' in conn.capabilities: conn.starttls() else: - _LOGGER.warning("Using unencrypted connection for account '%s'" % self.name) + _LOGGER.warning("Using unencrypted connection for account '%s'", self.name) if self.oauth2string != '': self._refresh_token() diff --git a/Mailnag/backends/pop3.py b/Mailnag/backends/pop3.py index 1684079..ebc9aff 100644 --- a/Mailnag/backends/pop3.py +++ b/Mailnag/backends/pop3.py @@ -80,7 +80,7 @@ def open(self) -> None: try: conn.stls() except: - _LOGGER.warning("Using unencrypted connection for account '%s'" % self.name) + _LOGGER.warning("Using unencrypted connection for account '%s'", self.name) conn.getwelcome() conn.user(self.user) diff --git a/Mailnag/common/accounts.py b/Mailnag/common/accounts.py index 5026f0b..2203161 100644 --- a/Mailnag/common/accounts.py +++ b/Mailnag/common/accounts.py @@ -146,7 +146,7 @@ def fetch_text(self, mail: Mail) -> str | None: if not self.is_open(): self.open() except Exception as ex: - _LOGGER.error("Failed to open mailbox for account '%s' (%s)." % (self.name, ex)) + _LOGGER.error("Failed to open mailbox for account '%s' (%s).", self.name, ex) return ret try: @@ -162,7 +162,7 @@ def fetch_text(self, mail: Mail) -> str | None: if self.supports_notifications(): raise else: - _LOGGER.error("An error occured while processing mails of account '%s' (%s)." % (self.name, ex)) + _LOGGER.error("An error occured while processing mails of account '%s' (%s).", self.name, ex) finally: # leave account with notifications open, so that it can # send notifications about new mails @@ -376,7 +376,7 @@ def save_to_cfg(self, cfg: RawConfigParser) -> None: i = 1 for acc in self._accounts: if acc.oauth2string != '': - _LOGGER.warning("Saving of OAuth2 based accounts is not supported. Account '%s' skipped." % acc.name) + _LOGGER.warning("Saving of OAuth2 based accounts is not supported. Account '%s' skipped.", acc.name) continue section_name = "account" + str(i) diff --git a/Mailnag/common/plugins.py b/Mailnag/common/plugins.py index 383822d..2b4f150 100644 --- a/Mailnag/common/plugins.py +++ b/Mailnag/common/plugins.py @@ -269,7 +269,7 @@ def load_plugins( p.init(modname, cfg, mailnag_controller) plugins.append(p) except: - _LOGGER.exception("Failed to instantiate plugin '%s'" % modname) + _LOGGER.exception("Failed to instantiate plugin '%s'", modname) return plugins @@ -320,6 +320,6 @@ def _load_plugin_types() -> list[tuple[str, type["Plugin"]]]: if issubclass(attr, Plugin) and attr != Plugin: plugin_types.append((modname, attr)) except: - _LOGGER.exception("Error while opening plugin file '%s'" % f) + _LOGGER.exception("Error while opening plugin file '%s'", f) return plugin_types diff --git a/Mailnag/common/subproc.py b/Mailnag/common/subproc.py index ac530e4..7be215d 100644 --- a/Mailnag/common/subproc.py +++ b/Mailnag/common/subproc.py @@ -135,7 +135,7 @@ def run(self) -> None: # Kill process p and quit the thread # waiting for p to terminate (p.wait()). p.kill() - _LOGGER.info('Watchdog killed process %s' % p.pid) + _LOGGER.info('Watchdog killed process %d', p.pid) except: _LOGGER.debug('p.kill() failed') diff --git a/Mailnag/daemon/idlers.py b/Mailnag/daemon/idlers.py index 93944cc..59e6eea 100644 --- a/Mailnag/daemon/idlers.py +++ b/Mailnag/daemon/idlers.py @@ -75,9 +75,9 @@ def _idle(self) -> None: try: self._account.open() except Exception as ex: - _LOGGER.error("Failed to open mailbox for account '%s' (%s)." % (self._account.name, ex)) - _LOGGER.info("Trying to reconnect Idler thread for account '%s' in %s minutes" % - (self._account.name, str(self.RECONNECT_RETRY_INTERVAL))) + _LOGGER.error("Failed to open mailbox for account '%s' (%s).", self._account.name, ex) + _LOGGER.info("Trying to reconnect Idler thread for account '%s' in %d minutes", + self._account.name, self.RECONNECT_RETRY_INTERVAL) self._wait(60 * self.RECONNECT_RETRY_INTERVAL) # don't hammer the server while not self._disposing: @@ -127,7 +127,8 @@ def _idle_callback(self, error: Optional[tuple[str, int]]) -> None: # flag the need for a connection reset in case of an error (e.g. conn terminated) if error is not None: error_type, error_val = error - _LOGGER.error("Idle callback for account '%s' returned an error (%s - %s)." % (self._account.name, error_type, str(error_val))) + _LOGGER.error("Idle callback for account '%s' returned an error (%s - %s).", + self._account.name, error_type, str(error_val)) self._needreset = True # trigger waiting _idle thread @@ -136,7 +137,7 @@ def _idle_callback(self, error: Optional[tuple[str, int]]) -> None: def _reset_conn(self) -> None: # Try to reset the connection to recover from a possible connection error (e.g. after system suspend) - _LOGGER.info("Resetting connection for account '%s'" % self._account.name) + _LOGGER.info("Resetting connection for account '%s'", self._account.name) try: self._account.close() except: pass self._reconnect() @@ -144,17 +145,17 @@ def _reset_conn(self) -> None: def _reconnect(self) -> None: # connection has been reset by provider -> try to reconnect - _LOGGER.info("Idler thread for account '%s' has been disconnected" % self._account.name) + _LOGGER.info("Idler thread for account '%s' has been disconnected", self._account.name) while (not self._account.is_open()) and (not self._disposing): - _LOGGER.info("Trying to reconnect Idler thread for account '%s'." % self._account.name) + _LOGGER.info("Trying to reconnect Idler thread for account '%s'.", self._account.name) try: self._account.open() - _LOGGER.info("Successfully reconnected Idler thread for account '%s'." % self._account.name) + _LOGGER.info("Successfully reconnected Idler thread for account '%s'.", self._account.name) except Exception as ex: - _LOGGER.error("Failed to reconnect Idler thread for account '%s' (%s)." % (self._account.name, ex)) - _LOGGER.info("Trying to reconnect Idler thread for account '%s' in %s minutes" % - (self._account.name, str(self.RECONNECT_RETRY_INTERVAL))) + _LOGGER.error("Failed to reconnect Idler thread for account '%s' (%s).", self._account.name, ex) + _LOGGER.info("Trying to reconnect Idler thread for account '%s' in %d minutes", + self._account.name, self.RECONNECT_RETRY_INTERVAL) self._wait(60 * self.RECONNECT_RETRY_INTERVAL) # don't hammer the server @@ -188,7 +189,7 @@ def start(self) -> None: idler.start() self._idlerlist.append(idler) except Exception as ex: - _LOGGER.error("Error: Failed to create an idler thread for account '%s' (%s)" % (acc.name, ex)) + _LOGGER.error("Error: Failed to create an idler thread for account '%s' (%s)", acc.name, ex) def dispose(self) -> None: diff --git a/Mailnag/daemon/mailchecker.py b/Mailnag/daemon/mailchecker.py index d5a8e7f..27b48a2 100644 --- a/Mailnag/daemon/mailchecker.py +++ b/Mailnag/daemon/mailchecker.py @@ -57,7 +57,7 @@ def check(self, accounts: list[Account]) -> None: # make sure multiple threads (idler and polling thread) # don't check for mails simultaneously. with self._mailcheck_lock: - _LOGGER.info('Checking %s email account(s).' % len(accounts)) + _LOGGER.info('Checking %d email account(s).', len(accounts)) if _LOGGER.getEffectiveLevel() == logging.DEBUG and len(accounts): _LOGGER.debug("Accounts:\n - %s", '\n - '.join([a.name for a in accounts])) diff --git a/Mailnag/daemon/mailnagdaemon.py b/Mailnag/daemon/mailnagdaemon.py index dee4aa3..1595d96 100644 --- a/Mailnag/daemon/mailnagdaemon.py +++ b/Mailnag/daemon/mailnagdaemon.py @@ -267,9 +267,9 @@ def _load_plugins(self, cfg: RawConfigParser) -> None: for p in self._plugins: try: p.enable() - _LOGGER.info("Successfully enabled plugin '%s'." % p.get_modname()) + _LOGGER.info("Successfully enabled plugin '%s'.", p.get_modname()) except: - _LOGGER.error("Failed to enable plugin '%s'." % p.get_modname()) + _LOGGER.error("Failed to enable plugin '%s'.", p.get_modname()) def _unload_plugins(self) -> None: @@ -282,7 +282,7 @@ def _unload_plugins(self) -> None: p.disable() except: err = True - _LOGGER.error("Failed to disable plugin '%s'." % p.get_modname()) + _LOGGER.error("Failed to disable plugin '%s'.", p.get_modname()) if not err: _LOGGER.info('Plugins disabled successfully.') diff --git a/Mailnag/daemon/mails.py b/Mailnag/daemon/mails.py index 8c4b3af..0c0a813 100644 --- a/Mailnag/daemon/mails.py +++ b/Mailnag/daemon/mails.py @@ -208,7 +208,7 @@ def collect_mail(self, sort: bool = True) -> list[Mail]: if not acc.is_open(): acc.open() except Exception as ex: - _LOGGER.error("Failed to open mailbox for account '%s' (%s)." % (acc.name, ex)) + _LOGGER.error("Failed to open mailbox for account '%s' (%s).", acc.name, ex) continue try: @@ -237,7 +237,7 @@ def collect_mail(self, sort: bool = True) -> list[Mail]: if acc.supports_notifications(): raise else: - _LOGGER.error("An error occured while processing mails of account '%s' (%s)." % (acc.name, ex)) + _LOGGER.error("An error occured while processing mails of account '%s' (%s).", acc.name, ex) finally: # leave account with notifications open, so that it can # send notifications about new mails @@ -313,7 +313,7 @@ def _get_header_field(self, msg_dict: Message, key: str) -> str: elif key.lower() in msg_dict: value = msg_dict[key.lower()] else: - _LOGGER.debug("Couldn't get %s from message." % key) + _LOGGER.debug("Couldn't get %s from message.", key) raise KeyError return value diff --git a/setup.py b/setup.py index ae6c2e9..0a7d6e5 100755 --- a/setup.py +++ b/setup.py @@ -57,7 +57,7 @@ def run(self): raise Warning("gen_locales returned %d (%s)" % (rc, err)) except Exception as e: _LOGGER.error("Building locales failed.") - _LOGGER.error("Error: %s" % str(e)) + _LOGGER.error("Error: %s", str(e)) sys.exit(1) # remove patch dir (if existing) From 489264dda93018d50417f29bba6a3f66b16a559c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Auzi?= Date: Sat, 14 Feb 2026 11:08:21 +0100 Subject: [PATCH 42/49] Some cleanups and fix pattern get_text --- Mailnag/plugins/libnotifyplugin.py | 37 ++++++++++++++---------------- 1 file changed, 17 insertions(+), 20 deletions(-) diff --git a/Mailnag/plugins/libnotifyplugin.py b/Mailnag/plugins/libnotifyplugin.py index 450ccb3..a1fde61 100644 --- a/Mailnag/plugins/libnotifyplugin.py +++ b/Mailnag/plugins/libnotifyplugin.py @@ -32,7 +32,6 @@ import re from subprocess import Popen, PIPE import logging -import json import csv import copy from collections.abc import Callable @@ -60,6 +59,8 @@ DESKTOP_ENV_VARS_FOR_SUPPORT_TEST = ('XDG_CURRENT_DESKTOP', 'GDMSESSION') SUPPORTED_DESKTOP_ENVIRONMENTS = ("gnome", "cinnamon") +RE_CODE = r'\b(?P\d+)\b' + cfg_2fa_providers_file = os.path.join(cfg_folder, '2fa_providers.tsv') plugin_defaults = { @@ -212,17 +213,14 @@ def get_config_ui(self) -> Gtk.Box: self._scrolled_window.set_propagate_natural_height(True) self._scrolled_window.set_propagate_natural_width(True) self._scrolled_window.set_max_content_height(348) - + return builder.get_object('box1') @staticmethod def _eval_2fa_providers(providers: list|str) -> list: - if isinstance(providers,list): - return providers - if not isinstance(providers,str): - return [] - return eval(providers) + assert isinstance(providers,list), f'Oops! config still have invalid providers (type={type(providers).__name__})' + return providers @staticmethod def _check_2fa_provider_pattern(sender: str, subject: str, pattern: str) -> bool: @@ -235,7 +233,7 @@ def _check_2fa_provider_pattern(sender: str, subject: str, pattern: str) -> bool pattern) if ret: try: - _cre = re.compile(pattern.replace('{code}', r'(?P\d+)')) + _cre = re.compile(pattern.replace('{code}', RE_CODE)) except re.PatternError as e: ret = False posi = '' @@ -255,10 +253,10 @@ def _check_2fa_provider_pattern(sender: str, subject: str, pattern: str) -> bool def get_config(self): config = super().get_config() - config['2fa_providers'] = self._load_2fa_provider_from_config(config) + config['2fa_providers'] = self._load_2fa_providers_from_config() return config - def _load_2fa_provider_from_config(self, config): + def _load_2fa_providers_from_config(self): lv = None try: with open(cfg_2fa_providers_file, 'r', encoding='utf-8') as fin: @@ -275,7 +273,7 @@ def _load_2fa_provider_from_config(self, config): values.append(v[k]) elif isinstance(v, list): values = copy.deepcopy(v) - + if isinstance(values[0], str): if values[0].lower() in ('y', 'yes', 'true', 'on'): values[0] = True @@ -284,10 +282,7 @@ def _load_2fa_provider_from_config(self, config): if len(values) == len(_2fa_providers_keys): providers.append(values) return providers - - if '2fa_providers' in config: - return self._eval_2fa_providers(config['2fa_providers']) - + return copy.deepcopy(default_2fa_providers) def load_ui_from_config(self, config_ui: Gtk.Widget) -> None: @@ -301,7 +296,7 @@ def load_ui_from_config(self, config_ui: Gtk.Widget) -> None: _enabled = False self._liststore_2FA_providers.append([_enabled, _sender, _subject, _pattern]) - def _save_2fa_provider_to_config(self, providers): + def _save_2fa_providers_to_config(self, providers): named_providers = [] for v in providers: nv = dict() @@ -323,7 +318,7 @@ def save_ui_to_config(self, config_ui: Gtk.Widget) -> None: providers = [] for row in self._liststore_2FA_providers: providers.append(tuple(row)) - self._save_2fa_provider_to_config(providers) + self._save_2fa_providers_to_config(providers) if '2fa_providers' in config: del config['2fa_providers'] @@ -465,7 +460,7 @@ def _notify_2FA_attempt(self, mail, providers) -> bool: continue if _subject != subject and '{code}' in _subject: - _pattern = re.escape(_subject).replace(r'\{code\}', r'(?P\d+)') + _pattern = re.escape(_subject).replace(r'\{code\}', RE_CODE) m = re.match(_pattern, subject) if m is None: @@ -495,7 +490,7 @@ def _notify_2FA_attempt(self, mail, providers) -> bool: sender, subject) return False - m = re.search(_pattern.replace('{code}', r'(?P\d+)'), body) + m = re.search(_pattern.replace('{code}', RE_CODE), body) if m is None: continue @@ -808,7 +803,9 @@ def _edit_provider(self) -> None: _enabled = b.get_object('enable').get_active() _sender = b.get_object('sender').get_text() _subject = b.get_object('subject').get_text() - _pattern = b.get_object('pattern_text_buffer').get_text() + start = b.get_object('pattern_text_buffer').get_start_iter() + end = b.get_object('pattern_text_buffer').get_end_iter() + _pattern = b.get_object('pattern_text_buffer').get_text(start, end, False) if not self._check_2fa_provider_pattern(_sender, _subject, _pattern) and _enabled: _enabled = False From f0d14c8b3ca4f5f4b7b5f7cf23473cfcf35afe23 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Auzi?= Date: Sat, 14 Feb 2026 11:32:45 +0100 Subject: [PATCH 43/49] More cleanups and fix first line handling of tsv config file --- Mailnag/plugins/libnotifyplugin.py | 27 +++++++++++++-------------- 1 file changed, 13 insertions(+), 14 deletions(-) diff --git a/Mailnag/plugins/libnotifyplugin.py b/Mailnag/plugins/libnotifyplugin.py index a1fde61..cd3eeb1 100644 --- a/Mailnag/plugins/libnotifyplugin.py +++ b/Mailnag/plugins/libnotifyplugin.py @@ -260,6 +260,7 @@ def _load_2fa_providers_from_config(self): lv = None try: with open(cfg_2fa_providers_file, 'r', encoding='utf-8') as fin: + next(fin) lv = list(csv.DictReader(fin, fieldnames=_2fa_providers_keys, delimiter='\t')) except FileNotFoundError: pass @@ -267,20 +268,18 @@ def _load_2fa_providers_from_config(self): providers = [] for v in lv: values = [] - if isinstance(v, dict): - for k in _2fa_providers_keys: - if k in v: - values.append(v[k]) - elif isinstance(v, list): - values = copy.deepcopy(v) - - if isinstance(values[0], str): - if values[0].lower() in ('y', 'yes', 'true', 'on'): - values[0] = True - else: - values[0] = False - if len(values) == len(_2fa_providers_keys): - providers.append(values) + assert isinstance(v, dict), f'Oops! "dict" lines expected in {os.path.basename(cfg_2fa_providers_file)}' + for k in _2fa_providers_keys: + if k in v: + values.append(v[k]) + + assert isinstance(values[0], str) + if values[0].lower() in ('y', 'yes', 'true', 'on'): + values[0] = True + else: + values[0] = False + + providers.append(values) return providers return copy.deepcopy(default_2fa_providers) From 95e24a6866b8abe746e465b5d89256128571105c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Auzi?= Date: Sat, 14 Feb 2026 19:46:15 +0100 Subject: [PATCH 44/49] Add robustness on regular expressions and use info bar in case of errors + fix UI errors --- Mailnag/plugins/libnotifyplugin.py | 270 ++++++++++++++++++++--------- Mailnag/plugins/libnotifyplugin.ui | 183 ++++++++++++++----- 2 files changed, 327 insertions(+), 126 deletions(-) diff --git a/Mailnag/plugins/libnotifyplugin.py b/Mailnag/plugins/libnotifyplugin.py index cd3eeb1..333ac62 100644 --- a/Mailnag/plugins/libnotifyplugin.py +++ b/Mailnag/plugins/libnotifyplugin.py @@ -36,7 +36,7 @@ import copy from collections.abc import Callable from typing import Any, Optional -from gi.repository import Notify, Gio, Gtk +from gi.repository import Notify, Gio, Gtk, Gdk, GLib from Mailnag.common.dist_cfg import PACKAGE_NAME from Mailnag.common.plugins import Plugin, HookTypes from Mailnag.common.i18n import _ @@ -59,7 +59,7 @@ DESKTOP_ENV_VARS_FOR_SUPPORT_TEST = ('XDG_CURRENT_DESKTOP', 'GDMSESSION') SUPPORTED_DESKTOP_ENVIRONMENTS = ("gnome", "cinnamon") -RE_CODE = r'\b(?P\d+)\b' +RE_CODE = r'\b(?P\d{4,8})\b' cfg_2fa_providers_file = os.path.join(cfg_folder, '2fa_providers.tsv') @@ -69,7 +69,7 @@ '2fa_notifications' : True, } -_2fa_providers_keys = ('enabled', 'provider', 'subject_re', 'text_re') +_2fa_providers_keys = ('enabled', 'provider', 'subject', 'text_re') default_2fa_providers = [ (True, 'Garmin', 'Your Security Passcode', r'Use this one-time code for your account\n{code}\n'), (True, 'Garmin', _('Your Security Passcode'), r'voici votre code de sécurité.\n{code}\n'), @@ -197,7 +197,9 @@ def get_config_ui(self) -> Gtk.Box: 'btn_edit_provider_clicked': self._on_btn_edit_provider_clicked, 'provider_toggled': self._on_provider_toggled, 'provider_row_activated': self._on_provider_row_activated, + 'provider_sel_changed': self._on_provider_sel_changed, 'expander_2fa_providers_expanded': self._on_expander_2fa_providers_expanded, + 'info_response': self._on_info_response, }) self._builder = builder @@ -206,6 +208,8 @@ def get_config_ui(self) -> Gtk.Box: self._switch_2FA_notifications = builder.get_object('switch_2FA_notifications') self._liststore_2FA_providers = builder.get_object('liststore_2FA_providers') self._treeview_2FA_providers = builder.get_object('treeview_2FA_providers') + self._infobar_info = builder.get_object('info') + self._label_info = builder.get_object('label_info') self._scrolled_window = builder.get_object('scrolledwindow1') self._scrolled_window.set_min_content_height(120) @@ -222,34 +226,43 @@ def _eval_2fa_providers(providers: list|str) -> list: assert isinstance(providers,list), f'Oops! config still have invalid providers (type={type(providers).__name__})' return providers - @staticmethod - def _check_2fa_provider_pattern(sender: str, subject: str, pattern: str) -> bool: - ret = True - if not '{code}' in pattern: - ret = False - _LOGGER.error('missing "code" group pattern: {code}...\n'+ + def _check_2fa_provider_pattern(self, sender: str, subject: str, pattern: str) -> bool: + if not '{code}' in subject and not '{code}' in pattern: + + _LOGGER.debug('Missing "code" group pattern: {code}...\n' 'sender: %s, subject: %s\npattern:\n%s', sender, subject, pattern) - if ret: + self._alert_message(_('Missing "code" group pattern: {code}'), + msg_type=Gtk.MessageType.ERROR, duration_s=5) + return False + + def check_regexp(name: str, msg_name: str, regexp_p: str) -> bool: + if '{code}' not in regexp_p: + return True try: - _cre = re.compile(pattern.replace('{code}', RE_CODE)) - except re.PatternError as e: - ret = False + compiled_re = regexp_p.replace('{code}', RE_CODE).strip() + _cre = re.compile(compiled_re) + return True + except (re.error, AttributeError) as e: posi = '' - if 'pos' in e.__dict__ and e.pos is not None: - posi = '^' - i = e.pos - while i > 0: - i -= 1 - posi = ' ' + posi - posi = '\n' + posi - _LOGGER.error('pattern is incorrect regexp:\n'+ - 'sender: %s, subject: %s\npattern: %s\n%s%s', - sender, subject, e.msg, - pattern, posi) - - return ret + pos = getattr(e, 'pos', None) + if pos is not None: + posi = "\n" + (" " * pos) + "^" + _LOGGER.exception('%s is incorrect regexp: %s\nregex: %s\n%s%s', + name, str(e), regexp_p, + compiled_re, posi) + self._alert_message(_('%s is incorrect regexp'), msg_name, + msg_type=Gtk.MessageType.ERROR, duration_s=5) + return False + + if not check_regexp('subject', _('Subject'), re.escape(subject)): + return False + + if not check_regexp('pattern', _('Pattern'), pattern): + return False + + return True def get_config(self): config = super().get_config() @@ -257,27 +270,68 @@ def get_config(self): return config def _load_2fa_providers_from_config(self): + def check_regexp(name: str, regexp_p: str) -> bool: + if '{code}' not in regexp_p: + return True + try: + compiled_re = regexp_p.replace('{code}', RE_CODE).strip() + _cre = re.compile(compiled_re) + return True + except (re.error, AttributeError) as e: + posi = '' + pos = getattr(e, 'pos', None) + if pos is not None: + posi = "\n" + (" " * pos) + "^" + _LOGGER.exception('%s is incorrect regexp: %s\nregex: %s\n%s%s', + name, str(e), regexp_p, + compiled_re, posi) + return False + + lv = None try: with open(cfg_2fa_providers_file, 'r', encoding='utf-8') as fin: next(fin) lv = list(csv.DictReader(fin, fieldnames=_2fa_providers_keys, delimiter='\t')) - except FileNotFoundError: + except (FileNotFoundError, StopIteration): pass + except Exception as e: + _LOGGER.exception('Failed to read 2FA providers file: %s\n%s', + os.path.basename(cfg_2fa_providers_file), + str(e)) + if lv is not None: providers = [] - for v in lv: + for l, v in enumerate(lv, start=2): + if not isinstance(v, dict): + _LOGGER.debug('Line %d invalid in: %s', + os.path.basename(cfg_2fa_providers_file)) + continue + values = [] - assert isinstance(v, dict), f'Oops! "dict" lines expected in {os.path.basename(cfg_2fa_providers_file)}' - for k in _2fa_providers_keys: - if k in v: - values.append(v[k]) + regexps_invalid = [] + is_enabled = str(v.get('enabled', '')).lower() in ('y', 'yes', 'true', 'on') - assert isinstance(values[0], str) - if values[0].lower() in ('y', 'yes', 'true', 'on'): - values[0] = True - else: - values[0] = False + for k in _2fa_providers_keys: + if k == 'enabled': + continue + + val = v.get(k, "") + if val: + if k == 'subject': + if not check_regexp(k, re.escape(v[k])): + regexps_invalid.append(f'line: {l}, field: {k}, value: {v[k]}') + elif k =='text_re': + if not check_regexp(k, v[k]): + regexps_invalid.append(f'line: {l}, field: {k}, value: {v[k]}') + values.append(val) + + if regexps_invalid: + _LOGGER.debug('Regexp invalid in: %s\n %s', + os.path.basename(cfg_2fa_providers_file), + '\n '.join(regexps_invalid)) + + values.insert(0, is_enabled and not bool(regexps_invalid)) providers.append(values) return providers @@ -450,31 +504,27 @@ def _notify_2FA_attempt(self, mail, providers) -> bool: sender = self._get_sender(mail) subject = mail.subject body = None + code = None - for (_enabled, _sender, _subject, _pattern) in providers: - if not _enabled: + for (_enabled, _sender, _subject, _text_re) in providers: + if not _enabled or sender != _sender: continue - if sender != _sender: - continue - - if _subject != subject and '{code}' in _subject: - _pattern = re.escape(_subject).replace(r'\{code\}', RE_CODE) + if '{code}' in _subject: + _pattern = re.escape(_subject).replace(r'\{code\}', RE_CODE).strip() m = re.match(_pattern, subject) - if m is None: - continue - - code = m.group('code') - if code: + if m: + code = m.group('code') _LOGGER.debug("2FA matched code %s: sender=%s, subject=%s", code, sender, subject) break - - - if subject != _subject: - continue + else: + continue + else: + if subject != _subject: + continue _LOGGER.debug("2FA pre-matched : sender=%s, subject=%s", sender, subject) @@ -489,16 +539,14 @@ def _notify_2FA_attempt(self, mail, providers) -> bool: sender, subject) return False - m = re.search(_pattern.replace('{code}', RE_CODE), body) - if m is None: - continue - - code = m.group('code') - _LOGGER.debug("2FA matched code %s: sender=%s, subject=%s, body:\n%s", - code, - sender, subject, - dbgindent(body)) - break + m = re.search(_text_re.replace('{code}', RE_CODE).strip(), body) + if m: + code = m.group('code') + _LOGGER.debug("2FA matched code %s: sender=%s, subject=%s, body:\n%s", + code, + sender, subject, + dbgindent(body)) + break else: _LOGGER.debug("2FA not matched : sender=%s, subject=%s, body:\n%s", sender, subject, @@ -507,6 +555,8 @@ def _notify_2FA_attempt(self, mail, providers) -> bool: return False + assert code is not None + n = self._get_notification(sender, f'{subject}: {code}', "mail-unread") n.set_timeout(Notify.EXPIRES_NEVER) n.set_urgency(Notify.Urgency.CRITICAL) @@ -714,10 +764,12 @@ def _on_btn_add_provider_clicked(self, widget: Gtk.ToolButton) -> None: _enable = b.get_object('enable').get_active() _sender = b.get_object('sender').get_text() _subject = b.get_object('subject').get_text() - _pattern = b.get_object('pattern_text_buffer').get_text() + start = b.get_object('pattern_text_buffer').get_start_iter() + end = b.get_object('pattern_text_buffer').get_end_iter() + _pattern = b.get_object('pattern_text_buffer').get_text(start, end, False) - if not self._check_2fa_provider_pattern(_sender, _subject, _pattern) and _enabled: - _enabled = False + if not self._check_2fa_provider_pattern(_sender, _subject, _pattern) and _enable: + _enable = False row = [_enable, _sender, _subject, _pattern] @@ -728,11 +780,6 @@ def _on_btn_add_provider_clicked(self, widget: Gtk.ToolButton) -> None: self._treeview_2FA_providers.grab_focus() - def _get_selected_provider(self) -> None: - treeselection = self._treeview_2FA_providers.get_selection() - return treeselection.get_selected() - - def _show_confirmation_dialog(self, text: str) -> None: message = Gtk.MessageDialog(None, Gtk.DialogFlags.MODAL, Gtk.MessageType.QUESTION, Gtk.ButtonsType.YES_NO, text) @@ -776,10 +823,7 @@ def _on_btn_remove_provider_clicked(self, widget: Gtk.ToolButton) -> None: model.remove(iter) - def _edit_provider(self) -> None: - treeselection = self._treeview_2FA_providers.get_selection() - model, iter = treeselection.get_selected() - + def _edit_provider(self, model, iter) -> None: if iter is None: return @@ -817,7 +861,10 @@ def _edit_provider(self) -> None: def _on_btn_edit_provider_clicked(self, widget: Gtk.ToolButton) -> None: _LOGGER.debug('on_btn_edit_provider_clicked') - self._edit_provider() + treeselection = self._treeview_2FA_providers.get_selection() + model, iter = treeselection.get_selected() + + self._edit_provider(model, iter) def _on_provider_toggled(self, cell: Gtk.CellRendererToggle, path: Gtk.TreePath) -> None: @@ -838,8 +885,15 @@ def _on_provider_toggled(self, cell: Gtk.CellRendererToggle, path: Gtk.TreePath) def _on_provider_row_activated(self, view: Gtk.TreeView, path: Gtk.TreePath, column: Gtk.TreeViewColumn) -> None: _LOGGER.debug('on_provider_row_activated') - for id in ('btn_remove_2FA_provider', 'btn_edit_2FA_provider'): - self._builder.get_object(id).set_sensitive(True) + + event = Gtk.get_current_event() + + _LOGGER.debug('event.type = %s', event.type.value_name) + + if column.get_name() != 'col_enabled': + model = view.get_model() + iter = model.get_iter(path) + self._edit_provider(model, iter) def _on_expander_2fa_providers_expanded(self, expander, pspec) -> None: @@ -849,6 +903,66 @@ def _on_expander_2fa_providers_expanded(self, expander, pspec) -> None: wnd.resize(w, 1) + def _on_provider_sel_changed(self, selection: Gtk.TreeSelection) -> None: + model, iter = selection.get_selected() + sensitive = (iter is not None) + for id in ('btn_remove_2FA_provider', 'btn_edit_2FA_provider'): + self._builder.get_object(id).set_sensitive(sensitive) + + @staticmethod + def _stop_infobar_timeout(infobar: Gtk.InfoBar) -> None: + timeout_id = getattr(infobar, "timeout_id", None) + if timeout_id is not None: + GLib.source_remove(timeout_id) + infobar.timeout_id = None + + @staticmethod + def _start_infobar_timeout(infobar: Gtk.InfoBar, duration_s: int) -> None: + LibNotifyPlugin._stop_infobar_timeout(infobar) + + def timeout_reached(): + infobar.hide() + infobar.timeout_id = None + return False + + infobar.timeout_id = GLib.timeout_add(duration_s*1000, timeout_reached) + + + def _alert_message(self, msg_format:str, *args, msg_type: Gtk.MessageType = Gtk.MessageType.INFO, duration_s:int = None) -> None: + self._stop_infobar_timeout(self._infobar_info) + + # 1. Formatage sécurisé du message + try: + msg = msg_format % args if args else msg_format + except TypeError as e: + msg = msg_format + log_msg = f"Erreur de formatage message: {msg_format} (args: {args})" + _LOGGER.exception("Format Error: %s\n%s", str(e), log_msg) + + # 2. Correspondance Logging et Affichage + # On définit le niveau de log en fonction du type GTK passé + if msg_type == Gtk.MessageType.ERROR: + _LOGGER.error(msg) + elif msg_type == Gtk.MessageType.WARNING: + _LOGGER.warning(msg) + elif msg_type == Gtk.MessageType.QUESTION: + _LOGGER.info("QUESTION: %s", msg) + else: # INFO ou OTHER + _LOGGER.info(msg) + + self._label_info.set_text(msg) + self._infobar_info.set_message_type(msg_type) + self._infobar_info.show() + + if duration_s is not None: + self._start_infobar_timeout(self._infobar_info, duration_s) + + def _on_info_response(self, infobar: Gtk.InfoBar, response_id: int) -> None: + if response_id in (Gtk.ResponseType.CLOSE, Gtk.ResponseType.OK): + self._stop_infobar_timeout(infobar) + infobar.hide() + + def ellipsize(str: str, max_len: int) -> str: if max_len < 3: max_len = 3 if len(str) <= max_len: diff --git a/Mailnag/plugins/libnotifyplugin.ui b/Mailnag/plugins/libnotifyplugin.ui index dd489f3..b48d5f3 100644 --- a/Mailnag/plugins/libnotifyplugin.ui +++ b/Mailnag/plugins/libnotifyplugin.ui @@ -131,6 +131,7 @@ True False + True vertical @@ -148,13 +149,14 @@ False False 1 - True - + + + - + Enabled @@ -167,7 +169,7 @@ - + True autosize Sender @@ -180,7 +182,7 @@ - + True Subject @@ -192,7 +194,7 @@ - + True autosize Pattern @@ -276,40 +278,108 @@ - - True - True - end - 6 - 6 - 2FA notifications - right + + False + True + vertical + True + + + + False + 6 + end + + + + + + True + True + 0 + + + + + False + 16 + + + True + False + True + information + True + 50 + + + True + True + 0 + + + + + True + True + 0 + + True True + 5 2 - + True - True - Enable/disable libnotify 2FA processing - end - center - 3 + False + + + True + True + 6 + 6 + 2FA notifications + right + + + False + False + 1 + + + + + True + True + Enable/disable libnotify 2FA processing + end + center + 3 + 3 + + + False + False + 2 + + False False - 3 + end + 6 False - False + True end 1 @@ -332,7 +402,7 @@ - Pattern + Pattern regexp with {code} for capture. 480 @@ -392,11 +462,11 @@ False False - 1 + 3 - + True False @@ -409,7 +479,7 @@ True False end - Sender: + Sender 0 @@ -420,6 +490,9 @@ True True + Display name of a mail sender, +if display name is not available, +address spec can be used. 6 6 True @@ -435,7 +508,7 @@ True False end - Subject: + Subject 0 @@ -446,31 +519,22 @@ True True + This field is not a regular expression, +however it can contain a code which +is materialised within braces, like +this: {code}. + +Ex: Your security code: {code} 6 6 True - Subject + Subject (not a regexp but {code} for capture possible) 1 1 - - - True - False - end - Pattern: - - - 0 - 2 - - - - - False @@ -479,13 +543,36 @@ - - 12 + + 50 True - True + False 48 - 12 - pattern_text_buffer + 7 + 6 + 6 + 0.05000000074505806 + out + + + 120 + True + True + This field can be a regular expression +where the code is materialised within +braces, like this: {code}. + +Ex: Your security code is:\s?{code} + pattern_text_buffer + + + + + True + False + Text + + True From 05df2643833b5415ea09f77a86ae941b70fdf519 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Auzi?= Date: Sat, 14 Feb 2026 21:22:54 +0100 Subject: [PATCH 45/49] Some cleanups and improvement of copy to clipboard --- Mailnag/plugins/libnotifyplugin.py | 67 ++++++++++++++++++++---------- 1 file changed, 46 insertions(+), 21 deletions(-) diff --git a/Mailnag/plugins/libnotifyplugin.py b/Mailnag/plugins/libnotifyplugin.py index 333ac62..996d317 100644 --- a/Mailnag/plugins/libnotifyplugin.py +++ b/Mailnag/plugins/libnotifyplugin.py @@ -30,7 +30,7 @@ import dbus import threading import re -from subprocess import Popen, PIPE +from subprocess import Popen, PIPE, TimeoutExpired import logging import csv import copy @@ -85,6 +85,11 @@ def __init__(self) -> None: self._notification_server_ready = False self._is_supported_env = False self._mails_added_hook: Optional[Callable[[list[Mail], list[Mail]], None]] = None + self._copy_commands = [ # wl-copy (Wayland), xsel (X11 alternatif), xclip (X11 standard) + ['wl-copy'], + ['xclip', '-selection', 'c'], + ['xsel', '--clipboard', '--input'] + ] def enable(self) -> None: @@ -184,9 +189,9 @@ def get_config_ui(self) -> Gtk.Box: radio_mapping.append((mode, radio_btn)) label = builder.get_object('notification_modes') - label.set_markup('%s' % _('Notification mode:')) + label.set_markup(f'{_('Notification mode:')}') label = builder.get_object('2fa_providers') - label.set_markup('%s' % _('2FA providers')) + label.set_markup(f'{_('2FA providers')}') builder.connect_signals({ 'close': self._on_close, @@ -430,10 +435,9 @@ def _notify_short_summary(self, new_mails: list[Mail], all_mails: list[Mail]) -> n += 1 i += 1 + senders = ', '.join(lst) if self._is_supported_env: - senders = "%s" % ", ".join(lst) - else: - senders = ", ".join(lst) + senders = f'{senders}' if mail_count > 1: summary = _("{0} new mails").format(str(mail_count)) @@ -460,16 +464,18 @@ def _notify_summary(self, new_mails: list[Mail], all_mails: list[Mail]) -> None: ubound = len(mails) if len(mails) <= self._max_mails else self._max_mails for i in range(ubound): + m = mails[i] + sender = self._get_sender(m) + subject = m.subject if self._is_supported_env: - body += "%s:\n%s\n\n" % (self._get_sender(mails[i]), mails[i].subject) + body += f'{sender}:\n{subject}\n\n' else: - body += "%s - %s\n" % (ellipsize(self._get_sender(mails[i]), 20), ellipsize(mails[i].subject, 20)) + body += f'{ellipsize(sender, 20)} - {ellipsize(subject, 20)}\n' if len(mails) > self._max_mails: + fragment = _("(and {0} more)").format(str(len(mails) - self._max_mails)) if self._is_supported_env: - body += "%s" % _("(and {0} more)").format(str(len(mails) - self._max_mails)) - else: - body += _("(and {0} more)").format(str(len(mails) - self._max_mails)) + body += f'{fragment}' if len(mails) > 1: # multiple new emails summary = _("{0} new mails").format(str(len(mails))) @@ -657,6 +663,32 @@ def _wait_for_notification_server(self) -> bool: return False return True + def _copy_to_clipboard(self, text: str) -> None: + """Copie le texte dans le presse-papier en supportant Wayland et X11.""" + # On encode le texte une seule fois + encoded_text = text.encode('utf-8') + + for i, cmd in enumerate(list(self._copy_commands)): + try: + # On tente d'exécuter la commande + pipe = Popen(cmd, stdin=PIPE, close_fds=True) + pipe.communicate(input=encoded_text, timeout=2) + + if pipe.returncode == 0: + _LOGGER.debug("Code copy succeeded with %s", cmd[0]) + successful_cmd = self._copy_commands.pop(i) + self._copy_commands.insert(0, successful_cmd) + break + except TimeoutExpired: + _LOGGER.warning("Timeout expired with %s, .", cmd[0]) + if pipe: + pipe.kill() # Important : kill the blocking process + pipe.wait() + except Exception as e: + _LOGGER.error("Copy failed with %s: %s", cmd[0], str(e)) + + else: + _LOGGER.error("Copy to clipboard failed (install wl-clipboard or xclip).") def _notification_action_handler( self, @@ -687,22 +719,15 @@ def _notification_action_handler( controller = self.get_mailnag_controller() try: code = user_data[2] - try: - pipe = Popen(['xclip', '-selection', 'c'], - stdin=PIPE, - close_fds=True) - pipe.communicate(input=code.encode('utf-8')) - _LOGGER.debug('xclip set text:%s', code) - except: - _LOGGER.exception('xclip set text failed.') - + self._copy_to_clipboard(code) controller.mark_mail_as_read(user_data[0].id) except InvalidOperationException: pass # clicking the action has closed the notification # so remove its reference. - del self._notifications[user_data[1]] + if user_data[1] in self._notifications: + del self._notifications[user_data[1]] @staticmethod def _get_sender(mail: Mail) -> str: From 1e588c606a643f3873caae56205e311d8cface77 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Auzi?= Date: Sat, 14 Feb 2026 22:22:57 +0100 Subject: [PATCH 46/49] Pimp notification aspect --- Mailnag/plugins/libnotifyplugin.py | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/Mailnag/plugins/libnotifyplugin.py b/Mailnag/plugins/libnotifyplugin.py index 996d317..79b8654 100644 --- a/Mailnag/plugins/libnotifyplugin.py +++ b/Mailnag/plugins/libnotifyplugin.py @@ -563,13 +563,19 @@ def _notify_2FA_attempt(self, mail, providers) -> bool: assert code is not None - n = self._get_notification(sender, f'{subject}: {code}', "mail-unread") + _summary = f"🔑 {code} — {sender}" + _body = f'\t\t{subject}' if self._is_supported_env else f'\t\t{subject}' + + n = self._get_notification(_summary, + _body, + "security-medium") + n.set_timeout(Notify.EXPIRES_NEVER) n.set_urgency(Notify.Urgency.CRITICAL) notification_id = str(id(n)) if self._is_supported_env: - n.add_action("copy-code", _("📋 Code: {0}").format(code), + n.add_action("copy-code", f'📋 {_("Copy code:")} {code}', self._notification_action_handler, (mail, notification_id, code)) n.show() self._record_mail_notification(mail, n) @@ -680,7 +686,7 @@ def _copy_to_clipboard(self, text: str) -> None: self._copy_commands.insert(0, successful_cmd) break except TimeoutExpired: - _LOGGER.warning("Timeout expired with %s, .", cmd[0]) + _LOGGER.warning("Timeout expired with %s.", cmd[0]) if pipe: pipe.kill() # Important : kill the blocking process pipe.wait() From 955d9439896f9317e581ef2b7b6364af72d9ee18 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Auzi?= Date: Sun, 15 Feb 2026 02:32:54 +0100 Subject: [PATCH 47/49] Update locales --- po/bg.po | 129 ++++++++++++++++++++++++++------------- po/ca.po | 129 ++++++++++++++++++++++++++------------- po/cs.po | 129 ++++++++++++++++++++++++++------------- po/de.po | 129 ++++++++++++++++++++++++++------------- po/es.po | 129 ++++++++++++++++++++++++++------------- po/fi.po | 129 ++++++++++++++++++++++++++------------- po/fr.po | 149 +++++++++++++++++++++++++++++++++------------- po/gl.po | 129 ++++++++++++++++++++++++++------------- po/hr.po | 129 ++++++++++++++++++++++++++------------- po/id.po | 129 ++++++++++++++++++++++++++------------- po/it.po | 129 ++++++++++++++++++++++++++------------- po/mailnagger.pot | 129 ++++++++++++++++++++++++++------------- po/pl.po | 129 ++++++++++++++++++++++++++------------- po/pt.po | 129 ++++++++++++++++++++++++++------------- po/pt_BR.po | 129 ++++++++++++++++++++++++++------------- po/ru.po | 129 ++++++++++++++++++++++++++------------- po/sr.po | 129 ++++++++++++++++++++++++++------------- po/sv.po | 129 ++++++++++++++++++++++++++------------- po/tr.po | 129 ++++++++++++++++++++++++++------------- po/uk.po | 129 ++++++++++++++++++++++++++------------- po/zh_CN.po | 129 ++++++++++++++++++++++++++------------- po/zh_TW.po | 129 ++++++++++++++++++++++++++------------- 22 files changed, 1976 insertions(+), 882 deletions(-) diff --git a/po/bg.po b/po/bg.po index bf35946..f5124d1 100644 --- a/po/bg.po +++ b/po/bg.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: mailnag\n" "Report-Msgid-Bugs-To: https://github.com/tikank/mailnagger/issues\n" -"POT-Creation-Date: 2026-02-11 23:22+0100\n" +"POT-Creation-Date: 2026-02-15 02:03+0100\n" "PO-Revision-Date: 2019-03-16 14:48+0000\n" "Last-Translator: Launchpad Translations Administrators \n" "Language-Team: Bulgarian \n" @@ -131,84 +131,100 @@ msgstr "" "Mailnag ще предава общия брой имейли на този скрипт,\n" "последвано от %s поредици." -#: Mailnag/plugins/libnotifyplugin.py:74 +#: Mailnag/plugins/libnotifyplugin.py:75 msgid "Your Security Passcode" msgstr "" -#: Mailnag/plugins/libnotifyplugin.py:143 +#: Mailnag/plugins/libnotifyplugin.py:149 msgid "LibNotify Notifications" msgstr "LibNotify известия" -#: Mailnag/plugins/libnotifyplugin.py:144 +#: Mailnag/plugins/libnotifyplugin.py:150 msgid "Shows a popup when new mails arrive." msgstr "Показва изкачащ прозорец при пристигане на имейл." -#: Mailnag/plugins/libnotifyplugin.py:186 +#: Mailnag/plugins/libnotifyplugin.py:192 msgid "Notification mode:" msgstr "Режим на известяване:" -#: Mailnag/plugins/libnotifyplugin.py:188 +#: Mailnag/plugins/libnotifyplugin.py:194 msgid "2FA providers" msgstr "" -#: Mailnag/plugins/libnotifyplugin.py:391 -#: Mailnag/plugins/libnotifyplugin.py:427 -#: Mailnag/plugins/libnotifyplugin.py:577 +#: Mailnag/plugins/libnotifyplugin.py:241 +#, python-brace-format +msgid "Missing \"code\" group pattern: {code}" +msgstr "" + +#: Mailnag/plugins/libnotifyplugin.py:260 +#, python-format +msgid "%s is incorrect regexp" +msgstr "" + +#: Mailnag/plugins/libnotifyplugin.py:264 +#: Mailnag/plugins/libnotifyplugin.ui.h:8 +#, fuzzy +msgid "Subject" +msgstr "тема" + +#: Mailnag/plugins/libnotifyplugin.py:267 +#: Mailnag/plugins/libnotifyplugin.ui.h:9 +msgid "Pattern" +msgstr "" + +#: Mailnag/plugins/libnotifyplugin.py:443 +#: Mailnag/plugins/libnotifyplugin.py:481 +#: Mailnag/plugins/libnotifyplugin.py:633 #, python-brace-format msgid "{0} new mails" msgstr "{0} нови писма" -#: Mailnag/plugins/libnotifyplugin.py:393 +#: Mailnag/plugins/libnotifyplugin.py:445 #, python-brace-format msgid "from {0} and others." msgstr "от {0} и други." -#: Mailnag/plugins/libnotifyplugin.py:395 -#: Mailnag/plugins/libnotifyplugin.py:398 +#: Mailnag/plugins/libnotifyplugin.py:447 +#: Mailnag/plugins/libnotifyplugin.py:450 #, python-brace-format msgid "from {0}." msgstr "от {0}." -#: Mailnag/plugins/libnotifyplugin.py:397 -#: Mailnag/plugins/libnotifyplugin.py:429 -#: Mailnag/plugins/libnotifyplugin.py:579 +#: Mailnag/plugins/libnotifyplugin.py:449 +#: Mailnag/plugins/libnotifyplugin.py:483 +#: Mailnag/plugins/libnotifyplugin.py:635 msgid "New mail" msgstr "Ново писмо" -#: Mailnag/plugins/libnotifyplugin.py:422 -#: Mailnag/plugins/libnotifyplugin.py:424 +#: Mailnag/plugins/libnotifyplugin.py:476 #, python-brace-format msgid "(and {0} more)" msgstr "( и {0} други)" -#: Mailnag/plugins/libnotifyplugin.py:522 -#, python-brace-format -msgid "📋 Code: {0}" +#: Mailnag/plugins/libnotifyplugin.py:578 +msgid "Copy code:" msgstr "" -#: Mailnag/plugins/libnotifyplugin.py:566 +#: Mailnag/plugins/libnotifyplugin.py:622 msgid "Mark as read" msgstr "Отбележи като прочетено" -#: Mailnag/plugins/libnotifyplugin.py:765 +#: Mailnag/plugins/libnotifyplugin.py:837 #, fuzzy msgid "Delete this provider:" msgstr "Изтриване на акаунта:" -#: Mailnag/plugins/libnotifyplugin.py:766 -#: Mailnag/plugins/libnotifyplugin.ui.h:15 +#: Mailnag/plugins/libnotifyplugin.py:838 #, fuzzy msgid "Sender:" msgstr "изпращач" -#: Mailnag/plugins/libnotifyplugin.py:767 -#: Mailnag/plugins/libnotifyplugin.ui.h:16 +#: Mailnag/plugins/libnotifyplugin.py:839 #, fuzzy msgid "Subject:" msgstr "тема" -#: Mailnag/plugins/libnotifyplugin.py:768 -#: Mailnag/plugins/libnotifyplugin.ui.h:17 +#: Mailnag/plugins/libnotifyplugin.py:840 msgid "Pattern:" msgstr "" @@ -345,15 +361,6 @@ msgstr "Едно известие за имейл" msgid "Sender" msgstr "изпращач" -#: Mailnag/plugins/libnotifyplugin.ui.h:8 -#, fuzzy -msgid "Subject" -msgstr "тема" - -#: Mailnag/plugins/libnotifyplugin.ui.h:9 -msgid "Pattern" -msgstr "" - #: Mailnag/plugins/libnotifyplugin.ui.h:10 msgid "Add 2FA Provider" msgstr "" @@ -367,19 +374,61 @@ msgid "Edit 2FA Provider" msgstr "" #: Mailnag/plugins/libnotifyplugin.ui.h:13 +msgid "information" +msgstr "" + +#: Mailnag/plugins/libnotifyplugin.ui.h:14 #, fuzzy msgid "2FA notifications" msgstr "Звукови известия" -#: Mailnag/plugins/libnotifyplugin.ui.h:14 +#: Mailnag/plugins/libnotifyplugin.ui.h:15 msgid "Enable/disable libnotify 2FA processing" msgstr "" -#: Mailnag/plugins/libnotifyplugin.ui.h:18 +#: Mailnag/plugins/libnotifyplugin.ui.h:16 +msgid "Pattern regexp with {code} for capture." +msgstr "" + +#: Mailnag/plugins/libnotifyplugin.ui.h:17 +msgid "" +"Display name of a mail sender, \n" +"if display name is not available, \n" +"address spec can be used." +msgstr "" + +#: Mailnag/plugins/libnotifyplugin.ui.h:21 +msgid "" +"This field is not a regular expression, \n" +"however it can contain a code which \n" +"is materialised within braces, like \n" +"this: {code}.\n" +"\n" +"Ex: Your security code: {code}" +msgstr "" + +#: Mailnag/plugins/libnotifyplugin.ui.h:27 +msgid "Subject (not a regexp but {code} for capture possible)" +msgstr "" + +#: Mailnag/plugins/libnotifyplugin.ui.h:29 +msgid "" +"This field can be a regular expression \n" +"where the code is materialised within \n" +"braces, like this: {code}.\n" +"\n" +"Ex: Your security code is:\\s?{code}" +msgstr "" + +#: Mailnag/plugins/libnotifyplugin.ui.h:34 +msgid "Text" +msgstr "" + +#: Mailnag/plugins/libnotifyplugin.ui.h:35 msgid "Edit 2FA provider" msgstr "" -#: Mailnag/plugins/libnotifyplugin.ui.h:19 +#: Mailnag/plugins/libnotifyplugin.ui.h:36 #, fuzzy msgid "Enable provider" msgstr "Включено" diff --git a/po/ca.po b/po/ca.po index 5093970..efed926 100644 --- a/po/ca.po +++ b/po/ca.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: mailnag\n" "Report-Msgid-Bugs-To: https://github.com/tikank/mailnagger/issues\n" -"POT-Creation-Date: 2026-02-11 23:22+0100\n" +"POT-Creation-Date: 2026-02-15 02:03+0100\n" "PO-Revision-Date: 2020-04-05 12:44+0000\n" "Last-Translator: Marc Riera Irigoyen \n" "Language-Team: Catalan \n" @@ -131,84 +131,100 @@ msgstr "" "El Mailnag passa el nombre total de correus nous a aquest script,\n" "seguit de seqüències %s." -#: Mailnag/plugins/libnotifyplugin.py:74 +#: Mailnag/plugins/libnotifyplugin.py:75 msgid "Your Security Passcode" msgstr "" -#: Mailnag/plugins/libnotifyplugin.py:143 +#: Mailnag/plugins/libnotifyplugin.py:149 msgid "LibNotify Notifications" msgstr "Notificacions del LibNotify" -#: Mailnag/plugins/libnotifyplugin.py:144 +#: Mailnag/plugins/libnotifyplugin.py:150 msgid "Shows a popup when new mails arrive." msgstr "Mostra una finestra emergent quan arriben correus nous." -#: Mailnag/plugins/libnotifyplugin.py:186 +#: Mailnag/plugins/libnotifyplugin.py:192 msgid "Notification mode:" msgstr "Mode de notificació:" -#: Mailnag/plugins/libnotifyplugin.py:188 +#: Mailnag/plugins/libnotifyplugin.py:194 msgid "2FA providers" msgstr "" -#: Mailnag/plugins/libnotifyplugin.py:391 -#: Mailnag/plugins/libnotifyplugin.py:427 -#: Mailnag/plugins/libnotifyplugin.py:577 +#: Mailnag/plugins/libnotifyplugin.py:241 +#, python-brace-format +msgid "Missing \"code\" group pattern: {code}" +msgstr "" + +#: Mailnag/plugins/libnotifyplugin.py:260 +#, python-format +msgid "%s is incorrect regexp" +msgstr "" + +#: Mailnag/plugins/libnotifyplugin.py:264 +#: Mailnag/plugins/libnotifyplugin.ui.h:8 +#, fuzzy +msgid "Subject" +msgstr "assumpte" + +#: Mailnag/plugins/libnotifyplugin.py:267 +#: Mailnag/plugins/libnotifyplugin.ui.h:9 +msgid "Pattern" +msgstr "" + +#: Mailnag/plugins/libnotifyplugin.py:443 +#: Mailnag/plugins/libnotifyplugin.py:481 +#: Mailnag/plugins/libnotifyplugin.py:633 #, python-brace-format msgid "{0} new mails" msgstr "{0} correus nous" -#: Mailnag/plugins/libnotifyplugin.py:393 +#: Mailnag/plugins/libnotifyplugin.py:445 #, python-brace-format msgid "from {0} and others." msgstr "de {0} i altres." -#: Mailnag/plugins/libnotifyplugin.py:395 -#: Mailnag/plugins/libnotifyplugin.py:398 +#: Mailnag/plugins/libnotifyplugin.py:447 +#: Mailnag/plugins/libnotifyplugin.py:450 #, python-brace-format msgid "from {0}." msgstr "de {0}." -#: Mailnag/plugins/libnotifyplugin.py:397 -#: Mailnag/plugins/libnotifyplugin.py:429 -#: Mailnag/plugins/libnotifyplugin.py:579 +#: Mailnag/plugins/libnotifyplugin.py:449 +#: Mailnag/plugins/libnotifyplugin.py:483 +#: Mailnag/plugins/libnotifyplugin.py:635 msgid "New mail" msgstr "Correu nou" -#: Mailnag/plugins/libnotifyplugin.py:422 -#: Mailnag/plugins/libnotifyplugin.py:424 +#: Mailnag/plugins/libnotifyplugin.py:476 #, python-brace-format msgid "(and {0} more)" msgstr "(i {0} més)" -#: Mailnag/plugins/libnotifyplugin.py:522 -#, python-brace-format -msgid "📋 Code: {0}" +#: Mailnag/plugins/libnotifyplugin.py:578 +msgid "Copy code:" msgstr "" -#: Mailnag/plugins/libnotifyplugin.py:566 +#: Mailnag/plugins/libnotifyplugin.py:622 msgid "Mark as read" msgstr "Marca com a llegit" -#: Mailnag/plugins/libnotifyplugin.py:765 +#: Mailnag/plugins/libnotifyplugin.py:837 #, fuzzy msgid "Delete this provider:" msgstr "Suprimeix aquest compte:" -#: Mailnag/plugins/libnotifyplugin.py:766 -#: Mailnag/plugins/libnotifyplugin.ui.h:15 +#: Mailnag/plugins/libnotifyplugin.py:838 #, fuzzy msgid "Sender:" msgstr "remitent" -#: Mailnag/plugins/libnotifyplugin.py:767 -#: Mailnag/plugins/libnotifyplugin.ui.h:16 +#: Mailnag/plugins/libnotifyplugin.py:839 #, fuzzy msgid "Subject:" msgstr "assumpte" -#: Mailnag/plugins/libnotifyplugin.py:768 -#: Mailnag/plugins/libnotifyplugin.ui.h:17 +#: Mailnag/plugins/libnotifyplugin.py:840 msgid "Pattern:" msgstr "" @@ -346,15 +362,6 @@ msgstr "Una notificació per correu nou" msgid "Sender" msgstr "remitent" -#: Mailnag/plugins/libnotifyplugin.ui.h:8 -#, fuzzy -msgid "Subject" -msgstr "assumpte" - -#: Mailnag/plugins/libnotifyplugin.ui.h:9 -msgid "Pattern" -msgstr "" - #: Mailnag/plugins/libnotifyplugin.ui.h:10 msgid "Add 2FA Provider" msgstr "" @@ -368,19 +375,61 @@ msgid "Edit 2FA Provider" msgstr "" #: Mailnag/plugins/libnotifyplugin.ui.h:13 +msgid "information" +msgstr "" + +#: Mailnag/plugins/libnotifyplugin.ui.h:14 #, fuzzy msgid "2FA notifications" msgstr "Notificacions sonores" -#: Mailnag/plugins/libnotifyplugin.ui.h:14 +#: Mailnag/plugins/libnotifyplugin.ui.h:15 msgid "Enable/disable libnotify 2FA processing" msgstr "" -#: Mailnag/plugins/libnotifyplugin.ui.h:18 +#: Mailnag/plugins/libnotifyplugin.ui.h:16 +msgid "Pattern regexp with {code} for capture." +msgstr "" + +#: Mailnag/plugins/libnotifyplugin.ui.h:17 +msgid "" +"Display name of a mail sender, \n" +"if display name is not available, \n" +"address spec can be used." +msgstr "" + +#: Mailnag/plugins/libnotifyplugin.ui.h:21 +msgid "" +"This field is not a regular expression, \n" +"however it can contain a code which \n" +"is materialised within braces, like \n" +"this: {code}.\n" +"\n" +"Ex: Your security code: {code}" +msgstr "" + +#: Mailnag/plugins/libnotifyplugin.ui.h:27 +msgid "Subject (not a regexp but {code} for capture possible)" +msgstr "" + +#: Mailnag/plugins/libnotifyplugin.ui.h:29 +msgid "" +"This field can be a regular expression \n" +"where the code is materialised within \n" +"braces, like this: {code}.\n" +"\n" +"Ex: Your security code is:\\s?{code}" +msgstr "" + +#: Mailnag/plugins/libnotifyplugin.ui.h:34 +msgid "Text" +msgstr "" + +#: Mailnag/plugins/libnotifyplugin.ui.h:35 msgid "Edit 2FA provider" msgstr "" -#: Mailnag/plugins/libnotifyplugin.ui.h:19 +#: Mailnag/plugins/libnotifyplugin.ui.h:36 #, fuzzy msgid "Enable provider" msgstr "Habilitat" diff --git a/po/cs.po b/po/cs.po index 073b783..255f6d8 100644 --- a/po/cs.po +++ b/po/cs.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: mailnag\n" "Report-Msgid-Bugs-To: https://github.com/tikank/mailnagger/issues\n" -"POT-Creation-Date: 2026-02-11 23:22+0100\n" +"POT-Creation-Date: 2026-02-15 02:03+0100\n" "PO-Revision-Date: 2019-03-16 14:48+0000\n" "Last-Translator: Launchpad Translations Administrators \n" "Language-Team: Czech \n" @@ -133,84 +133,100 @@ msgstr "" "Mailnag předá celkové počet nových e-mailů tomuto skriptu,\n" "následovaný %s sekvencemi." -#: Mailnag/plugins/libnotifyplugin.py:74 +#: Mailnag/plugins/libnotifyplugin.py:75 msgid "Your Security Passcode" msgstr "" -#: Mailnag/plugins/libnotifyplugin.py:143 +#: Mailnag/plugins/libnotifyplugin.py:149 msgid "LibNotify Notifications" msgstr "LibNotify notifikace" -#: Mailnag/plugins/libnotifyplugin.py:144 +#: Mailnag/plugins/libnotifyplugin.py:150 msgid "Shows a popup when new mails arrive." msgstr "Zobrazí popup okno při novém e-mailu." -#: Mailnag/plugins/libnotifyplugin.py:186 +#: Mailnag/plugins/libnotifyplugin.py:192 msgid "Notification mode:" msgstr "Notifikační mód:" -#: Mailnag/plugins/libnotifyplugin.py:188 +#: Mailnag/plugins/libnotifyplugin.py:194 msgid "2FA providers" msgstr "" -#: Mailnag/plugins/libnotifyplugin.py:391 -#: Mailnag/plugins/libnotifyplugin.py:427 -#: Mailnag/plugins/libnotifyplugin.py:577 +#: Mailnag/plugins/libnotifyplugin.py:241 +#, python-brace-format +msgid "Missing \"code\" group pattern: {code}" +msgstr "" + +#: Mailnag/plugins/libnotifyplugin.py:260 +#, python-format +msgid "%s is incorrect regexp" +msgstr "" + +#: Mailnag/plugins/libnotifyplugin.py:264 +#: Mailnag/plugins/libnotifyplugin.ui.h:8 +#, fuzzy +msgid "Subject" +msgstr "předmět" + +#: Mailnag/plugins/libnotifyplugin.py:267 +#: Mailnag/plugins/libnotifyplugin.ui.h:9 +msgid "Pattern" +msgstr "" + +#: Mailnag/plugins/libnotifyplugin.py:443 +#: Mailnag/plugins/libnotifyplugin.py:481 +#: Mailnag/plugins/libnotifyplugin.py:633 #, python-brace-format msgid "{0} new mails" msgstr "{0} nových e-mailů" -#: Mailnag/plugins/libnotifyplugin.py:393 +#: Mailnag/plugins/libnotifyplugin.py:445 #, python-brace-format msgid "from {0} and others." msgstr "z {0} a další." -#: Mailnag/plugins/libnotifyplugin.py:395 -#: Mailnag/plugins/libnotifyplugin.py:398 +#: Mailnag/plugins/libnotifyplugin.py:447 +#: Mailnag/plugins/libnotifyplugin.py:450 #, python-brace-format msgid "from {0}." msgstr "z {0}." -#: Mailnag/plugins/libnotifyplugin.py:397 -#: Mailnag/plugins/libnotifyplugin.py:429 -#: Mailnag/plugins/libnotifyplugin.py:579 +#: Mailnag/plugins/libnotifyplugin.py:449 +#: Mailnag/plugins/libnotifyplugin.py:483 +#: Mailnag/plugins/libnotifyplugin.py:635 msgid "New mail" msgstr "Nový mail" -#: Mailnag/plugins/libnotifyplugin.py:422 -#: Mailnag/plugins/libnotifyplugin.py:424 +#: Mailnag/plugins/libnotifyplugin.py:476 #, python-brace-format msgid "(and {0} more)" msgstr "(a {0} dalších)" -#: Mailnag/plugins/libnotifyplugin.py:522 -#, python-brace-format -msgid "📋 Code: {0}" +#: Mailnag/plugins/libnotifyplugin.py:578 +msgid "Copy code:" msgstr "" -#: Mailnag/plugins/libnotifyplugin.py:566 +#: Mailnag/plugins/libnotifyplugin.py:622 msgid "Mark as read" msgstr "Označit jako přečtený" -#: Mailnag/plugins/libnotifyplugin.py:765 +#: Mailnag/plugins/libnotifyplugin.py:837 #, fuzzy msgid "Delete this provider:" msgstr "Odstranit tento účet:" -#: Mailnag/plugins/libnotifyplugin.py:766 -#: Mailnag/plugins/libnotifyplugin.ui.h:15 +#: Mailnag/plugins/libnotifyplugin.py:838 #, fuzzy msgid "Sender:" msgstr "odesílatel" -#: Mailnag/plugins/libnotifyplugin.py:767 -#: Mailnag/plugins/libnotifyplugin.ui.h:16 +#: Mailnag/plugins/libnotifyplugin.py:839 #, fuzzy msgid "Subject:" msgstr "předmět" -#: Mailnag/plugins/libnotifyplugin.py:768 -#: Mailnag/plugins/libnotifyplugin.ui.h:17 +#: Mailnag/plugins/libnotifyplugin.py:840 msgid "Pattern:" msgstr "" @@ -347,15 +363,6 @@ msgstr "Jedna notifikace pro nový e-mail" msgid "Sender" msgstr "odesílatel" -#: Mailnag/plugins/libnotifyplugin.ui.h:8 -#, fuzzy -msgid "Subject" -msgstr "předmět" - -#: Mailnag/plugins/libnotifyplugin.ui.h:9 -msgid "Pattern" -msgstr "" - #: Mailnag/plugins/libnotifyplugin.ui.h:10 msgid "Add 2FA Provider" msgstr "" @@ -369,19 +376,61 @@ msgid "Edit 2FA Provider" msgstr "" #: Mailnag/plugins/libnotifyplugin.ui.h:13 +msgid "information" +msgstr "" + +#: Mailnag/plugins/libnotifyplugin.ui.h:14 #, fuzzy msgid "2FA notifications" msgstr "Zvukové notifikace" -#: Mailnag/plugins/libnotifyplugin.ui.h:14 +#: Mailnag/plugins/libnotifyplugin.ui.h:15 msgid "Enable/disable libnotify 2FA processing" msgstr "" -#: Mailnag/plugins/libnotifyplugin.ui.h:18 +#: Mailnag/plugins/libnotifyplugin.ui.h:16 +msgid "Pattern regexp with {code} for capture." +msgstr "" + +#: Mailnag/plugins/libnotifyplugin.ui.h:17 +msgid "" +"Display name of a mail sender, \n" +"if display name is not available, \n" +"address spec can be used." +msgstr "" + +#: Mailnag/plugins/libnotifyplugin.ui.h:21 +msgid "" +"This field is not a regular expression, \n" +"however it can contain a code which \n" +"is materialised within braces, like \n" +"this: {code}.\n" +"\n" +"Ex: Your security code: {code}" +msgstr "" + +#: Mailnag/plugins/libnotifyplugin.ui.h:27 +msgid "Subject (not a regexp but {code} for capture possible)" +msgstr "" + +#: Mailnag/plugins/libnotifyplugin.ui.h:29 +msgid "" +"This field can be a regular expression \n" +"where the code is materialised within \n" +"braces, like this: {code}.\n" +"\n" +"Ex: Your security code is:\\s?{code}" +msgstr "" + +#: Mailnag/plugins/libnotifyplugin.ui.h:34 +msgid "Text" +msgstr "" + +#: Mailnag/plugins/libnotifyplugin.ui.h:35 msgid "Edit 2FA provider" msgstr "" -#: Mailnag/plugins/libnotifyplugin.ui.h:19 +#: Mailnag/plugins/libnotifyplugin.ui.h:36 #, fuzzy msgid "Enable provider" msgstr "Povoleno" diff --git a/po/de.po b/po/de.po index 5ec7ec1..c027d9d 100644 --- a/po/de.po +++ b/po/de.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: mailnag\n" "Report-Msgid-Bugs-To: https://github.com/tikank/mailnagger/issues\n" -"POT-Creation-Date: 2026-02-11 23:22+0100\n" +"POT-Creation-Date: 2026-02-15 02:03+0100\n" "PO-Revision-Date: 2020-10-24 19:26+0000\n" "Last-Translator: J. Lavoie \n" "Language-Team: German \n" "Language-Team: Spanish \n" "Language-Team: \n" @@ -129,84 +129,100 @@ msgstr "" "Mailnagger välittää skriptille uusien postien kokonaismäärän\n" "ja sen perään %s-sarjan." -#: Mailnag/plugins/libnotifyplugin.py:74 +#: Mailnag/plugins/libnotifyplugin.py:75 msgid "Your Security Passcode" msgstr "" -#: Mailnag/plugins/libnotifyplugin.py:143 +#: Mailnag/plugins/libnotifyplugin.py:149 msgid "LibNotify Notifications" msgstr "LibNotify-huomautin" -#: Mailnag/plugins/libnotifyplugin.py:144 +#: Mailnag/plugins/libnotifyplugin.py:150 msgid "Shows a popup when new mails arrive." msgstr "Näyttää huomautuksen, kun uusi sähköposti saapuu." -#: Mailnag/plugins/libnotifyplugin.py:186 +#: Mailnag/plugins/libnotifyplugin.py:192 msgid "Notification mode:" msgstr "Huomautusvalinta:" -#: Mailnag/plugins/libnotifyplugin.py:188 +#: Mailnag/plugins/libnotifyplugin.py:194 msgid "2FA providers" msgstr "" -#: Mailnag/plugins/libnotifyplugin.py:391 -#: Mailnag/plugins/libnotifyplugin.py:427 -#: Mailnag/plugins/libnotifyplugin.py:577 +#: Mailnag/plugins/libnotifyplugin.py:241 +#, python-brace-format +msgid "Missing \"code\" group pattern: {code}" +msgstr "" + +#: Mailnag/plugins/libnotifyplugin.py:260 +#, python-format +msgid "%s is incorrect regexp" +msgstr "" + +#: Mailnag/plugins/libnotifyplugin.py:264 +#: Mailnag/plugins/libnotifyplugin.ui.h:8 +#, fuzzy +msgid "Subject" +msgstr "otsikko" + +#: Mailnag/plugins/libnotifyplugin.py:267 +#: Mailnag/plugins/libnotifyplugin.ui.h:9 +msgid "Pattern" +msgstr "" + +#: Mailnag/plugins/libnotifyplugin.py:443 +#: Mailnag/plugins/libnotifyplugin.py:481 +#: Mailnag/plugins/libnotifyplugin.py:633 #, python-brace-format msgid "{0} new mails" msgstr "{0} uutta sähköpostia" -#: Mailnag/plugins/libnotifyplugin.py:393 +#: Mailnag/plugins/libnotifyplugin.py:445 #, python-brace-format msgid "from {0} and others." msgstr "lähettäjältä {0} ja muilta." -#: Mailnag/plugins/libnotifyplugin.py:395 -#: Mailnag/plugins/libnotifyplugin.py:398 +#: Mailnag/plugins/libnotifyplugin.py:447 +#: Mailnag/plugins/libnotifyplugin.py:450 #, python-brace-format msgid "from {0}." msgstr "lähettäjältä {0}." -#: Mailnag/plugins/libnotifyplugin.py:397 -#: Mailnag/plugins/libnotifyplugin.py:429 -#: Mailnag/plugins/libnotifyplugin.py:579 +#: Mailnag/plugins/libnotifyplugin.py:449 +#: Mailnag/plugins/libnotifyplugin.py:483 +#: Mailnag/plugins/libnotifyplugin.py:635 msgid "New mail" msgstr "Uusi sähköposti" -#: Mailnag/plugins/libnotifyplugin.py:422 -#: Mailnag/plugins/libnotifyplugin.py:424 +#: Mailnag/plugins/libnotifyplugin.py:476 #, python-brace-format msgid "(and {0} more)" msgstr "(ja {0} muuta)" -#: Mailnag/plugins/libnotifyplugin.py:522 -#, python-brace-format -msgid "📋 Code: {0}" +#: Mailnag/plugins/libnotifyplugin.py:578 +msgid "Copy code:" msgstr "" -#: Mailnag/plugins/libnotifyplugin.py:566 +#: Mailnag/plugins/libnotifyplugin.py:622 msgid "Mark as read" msgstr "Merkitse luetuksi" -#: Mailnag/plugins/libnotifyplugin.py:765 +#: Mailnag/plugins/libnotifyplugin.py:837 #, fuzzy msgid "Delete this provider:" msgstr "Poista tämä tili:" -#: Mailnag/plugins/libnotifyplugin.py:766 -#: Mailnag/plugins/libnotifyplugin.ui.h:15 +#: Mailnag/plugins/libnotifyplugin.py:838 #, fuzzy msgid "Sender:" msgstr "lähettäjä" -#: Mailnag/plugins/libnotifyplugin.py:767 -#: Mailnag/plugins/libnotifyplugin.ui.h:16 +#: Mailnag/plugins/libnotifyplugin.py:839 #, fuzzy msgid "Subject:" msgstr "otsikko" -#: Mailnag/plugins/libnotifyplugin.py:768 -#: Mailnag/plugins/libnotifyplugin.ui.h:17 +#: Mailnag/plugins/libnotifyplugin.py:840 msgid "Pattern:" msgstr "" @@ -344,15 +360,6 @@ msgstr "Oma huomautus kustakin uudesta sähköpostista" msgid "Sender" msgstr "lähettäjä" -#: Mailnag/plugins/libnotifyplugin.ui.h:8 -#, fuzzy -msgid "Subject" -msgstr "otsikko" - -#: Mailnag/plugins/libnotifyplugin.ui.h:9 -msgid "Pattern" -msgstr "" - #: Mailnag/plugins/libnotifyplugin.ui.h:10 msgid "Add 2FA Provider" msgstr "" @@ -366,19 +373,61 @@ msgid "Edit 2FA Provider" msgstr "" #: Mailnag/plugins/libnotifyplugin.ui.h:13 +msgid "information" +msgstr "" + +#: Mailnag/plugins/libnotifyplugin.ui.h:14 #, fuzzy msgid "2FA notifications" msgstr "Äänimerkki" -#: Mailnag/plugins/libnotifyplugin.ui.h:14 +#: Mailnag/plugins/libnotifyplugin.ui.h:15 msgid "Enable/disable libnotify 2FA processing" msgstr "" -#: Mailnag/plugins/libnotifyplugin.ui.h:18 +#: Mailnag/plugins/libnotifyplugin.ui.h:16 +msgid "Pattern regexp with {code} for capture." +msgstr "" + +#: Mailnag/plugins/libnotifyplugin.ui.h:17 +msgid "" +"Display name of a mail sender, \n" +"if display name is not available, \n" +"address spec can be used." +msgstr "" + +#: Mailnag/plugins/libnotifyplugin.ui.h:21 +msgid "" +"This field is not a regular expression, \n" +"however it can contain a code which \n" +"is materialised within braces, like \n" +"this: {code}.\n" +"\n" +"Ex: Your security code: {code}" +msgstr "" + +#: Mailnag/plugins/libnotifyplugin.ui.h:27 +msgid "Subject (not a regexp but {code} for capture possible)" +msgstr "" + +#: Mailnag/plugins/libnotifyplugin.ui.h:29 +msgid "" +"This field can be a regular expression \n" +"where the code is materialised within \n" +"braces, like this: {code}.\n" +"\n" +"Ex: Your security code is:\\s?{code}" +msgstr "" + +#: Mailnag/plugins/libnotifyplugin.ui.h:34 +msgid "Text" +msgstr "" + +#: Mailnag/plugins/libnotifyplugin.ui.h:35 msgid "Edit 2FA provider" msgstr "" -#: Mailnag/plugins/libnotifyplugin.ui.h:19 +#: Mailnag/plugins/libnotifyplugin.ui.h:36 #, fuzzy msgid "Enable provider" msgstr "Käytössä" diff --git a/po/fr.po b/po/fr.po index b26b259..ec1e7c0 100644 --- a/po/fr.po +++ b/po/fr.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: mailnag\n" "Report-Msgid-Bugs-To: https://github.com/tikank/mailnagger/issues\n" -"POT-Creation-Date: 2026-02-11 23:22+0100\n" +"POT-Creation-Date: 2026-02-15 02:03+0100\n" "PO-Revision-Date: 2020-10-15 17:26+0000\n" "Last-Translator: J. Lavoie \n" "Language-Team: French \n" "Language-Team: Galician \n" @@ -130,84 +130,100 @@ msgid "" "followed by %s sequences." msgstr "" -#: Mailnag/plugins/libnotifyplugin.py:74 +#: Mailnag/plugins/libnotifyplugin.py:75 msgid "Your Security Passcode" msgstr "" -#: Mailnag/plugins/libnotifyplugin.py:143 +#: Mailnag/plugins/libnotifyplugin.py:149 msgid "LibNotify Notifications" msgstr "Notificacións LibNotify" -#: Mailnag/plugins/libnotifyplugin.py:144 +#: Mailnag/plugins/libnotifyplugin.py:150 msgid "Shows a popup when new mails arrive." msgstr "Mostra unha xanela emerxente ao recibir correos novos." -#: Mailnag/plugins/libnotifyplugin.py:186 +#: Mailnag/plugins/libnotifyplugin.py:192 msgid "Notification mode:" msgstr "Modo Notificación:" -#: Mailnag/plugins/libnotifyplugin.py:188 +#: Mailnag/plugins/libnotifyplugin.py:194 msgid "2FA providers" msgstr "" -#: Mailnag/plugins/libnotifyplugin.py:391 -#: Mailnag/plugins/libnotifyplugin.py:427 -#: Mailnag/plugins/libnotifyplugin.py:577 +#: Mailnag/plugins/libnotifyplugin.py:241 +#, python-brace-format +msgid "Missing \"code\" group pattern: {code}" +msgstr "" + +#: Mailnag/plugins/libnotifyplugin.py:260 +#, python-format +msgid "%s is incorrect regexp" +msgstr "" + +#: Mailnag/plugins/libnotifyplugin.py:264 +#: Mailnag/plugins/libnotifyplugin.ui.h:8 +#, fuzzy +msgid "Subject" +msgstr "asunto" + +#: Mailnag/plugins/libnotifyplugin.py:267 +#: Mailnag/plugins/libnotifyplugin.ui.h:9 +msgid "Pattern" +msgstr "" + +#: Mailnag/plugins/libnotifyplugin.py:443 +#: Mailnag/plugins/libnotifyplugin.py:481 +#: Mailnag/plugins/libnotifyplugin.py:633 #, python-brace-format msgid "{0} new mails" msgstr "{0} novos correos" -#: Mailnag/plugins/libnotifyplugin.py:393 +#: Mailnag/plugins/libnotifyplugin.py:445 #, python-brace-format msgid "from {0} and others." msgstr "" -#: Mailnag/plugins/libnotifyplugin.py:395 -#: Mailnag/plugins/libnotifyplugin.py:398 +#: Mailnag/plugins/libnotifyplugin.py:447 +#: Mailnag/plugins/libnotifyplugin.py:450 #, python-brace-format msgid "from {0}." msgstr "" -#: Mailnag/plugins/libnotifyplugin.py:397 -#: Mailnag/plugins/libnotifyplugin.py:429 -#: Mailnag/plugins/libnotifyplugin.py:579 +#: Mailnag/plugins/libnotifyplugin.py:449 +#: Mailnag/plugins/libnotifyplugin.py:483 +#: Mailnag/plugins/libnotifyplugin.py:635 msgid "New mail" msgstr "Correo novo" -#: Mailnag/plugins/libnotifyplugin.py:422 -#: Mailnag/plugins/libnotifyplugin.py:424 +#: Mailnag/plugins/libnotifyplugin.py:476 #, python-brace-format msgid "(and {0} more)" msgstr "(e {0} máis)" -#: Mailnag/plugins/libnotifyplugin.py:522 -#, python-brace-format -msgid "📋 Code: {0}" +#: Mailnag/plugins/libnotifyplugin.py:578 +msgid "Copy code:" msgstr "" -#: Mailnag/plugins/libnotifyplugin.py:566 +#: Mailnag/plugins/libnotifyplugin.py:622 msgid "Mark as read" msgstr "Marcar como lido" -#: Mailnag/plugins/libnotifyplugin.py:765 +#: Mailnag/plugins/libnotifyplugin.py:837 #, fuzzy msgid "Delete this provider:" msgstr "Eliminar esta conta:" -#: Mailnag/plugins/libnotifyplugin.py:766 -#: Mailnag/plugins/libnotifyplugin.ui.h:15 +#: Mailnag/plugins/libnotifyplugin.py:838 #, fuzzy msgid "Sender:" msgstr "remitente" -#: Mailnag/plugins/libnotifyplugin.py:767 -#: Mailnag/plugins/libnotifyplugin.ui.h:16 +#: Mailnag/plugins/libnotifyplugin.py:839 #, fuzzy msgid "Subject:" msgstr "asunto" -#: Mailnag/plugins/libnotifyplugin.py:768 -#: Mailnag/plugins/libnotifyplugin.ui.h:17 +#: Mailnag/plugins/libnotifyplugin.py:840 msgid "Pattern:" msgstr "" @@ -344,15 +360,6 @@ msgstr "Unha notificación por cada novo correo" msgid "Sender" msgstr "remitente" -#: Mailnag/plugins/libnotifyplugin.ui.h:8 -#, fuzzy -msgid "Subject" -msgstr "asunto" - -#: Mailnag/plugins/libnotifyplugin.ui.h:9 -msgid "Pattern" -msgstr "" - #: Mailnag/plugins/libnotifyplugin.ui.h:10 msgid "Add 2FA Provider" msgstr "" @@ -366,19 +373,61 @@ msgid "Edit 2FA Provider" msgstr "" #: Mailnag/plugins/libnotifyplugin.ui.h:13 +msgid "information" +msgstr "" + +#: Mailnag/plugins/libnotifyplugin.ui.h:14 #, fuzzy msgid "2FA notifications" msgstr "Notificacións con son" -#: Mailnag/plugins/libnotifyplugin.ui.h:14 +#: Mailnag/plugins/libnotifyplugin.ui.h:15 msgid "Enable/disable libnotify 2FA processing" msgstr "" -#: Mailnag/plugins/libnotifyplugin.ui.h:18 +#: Mailnag/plugins/libnotifyplugin.ui.h:16 +msgid "Pattern regexp with {code} for capture." +msgstr "" + +#: Mailnag/plugins/libnotifyplugin.ui.h:17 +msgid "" +"Display name of a mail sender, \n" +"if display name is not available, \n" +"address spec can be used." +msgstr "" + +#: Mailnag/plugins/libnotifyplugin.ui.h:21 +msgid "" +"This field is not a regular expression, \n" +"however it can contain a code which \n" +"is materialised within braces, like \n" +"this: {code}.\n" +"\n" +"Ex: Your security code: {code}" +msgstr "" + +#: Mailnag/plugins/libnotifyplugin.ui.h:27 +msgid "Subject (not a regexp but {code} for capture possible)" +msgstr "" + +#: Mailnag/plugins/libnotifyplugin.ui.h:29 +msgid "" +"This field can be a regular expression \n" +"where the code is materialised within \n" +"braces, like this: {code}.\n" +"\n" +"Ex: Your security code is:\\s?{code}" +msgstr "" + +#: Mailnag/plugins/libnotifyplugin.ui.h:34 +msgid "Text" +msgstr "" + +#: Mailnag/plugins/libnotifyplugin.ui.h:35 msgid "Edit 2FA provider" msgstr "" -#: Mailnag/plugins/libnotifyplugin.ui.h:19 +#: Mailnag/plugins/libnotifyplugin.ui.h:36 #, fuzzy msgid "Enable provider" msgstr "Activado" diff --git a/po/hr.po b/po/hr.po index af6cead..c1bdd67 100644 --- a/po/hr.po +++ b/po/hr.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: mailnag\n" "Report-Msgid-Bugs-To: https://github.com/tikank/mailnagger/issues\n" -"POT-Creation-Date: 2026-02-11 23:22+0100\n" +"POT-Creation-Date: 2026-02-15 02:03+0100\n" "PO-Revision-Date: 2021-01-18 00:35+0000\n" "Last-Translator: Milo Ivir \n" "Language-Team: Croatian \n" "Language-Team: Indonesian \n" @@ -128,84 +128,100 @@ msgid "" "followed by %s sequences." msgstr "" -#: Mailnag/plugins/libnotifyplugin.py:74 +#: Mailnag/plugins/libnotifyplugin.py:75 msgid "Your Security Passcode" msgstr "" -#: Mailnag/plugins/libnotifyplugin.py:143 +#: Mailnag/plugins/libnotifyplugin.py:149 msgid "LibNotify Notifications" msgstr "Notifikasi LibNotify" -#: Mailnag/plugins/libnotifyplugin.py:144 +#: Mailnag/plugins/libnotifyplugin.py:150 msgid "Shows a popup when new mails arrive." msgstr "Tampilkan jendela munculan ketika surat baru datang." -#: Mailnag/plugins/libnotifyplugin.py:186 +#: Mailnag/plugins/libnotifyplugin.py:192 msgid "Notification mode:" msgstr "Mode notifikasi:" -#: Mailnag/plugins/libnotifyplugin.py:188 +#: Mailnag/plugins/libnotifyplugin.py:194 msgid "2FA providers" msgstr "" -#: Mailnag/plugins/libnotifyplugin.py:391 -#: Mailnag/plugins/libnotifyplugin.py:427 -#: Mailnag/plugins/libnotifyplugin.py:577 +#: Mailnag/plugins/libnotifyplugin.py:241 +#, python-brace-format +msgid "Missing \"code\" group pattern: {code}" +msgstr "" + +#: Mailnag/plugins/libnotifyplugin.py:260 +#, python-format +msgid "%s is incorrect regexp" +msgstr "" + +#: Mailnag/plugins/libnotifyplugin.py:264 +#: Mailnag/plugins/libnotifyplugin.ui.h:8 +#, fuzzy +msgid "Subject" +msgstr "subyek" + +#: Mailnag/plugins/libnotifyplugin.py:267 +#: Mailnag/plugins/libnotifyplugin.ui.h:9 +msgid "Pattern" +msgstr "" + +#: Mailnag/plugins/libnotifyplugin.py:443 +#: Mailnag/plugins/libnotifyplugin.py:481 +#: Mailnag/plugins/libnotifyplugin.py:633 #, python-brace-format msgid "{0} new mails" msgstr "{0} surat baru" -#: Mailnag/plugins/libnotifyplugin.py:393 +#: Mailnag/plugins/libnotifyplugin.py:445 #, python-brace-format msgid "from {0} and others." msgstr "dari {0} dan lainnya." -#: Mailnag/plugins/libnotifyplugin.py:395 -#: Mailnag/plugins/libnotifyplugin.py:398 +#: Mailnag/plugins/libnotifyplugin.py:447 +#: Mailnag/plugins/libnotifyplugin.py:450 #, python-brace-format msgid "from {0}." msgstr "dari {0}." -#: Mailnag/plugins/libnotifyplugin.py:397 -#: Mailnag/plugins/libnotifyplugin.py:429 -#: Mailnag/plugins/libnotifyplugin.py:579 +#: Mailnag/plugins/libnotifyplugin.py:449 +#: Mailnag/plugins/libnotifyplugin.py:483 +#: Mailnag/plugins/libnotifyplugin.py:635 msgid "New mail" msgstr "Surat baru" -#: Mailnag/plugins/libnotifyplugin.py:422 -#: Mailnag/plugins/libnotifyplugin.py:424 +#: Mailnag/plugins/libnotifyplugin.py:476 #, python-brace-format msgid "(and {0} more)" msgstr "(dan {0} lainnya)" -#: Mailnag/plugins/libnotifyplugin.py:522 -#, python-brace-format -msgid "📋 Code: {0}" +#: Mailnag/plugins/libnotifyplugin.py:578 +msgid "Copy code:" msgstr "" -#: Mailnag/plugins/libnotifyplugin.py:566 +#: Mailnag/plugins/libnotifyplugin.py:622 msgid "Mark as read" msgstr "Tandai sudah dibaca" -#: Mailnag/plugins/libnotifyplugin.py:765 +#: Mailnag/plugins/libnotifyplugin.py:837 #, fuzzy msgid "Delete this provider:" msgstr "Hapus akun ini:" -#: Mailnag/plugins/libnotifyplugin.py:766 -#: Mailnag/plugins/libnotifyplugin.ui.h:15 +#: Mailnag/plugins/libnotifyplugin.py:838 #, fuzzy msgid "Sender:" msgstr "pengirim" -#: Mailnag/plugins/libnotifyplugin.py:767 -#: Mailnag/plugins/libnotifyplugin.ui.h:16 +#: Mailnag/plugins/libnotifyplugin.py:839 #, fuzzy msgid "Subject:" msgstr "subyek" -#: Mailnag/plugins/libnotifyplugin.py:768 -#: Mailnag/plugins/libnotifyplugin.ui.h:17 +#: Mailnag/plugins/libnotifyplugin.py:840 msgid "Pattern:" msgstr "" @@ -342,15 +358,6 @@ msgstr "Satu notifikasi per surat baru" msgid "Sender" msgstr "pengirim" -#: Mailnag/plugins/libnotifyplugin.ui.h:8 -#, fuzzy -msgid "Subject" -msgstr "subyek" - -#: Mailnag/plugins/libnotifyplugin.ui.h:9 -msgid "Pattern" -msgstr "" - #: Mailnag/plugins/libnotifyplugin.ui.h:10 msgid "Add 2FA Provider" msgstr "" @@ -364,19 +371,61 @@ msgid "Edit 2FA Provider" msgstr "" #: Mailnag/plugins/libnotifyplugin.ui.h:13 +msgid "information" +msgstr "" + +#: Mailnag/plugins/libnotifyplugin.ui.h:14 #, fuzzy msgid "2FA notifications" msgstr "Notifikasi Suara" -#: Mailnag/plugins/libnotifyplugin.ui.h:14 +#: Mailnag/plugins/libnotifyplugin.ui.h:15 msgid "Enable/disable libnotify 2FA processing" msgstr "" -#: Mailnag/plugins/libnotifyplugin.ui.h:18 +#: Mailnag/plugins/libnotifyplugin.ui.h:16 +msgid "Pattern regexp with {code} for capture." +msgstr "" + +#: Mailnag/plugins/libnotifyplugin.ui.h:17 +msgid "" +"Display name of a mail sender, \n" +"if display name is not available, \n" +"address spec can be used." +msgstr "" + +#: Mailnag/plugins/libnotifyplugin.ui.h:21 +msgid "" +"This field is not a regular expression, \n" +"however it can contain a code which \n" +"is materialised within braces, like \n" +"this: {code}.\n" +"\n" +"Ex: Your security code: {code}" +msgstr "" + +#: Mailnag/plugins/libnotifyplugin.ui.h:27 +msgid "Subject (not a regexp but {code} for capture possible)" +msgstr "" + +#: Mailnag/plugins/libnotifyplugin.ui.h:29 +msgid "" +"This field can be a regular expression \n" +"where the code is materialised within \n" +"braces, like this: {code}.\n" +"\n" +"Ex: Your security code is:\\s?{code}" +msgstr "" + +#: Mailnag/plugins/libnotifyplugin.ui.h:34 +msgid "Text" +msgstr "" + +#: Mailnag/plugins/libnotifyplugin.ui.h:35 msgid "Edit 2FA provider" msgstr "" -#: Mailnag/plugins/libnotifyplugin.ui.h:19 +#: Mailnag/plugins/libnotifyplugin.ui.h:36 #, fuzzy msgid "Enable provider" msgstr "Aktifkan" diff --git a/po/it.po b/po/it.po index 3349829..5e2d4f5 100644 --- a/po/it.po +++ b/po/it.po @@ -2,7 +2,7 @@ msgid "" msgstr "" "Project-Id-Version: mailnag\n" "Report-Msgid-Bugs-To: https://github.com/tikank/mailnagger/issues\n" -"POT-Creation-Date: 2026-02-11 23:22+0100\n" +"POT-Creation-Date: 2026-02-15 02:03+0100\n" "PO-Revision-Date: 2020-10-15 17:26+0000\n" "Last-Translator: J. Lavoie \n" "Language-Team: Italian \n" "Language-Team: LANGUAGE \n" "Language: \n" "MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" +"Content-Type: text/plain; charset=CHARSET\n" "Content-Transfer-Encoding: 8bit\n" #: Mailnag/daemon/mails.py:283 @@ -125,81 +125,96 @@ msgid "" "followed by %s sequences." msgstr "" -#: Mailnag/plugins/libnotifyplugin.py:74 +#: Mailnag/plugins/libnotifyplugin.py:75 msgid "Your Security Passcode" msgstr "" -#: Mailnag/plugins/libnotifyplugin.py:143 +#: Mailnag/plugins/libnotifyplugin.py:149 msgid "LibNotify Notifications" msgstr "" -#: Mailnag/plugins/libnotifyplugin.py:144 +#: Mailnag/plugins/libnotifyplugin.py:150 msgid "Shows a popup when new mails arrive." msgstr "" -#: Mailnag/plugins/libnotifyplugin.py:186 +#: Mailnag/plugins/libnotifyplugin.py:192 msgid "Notification mode:" msgstr "" -#: Mailnag/plugins/libnotifyplugin.py:188 +#: Mailnag/plugins/libnotifyplugin.py:194 msgid "2FA providers" msgstr "" -#: Mailnag/plugins/libnotifyplugin.py:391 -#: Mailnag/plugins/libnotifyplugin.py:427 -#: Mailnag/plugins/libnotifyplugin.py:577 +#: Mailnag/plugins/libnotifyplugin.py:241 +#, python-brace-format +msgid "Missing \"code\" group pattern: {code}" +msgstr "" + +#: Mailnag/plugins/libnotifyplugin.py:260 +#, python-format +msgid "%s is incorrect regexp" +msgstr "" + +#: Mailnag/plugins/libnotifyplugin.py:264 +#: Mailnag/plugins/libnotifyplugin.ui.h:8 +msgid "Subject" +msgstr "" + +#: Mailnag/plugins/libnotifyplugin.py:267 +#: Mailnag/plugins/libnotifyplugin.ui.h:9 +msgid "Pattern" +msgstr "" + +#: Mailnag/plugins/libnotifyplugin.py:443 +#: Mailnag/plugins/libnotifyplugin.py:481 +#: Mailnag/plugins/libnotifyplugin.py:633 #, python-brace-format msgid "{0} new mails" msgstr "" -#: Mailnag/plugins/libnotifyplugin.py:393 +#: Mailnag/plugins/libnotifyplugin.py:445 #, python-brace-format msgid "from {0} and others." msgstr "" -#: Mailnag/plugins/libnotifyplugin.py:395 -#: Mailnag/plugins/libnotifyplugin.py:398 +#: Mailnag/plugins/libnotifyplugin.py:447 +#: Mailnag/plugins/libnotifyplugin.py:450 #, python-brace-format msgid "from {0}." msgstr "" -#: Mailnag/plugins/libnotifyplugin.py:397 -#: Mailnag/plugins/libnotifyplugin.py:429 -#: Mailnag/plugins/libnotifyplugin.py:579 +#: Mailnag/plugins/libnotifyplugin.py:449 +#: Mailnag/plugins/libnotifyplugin.py:483 +#: Mailnag/plugins/libnotifyplugin.py:635 msgid "New mail" msgstr "" -#: Mailnag/plugins/libnotifyplugin.py:422 -#: Mailnag/plugins/libnotifyplugin.py:424 +#: Mailnag/plugins/libnotifyplugin.py:476 #, python-brace-format msgid "(and {0} more)" msgstr "" -#: Mailnag/plugins/libnotifyplugin.py:522 -#, python-brace-format -msgid "📋 Code: {0}" +#: Mailnag/plugins/libnotifyplugin.py:578 +msgid "Copy code:" msgstr "" -#: Mailnag/plugins/libnotifyplugin.py:566 +#: Mailnag/plugins/libnotifyplugin.py:622 msgid "Mark as read" msgstr "" -#: Mailnag/plugins/libnotifyplugin.py:765 +#: Mailnag/plugins/libnotifyplugin.py:837 msgid "Delete this provider:" msgstr "" -#: Mailnag/plugins/libnotifyplugin.py:766 -#: Mailnag/plugins/libnotifyplugin.ui.h:15 +#: Mailnag/plugins/libnotifyplugin.py:838 msgid "Sender:" msgstr "" -#: Mailnag/plugins/libnotifyplugin.py:767 -#: Mailnag/plugins/libnotifyplugin.ui.h:16 +#: Mailnag/plugins/libnotifyplugin.py:839 msgid "Subject:" msgstr "" -#: Mailnag/plugins/libnotifyplugin.py:768 -#: Mailnag/plugins/libnotifyplugin.ui.h:17 +#: Mailnag/plugins/libnotifyplugin.py:840 msgid "Pattern:" msgstr "" @@ -331,14 +346,6 @@ msgstr "" msgid "Sender" msgstr "" -#: Mailnag/plugins/libnotifyplugin.ui.h:8 -msgid "Subject" -msgstr "" - -#: Mailnag/plugins/libnotifyplugin.ui.h:9 -msgid "Pattern" -msgstr "" - #: Mailnag/plugins/libnotifyplugin.ui.h:10 msgid "Add 2FA Provider" msgstr "" @@ -352,17 +359,59 @@ msgid "Edit 2FA Provider" msgstr "" #: Mailnag/plugins/libnotifyplugin.ui.h:13 -msgid "2FA notifications" +msgid "information" msgstr "" #: Mailnag/plugins/libnotifyplugin.ui.h:14 +msgid "2FA notifications" +msgstr "" + +#: Mailnag/plugins/libnotifyplugin.ui.h:15 msgid "Enable/disable libnotify 2FA processing" msgstr "" -#: Mailnag/plugins/libnotifyplugin.ui.h:18 +#: Mailnag/plugins/libnotifyplugin.ui.h:16 +msgid "Pattern regexp with {code} for capture." +msgstr "" + +#: Mailnag/plugins/libnotifyplugin.ui.h:17 +msgid "" +"Display name of a mail sender, \n" +"if display name is not available, \n" +"address spec can be used." +msgstr "" + +#: Mailnag/plugins/libnotifyplugin.ui.h:21 +msgid "" +"This field is not a regular expression, \n" +"however it can contain a code which \n" +"is materialised within braces, like \n" +"this: {code}.\n" +"\n" +"Ex: Your security code: {code}" +msgstr "" + +#: Mailnag/plugins/libnotifyplugin.ui.h:27 +msgid "Subject (not a regexp but {code} for capture possible)" +msgstr "" + +#: Mailnag/plugins/libnotifyplugin.ui.h:29 +msgid "" +"This field can be a regular expression \n" +"where the code is materialised within \n" +"braces, like this: {code}.\n" +"\n" +"Ex: Your security code is:\\s?{code}" +msgstr "" + +#: Mailnag/plugins/libnotifyplugin.ui.h:34 +msgid "Text" +msgstr "" + +#: Mailnag/plugins/libnotifyplugin.ui.h:35 msgid "Edit 2FA provider" msgstr "" -#: Mailnag/plugins/libnotifyplugin.ui.h:19 +#: Mailnag/plugins/libnotifyplugin.ui.h:36 msgid "Enable provider" msgstr "" diff --git a/po/pl.po b/po/pl.po index 20388ac..e6b4ca6 100644 --- a/po/pl.po +++ b/po/pl.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: mailnag\n" "Report-Msgid-Bugs-To: https://github.com/tikank/mailnagger/issues\n" -"POT-Creation-Date: 2026-02-11 23:22+0100\n" +"POT-Creation-Date: 2026-02-15 02:03+0100\n" "PO-Revision-Date: 2019-03-16 14:48+0000\n" "Last-Translator: Launchpad Translations Administrators \n" "Language-Team: Polish \n" @@ -133,84 +133,100 @@ msgid "" "followed by %s sequences." msgstr "" -#: Mailnag/plugins/libnotifyplugin.py:74 +#: Mailnag/plugins/libnotifyplugin.py:75 msgid "Your Security Passcode" msgstr "" -#: Mailnag/plugins/libnotifyplugin.py:143 +#: Mailnag/plugins/libnotifyplugin.py:149 msgid "LibNotify Notifications" msgstr "Powiadomienia LibNotify" -#: Mailnag/plugins/libnotifyplugin.py:144 +#: Mailnag/plugins/libnotifyplugin.py:150 msgid "Shows a popup when new mails arrive." msgstr "Pokaż okno kiedy przychodzi nowa poczta." -#: Mailnag/plugins/libnotifyplugin.py:186 +#: Mailnag/plugins/libnotifyplugin.py:192 msgid "Notification mode:" msgstr "Tryb powiadamiania:" -#: Mailnag/plugins/libnotifyplugin.py:188 +#: Mailnag/plugins/libnotifyplugin.py:194 msgid "2FA providers" msgstr "" -#: Mailnag/plugins/libnotifyplugin.py:391 -#: Mailnag/plugins/libnotifyplugin.py:427 -#: Mailnag/plugins/libnotifyplugin.py:577 +#: Mailnag/plugins/libnotifyplugin.py:241 +#, python-brace-format +msgid "Missing \"code\" group pattern: {code}" +msgstr "" + +#: Mailnag/plugins/libnotifyplugin.py:260 +#, python-format +msgid "%s is incorrect regexp" +msgstr "" + +#: Mailnag/plugins/libnotifyplugin.py:264 +#: Mailnag/plugins/libnotifyplugin.ui.h:8 +#, fuzzy +msgid "Subject" +msgstr "temat" + +#: Mailnag/plugins/libnotifyplugin.py:267 +#: Mailnag/plugins/libnotifyplugin.ui.h:9 +msgid "Pattern" +msgstr "" + +#: Mailnag/plugins/libnotifyplugin.py:443 +#: Mailnag/plugins/libnotifyplugin.py:481 +#: Mailnag/plugins/libnotifyplugin.py:633 #, python-brace-format msgid "{0} new mails" msgstr "{0} nowych wiadomości" -#: Mailnag/plugins/libnotifyplugin.py:393 +#: Mailnag/plugins/libnotifyplugin.py:445 #, python-brace-format msgid "from {0} and others." msgstr "od {0} i innych." -#: Mailnag/plugins/libnotifyplugin.py:395 -#: Mailnag/plugins/libnotifyplugin.py:398 +#: Mailnag/plugins/libnotifyplugin.py:447 +#: Mailnag/plugins/libnotifyplugin.py:450 #, python-brace-format msgid "from {0}." msgstr "od {0}" -#: Mailnag/plugins/libnotifyplugin.py:397 -#: Mailnag/plugins/libnotifyplugin.py:429 -#: Mailnag/plugins/libnotifyplugin.py:579 +#: Mailnag/plugins/libnotifyplugin.py:449 +#: Mailnag/plugins/libnotifyplugin.py:483 +#: Mailnag/plugins/libnotifyplugin.py:635 msgid "New mail" msgstr "Nowa poczta" -#: Mailnag/plugins/libnotifyplugin.py:422 -#: Mailnag/plugins/libnotifyplugin.py:424 +#: Mailnag/plugins/libnotifyplugin.py:476 #, python-brace-format msgid "(and {0} more)" msgstr "(i {0} więcej)" -#: Mailnag/plugins/libnotifyplugin.py:522 -#, python-brace-format -msgid "📋 Code: {0}" +#: Mailnag/plugins/libnotifyplugin.py:578 +msgid "Copy code:" msgstr "" -#: Mailnag/plugins/libnotifyplugin.py:566 +#: Mailnag/plugins/libnotifyplugin.py:622 msgid "Mark as read" msgstr "Oznacz jako przeczytana" -#: Mailnag/plugins/libnotifyplugin.py:765 +#: Mailnag/plugins/libnotifyplugin.py:837 #, fuzzy msgid "Delete this provider:" msgstr "Usuń to konto:" -#: Mailnag/plugins/libnotifyplugin.py:766 -#: Mailnag/plugins/libnotifyplugin.ui.h:15 +#: Mailnag/plugins/libnotifyplugin.py:838 #, fuzzy msgid "Sender:" msgstr "nadawca" -#: Mailnag/plugins/libnotifyplugin.py:767 -#: Mailnag/plugins/libnotifyplugin.ui.h:16 +#: Mailnag/plugins/libnotifyplugin.py:839 #, fuzzy msgid "Subject:" msgstr "temat" -#: Mailnag/plugins/libnotifyplugin.py:768 -#: Mailnag/plugins/libnotifyplugin.ui.h:17 +#: Mailnag/plugins/libnotifyplugin.py:840 msgid "Pattern:" msgstr "" @@ -344,15 +360,6 @@ msgstr "Jedno powiadomienie dla jednej wiadomości" msgid "Sender" msgstr "nadawca" -#: Mailnag/plugins/libnotifyplugin.ui.h:8 -#, fuzzy -msgid "Subject" -msgstr "temat" - -#: Mailnag/plugins/libnotifyplugin.ui.h:9 -msgid "Pattern" -msgstr "" - #: Mailnag/plugins/libnotifyplugin.ui.h:10 msgid "Add 2FA Provider" msgstr "" @@ -366,19 +373,61 @@ msgid "Edit 2FA Provider" msgstr "" #: Mailnag/plugins/libnotifyplugin.ui.h:13 +msgid "information" +msgstr "" + +#: Mailnag/plugins/libnotifyplugin.ui.h:14 #, fuzzy msgid "2FA notifications" msgstr "Dżwięk powiadomienia" -#: Mailnag/plugins/libnotifyplugin.ui.h:14 +#: Mailnag/plugins/libnotifyplugin.ui.h:15 msgid "Enable/disable libnotify 2FA processing" msgstr "" -#: Mailnag/plugins/libnotifyplugin.ui.h:18 +#: Mailnag/plugins/libnotifyplugin.ui.h:16 +msgid "Pattern regexp with {code} for capture." +msgstr "" + +#: Mailnag/plugins/libnotifyplugin.ui.h:17 +msgid "" +"Display name of a mail sender, \n" +"if display name is not available, \n" +"address spec can be used." +msgstr "" + +#: Mailnag/plugins/libnotifyplugin.ui.h:21 +msgid "" +"This field is not a regular expression, \n" +"however it can contain a code which \n" +"is materialised within braces, like \n" +"this: {code}.\n" +"\n" +"Ex: Your security code: {code}" +msgstr "" + +#: Mailnag/plugins/libnotifyplugin.ui.h:27 +msgid "Subject (not a regexp but {code} for capture possible)" +msgstr "" + +#: Mailnag/plugins/libnotifyplugin.ui.h:29 +msgid "" +"This field can be a regular expression \n" +"where the code is materialised within \n" +"braces, like this: {code}.\n" +"\n" +"Ex: Your security code is:\\s?{code}" +msgstr "" + +#: Mailnag/plugins/libnotifyplugin.ui.h:34 +msgid "Text" +msgstr "" + +#: Mailnag/plugins/libnotifyplugin.ui.h:35 msgid "Edit 2FA provider" msgstr "" -#: Mailnag/plugins/libnotifyplugin.ui.h:19 +#: Mailnag/plugins/libnotifyplugin.ui.h:36 #, fuzzy msgid "Enable provider" msgstr "Włączone" diff --git a/po/pt.po b/po/pt.po index 8f15cd6..52f00f9 100644 --- a/po/pt.po +++ b/po/pt.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: mailnag\n" "Report-Msgid-Bugs-To: https://github.com/tikank/mailnagger/issues\n" -"POT-Creation-Date: 2026-02-11 23:22+0100\n" +"POT-Creation-Date: 2026-02-15 02:03+0100\n" "PO-Revision-Date: 2019-03-16 14:48+0000\n" "Last-Translator: Launchpad Translations Administrators \n" "Language-Team: Portuguese \n" @@ -134,84 +134,100 @@ msgstr "" "O Mailnag passa a quantidade total de mails novos para este script,\n" "seguido por sequências de %s." -#: Mailnag/plugins/libnotifyplugin.py:74 +#: Mailnag/plugins/libnotifyplugin.py:75 msgid "Your Security Passcode" msgstr "" -#: Mailnag/plugins/libnotifyplugin.py:143 +#: Mailnag/plugins/libnotifyplugin.py:149 msgid "LibNotify Notifications" msgstr "Notificações da LibNotify" -#: Mailnag/plugins/libnotifyplugin.py:144 +#: Mailnag/plugins/libnotifyplugin.py:150 msgid "Shows a popup when new mails arrive." msgstr "Mostra um popup quando chegam novos mails." -#: Mailnag/plugins/libnotifyplugin.py:186 +#: Mailnag/plugins/libnotifyplugin.py:192 msgid "Notification mode:" msgstr "Modo de notificação:" -#: Mailnag/plugins/libnotifyplugin.py:188 +#: Mailnag/plugins/libnotifyplugin.py:194 msgid "2FA providers" msgstr "" -#: Mailnag/plugins/libnotifyplugin.py:391 -#: Mailnag/plugins/libnotifyplugin.py:427 -#: Mailnag/plugins/libnotifyplugin.py:577 +#: Mailnag/plugins/libnotifyplugin.py:241 +#, python-brace-format +msgid "Missing \"code\" group pattern: {code}" +msgstr "" + +#: Mailnag/plugins/libnotifyplugin.py:260 +#, python-format +msgid "%s is incorrect regexp" +msgstr "" + +#: Mailnag/plugins/libnotifyplugin.py:264 +#: Mailnag/plugins/libnotifyplugin.ui.h:8 +#, fuzzy +msgid "Subject" +msgstr "assunto" + +#: Mailnag/plugins/libnotifyplugin.py:267 +#: Mailnag/plugins/libnotifyplugin.ui.h:9 +msgid "Pattern" +msgstr "" + +#: Mailnag/plugins/libnotifyplugin.py:443 +#: Mailnag/plugins/libnotifyplugin.py:481 +#: Mailnag/plugins/libnotifyplugin.py:633 #, python-brace-format msgid "{0} new mails" msgstr "{0} novos mails" -#: Mailnag/plugins/libnotifyplugin.py:393 +#: Mailnag/plugins/libnotifyplugin.py:445 #, python-brace-format msgid "from {0} and others." msgstr "de {0} e outros." -#: Mailnag/plugins/libnotifyplugin.py:395 -#: Mailnag/plugins/libnotifyplugin.py:398 +#: Mailnag/plugins/libnotifyplugin.py:447 +#: Mailnag/plugins/libnotifyplugin.py:450 #, python-brace-format msgid "from {0}." msgstr "de {0}." -#: Mailnag/plugins/libnotifyplugin.py:397 -#: Mailnag/plugins/libnotifyplugin.py:429 -#: Mailnag/plugins/libnotifyplugin.py:579 +#: Mailnag/plugins/libnotifyplugin.py:449 +#: Mailnag/plugins/libnotifyplugin.py:483 +#: Mailnag/plugins/libnotifyplugin.py:635 msgid "New mail" msgstr "Novo mail" -#: Mailnag/plugins/libnotifyplugin.py:422 -#: Mailnag/plugins/libnotifyplugin.py:424 +#: Mailnag/plugins/libnotifyplugin.py:476 #, python-brace-format msgid "(and {0} more)" msgstr "(e mais {0})" -#: Mailnag/plugins/libnotifyplugin.py:522 -#, python-brace-format -msgid "📋 Code: {0}" +#: Mailnag/plugins/libnotifyplugin.py:578 +msgid "Copy code:" msgstr "" -#: Mailnag/plugins/libnotifyplugin.py:566 +#: Mailnag/plugins/libnotifyplugin.py:622 msgid "Mark as read" msgstr "Marcar como lido" -#: Mailnag/plugins/libnotifyplugin.py:765 +#: Mailnag/plugins/libnotifyplugin.py:837 #, fuzzy msgid "Delete this provider:" msgstr "Apagar esta conta:" -#: Mailnag/plugins/libnotifyplugin.py:766 -#: Mailnag/plugins/libnotifyplugin.ui.h:15 +#: Mailnag/plugins/libnotifyplugin.py:838 #, fuzzy msgid "Sender:" msgstr "remetente" -#: Mailnag/plugins/libnotifyplugin.py:767 -#: Mailnag/plugins/libnotifyplugin.ui.h:16 +#: Mailnag/plugins/libnotifyplugin.py:839 #, fuzzy msgid "Subject:" msgstr "assunto" -#: Mailnag/plugins/libnotifyplugin.py:768 -#: Mailnag/plugins/libnotifyplugin.ui.h:17 +#: Mailnag/plugins/libnotifyplugin.py:840 msgid "Pattern:" msgstr "" @@ -348,15 +364,6 @@ msgstr "Uma notificação por novo mail" msgid "Sender" msgstr "remetente" -#: Mailnag/plugins/libnotifyplugin.ui.h:8 -#, fuzzy -msgid "Subject" -msgstr "assunto" - -#: Mailnag/plugins/libnotifyplugin.ui.h:9 -msgid "Pattern" -msgstr "" - #: Mailnag/plugins/libnotifyplugin.ui.h:10 msgid "Add 2FA Provider" msgstr "" @@ -370,19 +377,61 @@ msgid "Edit 2FA Provider" msgstr "" #: Mailnag/plugins/libnotifyplugin.ui.h:13 +msgid "information" +msgstr "" + +#: Mailnag/plugins/libnotifyplugin.ui.h:14 #, fuzzy msgid "2FA notifications" msgstr "Notificações de Som" -#: Mailnag/plugins/libnotifyplugin.ui.h:14 +#: Mailnag/plugins/libnotifyplugin.ui.h:15 msgid "Enable/disable libnotify 2FA processing" msgstr "" -#: Mailnag/plugins/libnotifyplugin.ui.h:18 +#: Mailnag/plugins/libnotifyplugin.ui.h:16 +msgid "Pattern regexp with {code} for capture." +msgstr "" + +#: Mailnag/plugins/libnotifyplugin.ui.h:17 +msgid "" +"Display name of a mail sender, \n" +"if display name is not available, \n" +"address spec can be used." +msgstr "" + +#: Mailnag/plugins/libnotifyplugin.ui.h:21 +msgid "" +"This field is not a regular expression, \n" +"however it can contain a code which \n" +"is materialised within braces, like \n" +"this: {code}.\n" +"\n" +"Ex: Your security code: {code}" +msgstr "" + +#: Mailnag/plugins/libnotifyplugin.ui.h:27 +msgid "Subject (not a regexp but {code} for capture possible)" +msgstr "" + +#: Mailnag/plugins/libnotifyplugin.ui.h:29 +msgid "" +"This field can be a regular expression \n" +"where the code is materialised within \n" +"braces, like this: {code}.\n" +"\n" +"Ex: Your security code is:\\s?{code}" +msgstr "" + +#: Mailnag/plugins/libnotifyplugin.ui.h:34 +msgid "Text" +msgstr "" + +#: Mailnag/plugins/libnotifyplugin.ui.h:35 msgid "Edit 2FA provider" msgstr "" -#: Mailnag/plugins/libnotifyplugin.ui.h:19 +#: Mailnag/plugins/libnotifyplugin.ui.h:36 #, fuzzy msgid "Enable provider" msgstr "Ativado" diff --git a/po/pt_BR.po b/po/pt_BR.po index 22cd226..4645f6e 100644 --- a/po/pt_BR.po +++ b/po/pt_BR.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: mailnag\n" "Report-Msgid-Bugs-To: https://github.com/tikank/mailnagger/issues\n" -"POT-Creation-Date: 2026-02-11 23:22+0100\n" +"POT-Creation-Date: 2026-02-15 02:03+0100\n" "PO-Revision-Date: 2019-12-25 19:25+0000\n" "Last-Translator: Relaxeaza \n" "Language-Team: Brazilian Portuguese \n" @@ -134,84 +134,100 @@ msgstr "" "Mailnag passa o total novas mensagens para o script,\n" "seguido por sequências de %s." -#: Mailnag/plugins/libnotifyplugin.py:74 +#: Mailnag/plugins/libnotifyplugin.py:75 msgid "Your Security Passcode" msgstr "" -#: Mailnag/plugins/libnotifyplugin.py:143 +#: Mailnag/plugins/libnotifyplugin.py:149 msgid "LibNotify Notifications" msgstr "Notificações da LibNotify" -#: Mailnag/plugins/libnotifyplugin.py:144 +#: Mailnag/plugins/libnotifyplugin.py:150 msgid "Shows a popup when new mails arrive." msgstr "Mostra um popup quando chegam novas mensagens." -#: Mailnag/plugins/libnotifyplugin.py:186 +#: Mailnag/plugins/libnotifyplugin.py:192 msgid "Notification mode:" msgstr "Modo de notificação:" -#: Mailnag/plugins/libnotifyplugin.py:188 +#: Mailnag/plugins/libnotifyplugin.py:194 msgid "2FA providers" msgstr "" -#: Mailnag/plugins/libnotifyplugin.py:391 -#: Mailnag/plugins/libnotifyplugin.py:427 -#: Mailnag/plugins/libnotifyplugin.py:577 +#: Mailnag/plugins/libnotifyplugin.py:241 +#, python-brace-format +msgid "Missing \"code\" group pattern: {code}" +msgstr "" + +#: Mailnag/plugins/libnotifyplugin.py:260 +#, python-format +msgid "%s is incorrect regexp" +msgstr "" + +#: Mailnag/plugins/libnotifyplugin.py:264 +#: Mailnag/plugins/libnotifyplugin.ui.h:8 +#, fuzzy +msgid "Subject" +msgstr "assunto" + +#: Mailnag/plugins/libnotifyplugin.py:267 +#: Mailnag/plugins/libnotifyplugin.ui.h:9 +msgid "Pattern" +msgstr "" + +#: Mailnag/plugins/libnotifyplugin.py:443 +#: Mailnag/plugins/libnotifyplugin.py:481 +#: Mailnag/plugins/libnotifyplugin.py:633 #, python-brace-format msgid "{0} new mails" msgstr "{0} novas mensagens" -#: Mailnag/plugins/libnotifyplugin.py:393 +#: Mailnag/plugins/libnotifyplugin.py:445 #, python-brace-format msgid "from {0} and others." msgstr "de {0} e outros." -#: Mailnag/plugins/libnotifyplugin.py:395 -#: Mailnag/plugins/libnotifyplugin.py:398 +#: Mailnag/plugins/libnotifyplugin.py:447 +#: Mailnag/plugins/libnotifyplugin.py:450 #, python-brace-format msgid "from {0}." msgstr "de {0}." -#: Mailnag/plugins/libnotifyplugin.py:397 -#: Mailnag/plugins/libnotifyplugin.py:429 -#: Mailnag/plugins/libnotifyplugin.py:579 +#: Mailnag/plugins/libnotifyplugin.py:449 +#: Mailnag/plugins/libnotifyplugin.py:483 +#: Mailnag/plugins/libnotifyplugin.py:635 msgid "New mail" msgstr "Novo mail" -#: Mailnag/plugins/libnotifyplugin.py:422 -#: Mailnag/plugins/libnotifyplugin.py:424 +#: Mailnag/plugins/libnotifyplugin.py:476 #, python-brace-format msgid "(and {0} more)" msgstr "(e mais {0})" -#: Mailnag/plugins/libnotifyplugin.py:522 -#, python-brace-format -msgid "📋 Code: {0}" +#: Mailnag/plugins/libnotifyplugin.py:578 +msgid "Copy code:" msgstr "" -#: Mailnag/plugins/libnotifyplugin.py:566 +#: Mailnag/plugins/libnotifyplugin.py:622 msgid "Mark as read" msgstr "Marcar como lido" -#: Mailnag/plugins/libnotifyplugin.py:765 +#: Mailnag/plugins/libnotifyplugin.py:837 #, fuzzy msgid "Delete this provider:" msgstr "Apagar esta conta:" -#: Mailnag/plugins/libnotifyplugin.py:766 -#: Mailnag/plugins/libnotifyplugin.ui.h:15 +#: Mailnag/plugins/libnotifyplugin.py:838 #, fuzzy msgid "Sender:" msgstr "remetente" -#: Mailnag/plugins/libnotifyplugin.py:767 -#: Mailnag/plugins/libnotifyplugin.ui.h:16 +#: Mailnag/plugins/libnotifyplugin.py:839 #, fuzzy msgid "Subject:" msgstr "assunto" -#: Mailnag/plugins/libnotifyplugin.py:768 -#: Mailnag/plugins/libnotifyplugin.ui.h:17 +#: Mailnag/plugins/libnotifyplugin.py:840 msgid "Pattern:" msgstr "" @@ -348,15 +364,6 @@ msgstr "Uma notificação por mensagem nova" msgid "Sender" msgstr "remetente" -#: Mailnag/plugins/libnotifyplugin.ui.h:8 -#, fuzzy -msgid "Subject" -msgstr "assunto" - -#: Mailnag/plugins/libnotifyplugin.ui.h:9 -msgid "Pattern" -msgstr "" - #: Mailnag/plugins/libnotifyplugin.ui.h:10 msgid "Add 2FA Provider" msgstr "" @@ -370,19 +377,61 @@ msgid "Edit 2FA Provider" msgstr "" #: Mailnag/plugins/libnotifyplugin.ui.h:13 +msgid "information" +msgstr "" + +#: Mailnag/plugins/libnotifyplugin.ui.h:14 #, fuzzy msgid "2FA notifications" msgstr "Notificações de Som" -#: Mailnag/plugins/libnotifyplugin.ui.h:14 +#: Mailnag/plugins/libnotifyplugin.ui.h:15 msgid "Enable/disable libnotify 2FA processing" msgstr "" -#: Mailnag/plugins/libnotifyplugin.ui.h:18 +#: Mailnag/plugins/libnotifyplugin.ui.h:16 +msgid "Pattern regexp with {code} for capture." +msgstr "" + +#: Mailnag/plugins/libnotifyplugin.ui.h:17 +msgid "" +"Display name of a mail sender, \n" +"if display name is not available, \n" +"address spec can be used." +msgstr "" + +#: Mailnag/plugins/libnotifyplugin.ui.h:21 +msgid "" +"This field is not a regular expression, \n" +"however it can contain a code which \n" +"is materialised within braces, like \n" +"this: {code}.\n" +"\n" +"Ex: Your security code: {code}" +msgstr "" + +#: Mailnag/plugins/libnotifyplugin.ui.h:27 +msgid "Subject (not a regexp but {code} for capture possible)" +msgstr "" + +#: Mailnag/plugins/libnotifyplugin.ui.h:29 +msgid "" +"This field can be a regular expression \n" +"where the code is materialised within \n" +"braces, like this: {code}.\n" +"\n" +"Ex: Your security code is:\\s?{code}" +msgstr "" + +#: Mailnag/plugins/libnotifyplugin.ui.h:34 +msgid "Text" +msgstr "" + +#: Mailnag/plugins/libnotifyplugin.ui.h:35 msgid "Edit 2FA provider" msgstr "" -#: Mailnag/plugins/libnotifyplugin.ui.h:19 +#: Mailnag/plugins/libnotifyplugin.ui.h:36 #, fuzzy msgid "Enable provider" msgstr "Ativado" diff --git a/po/ru.po b/po/ru.po index b895d14..cef7297 100644 --- a/po/ru.po +++ b/po/ru.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: mailnag\n" "Report-Msgid-Bugs-To: https://github.com/tikank/mailnagger/issues\n" -"POT-Creation-Date: 2026-02-11 23:22+0100\n" +"POT-Creation-Date: 2026-02-15 02:03+0100\n" "PO-Revision-Date: 2019-03-16 14:48+0000\n" "Last-Translator: Launchpad Translations Administrators \n" "Language-Team: LANGUAGE \n" @@ -135,84 +135,100 @@ msgstr "" "Скрипту передаётся количество сообщений,\n" "за которым следуют: %s" -#: Mailnag/plugins/libnotifyplugin.py:74 +#: Mailnag/plugins/libnotifyplugin.py:75 msgid "Your Security Passcode" msgstr "" -#: Mailnag/plugins/libnotifyplugin.py:143 +#: Mailnag/plugins/libnotifyplugin.py:149 msgid "LibNotify Notifications" msgstr "Уведомления LibNotify" -#: Mailnag/plugins/libnotifyplugin.py:144 +#: Mailnag/plugins/libnotifyplugin.py:150 msgid "Shows a popup when new mails arrive." msgstr "Отображение всплывающего уведомления при получении новых писем" -#: Mailnag/plugins/libnotifyplugin.py:186 +#: Mailnag/plugins/libnotifyplugin.py:192 msgid "Notification mode:" msgstr "Тип уведомлений:" -#: Mailnag/plugins/libnotifyplugin.py:188 +#: Mailnag/plugins/libnotifyplugin.py:194 msgid "2FA providers" msgstr "" -#: Mailnag/plugins/libnotifyplugin.py:391 -#: Mailnag/plugins/libnotifyplugin.py:427 -#: Mailnag/plugins/libnotifyplugin.py:577 +#: Mailnag/plugins/libnotifyplugin.py:241 +#, python-brace-format +msgid "Missing \"code\" group pattern: {code}" +msgstr "" + +#: Mailnag/plugins/libnotifyplugin.py:260 +#, python-format +msgid "%s is incorrect regexp" +msgstr "" + +#: Mailnag/plugins/libnotifyplugin.py:264 +#: Mailnag/plugins/libnotifyplugin.ui.h:8 +#, fuzzy +msgid "Subject" +msgstr "тема" + +#: Mailnag/plugins/libnotifyplugin.py:267 +#: Mailnag/plugins/libnotifyplugin.ui.h:9 +msgid "Pattern" +msgstr "" + +#: Mailnag/plugins/libnotifyplugin.py:443 +#: Mailnag/plugins/libnotifyplugin.py:481 +#: Mailnag/plugins/libnotifyplugin.py:633 #, python-brace-format msgid "{0} new mails" msgstr "сообщений: {0}" -#: Mailnag/plugins/libnotifyplugin.py:393 +#: Mailnag/plugins/libnotifyplugin.py:445 #, python-brace-format msgid "from {0} and others." msgstr "от {0} и других." -#: Mailnag/plugins/libnotifyplugin.py:395 -#: Mailnag/plugins/libnotifyplugin.py:398 +#: Mailnag/plugins/libnotifyplugin.py:447 +#: Mailnag/plugins/libnotifyplugin.py:450 #, python-brace-format msgid "from {0}." msgstr "от {0}." -#: Mailnag/plugins/libnotifyplugin.py:397 -#: Mailnag/plugins/libnotifyplugin.py:429 -#: Mailnag/plugins/libnotifyplugin.py:579 +#: Mailnag/plugins/libnotifyplugin.py:449 +#: Mailnag/plugins/libnotifyplugin.py:483 +#: Mailnag/plugins/libnotifyplugin.py:635 msgid "New mail" msgstr "Новое сообщение" -#: Mailnag/plugins/libnotifyplugin.py:422 -#: Mailnag/plugins/libnotifyplugin.py:424 +#: Mailnag/plugins/libnotifyplugin.py:476 #, python-brace-format msgid "(and {0} more)" msgstr "(и еще {0})" -#: Mailnag/plugins/libnotifyplugin.py:522 -#, python-brace-format -msgid "📋 Code: {0}" +#: Mailnag/plugins/libnotifyplugin.py:578 +msgid "Copy code:" msgstr "" -#: Mailnag/plugins/libnotifyplugin.py:566 +#: Mailnag/plugins/libnotifyplugin.py:622 msgid "Mark as read" msgstr "Отметить как прочитанное" -#: Mailnag/plugins/libnotifyplugin.py:765 +#: Mailnag/plugins/libnotifyplugin.py:837 #, fuzzy msgid "Delete this provider:" msgstr "Удалить учетную запись:" -#: Mailnag/plugins/libnotifyplugin.py:766 -#: Mailnag/plugins/libnotifyplugin.ui.h:15 +#: Mailnag/plugins/libnotifyplugin.py:838 #, fuzzy msgid "Sender:" msgstr "отправитель" -#: Mailnag/plugins/libnotifyplugin.py:767 -#: Mailnag/plugins/libnotifyplugin.ui.h:16 +#: Mailnag/plugins/libnotifyplugin.py:839 #, fuzzy msgid "Subject:" msgstr "тема" -#: Mailnag/plugins/libnotifyplugin.py:768 -#: Mailnag/plugins/libnotifyplugin.ui.h:17 +#: Mailnag/plugins/libnotifyplugin.py:840 msgid "Pattern:" msgstr "" @@ -349,15 +365,6 @@ msgstr "Одно уведомление на письмо" msgid "Sender" msgstr "отправитель" -#: Mailnag/plugins/libnotifyplugin.ui.h:8 -#, fuzzy -msgid "Subject" -msgstr "тема" - -#: Mailnag/plugins/libnotifyplugin.ui.h:9 -msgid "Pattern" -msgstr "" - #: Mailnag/plugins/libnotifyplugin.ui.h:10 msgid "Add 2FA Provider" msgstr "" @@ -371,19 +378,61 @@ msgid "Edit 2FA Provider" msgstr "" #: Mailnag/plugins/libnotifyplugin.ui.h:13 +msgid "information" +msgstr "" + +#: Mailnag/plugins/libnotifyplugin.ui.h:14 #, fuzzy msgid "2FA notifications" msgstr "Звуковые уведомления" -#: Mailnag/plugins/libnotifyplugin.ui.h:14 +#: Mailnag/plugins/libnotifyplugin.ui.h:15 msgid "Enable/disable libnotify 2FA processing" msgstr "" -#: Mailnag/plugins/libnotifyplugin.ui.h:18 +#: Mailnag/plugins/libnotifyplugin.ui.h:16 +msgid "Pattern regexp with {code} for capture." +msgstr "" + +#: Mailnag/plugins/libnotifyplugin.ui.h:17 +msgid "" +"Display name of a mail sender, \n" +"if display name is not available, \n" +"address spec can be used." +msgstr "" + +#: Mailnag/plugins/libnotifyplugin.ui.h:21 +msgid "" +"This field is not a regular expression, \n" +"however it can contain a code which \n" +"is materialised within braces, like \n" +"this: {code}.\n" +"\n" +"Ex: Your security code: {code}" +msgstr "" + +#: Mailnag/plugins/libnotifyplugin.ui.h:27 +msgid "Subject (not a regexp but {code} for capture possible)" +msgstr "" + +#: Mailnag/plugins/libnotifyplugin.ui.h:29 +msgid "" +"This field can be a regular expression \n" +"where the code is materialised within \n" +"braces, like this: {code}.\n" +"\n" +"Ex: Your security code is:\\s?{code}" +msgstr "" + +#: Mailnag/plugins/libnotifyplugin.ui.h:34 +msgid "Text" +msgstr "" + +#: Mailnag/plugins/libnotifyplugin.ui.h:35 msgid "Edit 2FA provider" msgstr "" -#: Mailnag/plugins/libnotifyplugin.ui.h:19 +#: Mailnag/plugins/libnotifyplugin.ui.h:36 #, fuzzy msgid "Enable provider" msgstr "Включено" diff --git a/po/sr.po b/po/sr.po index 79dee93..e77093d 100644 --- a/po/sr.po +++ b/po/sr.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: mailnag\n" "Report-Msgid-Bugs-To: https://github.com/tikank/mailnagger/issues\n" -"POT-Creation-Date: 2026-02-11 23:22+0100\n" +"POT-Creation-Date: 2026-02-15 02:03+0100\n" "PO-Revision-Date: 2021-01-07 11:29+0000\n" "Last-Translator: Burek \n" "Language-Team: Serbian \n" "Language-Team: Swedish \n" "Language-Team: Turkish \n" "Language-Team: Ukrainian \n" @@ -131,84 +131,100 @@ msgid "" "followed by %s sequences." msgstr "" -#: Mailnag/plugins/libnotifyplugin.py:74 +#: Mailnag/plugins/libnotifyplugin.py:75 msgid "Your Security Passcode" msgstr "" -#: Mailnag/plugins/libnotifyplugin.py:143 +#: Mailnag/plugins/libnotifyplugin.py:149 msgid "LibNotify Notifications" msgstr "Сповіщення LibNotify" -#: Mailnag/plugins/libnotifyplugin.py:144 +#: Mailnag/plugins/libnotifyplugin.py:150 msgid "Shows a popup when new mails arrive." msgstr "Сповіщає про нові листи за допомогою виринаючих повідомлень." -#: Mailnag/plugins/libnotifyplugin.py:186 +#: Mailnag/plugins/libnotifyplugin.py:192 msgid "Notification mode:" msgstr "Метод сповіщення:" -#: Mailnag/plugins/libnotifyplugin.py:188 +#: Mailnag/plugins/libnotifyplugin.py:194 msgid "2FA providers" msgstr "" -#: Mailnag/plugins/libnotifyplugin.py:391 -#: Mailnag/plugins/libnotifyplugin.py:427 -#: Mailnag/plugins/libnotifyplugin.py:577 +#: Mailnag/plugins/libnotifyplugin.py:241 +#, python-brace-format +msgid "Missing \"code\" group pattern: {code}" +msgstr "" + +#: Mailnag/plugins/libnotifyplugin.py:260 +#, python-format +msgid "%s is incorrect regexp" +msgstr "" + +#: Mailnag/plugins/libnotifyplugin.py:264 +#: Mailnag/plugins/libnotifyplugin.ui.h:8 +#, fuzzy +msgid "Subject" +msgstr "тема" + +#: Mailnag/plugins/libnotifyplugin.py:267 +#: Mailnag/plugins/libnotifyplugin.ui.h:9 +msgid "Pattern" +msgstr "" + +#: Mailnag/plugins/libnotifyplugin.py:443 +#: Mailnag/plugins/libnotifyplugin.py:481 +#: Mailnag/plugins/libnotifyplugin.py:633 #, python-brace-format msgid "{0} new mails" msgstr "{0} листів" -#: Mailnag/plugins/libnotifyplugin.py:393 +#: Mailnag/plugins/libnotifyplugin.py:445 #, python-brace-format msgid "from {0} and others." msgstr "" -#: Mailnag/plugins/libnotifyplugin.py:395 -#: Mailnag/plugins/libnotifyplugin.py:398 +#: Mailnag/plugins/libnotifyplugin.py:447 +#: Mailnag/plugins/libnotifyplugin.py:450 #, python-brace-format msgid "from {0}." msgstr "" -#: Mailnag/plugins/libnotifyplugin.py:397 -#: Mailnag/plugins/libnotifyplugin.py:429 -#: Mailnag/plugins/libnotifyplugin.py:579 +#: Mailnag/plugins/libnotifyplugin.py:449 +#: Mailnag/plugins/libnotifyplugin.py:483 +#: Mailnag/plugins/libnotifyplugin.py:635 msgid "New mail" msgstr "Новий лист" -#: Mailnag/plugins/libnotifyplugin.py:422 -#: Mailnag/plugins/libnotifyplugin.py:424 +#: Mailnag/plugins/libnotifyplugin.py:476 #, python-brace-format msgid "(and {0} more)" msgstr "(і ще {0})" -#: Mailnag/plugins/libnotifyplugin.py:522 -#, python-brace-format -msgid "📋 Code: {0}" +#: Mailnag/plugins/libnotifyplugin.py:578 +msgid "Copy code:" msgstr "" -#: Mailnag/plugins/libnotifyplugin.py:566 +#: Mailnag/plugins/libnotifyplugin.py:622 msgid "Mark as read" msgstr "Позначити як прочитане" -#: Mailnag/plugins/libnotifyplugin.py:765 +#: Mailnag/plugins/libnotifyplugin.py:837 #, fuzzy msgid "Delete this provider:" msgstr "Видалити обліковий запис" -#: Mailnag/plugins/libnotifyplugin.py:766 -#: Mailnag/plugins/libnotifyplugin.ui.h:15 +#: Mailnag/plugins/libnotifyplugin.py:838 #, fuzzy msgid "Sender:" msgstr "відправник" -#: Mailnag/plugins/libnotifyplugin.py:767 -#: Mailnag/plugins/libnotifyplugin.ui.h:16 +#: Mailnag/plugins/libnotifyplugin.py:839 #, fuzzy msgid "Subject:" msgstr "тема" -#: Mailnag/plugins/libnotifyplugin.py:768 -#: Mailnag/plugins/libnotifyplugin.ui.h:17 +#: Mailnag/plugins/libnotifyplugin.py:840 msgid "Pattern:" msgstr "" @@ -345,15 +361,6 @@ msgstr "Про кожен лист окремо" msgid "Sender" msgstr "відправник" -#: Mailnag/plugins/libnotifyplugin.ui.h:8 -#, fuzzy -msgid "Subject" -msgstr "тема" - -#: Mailnag/plugins/libnotifyplugin.ui.h:9 -msgid "Pattern" -msgstr "" - #: Mailnag/plugins/libnotifyplugin.ui.h:10 msgid "Add 2FA Provider" msgstr "" @@ -367,19 +374,61 @@ msgid "Edit 2FA Provider" msgstr "" #: Mailnag/plugins/libnotifyplugin.ui.h:13 +msgid "information" +msgstr "" + +#: Mailnag/plugins/libnotifyplugin.ui.h:14 #, fuzzy msgid "2FA notifications" msgstr "Звукові сповіщення" -#: Mailnag/plugins/libnotifyplugin.ui.h:14 +#: Mailnag/plugins/libnotifyplugin.ui.h:15 msgid "Enable/disable libnotify 2FA processing" msgstr "" -#: Mailnag/plugins/libnotifyplugin.ui.h:18 +#: Mailnag/plugins/libnotifyplugin.ui.h:16 +msgid "Pattern regexp with {code} for capture." +msgstr "" + +#: Mailnag/plugins/libnotifyplugin.ui.h:17 +msgid "" +"Display name of a mail sender, \n" +"if display name is not available, \n" +"address spec can be used." +msgstr "" + +#: Mailnag/plugins/libnotifyplugin.ui.h:21 +msgid "" +"This field is not a regular expression, \n" +"however it can contain a code which \n" +"is materialised within braces, like \n" +"this: {code}.\n" +"\n" +"Ex: Your security code: {code}" +msgstr "" + +#: Mailnag/plugins/libnotifyplugin.ui.h:27 +msgid "Subject (not a regexp but {code} for capture possible)" +msgstr "" + +#: Mailnag/plugins/libnotifyplugin.ui.h:29 +msgid "" +"This field can be a regular expression \n" +"where the code is materialised within \n" +"braces, like this: {code}.\n" +"\n" +"Ex: Your security code is:\\s?{code}" +msgstr "" + +#: Mailnag/plugins/libnotifyplugin.ui.h:34 +msgid "Text" +msgstr "" + +#: Mailnag/plugins/libnotifyplugin.ui.h:35 msgid "Edit 2FA provider" msgstr "" -#: Mailnag/plugins/libnotifyplugin.ui.h:19 +#: Mailnag/plugins/libnotifyplugin.ui.h:36 #, fuzzy msgid "Enable provider" msgstr "Задіяно" diff --git a/po/zh_CN.po b/po/zh_CN.po index 605a139..80c324c 100644 --- a/po/zh_CN.po +++ b/po/zh_CN.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: mailnag\n" "Report-Msgid-Bugs-To: https://github.com/tikank/mailnagger/issues\n" -"POT-Creation-Date: 2026-02-11 23:22+0100\n" +"POT-Creation-Date: 2026-02-15 02:03+0100\n" "PO-Revision-Date: 2019-03-16 14:48+0000\n" "Last-Translator: Launchpad Translations Administrators \n" "Language-Team: Chinese (Simplified) \n" @@ -130,84 +130,100 @@ msgid "" "followed by %s sequences." msgstr "" -#: Mailnag/plugins/libnotifyplugin.py:74 +#: Mailnag/plugins/libnotifyplugin.py:75 msgid "Your Security Passcode" msgstr "" -#: Mailnag/plugins/libnotifyplugin.py:143 +#: Mailnag/plugins/libnotifyplugin.py:149 msgid "LibNotify Notifications" msgstr "弹出窗口通知" -#: Mailnag/plugins/libnotifyplugin.py:144 +#: Mailnag/plugins/libnotifyplugin.py:150 msgid "Shows a popup when new mails arrive." msgstr "当新邮件到达时弹出。" -#: Mailnag/plugins/libnotifyplugin.py:186 +#: Mailnag/plugins/libnotifyplugin.py:192 msgid "Notification mode:" msgstr "通知模式" -#: Mailnag/plugins/libnotifyplugin.py:188 +#: Mailnag/plugins/libnotifyplugin.py:194 msgid "2FA providers" msgstr "" -#: Mailnag/plugins/libnotifyplugin.py:391 -#: Mailnag/plugins/libnotifyplugin.py:427 -#: Mailnag/plugins/libnotifyplugin.py:577 +#: Mailnag/plugins/libnotifyplugin.py:241 +#, python-brace-format +msgid "Missing \"code\" group pattern: {code}" +msgstr "" + +#: Mailnag/plugins/libnotifyplugin.py:260 +#, python-format +msgid "%s is incorrect regexp" +msgstr "" + +#: Mailnag/plugins/libnotifyplugin.py:264 +#: Mailnag/plugins/libnotifyplugin.ui.h:8 +#, fuzzy +msgid "Subject" +msgstr "主题" + +#: Mailnag/plugins/libnotifyplugin.py:267 +#: Mailnag/plugins/libnotifyplugin.ui.h:9 +msgid "Pattern" +msgstr "" + +#: Mailnag/plugins/libnotifyplugin.py:443 +#: Mailnag/plugins/libnotifyplugin.py:481 +#: Mailnag/plugins/libnotifyplugin.py:633 #, python-brace-format msgid "{0} new mails" msgstr "" -#: Mailnag/plugins/libnotifyplugin.py:393 +#: Mailnag/plugins/libnotifyplugin.py:445 #, python-brace-format msgid "from {0} and others." msgstr "" -#: Mailnag/plugins/libnotifyplugin.py:395 -#: Mailnag/plugins/libnotifyplugin.py:398 +#: Mailnag/plugins/libnotifyplugin.py:447 +#: Mailnag/plugins/libnotifyplugin.py:450 #, python-brace-format msgid "from {0}." msgstr "" -#: Mailnag/plugins/libnotifyplugin.py:397 -#: Mailnag/plugins/libnotifyplugin.py:429 -#: Mailnag/plugins/libnotifyplugin.py:579 +#: Mailnag/plugins/libnotifyplugin.py:449 +#: Mailnag/plugins/libnotifyplugin.py:483 +#: Mailnag/plugins/libnotifyplugin.py:635 msgid "New mail" msgstr "" -#: Mailnag/plugins/libnotifyplugin.py:422 -#: Mailnag/plugins/libnotifyplugin.py:424 +#: Mailnag/plugins/libnotifyplugin.py:476 #, python-brace-format msgid "(and {0} more)" msgstr "( 还有 {0} 条)" -#: Mailnag/plugins/libnotifyplugin.py:522 -#, python-brace-format -msgid "📋 Code: {0}" +#: Mailnag/plugins/libnotifyplugin.py:578 +msgid "Copy code:" msgstr "" -#: Mailnag/plugins/libnotifyplugin.py:566 +#: Mailnag/plugins/libnotifyplugin.py:622 msgid "Mark as read" msgstr "标记为已读" -#: Mailnag/plugins/libnotifyplugin.py:765 +#: Mailnag/plugins/libnotifyplugin.py:837 #, fuzzy msgid "Delete this provider:" msgstr "删除该帐户:" -#: Mailnag/plugins/libnotifyplugin.py:766 -#: Mailnag/plugins/libnotifyplugin.ui.h:15 +#: Mailnag/plugins/libnotifyplugin.py:838 #, fuzzy msgid "Sender:" msgstr "寄件人" -#: Mailnag/plugins/libnotifyplugin.py:767 -#: Mailnag/plugins/libnotifyplugin.ui.h:16 +#: Mailnag/plugins/libnotifyplugin.py:839 #, fuzzy msgid "Subject:" msgstr "主题" -#: Mailnag/plugins/libnotifyplugin.py:768 -#: Mailnag/plugins/libnotifyplugin.ui.h:17 +#: Mailnag/plugins/libnotifyplugin.py:840 msgid "Pattern:" msgstr "" @@ -341,15 +357,6 @@ msgstr "每封新邮件通知一次" msgid "Sender" msgstr "寄件人" -#: Mailnag/plugins/libnotifyplugin.ui.h:8 -#, fuzzy -msgid "Subject" -msgstr "主题" - -#: Mailnag/plugins/libnotifyplugin.ui.h:9 -msgid "Pattern" -msgstr "" - #: Mailnag/plugins/libnotifyplugin.ui.h:10 msgid "Add 2FA Provider" msgstr "" @@ -363,19 +370,61 @@ msgid "Edit 2FA Provider" msgstr "" #: Mailnag/plugins/libnotifyplugin.ui.h:13 +msgid "information" +msgstr "" + +#: Mailnag/plugins/libnotifyplugin.ui.h:14 #, fuzzy msgid "2FA notifications" msgstr "声音通知" -#: Mailnag/plugins/libnotifyplugin.ui.h:14 +#: Mailnag/plugins/libnotifyplugin.ui.h:15 msgid "Enable/disable libnotify 2FA processing" msgstr "" -#: Mailnag/plugins/libnotifyplugin.ui.h:18 +#: Mailnag/plugins/libnotifyplugin.ui.h:16 +msgid "Pattern regexp with {code} for capture." +msgstr "" + +#: Mailnag/plugins/libnotifyplugin.ui.h:17 +msgid "" +"Display name of a mail sender, \n" +"if display name is not available, \n" +"address spec can be used." +msgstr "" + +#: Mailnag/plugins/libnotifyplugin.ui.h:21 +msgid "" +"This field is not a regular expression, \n" +"however it can contain a code which \n" +"is materialised within braces, like \n" +"this: {code}.\n" +"\n" +"Ex: Your security code: {code}" +msgstr "" + +#: Mailnag/plugins/libnotifyplugin.ui.h:27 +msgid "Subject (not a regexp but {code} for capture possible)" +msgstr "" + +#: Mailnag/plugins/libnotifyplugin.ui.h:29 +msgid "" +"This field can be a regular expression \n" +"where the code is materialised within \n" +"braces, like this: {code}.\n" +"\n" +"Ex: Your security code is:\\s?{code}" +msgstr "" + +#: Mailnag/plugins/libnotifyplugin.ui.h:34 +msgid "Text" +msgstr "" + +#: Mailnag/plugins/libnotifyplugin.ui.h:35 msgid "Edit 2FA provider" msgstr "" -#: Mailnag/plugins/libnotifyplugin.ui.h:19 +#: Mailnag/plugins/libnotifyplugin.ui.h:36 #, fuzzy msgid "Enable provider" msgstr "已启用" diff --git a/po/zh_TW.po b/po/zh_TW.po index c5d35f4..ad5c57a 100644 --- a/po/zh_TW.po +++ b/po/zh_TW.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: mailnag\n" "Report-Msgid-Bugs-To: https://github.com/tikank/mailnagger/issues\n" -"POT-Creation-Date: 2026-02-11 23:22+0100\n" +"POT-Creation-Date: 2026-02-15 02:03+0100\n" "PO-Revision-Date: 2019-03-16 14:48+0000\n" "Last-Translator: Launchpad Translations Administrators \n" "Language-Team: Chinese (Traditional) \n" @@ -128,84 +128,100 @@ msgid "" "followed by %s sequences." msgstr "" -#: Mailnag/plugins/libnotifyplugin.py:74 +#: Mailnag/plugins/libnotifyplugin.py:75 msgid "Your Security Passcode" msgstr "" -#: Mailnag/plugins/libnotifyplugin.py:143 +#: Mailnag/plugins/libnotifyplugin.py:149 msgid "LibNotify Notifications" msgstr "彈出視窗通知" -#: Mailnag/plugins/libnotifyplugin.py:144 +#: Mailnag/plugins/libnotifyplugin.py:150 msgid "Shows a popup when new mails arrive." msgstr "當新郵件到達時彈出訊息視窗。" -#: Mailnag/plugins/libnotifyplugin.py:186 +#: Mailnag/plugins/libnotifyplugin.py:192 msgid "Notification mode:" msgstr "通知模式" -#: Mailnag/plugins/libnotifyplugin.py:188 +#: Mailnag/plugins/libnotifyplugin.py:194 msgid "2FA providers" msgstr "" -#: Mailnag/plugins/libnotifyplugin.py:391 -#: Mailnag/plugins/libnotifyplugin.py:427 -#: Mailnag/plugins/libnotifyplugin.py:577 +#: Mailnag/plugins/libnotifyplugin.py:241 +#, python-brace-format +msgid "Missing \"code\" group pattern: {code}" +msgstr "" + +#: Mailnag/plugins/libnotifyplugin.py:260 +#, python-format +msgid "%s is incorrect regexp" +msgstr "" + +#: Mailnag/plugins/libnotifyplugin.py:264 +#: Mailnag/plugins/libnotifyplugin.ui.h:8 +#, fuzzy +msgid "Subject" +msgstr "主題" + +#: Mailnag/plugins/libnotifyplugin.py:267 +#: Mailnag/plugins/libnotifyplugin.ui.h:9 +msgid "Pattern" +msgstr "" + +#: Mailnag/plugins/libnotifyplugin.py:443 +#: Mailnag/plugins/libnotifyplugin.py:481 +#: Mailnag/plugins/libnotifyplugin.py:633 #, python-brace-format msgid "{0} new mails" msgstr "{0} 封新郵件" -#: Mailnag/plugins/libnotifyplugin.py:393 +#: Mailnag/plugins/libnotifyplugin.py:445 #, python-brace-format msgid "from {0} and others." msgstr "" -#: Mailnag/plugins/libnotifyplugin.py:395 -#: Mailnag/plugins/libnotifyplugin.py:398 +#: Mailnag/plugins/libnotifyplugin.py:447 +#: Mailnag/plugins/libnotifyplugin.py:450 #, python-brace-format msgid "from {0}." msgstr "" -#: Mailnag/plugins/libnotifyplugin.py:397 -#: Mailnag/plugins/libnotifyplugin.py:429 -#: Mailnag/plugins/libnotifyplugin.py:579 +#: Mailnag/plugins/libnotifyplugin.py:449 +#: Mailnag/plugins/libnotifyplugin.py:483 +#: Mailnag/plugins/libnotifyplugin.py:635 msgid "New mail" msgstr "新郵件" -#: Mailnag/plugins/libnotifyplugin.py:422 -#: Mailnag/plugins/libnotifyplugin.py:424 +#: Mailnag/plugins/libnotifyplugin.py:476 #, python-brace-format msgid "(and {0} more)" msgstr "( 還有 {0} 條)" -#: Mailnag/plugins/libnotifyplugin.py:522 -#, python-brace-format -msgid "📋 Code: {0}" +#: Mailnag/plugins/libnotifyplugin.py:578 +msgid "Copy code:" msgstr "" -#: Mailnag/plugins/libnotifyplugin.py:566 +#: Mailnag/plugins/libnotifyplugin.py:622 msgid "Mark as read" msgstr "標記爲已讀" -#: Mailnag/plugins/libnotifyplugin.py:765 +#: Mailnag/plugins/libnotifyplugin.py:837 #, fuzzy msgid "Delete this provider:" msgstr "刪除該帳戶:" -#: Mailnag/plugins/libnotifyplugin.py:766 -#: Mailnag/plugins/libnotifyplugin.ui.h:15 +#: Mailnag/plugins/libnotifyplugin.py:838 #, fuzzy msgid "Sender:" msgstr "寄件人" -#: Mailnag/plugins/libnotifyplugin.py:767 -#: Mailnag/plugins/libnotifyplugin.ui.h:16 +#: Mailnag/plugins/libnotifyplugin.py:839 #, fuzzy msgid "Subject:" msgstr "主題" -#: Mailnag/plugins/libnotifyplugin.py:768 -#: Mailnag/plugins/libnotifyplugin.ui.h:17 +#: Mailnag/plugins/libnotifyplugin.py:840 msgid "Pattern:" msgstr "" @@ -340,15 +356,6 @@ msgstr "每封新郵件通知一次" msgid "Sender" msgstr "寄件人" -#: Mailnag/plugins/libnotifyplugin.ui.h:8 -#, fuzzy -msgid "Subject" -msgstr "主題" - -#: Mailnag/plugins/libnotifyplugin.ui.h:9 -msgid "Pattern" -msgstr "" - #: Mailnag/plugins/libnotifyplugin.ui.h:10 msgid "Add 2FA Provider" msgstr "" @@ -362,19 +369,61 @@ msgid "Edit 2FA Provider" msgstr "" #: Mailnag/plugins/libnotifyplugin.ui.h:13 +msgid "information" +msgstr "" + +#: Mailnag/plugins/libnotifyplugin.ui.h:14 #, fuzzy msgid "2FA notifications" msgstr "聲音通知" -#: Mailnag/plugins/libnotifyplugin.ui.h:14 +#: Mailnag/plugins/libnotifyplugin.ui.h:15 msgid "Enable/disable libnotify 2FA processing" msgstr "" -#: Mailnag/plugins/libnotifyplugin.ui.h:18 +#: Mailnag/plugins/libnotifyplugin.ui.h:16 +msgid "Pattern regexp with {code} for capture." +msgstr "" + +#: Mailnag/plugins/libnotifyplugin.ui.h:17 +msgid "" +"Display name of a mail sender, \n" +"if display name is not available, \n" +"address spec can be used." +msgstr "" + +#: Mailnag/plugins/libnotifyplugin.ui.h:21 +msgid "" +"This field is not a regular expression, \n" +"however it can contain a code which \n" +"is materialised within braces, like \n" +"this: {code}.\n" +"\n" +"Ex: Your security code: {code}" +msgstr "" + +#: Mailnag/plugins/libnotifyplugin.ui.h:27 +msgid "Subject (not a regexp but {code} for capture possible)" +msgstr "" + +#: Mailnag/plugins/libnotifyplugin.ui.h:29 +msgid "" +"This field can be a regular expression \n" +"where the code is materialised within \n" +"braces, like this: {code}.\n" +"\n" +"Ex: Your security code is:\\s?{code}" +msgstr "" + +#: Mailnag/plugins/libnotifyplugin.ui.h:34 +msgid "Text" +msgstr "" + +#: Mailnag/plugins/libnotifyplugin.ui.h:35 msgid "Edit 2FA provider" msgstr "" -#: Mailnag/plugins/libnotifyplugin.ui.h:19 +#: Mailnag/plugins/libnotifyplugin.ui.h:36 #, fuzzy msgid "Enable provider" msgstr "已啓用" From ecaf651225c27866ccaf65e3541055e038c62ffc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Auzi?= Date: Sun, 15 Feb 2026 02:36:21 +0100 Subject: [PATCH 48/49] Bump version 2.4.0.aau0 --- AUTHORS | 1 + NEWS | 24 ++++++++- README.md | 143 ++++++++++++++++++++++++++++++++++++++++++++++-------- VERSION | 2 +- 4 files changed, 147 insertions(+), 23 deletions(-) diff --git a/AUTHORS b/AUTHORS index 49722e0..52bf68a 100644 --- a/AUTHORS +++ b/AUTHORS @@ -17,6 +17,7 @@ Popper was written by Ralf Hersel . Code, docs and packaging contributors: ====================================== +André Auzi Amin Bandali Andreas Angerer Balló György diff --git a/NEWS b/NEWS index 3c3a83a..8b2c5db 100644 --- a/NEWS +++ b/NEWS @@ -1,7 +1,7 @@ Mailnagger news =============== -Version 2.4.0.dev0 (not released) +Version 2.4.0.dev1 (not released) ================================= Fixes @@ -12,6 +12,28 @@ New features ------------ +Version 2.4.0.aau0 (not released) +================================= + +Fixes +----- +* Improved IMAP/POP3 connection reliability and socket handling. +* Fixed missing UI assets in distribution packages. +* Enhanced translation build process with explicit error logging. + +New features +------------ +* Added 2FA code extraction from emails with "Copy" button in notifications. +* Integrated support for wl-copy, xclip, and xsel. +* Migrated configuration to XDG standard path (~/.config/mailnag/). +* Improved GOA integration with automatic OAuth2 token refresh. +* Added granular per-module log level configuration. +* Updated backend API (ABC classes, UID tracking, mandatory fetch_text). + +NOTES: +* Binaries are renamed to mailnagger and mailnagger-config. [cite: 7] +* Manual migration of mailnag.cfg from ~/.mailnag/ to ~/.config/mailnag/ is required. + Version 2.3.1 (2024-12-06) ========================== diff --git a/README.md b/README.md index ca0a98a..7e718ac 100644 --- a/README.md +++ b/README.md @@ -18,35 +18,136 @@ If you like Mailnagger, please help to keep it going by [contributing code](http or [writing docs](https://github.com/tikank/mailnagger/tree/master/docs). -## Installation +## 🚀 Advanced Features (This Fork) -Easiest way to install Mailnagger from -[PyPI](https://pypi.org/project/mailnagger/) is to use -[pipx](https://pypi.org/project/pipx/). +This version of Mailnagger introduces several high-productivity enhancements and core engine improvements: + +### 🔑 Intelligent 2FA Detection & Power Summary +* **Automatic Extraction**: The `libnotify` plugin scans incoming emails to detect Two-Factor Authentication (2FA) codes using customizable regex patterns. +* **HTML Body Parsing**: Smart extraction of plain text from HTML emails to ensure 2FA patterns are matched accurately even in complex layouts. +* **Urgency Handling**: 2FA notifications are treated with higher priority, ensuring they stay visible while the code is valid. +* **Instant Visibility**: Extracted codes are injected directly into the notification title (e.g., `🔑 123456 — Garmin`). +* **One-Click Copy**: A "Copy code" button is integrated into the notification, supporting **Wayland** (`wl-copy`) and **X11** (`xclip`, `xsel`). +* **On-Demand Fetching**: Uses the new `fetch_text()` backend method to retrieve only the necessary data for parsing, saving bandwidth. +* **Independent Notifications**: Each incoming mail generates a unique notification instance. Copying a 2FA code from one specific notification won't interfere with others, even during simultaneous bursts. +* **Non-Blocking Fetch**: The 2FA extraction engine works asynchronously. Slow network responses from one mail server won't delay notifications from other accounts. +* **Clipboard Persistence**: Copy actions are delegated to system-level utilities, ensuring codes remain available in your clipboard even after notifications are dismissed. + +### 🛡️ Robust GOA & OAuth2 Management +* **Native GNOME Integration**: Deeply integrated with **GNOME Online Accounts (GOA)**. +* **Automatic Token Refresh**: Implements `refresh_goa_token` to handle OAuth2 access token updates in the background, preventing connection drops for Gmail/Outlook. + +### 📊 Professional Logging System +* **Granular Control**: Define log levels per module via the `[logger_levels]` section in `mailnag.cfg`. +* **Safe Configuration**: Uses `dictConfig` with predefined `VALID_LEVELS` to ensure system stability even with custom log settings. + +--- + +## ⚙️ Configuration + +### 1. Granular Logging Control (`mailnag.cfg`) + +You can now define the logging verbosity per module by adding a `[logger_levels]` section to your `~/.config/mailnag/mailnag.cfg`. + +```ini +[logger_levels] +# Set the global log level (DEBUG, INFO, WARNING, ERROR, or CRITICAL) +root = INFO + +# Specific level for the 2FA extraction and GOA utilities +Mailnag.common.utils = DEBUG + +# Specific level for the libnotify plugin (useful for regex debugging) +Mailnag.plugins.libnotifyplugin = DEBUG -Run -``` - pipx install mailnagger ``` -though make sure the requirements stated below are met. +* **Dynamic Loading**: The daemon validates these levels against a predefined list (`DEBUG`, `INFO`, `WARNING`, `ERROR`, `CRITICAL`) and applies them using `dictConfig`. +* **Dual Output**: Logs are automatically routed to both standard output and the system journal via `/dev/log`. + +--- + +### 2. 2FA Providers (`2fa_providers.tsv`) + +The extraction of security codes from incoming emails is managed via a Tab-Separated Values (TSV) file located at `~/.config/mailnag/2fa_providers.tsv`. + +| Column | Description | +| --- | --- | +| **enabled** | `True` or `False` to toggle detection for this service. | +| **provider** | The display name of the service (e.g., Garmin, Microsoft). | +| **subject** | The email subject pattern to match (supports the `{code}` placeholder). | +| **text_re** | The Regex used to find the code in the email body (use `{code}` for the target). | + +--- + +### 3. GNOME Online Accounts (GOA) Integration + +This fork provides deep integration with GNOME Online Accounts for robust authentication. + +* **Account Linking**: The system automatically maps your email and username to the corresponding GOA identity using `get_goa_account_id`. +* **Automatic OAuth2 Refresh**: If a connection fails due to an expired session, `refresh_goa_token` silently fetches a new access token from the system, preventing manual re-authentication prompts. + +--- + +## 🛠️ Developers & "Under the Hood" + +* **Architecture**: Transitioned to **Abstract Base Classes (ABC)** for backends, ensuring a strict and stable interface. +* **Reliability**: All backends now support **UID-based tracking** and the `fetch_text()` method. +* **Standards**: Configuration management now follows **XDG Base Directory** specifications using `pathlib`. +* **Resilience**: Improved socket error handling and auto-retry logic for IMAP/POP3 connections. +* **Code Style**: Unified codebase using `_LOGGER` and strict **tab-indentation** (optimized for `tabsize 8`). + +If you are developing custom plugins or backends, please note the following core changes: + +* **Backend Interface**: The `list_messages()` method has been updated to yield a 4-tuple including the message **UID**: `(folder, message, uid, flags)`. +* **Mandatory Method**: All backends must now implement `fetch_text()` to allow on-demand retrieval of the email body. + +## 🏗️ Build & Setup Improvements +* **Robust Localization**: Improved `BuildData` class with explicit error handling and logging during translation compilation. +* **Asset Integrity**: Fixed missing UI resources in the distribution package, ensuring `libnotifyplugin.ui` is correctly installed. +* **Modern Packaging**: Updated `setup.py` to support high-resolution icons and standardized XDG desktop file locations. + +--- + +## ⚠️ Technical Incompatibilities + +**Important:** This fork modifies the Mailnagger core. Its `libnotify` is **not compatible** with backends from the original `titank` repository due to the following changes: + +* **`fetch_text()` Method**: All mail backends now require a mandatory `fetch_text()` function. +* **Modified Signatures**: Backend methods like `list_messages` now return additional data (such as UIDs), making them incompatible with older core versions. + +--- + +## 🔄 Migration Note (Standard Compliance) + +This fork now follows the **XDG Base Directory Specification**. +Config files have moved from `~/.mailnag` to `~/.config/mailnag`. + +If you are upgrading from an older version, you can migrate your settings manually: + +```bash +mkdir -p ~/.config/mailnag +cp ~/.mailnag/mailnag.cfg ~/.config/mailnag/ +# Optional: Move your custom rules/scripts if you have any +``` +## 📋 Requirements & Installation -### Requirements +### Core Dependencies +* **Python** (>= 3.10) - *Mandatory for modern type syntax.* +* **pyxdg** - *Mandatory for XDG directory support.* +* **PyGObject / GLib / gir-notify** - *For system notifications and UI.* +* **dbus-python** - *For communication with GOA and desktop services.* -* python (>= 3.9) -* pygobject -* gir-notify (>= 0.7.6) -* gir-gtk-3.0 -* gir-gdkpixbuf-2.0 -* gir-glib-2.0 -* gir-gst-plugins-base-1.0 -* python-dbus -* pyxdg -* gettext -* gir1.2-secret-1 (optional) +### Optional (Feature-Specific) +* **2FA Clipboard**: `wl-clipboard` (Wayland) or `xclip/xsel` (X11). +* **Secure Storage**: `libsecret` / `gir1.2-secret-1`. +* **Translations**: `gettext` (only for building from source). +### Installation +```bash +pipx install mailnagger -## Configuration +## Configuration Run `mailnagger-config` to setup Mailnagger. diff --git a/VERSION b/VERSION index 2bf1c1c..b2e466d 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -2.3.1 +2.4.0.aau0 From 7c53bff9974c151913177263f0dddbe061560bcd Mon Sep 17 00:00:00 2001 From: aauzi Date: Sun, 15 Feb 2026 03:50:47 +0100 Subject: [PATCH 49/49] Add installation instructions for Mailnagger --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 7e718ac..bb4d6dc 100644 --- a/README.md +++ b/README.md @@ -146,6 +146,7 @@ cp ~/.mailnag/mailnag.cfg ~/.config/mailnag/ ### Installation ```bash pipx install mailnagger +``` ## Configuration