From 5425863d36a47217747dbbcd5513737ab6d0df87 Mon Sep 17 00:00:00 2001 From: Patrick Ulbrich Date: Sat, 2 Jul 2016 12:37:24 +0200 Subject: [PATCH 01/18] Update AUTHORS --- AUTHORS | 1 + 1 file changed, 1 insertion(+) diff --git a/AUTHORS b/AUTHORS index 41f09b3..c9cba01 100644 --- a/AUTHORS +++ b/AUTHORS @@ -63,6 +63,7 @@ Manuel Xosé Lemos Marcos Lans Marti Bosch Mattia Meneguzzo +Микола Ткач Мирослав Николић Oleg «Eleidan» Kulyk Patrick Ulbrich From 18a174329fae2fe7bc61aaabb5fc3fa1ac049642 Mon Sep 17 00:00:00 2001 From: Patrick Ulbrich Date: Sat, 2 Jul 2016 12:37:44 +0200 Subject: [PATCH 02/18] Update README --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index d8a43a7..00f296d 100644 --- a/README.md +++ b/README.md @@ -29,7 +29,7 @@ As of Ubuntu 13.04 (Raring), Mailnag is also available in the official repos. Run `sudo apt-get install mailnag` in a terminal to install it. ### Debian -Mailnag is currently available in Debian unstable. +Mailnag is available in Debian stable and unstable. Run `sudo apt-get install mailnag` in a terminal to install it. ### Fedora From 7321c117db680650b95592aa92ffc857583f9c7c Mon Sep 17 00:00:00 2001 From: Patrick Ulbrich Date: Mon, 18 Jul 2016 17:59:06 +0200 Subject: [PATCH 03/18] Change PING_TEST_HOST to www.google.com --- Mailnag/daemon/conntest.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Mailnag/daemon/conntest.py b/Mailnag/daemon/conntest.py index da91d5c..4209661 100644 --- a/Mailnag/daemon/conntest.py +++ b/Mailnag/daemon/conntest.py @@ -3,7 +3,7 @@ # # conntest.py # -# Copyright 2014 Patrick Ulbrich +# Copyright 2014, 2016 Patrick Ulbrich # # 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 @@ -24,7 +24,7 @@ import os import dbus -PING_TEST_HOST = 'www.google.de' +PING_TEST_HOST = 'www.google.com' NM_STATE_CONNECTED_GLOBAL = 70 From f446bc58ea3f2aa40230664e15360baa913b8ae7 Mon Sep 17 00:00:00 2001 From: Patrick Ulbrich Date: Tue, 2 Aug 2016 19:45:47 +0200 Subject: [PATCH 04/18] Parse folders via regex. Fixes #127 --- Mailnag/common/accounts.py | 21 +++++++-------------- 1 file changed, 7 insertions(+), 14 deletions(-) diff --git a/Mailnag/common/accounts.py b/Mailnag/common/accounts.py index 8d87172..264b6b1 100644 --- a/Mailnag/common/accounts.py +++ b/Mailnag/common/accounts.py @@ -23,6 +23,7 @@ # MA 02110-1301, USA. # +import re import poplib import logging import Mailnag.common.imaplib2 as imaplib @@ -105,22 +106,14 @@ class Account: # conn.close() # allowed in SELECTED state only conn.logout() - separators = [ ' "/" ', ' "." ' ] for d in data: - folder = '' - for s in separators: - if s in d: - folder = d.split(s)[-1] - break - - if len(folder) == 0: + match = re.match('.+\s+("."|"?NIL"?)\s+"?([^".]+)"?$', d) + + if match == None: logging.warning("Folder format not supported.") - break - - if (folder[0] == '"') and (folder[-1] == '"'): - folder = folder[1:-1] - - lst.append(folder) + else: + folder = match.group(2) + lst.append(folder) return lst From a0c8cab3544cc7d8dd69b29a5d11aabb152f9b3b Mon Sep 17 00:00:00 2001 From: Patrick Ulbrich Date: Thu, 4 Aug 2016 12:24:38 +0200 Subject: [PATCH 05/18] Move init_logging() to utils --- Mailnag/common/utils.py | 26 +++++++++++++++++++++++++- mailnag | 30 ++++-------------------------- 2 files changed, 29 insertions(+), 27 deletions(-) diff --git a/Mailnag/common/utils.py b/Mailnag/common/utils.py index cfdda7f..28b4aaa 100644 --- a/Mailnag/common/utils.py +++ b/Mailnag/common/utils.py @@ -3,7 +3,7 @@ # # utils.py # -# Copyright 2011 - 2015 Patrick Ulbrich +# Copyright 2011 - 2016 Patrick Ulbrich # Copyright 2007 Marco Ferragina # # This program is free software; you can redistribute it and/or modify @@ -28,10 +28,34 @@ import sys import time import dbus import logging +import logging.handlers import inspect from Mailnag.common.dist_cfg import PACKAGE_NAME, DBUS_BUS_NAME, DBUS_OBJ_PATH +LOG_FORMAT = '%(levelname)s (%(asctime)s): %(message)s' +LOG_DATE_FORMAT = '%Y-%m-%d %H:%M:%S' + + +def init_logging(enable_stdout = True, enable_syslog = True, log_level = logging.DEBUG): + logging.basicConfig( + 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) + def get_data_paths(): # Add "./data" in workdir for running from builddir diff --git a/mailnag b/mailnag index 59113b3..c237632 100755 --- a/mailnag +++ b/mailnag @@ -31,7 +31,6 @@ from dbus.mainloop.glib import DBusGMainLoop import threading import argparse import logging -import logging.handlers import os import signal @@ -41,16 +40,14 @@ fix_cwd() from Mailnag.common.config import cfg_exists from Mailnag.common.dist_cfg import APP_VERSION -from Mailnag.common.utils import set_procname, shutdown_existing_instance +from Mailnag.common.utils import set_procname, init_logging, shutdown_existing_instance from Mailnag.common.subproc import terminate_subprocesses from Mailnag.common.exceptions import InvalidOperationException from Mailnag.daemon.mailnagdaemon import MailnagDaemon PROGNAME = 'mailnag' - LOG_LEVEL = logging.DEBUG -LOG_FORMAT = '%(levelname)s (%(asctime)s): %(message)s' -LOG_DATE_FORMAT = '%Y-%m-%d %H:%M:%S' + def cleanup(daemon): event = threading.Event() @@ -81,27 +78,7 @@ def get_args(): version = '%s %s' % (PROGNAME, APP_VERSION)) return parser.parse_args() - - -def init_logging(enable_stdout = True): - logging.basicConfig( - format = LOG_FORMAT, - datefmt = LOG_DATE_FORMAT, - level = LOG_LEVEL) - logger = logging.getLogger('') - - syslog_handler = logging.handlers.SysLogHandler(address='/dev/log') - syslog_handler.setLevel(LOG_LEVEL) - syslog_handler.setFormatter(logging.Formatter(LOG_FORMAT, LOG_DATE_FORMAT)) - - stdout_handler = logger.handlers[0] - - logger.addHandler(syslog_handler) - - if not enable_stdout: - logger.removeHandler(stdout_handler) - def sigterm_handler(mainloop): if mainloop != None: @@ -127,7 +104,8 @@ def main(): # Note: don't start logging before an existing Mailnag # instance has been shut down completely (will corrupt logfile). - init_logging(not args.quiet) + init_logging(enable_stdout = (not args.quiet), \ + enable_syslog = True, log_level = LOG_LEVEL) try: if not cfg_exists(): From 26295e0e606cfcddc4243de818090ede0c90049d Mon Sep 17 00:00:00 2001 From: Patrick Ulbrich Date: Thu, 4 Aug 2016 12:25:04 +0200 Subject: [PATCH 06/18] Init logging in mailnag-config --- mailnag-config | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/mailnag-config b/mailnag-config index 2eb4b66..2b91a78 100755 --- a/mailnag-config +++ b/mailnag-config @@ -27,10 +27,11 @@ gi.require_version('Gtk', '3.0') import os import subprocess +import logging from gi.repository import Gtk from dbus.mainloop.glib import DBusGMainLoop -from Mailnag.common.utils import fix_cwd +from Mailnag.common.utils import fix_cwd, init_logging fix_cwd() @@ -38,9 +39,12 @@ from Mailnag.common.utils import set_procname, shutdown_existing_instance from Mailnag.common.dist_cfg import BIN_DIR from Mailnag.configuration.configwindow import ConfigWindow +LOG_LEVEL = logging.DEBUG + def main(): set_procname("mailnag-config") + init_logging(enable_stdout = True, enable_syslog = False, log_level = LOG_LEVEL) confwin = ConfigWindow() Gtk.main() From 19ed4745e34e6a1c4affaeae9ecbf367a6082a62 Mon Sep 17 00:00:00 2001 From: Patrick Ulbrich Date: Thu, 4 Aug 2016 12:25:41 +0200 Subject: [PATCH 07/18] Add debug log output for raw folder format --- Mailnag/common/accounts.py | 1 + 1 file changed, 1 insertion(+) diff --git a/Mailnag/common/accounts.py b/Mailnag/common/accounts.py index 264b6b1..c0696de 100644 --- a/Mailnag/common/accounts.py +++ b/Mailnag/common/accounts.py @@ -107,6 +107,7 @@ class Account: conn.logout() for d in data: + logging.debug("Folder raw format: %s" % d) match = re.match('.+\s+("."|"?NIL"?)\s+"?([^".]+)"?$', d) if match == None: From e113012e1debea13c0a9fbdfac32323f8ad0db93 Mon Sep 17 00:00:00 2001 From: Patrick Ulbrich Date: Thu, 4 Aug 2016 18:24:50 +0200 Subject: [PATCH 08/18] Remove debug output --- Mailnag/common/accounts.py | 1 - 1 file changed, 1 deletion(-) diff --git a/Mailnag/common/accounts.py b/Mailnag/common/accounts.py index c0696de..264b6b1 100644 --- a/Mailnag/common/accounts.py +++ b/Mailnag/common/accounts.py @@ -107,7 +107,6 @@ class Account: conn.logout() for d in data: - logging.debug("Folder raw format: %s" % d) match = re.match('.+\s+("."|"?NIL"?)\s+"?([^".]+)"?$', d) if match == None: From 574e350da2a03e4b5be1d4776940c940e96a85ec Mon Sep 17 00:00:00 2001 From: Patrick Ulbrich Date: Thu, 4 Aug 2016 18:25:33 +0200 Subject: [PATCH 09/18] Fix regex folder matching. Fixes #128 --- Mailnag/common/accounts.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Mailnag/common/accounts.py b/Mailnag/common/accounts.py index 264b6b1..90c1ced 100644 --- a/Mailnag/common/accounts.py +++ b/Mailnag/common/accounts.py @@ -107,7 +107,7 @@ class Account: conn.logout() for d in data: - match = re.match('.+\s+("."|"?NIL"?)\s+"?([^".]+)"?$', d) + match = re.match('.+\s+("."|"?NIL"?)\s+"?([^"]+)"?$', d) if match == None: logging.warning("Folder format not supported.") From 58c194fa7bede8a73999eaf61516f63bfb9e9684 Mon Sep 17 00:00:00 2001 From: Patrick Ulbrich Date: Fri, 5 Aug 2016 12:34:19 +0200 Subject: [PATCH 10/18] Update AUTHORS --- AUTHORS | 1 + 1 file changed, 1 insertion(+) diff --git a/AUTHORS b/AUTHORS index c9cba01..f4b24c3 100644 --- a/AUTHORS +++ b/AUTHORS @@ -16,6 +16,7 @@ Code, docs and packaging contributors: Amin Bandali Edwin Smulders Hasan Yavuz Özderya +Heiko Adams Leighton Earl Matthias Mailänder Taylor Braun-Jones From 44d250e3214e5358ae50ad45bce32ea1bb52f82b Mon Sep 17 00:00:00 2001 From: cheshire-mouse Date: Tue, 16 Aug 2016 10:53:58 +0300 Subject: [PATCH 11/18] fix non-ascii folder names encoding in the configuration menu --- Mailnag/common/mutf7.py | 97 ++++++++++++++++++++++++++ Mailnag/configuration/accountdialog.py | 5 +- 2 files changed, 100 insertions(+), 2 deletions(-) create mode 100644 Mailnag/common/mutf7.py diff --git a/Mailnag/common/mutf7.py b/Mailnag/common/mutf7.py new file mode 100644 index 0000000..c3cb184 --- /dev/null +++ b/Mailnag/common/mutf7.py @@ -0,0 +1,97 @@ +#!/usr/bin/env python2 +# -*- coding: utf-8 -*- + +''' +This awesome piece of code is intented to encode and decode modified UTF-7 +(the one that is used for IMAP folder names) + +encode_mutf7(text) - to encode +decode_mutf7(text) - to decode +''' + +__author__ = "https://github.com/cheshire-mouse" +__license__ = "WTFPL v. 2" + +import base64 +import re + +ascii_codes = set(range(0x20,0x7e)) + +def __get_ascii(text): + pos = 0 + for c in text: + code=ord(c) + if ord(c) not in ascii_codes : + break + pos += 1 + return text[:pos].encode('ascii') + +def __remove_ascii(text): + pos = 0 + for c in text: + if ord(c) not in ascii_codes : + break + pos += 1 + return text[pos:] + +def __get_nonascii(text): + pos = 0 + for c in text: + code=ord(c) + if ord(c) in ascii_codes : + break + pos += 1 + return text[:pos] + +def __remove_nonascii(text): + pos = 0 + for c in text: + if ord(c) in ascii_codes : + break + pos += 1 + return text[pos:] + +def __encode_modified_utf7(text): + #modified base64 - good old base64 without padding characters (=) + result = base64.b64encode(text.encode('utf-16be')).rstrip('=') + result = result.replace('/',',') + result = '&' + result + '-' + return result + +def encode_mutf7(text): + result = "" + text = text.replace('&','&-') + while len(text) > 0: + result += __get_ascii(text) + text = __remove_ascii(text) + if len(text) > 0: + result += __encode_modified_utf7(__get_nonascii(text)) + text = __remove_nonascii(text) + return result + +def __decode_modified_utf7(text): + if text == '&-': + return '&' + #remove leading & and trailing - + text_mb64 = text[1:-1] + text_b64 = text_mb64.replace(',','/') + #back to normal base64 with padding + while len(text_b64) % 4 != 0: + text_b64 += '=' + text_u16 = base64.b64decode(text_b64) + result = text_u16.decode('utf-16be') + return result + +def decode_mutf7(text): + rxp = re.compile('&[^&-]*-') + match = rxp.search(text) + while ( match ): + encoded_text = match.group(0) + decoded_text = __decode_modified_utf7(encoded_text) + text = rxp.sub(decoded_text,text, count=1) + match = rxp.search(text) + result = text + return result + +# vim: tabstop=8 expandtab shiftwidth=4 softtabstop=4 + diff --git a/Mailnag/configuration/accountdialog.py b/Mailnag/configuration/accountdialog.py index 244a9b0..4ad5596 100644 --- a/Mailnag/configuration/accountdialog.py +++ b/Mailnag/configuration/accountdialog.py @@ -31,6 +31,7 @@ from Mailnag.common.dist_cfg import PACKAGE_NAME from Mailnag.common.i18n import _ from Mailnag.common.utils import get_data_file, splitstr from Mailnag.common.accounts import Account +from Mailnag.common import mutf7 IDX_GMAIL = 0 IDX_GMX = 1 @@ -170,7 +171,7 @@ class AccountDialog: folders = [] for row in self._liststore_folders: if row[0]: - folders.append(row[1]) + folders.append(mutf7.encode_mutf7(row[1].decode('utf-8'))) return folders @@ -282,7 +283,7 @@ class AccountDialog: if f in self._acc.folders: enabled = True self._selected_folder_count += 1 - row = [enabled, f] + row = [enabled, mutf7.decode_mutf7(f)] self._liststore_folders.append(row) # Enable the push checkbox in case a remote folder wasn't found From 43856eaccac05d5f9b5bb641d3cd209afe4ae65c Mon Sep 17 00:00:00 2001 From: cheshire-mouse Date: Tue, 16 Aug 2016 10:55:43 +0300 Subject: [PATCH 12/18] use JSON format to save folders configuration --- Mailnag/common/accounts.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Mailnag/common/accounts.py b/Mailnag/common/accounts.py index 90c1ced..5b6024d 100644 --- a/Mailnag/common/accounts.py +++ b/Mailnag/common/accounts.py @@ -26,8 +26,8 @@ import re import poplib import logging +import json import Mailnag.common.imaplib2 as imaplib -from Mailnag.common.utils import splitstr account_defaults = { 'enabled' : '0', @@ -39,7 +39,7 @@ account_defaults = { 'ssl' : '1', 'imap' : '1', 'idle' : '1', - 'folder' : '' + 'folder' : '[]' } CREDENTIAL_KEY = 'Mailnag password for %s://%s@%s' @@ -276,7 +276,7 @@ class AccountManager: ssl = bool(int( self._get_account_cfg(cfg, section_name, 'ssl') )) imap = bool(int( self._get_account_cfg(cfg, section_name, 'imap') )) idle = bool(int( self._get_account_cfg(cfg, section_name, 'idle') )) - folders = splitstr(self._get_account_cfg(cfg, section_name, 'folder'), ',') + folders = json.loads(self._get_account_cfg(cfg, section_name, 'folder')) if self._credentialstore != None: protocol = 'imap' if imap else 'pop' @@ -329,7 +329,7 @@ class AccountManager: cfg.set(section_name, 'ssl', int(acc.ssl)) cfg.set(section_name, 'imap', int(acc.imap)) cfg.set(section_name, 'idle', int(acc.idle)) - cfg.set(section_name, 'folder', ', '.join(acc.folders)) + cfg.set(section_name, 'folder', json.dumps(acc.folders)) if self._credentialstore != None: protocol = 'imap' if acc.imap else 'pop' From d257f70b670b05ddb99e6effaaf5a2ef923983df Mon Sep 17 00:00:00 2001 From: cheshire-mouse Date: Tue, 16 Aug 2016 12:26:08 +0300 Subject: [PATCH 13/18] check folder option format --- Mailnag/common/accounts.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/Mailnag/common/accounts.py b/Mailnag/common/accounts.py index 5b6024d..a5c5bec 100644 --- a/Mailnag/common/accounts.py +++ b/Mailnag/common/accounts.py @@ -28,6 +28,7 @@ import poplib import logging import json import Mailnag.common.imaplib2 as imaplib +from Mailnag.common.utils import splitstr account_defaults = { 'enabled' : '0', @@ -276,7 +277,11 @@ class AccountManager: ssl = bool(int( self._get_account_cfg(cfg, section_name, 'ssl') )) imap = bool(int( self._get_account_cfg(cfg, section_name, 'imap') )) idle = bool(int( self._get_account_cfg(cfg, section_name, 'idle') )) - folders = json.loads(self._get_account_cfg(cfg, section_name, 'folder')) + folders_str = self._get_account_cfg(cfg, section_name, 'folder') + if re.match(r'^\[.*\]$', folders_str): + folders = json.loads(folders_str) + else: + folders = splitstr(folders_str, ',') if self._credentialstore != None: protocol = 'imap' if imap else 'pop' From 81fa02b82d2bcfe4e1a5ecb74446871458811601 Mon Sep 17 00:00:00 2001 From: cheshire-mouse Date: Tue, 16 Aug 2016 13:12:13 +0300 Subject: [PATCH 14/18] fix ascii range --- Mailnag/common/mutf7.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Mailnag/common/mutf7.py b/Mailnag/common/mutf7.py index c3cb184..96408bd 100644 --- a/Mailnag/common/mutf7.py +++ b/Mailnag/common/mutf7.py @@ -15,7 +15,7 @@ __license__ = "WTFPL v. 2" import base64 import re -ascii_codes = set(range(0x20,0x7e)) +ascii_codes = set(range(0x20,0x7f)) def __get_ascii(text): pos = 0 From 3d88d92f601ce58cbd6881533f229e4e812844e8 Mon Sep 17 00:00:00 2001 From: cheshire-mouse Date: Wed, 17 Aug 2016 18:13:11 +0300 Subject: [PATCH 15/18] russian translation --- po/ru.po | 284 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 284 insertions(+) create mode 100644 po/ru.po diff --git a/po/ru.po b/po/ru.po new file mode 100644 index 0000000..46ed6bb --- /dev/null +++ b/po/ru.po @@ -0,0 +1,284 @@ +# Mailnag russian tranlation +# This file is distributed under the same license as the mailnag package. +# Oleg , 2016. +# +msgid "" +msgstr "" +"Project-Id-Version: mailnag\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2016-02-03 19:08+0100\n" +"PO-Revision-Date: 2016-08-17 2O:00+0300\n" +"Last-Translator: Oleg \n" +"Language: RU\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: Mailnag/plugins/userscriptplugin.py:62 +msgid "User Script" +msgstr "Пользовательский скрипт" + +#: Mailnag/plugins/userscriptplugin.py:63 +msgid "Runs an user defined script on mail arrival." +msgstr "Запустить пользовательский скрипт при получении почты" + +#: Mailnag/plugins/userscriptplugin.py:83 +msgid "account" +msgstr "учетная запись" + +#: Mailnag/plugins/userscriptplugin.py:83 +msgid "sender" +msgstr "отправитель" + +#: Mailnag/plugins/userscriptplugin.py:83 +msgid "subject" +msgstr "тема" + +#: Mailnag/plugins/userscriptplugin.py:84 +#, python-format +msgid "" +"The following script will be executed whenever new mails arrive.\n" +"Mailnag passes the total count of new mails to this script,\n" +"followed by %s sequences." +msgstr "" +"Следующий скрипт будет выполнен при появлении новых сообщений.\n" +"Скрипту передаётся количество сообщений,\n" +"за которым следуют: %s" + +#: Mailnag/plugins/unityplugin.py:98 +msgid "Ubuntu Unity" +msgstr "" + +#: Mailnag/plugins/unityplugin.py:99 +msgid "Shows new mails in Ubuntu's Messaging menu." +msgstr "Отображает новые письма в меню сообщений Ubuntu." + +#: Mailnag/plugins/unityplugin.py:118 +msgid "Maximum number of visible mails:" +msgstr "Максимальное количество отображаемых писем:" + +#: Mailnag/plugins/spamfilterplugin.py:69 +msgid "Spam Filter" +msgstr "Спам фильтр" + +#: Mailnag/plugins/spamfilterplugin.py:70 +msgid "Filters out unwanted mails." +msgstr "Фильтрует нежелательные сообщения." + +#: Mailnag/plugins/spamfilterplugin.py:90 +msgid "" +"Mailnag will ignore mails containing at least one of \n" +"the following words in subject or sender." +msgstr "" +"Mailnag проигнорирует письмо, если имя отправителя\n" +"или тема содержит одно из следующих слов" + +#: Mailnag/plugins/libnotifyplugin.py:100 +msgid "LibNotify Notifications" +msgstr "Уведомления LibNotify" + +#: Mailnag/plugins/libnotifyplugin.py:101 +msgid "Shows a popup when new mails arrive." +msgstr "Отображение всплывающего уведомления при получении новых писем" + +#: Mailnag/plugins/libnotifyplugin.py:117 +msgid "Count of new mails" +msgstr "Количество новых писем" + +#: Mailnag/plugins/libnotifyplugin.py:118 +msgid "Short summary of new mails" +msgstr "Краткие сведения о письмах" + +#: Mailnag/plugins/libnotifyplugin.py:119 +msgid "Detailed summary of new mails" +msgstr "Подробные сведения о письмах" + +#: Mailnag/plugins/libnotifyplugin.py:120 +msgid "One notification per new mail" +msgstr "Одно уведомление на письмо" + +#: Mailnag/plugins/libnotifyplugin.py:128 +msgid "Notification mode:" +msgstr "Тип уведомлений" + +#: Mailnag/plugins/libnotifyplugin.py:215 +#: Mailnag/plugins/libnotifyplugin.py:251 +#: Mailnag/plugins/libnotifyplugin.py:279 +#, python-brace-format +msgid "{0} new mails" +msgstr "сообщений: {0}" + +#: Mailnag/plugins/libnotifyplugin.py:217 +#, python-brace-format +msgid "from {0} and others." +msgstr "от {0} и других." + +#: Mailnag/plugins/libnotifyplugin.py:219 +#: Mailnag/plugins/libnotifyplugin.py:222 +#, python-brace-format +msgid "from {0}." +msgstr "от {0}." + +#: Mailnag/plugins/libnotifyplugin.py:221 +#: Mailnag/plugins/libnotifyplugin.py:253 +#: Mailnag/plugins/libnotifyplugin.py:281 +msgid "New mail" +msgstr "Новое сообщение" + +#: Mailnag/plugins/libnotifyplugin.py:246 +#: Mailnag/plugins/libnotifyplugin.py:248 +#, python-brace-format +msgid "(and {0} more)" +msgstr "(и еще {0})" + +#: Mailnag/plugins/libnotifyplugin.py:268 +msgid "Mark as read" +msgstr "Отметить как прочитанное" + +#: Mailnag/plugins/soundplugin.py:65 +msgid "Sound Notifications" +msgstr "Звуковые уведомления" + +#: Mailnag/plugins/soundplugin.py:66 +msgid "Plays a sound when new mails arrive." +msgstr "Проигрывает мелодию при появлении нового сообщения." + +#: Mailnag/plugins/goaplugin.py:93 +msgid "GNOME Online Accounts" +msgstr "" + +#: Mailnag/plugins/goaplugin.py:94 +msgid "GNOME Online Accounts Integration." +msgstr "" + +#: Mailnag/plugins/dbusplugin.py:83 +msgid "DBus Service" +msgstr "Служба DBus" + +#: Mailnag/plugins/dbusplugin.py:84 +msgid "Exposes Mailnag's functionality via a DBus service." +msgstr "Доступ к фунциям Mailnag через службу DBus." + +#: Mailnag/daemon/mails.py:171 +msgid "No subject" +msgstr "Без темы" + +#: Mailnag/configuration/plugindialog.py:33 +msgid "Plugin Configuration" +msgstr "Настройка плагина" + +#: Mailnag/configuration/configwindow.py:109 +#: Mailnag/configuration/configwindow.py:134 +#: Mailnag/configuration/accountdialog.py:88 +msgid "Enabled" +msgstr "Включено" + +#: Mailnag/configuration/configwindow.py:115 +#: Mailnag/configuration/configwindow.py:141 +#: Mailnag/configuration/accountdialog.py:94 +msgid "Name" +msgstr "Имя" + +#: Mailnag/configuration/configwindow.py:344 +msgid "Delete this account:" +msgstr "Удалить учетную запись:" + +#: Mailnag/configuration/accountdialog.py:84 +msgid "optional" +msgstr "необязательно" + +#: Mailnag/configuration/accountdialog.py:177 +msgid "Other (IMAP)" +msgstr "Другое (IMAP)" + +#: Mailnag/configuration/accountdialog.py:178 +msgid "Other (POP3)" +msgstr "Другое (POP3)" + +#: Mailnag/configuration/accountdialog.py:271 +msgid "Connection failed." +msgstr "Ошибка соединения." + +#: data/account_dialog.ui.h:1 +msgid "Mail Account" +msgstr "Учетная запись" + +#: data/account_dialog.ui.h:2 +msgid "Enable Push-IMAP" +msgstr "Включить Push-IMAP" + +#: data/account_dialog.ui.h:3 +msgid "Enable SSL encryption" +msgstr "Включить SSL шифрование" + +#: data/account_dialog.ui.h:4 +msgid "Accountname:" +msgstr "Имя учетной записи:" + +#: data/account_dialog.ui.h:5 +msgid "Account type:" +msgstr "Тип учетной записи:" + +#: data/account_dialog.ui.h:6 +msgid "User:" +msgstr "Пользователь:" + +#: data/account_dialog.ui.h:7 +msgid "Password:" +msgstr "Пароль:" + +#: data/account_dialog.ui.h:8 +msgid "Server:" +msgstr "Сервер:" + +#: data/account_dialog.ui.h:9 +msgid "Port:" +msgstr "Порт:" + +#: data/account_dialog.ui.h:10 +msgid "Folders (optional)" +msgstr "Папки (необзязательно)" + +#: data/config_window.ui.h:1 +msgid "Mailnag Configuration" +msgstr "Настройки Mailnag" + +#: data/config_window.ui.h:2 +msgid "General" +msgstr "Общее" + +#: data/config_window.ui.h:3 +msgid "Accounts" +msgstr "Учетные записи" + +#: data/config_window.ui.h:4 +msgid "Plugins" +msgstr "Плагины" + +#: data/config_window.ui.h:5 +msgid "" +"Mailnag - An extensible mail " +"notification daemon.\n" +"Copyright (c) 2011 - 2016 Patrick Ulbrich\n" +"and contributors." +msgstr "" +"Mailnag - служба уведомлений " +"о входящей почте.\n" +"Copyright (c) 2011 - 2016 Patrick Ulbrich\n" +"and contributors." + +#: data/config_window.ui.h:8 +msgid "Add Account" +msgstr "Добавить учетную запись" + +#: data/config_window.ui.h:9 +msgid "Remove Account" +msgstr "Удалить учетную запись" + +#: data/config_window.ui.h:10 +msgid "Edit Account" +msgstr "Редактировать учетную запись" + +#: data/config_window.ui.h:11 +msgid "Edit Plugin" +msgstr "Редактировать плагин" From e63b88745984b31ece006e0460edfb9be2c00aed Mon Sep 17 00:00:00 2001 From: cheshire-mouse Date: Wed, 17 Aug 2016 18:19:48 +0300 Subject: [PATCH 16/18] fix typo --- po/ru.po | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/po/ru.po b/po/ru.po index 46ed6bb..7d8a1c7 100644 --- a/po/ru.po +++ b/po/ru.po @@ -99,7 +99,7 @@ msgstr "Одно уведомление на письмо" #: Mailnag/plugins/libnotifyplugin.py:128 msgid "Notification mode:" -msgstr "Тип уведомлений" +msgstr "Тип уведомлений:" #: Mailnag/plugins/libnotifyplugin.py:215 #: Mailnag/plugins/libnotifyplugin.py:251 From 1a18157a50e76169669b4da445e1c6b19942aa04 Mon Sep 17 00:00:00 2001 From: cheshire-mouse Date: Wed, 17 Aug 2016 18:44:17 +0300 Subject: [PATCH 17/18] one more type --- po/ru.po | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/po/ru.po b/po/ru.po index 7d8a1c7..9f4fd98 100644 --- a/po/ru.po +++ b/po/ru.po @@ -1,6 +1,6 @@ # Mailnag russian tranlation # This file is distributed under the same license as the mailnag package. -# Oleg , 2016. +# Oleg , 2016. # msgid "" msgstr "" @@ -8,7 +8,7 @@ msgstr "" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2016-02-03 19:08+0100\n" "PO-Revision-Date: 2016-08-17 2O:00+0300\n" -"Last-Translator: Oleg \n" +"Last-Translator: Oleg \n" "Language: RU\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" From c0940324522ea9a0fbf6526609fd8edef72293bf Mon Sep 17 00:00:00 2001 From: Patrick Ulbrich Date: Sat, 27 Aug 2016 19:35:48 +0200 Subject: [PATCH 18/18] Add Oleg to AUTHORS --- AUTHORS | 1 + 1 file changed, 1 insertion(+) diff --git a/AUTHORS b/AUTHORS index f4b24c3..fbc1546 100644 --- a/AUTHORS +++ b/AUTHORS @@ -19,6 +19,7 @@ Hasan Yavuz Özderya Heiko Adams Leighton Earl Matthias Mailänder +Oleg Taylor Braun-Jones Thorsten Leemhuis Thomas Haider