From ac5d0f24da2eb854492d8634896114193638088d Mon Sep 17 00:00:00 2001 From: Stephan Erb Date: Sat, 14 Nov 2009 19:54:33 +0100 Subject: [PATCH 001/259] Fix error in the documentation of our xmpp dispatcher fork. Raise NodeProcessed if the stanza should NOT be handled by other user handlers. --- src/common/xmpp/dispatcher_nb.py | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/src/common/xmpp/dispatcher_nb.py b/src/common/xmpp/dispatcher_nb.py index 8f4746f68..477d3e6c4 100644 --- a/src/common/xmpp/dispatcher_nb.py +++ b/src/common/xmpp/dispatcher_nb.py @@ -247,25 +247,23 @@ class XMPPDispatcher(PlugIn): ''' Register user callback as stanzas handler of declared type. - Callback must take (if chained, see later) arguments: + Callback arguments: dispatcher instance (for replying), incoming return of previous handlers. The callback must raise xmpp.NodeProcessed just before return if it wants - other callbacks to be called with the same stanza as argument _and_, more - importantly library from returning stanza to sender with error set. + to prevent other callbacks to be called with the same stanza as argument + _and_, more importantly library from returning stanza to sender with error set. :param name: name of stanza. F.e. "iq". :param handler: user callback. :param typ: value of stanza's "type" attribute. If not specified any value will match :param ns: namespace of child that stanza must contain. - :param chained: chain together output of several handlers. - :param makefirst: insert handler in the beginning of handlers list instea + :param makefirst: insert handler in the beginning of handlers list instead of adding it to the end. Note that more common handlers i.e. w/o "typ" and " will be called first nevertheless. :param system: call handler even if NodeProcessed Exception were raised already. ''' - # FIXME: What does chain mean and where is it handled? if not xmlns: xmlns=self._owner.defaultNamespace log.debug('Registering handler %s for "%s" type->%s ns->%s(%s)' % From 30580702d54b92cf3f177ca62dd8171e17a7c6f1 Mon Sep 17 00:00:00 2001 From: Stephan Erb Date: Sat, 14 Nov 2009 19:56:15 +0100 Subject: [PATCH 002/259] Create a ConnectionPEP class and directly register its callback to handle pep events. --- src/common/connection_handlers.py | 51 +++---------------------------- src/common/pep.py | 50 ++++++++++++++++++++++++++++++ src/common/xmpp/protocol.py | 1 + 3 files changed, 55 insertions(+), 47 deletions(-) diff --git a/src/common/connection_handlers.py b/src/common/connection_handlers.py index e134aa003..cb9197d5e 100644 --- a/src/common/connection_handlers.py +++ b/src/common/connection_handlers.py @@ -46,11 +46,10 @@ import common.xmpp from common import helpers from common import gajim -from common import atom -from common import pep from common import exceptions from common.commands import ConnectionCommands from common.pubsub import ConnectionPubSub +from common.pep import ConnectionPEP from common.caps import ConnectionCaps if gajim.HAVE_FARSIGHT: from common.jingle import ConnectionJingle @@ -1453,7 +1452,7 @@ sent a message to.''' return sess -class ConnectionHandlers(ConnectionVcard, ConnectionBytestream, ConnectionDisco, ConnectionCommands, ConnectionPubSub, ConnectionCaps, ConnectionHandlersBase, ConnectionJingle): +class ConnectionHandlers(ConnectionVcard, ConnectionBytestream, ConnectionDisco, ConnectionCommands, ConnectionPubSub, ConnectionPEP, ConnectionCaps, ConnectionHandlersBase, ConnectionJingle): def __init__(self): ConnectionVcard.__init__(self) ConnectionBytestream.__init__(self) @@ -1874,15 +1873,7 @@ class ConnectionHandlers(ConnectionVcard, ConnectionBytestream, ConnectionDisco, def _messageCB(self, con, msg): '''Called when we receive a message''' log.debug('MessageCB') - mtype = msg.getType() - # check if the message is pubsub#event - if msg.getTag('event') is not None: - if mtype == 'groupchat': - return - if msg.getTag('error') is None: - self._pubsubEventCB(con, msg) - return # check if the message is a roster item exchange (XEP-0144) if msg.getTag('x', namespace=common.xmpp.NS_ROSTERX): @@ -2148,42 +2139,6 @@ class ConnectionHandlers(ConnectionVcard, ConnectionBytestream, ConnectionDisco, self.dispatch('GC_INVITATION',(frm, jid_from, reason, password, is_continued)) - def _pubsubEventCB(self, con, msg): - ''' Called when we receive with pubsub event. ''' - # TODO: Logging? (actually services where logging would be useful, should - # TODO: allow to access archives remotely...) - jid = helpers.get_full_jid_from_iq(msg) - event = msg.getTag('event') - - # XEP-0107: User Mood - items = event.getTag('items', {'node': common.xmpp.NS_MOOD}) - if items: pep.user_mood(items, self.name, jid) - # XEP-0118: User Tune - items = event.getTag('items', {'node': common.xmpp.NS_TUNE}) - if items: pep.user_tune(items, self.name, jid) - # XEP-0080: User Geolocation - items = event.getTag('items', {'node': common.xmpp.NS_GEOLOC}) - if items: pep.user_geoloc(items, self.name, jid) - # XEP-0108: User Activity - items = event.getTag('items', {'node': common.xmpp.NS_ACTIVITY}) - if items: pep.user_activity(items, self.name, jid) - # XEP-0172: User Nickname - items = event.getTag('items', {'node': common.xmpp.NS_NICK}) - if items: pep.user_nickname(items, self.name, jid) - - items = event.getTag('items') - if items is None: return - - for item in items.getTags('item'): - entry = item.getTag('entry') - if entry is not None: - # for each entry in feed (there shouldn't be more than one, - # but to be sure... - self.dispatch('ATOM_ENTRY', (atom.OldEntry(node=entry),)) - continue - # unknown type... probably user has another client who understands that event - raise common.xmpp.NodeProcessed - def _presenceCB(self, con, prs): '''Called when we receive a presence''' ptype = prs.getType() @@ -2751,6 +2706,8 @@ class ConnectionHandlers(ConnectionVcard, ConnectionBytestream, ConnectionDisco, con.RegisterHandler('message', self._messageCB) con.RegisterHandler('presence', self._presenceCB) con.RegisterHandler('presence', self._capsPresenceCB) + con.RegisterHandler('message', self._pubsubEventCB, + ns=common.xmpp.NS_PUBSUB_EVENT) con.RegisterHandler('iq', self._vCardCB, 'result', common.xmpp.NS_VCARD) con.RegisterHandler('iq', self._rosterSetCB, 'set', diff --git a/src/common/pep.py b/src/common/pep.py index 54012514f..fe67d578a 100644 --- a/src/common/pep.py +++ b/src/common/pep.py @@ -192,6 +192,56 @@ ACTIVITIES = { 'studying': _('Studying'), 'writing': _('Writing')}} +import logging +log = logging.getLogger('gajim.c.pep') + +import helpers +import atom + +class ConnectionPEP: + + def _pubsubEventCB(self, xmpp_dispatcher, msg): + ''' Called when we receive with pubsub event. ''' + + if msg.getTag('error'): + log.warning('Pep Error CB') + return + + # TODO: Logging? (actually services where logging would be useful, should + # TODO: allow to access archives remotely...) + jid = helpers.get_full_jid_from_iq(msg) + event = msg.getTag('event') + + # XEP-0107: User Mood + items = event.getTag('items', {'node': common.xmpp.NS_MOOD}) + if items: user_mood(items, self.name, jid) + # XEP-0118: User Tune + items = event.getTag('items', {'node': common.xmpp.NS_TUNE}) + if items: user_tune(items, self.name, jid) + # XEP-0080: User Geolocation + items = event.getTag('items', {'node': common.xmpp.NS_GEOLOC}) + if items: user_geoloc(items, self.name, jid) + # XEP-0108: User Activity + items = event.getTag('items', {'node': common.xmpp.NS_ACTIVITY}) + if items: user_activity(items, self.name, jid) + # XEP-0172: User Nickname + items = event.getTag('items', {'node': common.xmpp.NS_NICK}) + if items: user_nickname(items, self.name, jid) + + items = event.getTag('items') + if items is None: return + + for item in items.getTags('item'): + entry = item.getTag('entry') + if entry is not None: + # for each entry in feed (there shouldn't be more than one, + # but to be sure... + self.dispatch('ATOM_ENTRY', (atom.OldEntry(node=entry),)) + continue + # unknown type... probably user has another client who understands that event + + raise common.xmpp.NodeProcessed + def user_mood(items, name, jid): has_child = False retract = False diff --git a/src/common/xmpp/protocol.py b/src/common/xmpp/protocol.py index 619771409..5eb31b7d3 100644 --- a/src/common/xmpp/protocol.py +++ b/src/common/xmpp/protocol.py @@ -88,6 +88,7 @@ NS_PRIVACY ='jabber:iq:privacy' NS_PRIVATE ='jabber:iq:private' NS_PROFILE ='http://jabber.org/protocol/profile' # XEP-0154 NS_PUBSUB ='http://jabber.org/protocol/pubsub' # XEP-0060 +NS_PUBSUB_EVENT = 'http://jabber.org/protocol/pubsub#event' NS_PUBSUB_PUBLISH_OPTIONS = NS_PUBSUB + '#publish-options' # XEP-0060 NS_PUBSUB_OWNER ='http://jabber.org/protocol/pubsub#owner' # JEP-0060 NS_REGISTER ='jabber:iq:register' From 85b7b89b49a7db6b077e1c01a3811d92556e3092 Mon Sep 17 00:00:00 2001 From: Stephan Erb Date: Sat, 14 Nov 2009 20:48:33 +0100 Subject: [PATCH 003/259] Create a class for each PEP XEP that we support. Dispatch an event to the Interface() handlers when we have have received a PEP event. --- src/common/pep.py | 100 ++++++++++++++++++++++++++++++++++++---------- 1 file changed, 79 insertions(+), 21 deletions(-) diff --git a/src/common/pep.py b/src/common/pep.py index fe67d578a..03f262ce3 100644 --- a/src/common/pep.py +++ b/src/common/pep.py @@ -198,37 +198,94 @@ log = logging.getLogger('gajim.c.pep') import helpers import atom + +class AbstractPEP(object): + + type = '' + namespace = '' + + @classmethod + def get_tag_as_PEP(cls, jid, account, event_tag): + items = event_tag.getTag('items', {'node': cls.namespace}) + if items: + log.debug("Received PEP 'user %s' from %s" % (cls.type, jid)) + return cls(jid, account, items) + else: + return None + + +class UserMoodPEP(AbstractPEP): + '''XEP-0107: User Mood''' + + type = 'mood' + namespace = common.xmpp.NS_MOOD + + def __init__(self, jid, account, items): + user_mood(items, account, jid) + + +class UserTunePEP(AbstractPEP): + '''XEP-0118: User Tune''' + + type = 'tune' + namespace = common.xmpp.NS_TUNE + + def __init__(self, jid, account, items): + user_tune(items, account, jid) + + +class UserGeolocationPEP(AbstractPEP): + '''XEP-0080: User Geolocation''' + + type = 'geolocation' + namespace = common.xmpp.NS_GEOLOC + + def __init__(self, jid, account, items): + user_geoloc(items, account, jid) + + +class UserActivityPEP(AbstractPEP): + '''XEP-0108: User Activity''' + + type = 'activity' + namespace = common.xmpp.NS_ACTIVITY + + def __init__(self, jid, account, items): + user_activity(items, account, jid) + + +class UserNicknamePEP(AbstractPEP): + '''XEP-0172: User Nickname''' + + type = 'activity' + namespace = common.xmpp.NS_NICK + + def __init__(self, jid, account, items): + user_nickname(items, self.name, jid) + + +SUPPORTED_PERSONAL_USER_EVENTS = [UserMoodPEP, UserTunePEP, UserGeolocationPEP, + UserActivityPEP, UserNicknamePEP] + class ConnectionPEP: def _pubsubEventCB(self, xmpp_dispatcher, msg): ''' Called when we receive with pubsub event. ''' - if msg.getTag('error'): - log.warning('Pep Error CB') + log.warning('PubsubEventCB received error stanza') return - + # TODO: Logging? (actually services where logging would be useful, should # TODO: allow to access archives remotely...) jid = helpers.get_full_jid_from_iq(msg) - event = msg.getTag('event') + event_tag = msg.getTag('event') - # XEP-0107: User Mood - items = event.getTag('items', {'node': common.xmpp.NS_MOOD}) - if items: user_mood(items, self.name, jid) - # XEP-0118: User Tune - items = event.getTag('items', {'node': common.xmpp.NS_TUNE}) - if items: user_tune(items, self.name, jid) - # XEP-0080: User Geolocation - items = event.getTag('items', {'node': common.xmpp.NS_GEOLOC}) - if items: user_geoloc(items, self.name, jid) - # XEP-0108: User Activity - items = event.getTag('items', {'node': common.xmpp.NS_ACTIVITY}) - if items: user_activity(items, self.name, jid) - # XEP-0172: User Nickname - items = event.getTag('items', {'node': common.xmpp.NS_NICK}) - if items: user_nickname(items, self.name, jid) - - items = event.getTag('items') + for pep_class in SUPPORTED_PERSONAL_USER_EVENTS: + pep = pep_class.get_tag_as_PEP(jid, self.name, event_tag) + if pep: + self.dispatch('PEP_RECEIVED', (pep.type, pep)) + + items = event_tag.getTag('items') if items is None: return for item in items.getTags('item'): @@ -242,6 +299,7 @@ class ConnectionPEP: raise common.xmpp.NodeProcessed + def user_mood(items, name, jid): has_child = False retract = False From 7c6dc424afc4039ee92c0314c7008ae87928ed35 Mon Sep 17 00:00:00 2001 From: Stephan Erb Date: Sat, 14 Nov 2009 20:54:42 +0100 Subject: [PATCH 004/259] Make user_tune a instance method, not a function. --- src/common/pep.py | 119 +++++++++++++++++++++++----------------------- 1 file changed, 60 insertions(+), 59 deletions(-) diff --git a/src/common/pep.py b/src/common/pep.py index 03f262ce3..7f04f4139 100644 --- a/src/common/pep.py +++ b/src/common/pep.py @@ -221,7 +221,66 @@ class UserMoodPEP(AbstractPEP): namespace = common.xmpp.NS_MOOD def __init__(self, jid, account, items): - user_mood(items, account, jid) + self.user_mood(items, account, jid) + + + def user_mood(self, items, name, jid): + has_child = False + retract = False + mood = None + text = None + for item in items.getTags('item'): + child = item.getTag('mood') + if child is not None: + has_child = True + for ch in child.getChildren(): + if ch.getName() != 'text': + mood = ch.getName() + else: + text = ch.getData() + if items.getTag('retract') is not None: + retract = True + + if jid == common.gajim.get_jid_from_account(name): + acc = common.gajim.connections[name] + if has_child: + if 'mood' in acc.mood: + del acc.mood['mood'] + if 'text' in acc.mood: + del acc.mood['text'] + if mood is not None: + acc.mood['mood'] = mood + if text is not None: + acc.mood['text'] = text + elif retract: + if 'mood' in acc.mood: + del acc.mood['mood'] + if 'text' in acc.mood: + del acc.mood['text'] + + (user, resource) = common.gajim.get_room_and_nick_from_fjid(jid) + for contact in common.gajim.contacts.get_contacts(name, user): + if has_child: + if 'mood' in contact.mood: + del contact.mood['mood'] + if 'text' in contact.mood: + del contact.mood['text'] + if mood is not None: + contact.mood['mood'] = mood + if text is not None: + contact.mood['text'] = text + elif retract: + if 'mood' in contact.mood: + del contact.mood['mood'] + if 'text' in contact.mood: + del contact.mood['text'] + + if jid == common.gajim.get_jid_from_account(name): + common.gajim.interface.roster.draw_account(name) + common.gajim.interface.roster.draw_mood(user, name) + ctrl = common.gajim.interface.msg_win_mgr.get_control(user, name) + if ctrl: + ctrl.update_mood() class UserTunePEP(AbstractPEP): @@ -300,64 +359,6 @@ class ConnectionPEP: raise common.xmpp.NodeProcessed -def user_mood(items, name, jid): - has_child = False - retract = False - mood = None - text = None - for item in items.getTags('item'): - child = item.getTag('mood') - if child is not None: - has_child = True - for ch in child.getChildren(): - if ch.getName() != 'text': - mood = ch.getName() - else: - text = ch.getData() - if items.getTag('retract') is not None: - retract = True - - if jid == common.gajim.get_jid_from_account(name): - acc = common.gajim.connections[name] - if has_child: - if 'mood' in acc.mood: - del acc.mood['mood'] - if 'text' in acc.mood: - del acc.mood['text'] - if mood is not None: - acc.mood['mood'] = mood - if text is not None: - acc.mood['text'] = text - elif retract: - if 'mood' in acc.mood: - del acc.mood['mood'] - if 'text' in acc.mood: - del acc.mood['text'] - - (user, resource) = common.gajim.get_room_and_nick_from_fjid(jid) - for contact in common.gajim.contacts.get_contacts(name, user): - if has_child: - if 'mood' in contact.mood: - del contact.mood['mood'] - if 'text' in contact.mood: - del contact.mood['text'] - if mood is not None: - contact.mood['mood'] = mood - if text is not None: - contact.mood['text'] = text - elif retract: - if 'mood' in contact.mood: - del contact.mood['mood'] - if 'text' in contact.mood: - del contact.mood['text'] - - if jid == common.gajim.get_jid_from_account(name): - common.gajim.interface.roster.draw_account(name) - common.gajim.interface.roster.draw_mood(user, name) - ctrl = common.gajim.interface.msg_win_mgr.get_control(user, name) - if ctrl: - ctrl.update_mood() - def user_tune(items, name, jid): has_child = False retract = False From 99e718583aaedebe03bbd0e8efd6a87f605d860f Mon Sep 17 00:00:00 2001 From: Stephan Erb Date: Sat, 14 Nov 2009 22:31:27 +0100 Subject: [PATCH 005/259] Initial simplification of PEP data extraction by moving the extraction methods to the newly created PEP classess. If-else-retract complexity is substituted by dictionaries. --- src/common/pep.py | 407 +++++++++++++++------------------------------- 1 file changed, 131 insertions(+), 276 deletions(-) diff --git a/src/common/pep.py b/src/common/pep.py index 7f04f4139..9e99a5a24 100644 --- a/src/common/pep.py +++ b/src/common/pep.py @@ -192,6 +192,8 @@ ACTIVITIES = { 'studying': _('Studying'), 'writing': _('Writing')}} +TUNE_DATA = ['artist', 'title', 'source', 'track', 'length'] + import logging log = logging.getLogger('gajim.c.pep') @@ -221,59 +223,36 @@ class UserMoodPEP(AbstractPEP): namespace = common.xmpp.NS_MOOD def __init__(self, jid, account, items): + self._mood_dict, self._retracted = self._extract_info(items) + self.user_mood(items, account, jid) + def _extract_info(self, items): + mood_dict = {} - def user_mood(self, items, name, jid): - has_child = False - retract = False - mood = None - text = None for item in items.getTags('item'): - child = item.getTag('mood') - if child is not None: - has_child = True - for ch in child.getChildren(): - if ch.getName() != 'text': - mood = ch.getName() - else: - text = ch.getData() - if items.getTag('retract') is not None: - retract = True + mood_tag = item.getTag('mood') + if mood_tag: + for child in mood_tag.getChildren(): + if child.getName() == 'text': + mood_dict['text'] = child.getData() + elif child.getName() in MOODS : + mood_dict['mood'] = child.getName() + + retracted = items.getTag('retract') or not mood_dict + return (mood_dict, retracted) + + def user_mood(self, items, name, jid): + + mood_dict = {} if self._retracted else self._mood_dict if jid == common.gajim.get_jid_from_account(name): acc = common.gajim.connections[name] - if has_child: - if 'mood' in acc.mood: - del acc.mood['mood'] - if 'text' in acc.mood: - del acc.mood['text'] - if mood is not None: - acc.mood['mood'] = mood - if text is not None: - acc.mood['text'] = text - elif retract: - if 'mood' in acc.mood: - del acc.mood['mood'] - if 'text' in acc.mood: - del acc.mood['text'] + acc.mood = mood_dict - (user, resource) = common.gajim.get_room_and_nick_from_fjid(jid) + user = common.gajim.get_room_and_nick_from_fjid(jid)[0] for contact in common.gajim.contacts.get_contacts(name, user): - if has_child: - if 'mood' in contact.mood: - del contact.mood['mood'] - if 'text' in contact.mood: - del contact.mood['text'] - if mood is not None: - contact.mood['mood'] = mood - if text is not None: - contact.mood['text'] = text - elif retract: - if 'mood' in contact.mood: - del contact.mood['mood'] - if 'text' in contact.mood: - del contact.mood['text'] + contact.mood = mood_dict if jid == common.gajim.get_jid_from_account(name): common.gajim.interface.roster.draw_account(name) @@ -290,18 +269,42 @@ class UserTunePEP(AbstractPEP): namespace = common.xmpp.NS_TUNE def __init__(self, jid, account, items): - user_tune(items, account, jid) - + self._tune_dict, self._retracted = self._extract_info(items) -class UserGeolocationPEP(AbstractPEP): - '''XEP-0080: User Geolocation''' + self.user_tune(items, account, jid) + + def _extract_info(self, items): + tune_dict = {} - type = 'geolocation' - namespace = common.xmpp.NS_GEOLOC - - def __init__(self, jid, account, items): - user_geoloc(items, account, jid) + for item in items.getTags('item'): + tune_tag = item.getTag('tune') + if tune_tag: + for child in tune_tag.getChildren(): + if child.getName() in TUNE_DATA: + tune_dict[child.getName()] = child.getData() + + retracted = items.getTag('retract') or not tune_dict + return (tune_dict, retracted) + + + def user_tune(self, items, name, jid): + tune_dict = {} if self._retracted else self._tune_dict + if jid == common.gajim.get_jid_from_account(name): + acc = common.gajim.connections[name] + acc.tune = tune_dict + + user = common.gajim.get_room_and_nick_from_fjid(jid)[0] + for contact in common.gajim.contacts.get_contacts(name, user): + contact.tune = tune_dict + + if jid == common.gajim.get_jid_from_account(name): + common.gajim.interface.roster.draw_account(name) + common.gajim.interface.roster.draw_tune(user, name) + ctrl = common.gajim.interface.msg_win_mgr.get_control(user, name) + if ctrl: + ctrl.update_tune() + class UserActivityPEP(AbstractPEP): '''XEP-0108: User Activity''' @@ -310,7 +313,45 @@ class UserActivityPEP(AbstractPEP): namespace = common.xmpp.NS_ACTIVITY def __init__(self, jid, account, items): - user_activity(items, account, jid) + self._activity_dict, self._retracted = self._extract_info(items) + + self.user_activity(items, account, jid) + + def _extract_info(self, items): + activity_dict = {} + + for item in items.getTags('item'): + activity_tag = item.getTag('activity') + if activity_tag: + for child in child.getChildren(): + if child.getName() == 'text': + activity_dict['text'] = child.getData() + elif child.getName() in ACTIVITIES: + activity_dict['activity'] = child.getName() + for subactivity in child.getChildren(): + if subactivity.getName() in ACTIVITIES[child.getName()]: + activity_dict['subactivity'] = subactivity.getName() + + retracted = items.getTag('retract') or not activity_dict + return (activity_dict, retracted) + + def user_activity(self, items, name, jid): + activity_dict = {} if self._retracted else self._activity_dict + + if jid == common.gajim.get_jid_from_account(name): + acc = common.gajim.connections[name] + acc.activity = activity_dict + + user = common.gajim.get_room_and_nick_from_fjid(jid)[0] + for contact in common.gajim.contacts.get_contacts(name, user): + contact.activity = activity_dict + + if jid == common.gajim.get_jid_from_account(name): + common.gajim.interface.roster.draw_account(name) + common.gajim.interface.roster.draw_activity(user, name) + ctrl = common.gajim.interface.msg_win_mgr.get_control(user, name) + if ctrl: + ctrl.update_activity() class UserNicknamePEP(AbstractPEP): @@ -320,11 +361,44 @@ class UserNicknamePEP(AbstractPEP): namespace = common.xmpp.NS_NICK def __init__(self, jid, account, items): - user_nickname(items, self.name, jid) + self._nick, self._retracted = self._extract_info(items) + self.user_nickname(items, account, jid) + + def _extract_info(self, items): + nick = '' + for item in items.getTags('item'): + child = item.getTag('nick') + if child: + nick = child.getData() + break + + retracted = items.getTag('retract') or not nick + return (nick, retracted) + + def user_nickname(self, items, name, jid): + if jid == common.gajim.get_jid_from_account(name): + if self._retracted: + common.gajim.nicks[name] = common.gajim.config.get_per('accounts', + name, 'name') + else: + common.gajim.nicks[name] = self._nick + + nick = '' if self._retracted else self._nick + + user = common.gajim.get_room_and_nick_from_fjid(jid)[0] + for contact in common.gajim.contacts.get_contacts(name, user): + contact.contact_name = nick + common.gajim.interface.roster.draw_contact(user, name) + + ctrl = common.gajim.interface.msg_win_mgr.get_control(user, name) + if ctrl: + ctrl.update_ui() + win = ctrl.parent_win + win.redraw_tab(ctrl) + win.show_title() -SUPPORTED_PERSONAL_USER_EVENTS = [UserMoodPEP, UserTunePEP, UserGeolocationPEP, - UserActivityPEP, UserNicknamePEP] +SUPPORTED_PERSONAL_USER_EVENTS = [UserMoodPEP, UserTunePEP, UserActivityPEP, UserNicknamePEP] class ConnectionPEP: @@ -359,225 +433,6 @@ class ConnectionPEP: raise common.xmpp.NodeProcessed -def user_tune(items, name, jid): - has_child = False - retract = False - artist = None - title = None - source = None - track = None - length = None - - for item in items.getTags('item'): - child = item.getTag('tune') - if child is not None: - has_child = True - for ch in child.getChildren(): - if ch.getName() == 'artist': - artist = ch.getData() - elif ch.getName() == 'title': - title = ch.getData() - elif ch.getName() == 'source': - source = ch.getData() - elif ch.getName() == 'track': - track = ch.getData() - elif ch.getName() == 'length': - length = ch.getData() - if items.getTag('retract') is not None: - retract = True - - if jid == common.gajim.get_jid_from_account(name): - acc = common.gajim.connections[name] - if has_child: - if 'artist' in acc.tune: - del acc.tune['artist'] - if 'title' in acc.tune: - del acc.tune['title'] - if 'source' in acc.tune: - del acc.tune['source'] - if 'track' in acc.tune: - del acc.tune['track'] - if 'length' in acc.tune: - del acc.tune['length'] - if artist is not None: - acc.tune['artist'] = artist - if title is not None: - acc.tune['title'] = title - if source is not None: - acc.tune['source'] = source - if track is not None: - acc.tune['track'] = track - if length is not None: - acc.tune['length'] = length - elif retract: - if 'artist' in acc.tune: - del acc.tune['artist'] - if 'title' in acc.tune: - del acc.tune['title'] - if 'source' in acc.tune: - del acc.tune['source'] - if 'track' in acc.tune: - del acc.tune['track'] - if 'length' in acc.tune: - del acc.tune['length'] - - user = common.gajim.get_room_and_nick_from_fjid(jid)[0] - for contact in common.gajim.contacts.get_contacts(name, user): - if has_child: - if 'artist' in contact.tune: - del contact.tune['artist'] - if 'title' in contact.tune: - del contact.tune['title'] - if 'source' in contact.tune: - del contact.tune['source'] - if 'track' in contact.tune: - del contact.tune['track'] - if 'length' in contact.tune: - del contact.tune['length'] - if artist is not None: - contact.tune['artist'] = artist - if title is not None: - contact.tune['title'] = title - if source is not None: - contact.tune['source'] = source - if track is not None: - contact.tune['track'] = track - if length is not None: - contact.tune['length'] = length - elif retract: - if 'artist' in contact.tune: - del contact.tune['artist'] - if 'title' in contact.tune: - del contact.tune['title'] - if 'source' in contact.tune: - del contact.tune['source'] - if 'track' in contact.tune: - del contact.tune['track'] - if 'length' in contact.tune: - del contact.tune['length'] - - if jid == common.gajim.get_jid_from_account(name): - common.gajim.interface.roster.draw_account(name) - common.gajim.interface.roster.draw_tune(user, name) - ctrl = common.gajim.interface.msg_win_mgr.get_control(user, name) - if ctrl: - ctrl.update_tune() - -def user_geoloc(items, name, jid): - pass - -def user_activity(items, name, jid): - has_child = False - retract = False - activity = None - subactivity = None - text = None - - for item in items.getTags('item'): - child = item.getTag('activity') - if child is not None: - has_child = True - for ch in child.getChildren(): - if ch.getName() != 'text': - activity = ch.getName() - for chi in ch.getChildren(): - subactivity = chi.getName() - else: - text = ch.getData() - if items.getTag('retract') is not None: - retract = True - - if jid == common.gajim.get_jid_from_account(name): - acc = common.gajim.connections[name] - if has_child: - if 'activity' in acc.activity: - del acc.activity['activity'] - if 'subactivity' in acc.activity: - del acc.activity['subactivity'] - if 'text' in acc.activity: - del acc.activity['text'] - if activity is not None: - acc.activity['activity'] = activity - if subactivity is not None and subactivity != 'other': - acc.activity['subactivity'] = subactivity - if text is not None: - acc.activity['text'] = text - elif retract: - if 'activity' in acc.activity: - del acc.activity['activity'] - if 'subactivity' in acc.activity: - del acc.activity['subactivity'] - if 'text' in acc.activity: - del acc.activity['text'] - - user = common.gajim.get_room_and_nick_from_fjid(jid)[0] - for contact in common.gajim.contacts.get_contacts(name, user): - if has_child: - if 'activity' in contact.activity: - del contact.activity['activity'] - if 'subactivity' in contact.activity: - del contact.activity['subactivity'] - if 'text' in contact.activity: - del contact.activity['text'] - if activity is not None: - contact.activity['activity'] = activity - if subactivity is not None and subactivity != 'other': - contact.activity['subactivity'] = subactivity - if text is not None: - contact.activity['text'] = text - elif retract: - if 'activity' in contact.activity: - del contact.activity['activity'] - if 'subactivity' in contact.activity: - del contact.activity['subactivity'] - if 'text' in contact.activity: - del contact.activity['text'] - - if jid == common.gajim.get_jid_from_account(name): - common.gajim.interface.roster.draw_account(name) - common.gajim.interface.roster.draw_activity(user, name) - ctrl = common.gajim.interface.msg_win_mgr.get_control(user, name) - if ctrl: - ctrl.update_activity() - -def user_nickname(items, name, jid): - has_child = False - retract = False - nick = None - - for item in items.getTags('item'): - child = item.getTag('nick') - if child is not None: - has_child = True - nick = child.getData() - break - - if items.getTag('retract') is not None: - retract = True - - if jid == common.gajim.get_jid_from_account(name): - if has_child: - common.gajim.nicks[name] = nick - if retract: - common.gajim.nicks[name] = common.gajim.config.get_per('accounts', - name, 'name') - - user = common.gajim.get_room_and_nick_from_fjid(jid)[0] - if has_child: - if nick is not None: - for contact in common.gajim.contacts.get_contacts(name, user): - contact.contact_name = nick - common.gajim.interface.roster.draw_contact(user, name) - - ctrl = common.gajim.interface.msg_win_mgr.get_control(user, name) - if ctrl: - ctrl.update_ui() - win = ctrl.parent_win - win.redraw_tab(ctrl) - win.show_title() - elif retract: - contact.contact_name = '' - def user_send_mood(account, mood, message=''): if not common.gajim.connections[account].pep_supported: return From 3d5e8cc42737418a237d3f5812834d2b9ef9acce Mon Sep 17 00:00:00 2001 From: Stephan Erb Date: Sat, 14 Nov 2009 22:47:21 +0100 Subject: [PATCH 006/259] Move common pep constructor logic to base class. --- src/common/pep.py | 55 ++++++++++++++++++----------------------------- 1 file changed, 21 insertions(+), 34 deletions(-) diff --git a/src/common/pep.py b/src/common/pep.py index 9e99a5a24..4b31fb58e 100644 --- a/src/common/pep.py +++ b/src/common/pep.py @@ -205,7 +205,7 @@ class AbstractPEP(object): type = '' namespace = '' - + @classmethod def get_tag_as_PEP(cls, jid, account, event_tag): items = event_tag.getTag('items', {'node': cls.namespace}) @@ -215,17 +215,19 @@ class AbstractPEP(object): else: return None + def __init__(self, jid, account, items): + self._pep_specific_data, self._retracted = self._extract_info(items) + self.do(jid, account) + + def _extract_info(self, items): + '''To be implemented by subclasses''' + raise NotImplementedError class UserMoodPEP(AbstractPEP): '''XEP-0107: User Mood''' type = 'mood' namespace = common.xmpp.NS_MOOD - - def __init__(self, jid, account, items): - self._mood_dict, self._retracted = self._extract_info(items) - - self.user_mood(items, account, jid) def _extract_info(self, items): mood_dict = {} @@ -242,9 +244,8 @@ class UserMoodPEP(AbstractPEP): retracted = items.getTag('retract') or not mood_dict return (mood_dict, retracted) - def user_mood(self, items, name, jid): - - mood_dict = {} if self._retracted else self._mood_dict + def do(self, jid, name): + mood_dict = {} if self._retracted else self._pep_specific_data if jid == common.gajim.get_jid_from_account(name): acc = common.gajim.connections[name] @@ -267,12 +268,7 @@ class UserTunePEP(AbstractPEP): type = 'tune' namespace = common.xmpp.NS_TUNE - - def __init__(self, jid, account, items): - self._tune_dict, self._retracted = self._extract_info(items) - - self.user_tune(items, account, jid) - + def _extract_info(self, items): tune_dict = {} @@ -287,8 +283,8 @@ class UserTunePEP(AbstractPEP): return (tune_dict, retracted) - def user_tune(self, items, name, jid): - tune_dict = {} if self._retracted else self._tune_dict + def do(self, jid, name): + tune_dict = {} if self._retracted else self._pep_specific_data if jid == common.gajim.get_jid_from_account(name): acc = common.gajim.connections[name] @@ -311,19 +307,14 @@ class UserActivityPEP(AbstractPEP): type = 'activity' namespace = common.xmpp.NS_ACTIVITY - - def __init__(self, jid, account, items): - self._activity_dict, self._retracted = self._extract_info(items) - - self.user_activity(items, account, jid) - + def _extract_info(self, items): activity_dict = {} for item in items.getTags('item'): activity_tag = item.getTag('activity') if activity_tag: - for child in child.getChildren(): + for child in activity_tag.getChildren(): if child.getName() == 'text': activity_dict['text'] = child.getData() elif child.getName() in ACTIVITIES: @@ -335,8 +326,8 @@ class UserActivityPEP(AbstractPEP): retracted = items.getTag('retract') or not activity_dict return (activity_dict, retracted) - def user_activity(self, items, name, jid): - activity_dict = {} if self._retracted else self._activity_dict + def do(self, jid, name): + activity_dict = {} if self._retracted else self._pep_specific_data if jid == common.gajim.get_jid_from_account(name): acc = common.gajim.connections[name] @@ -359,11 +350,7 @@ class UserNicknamePEP(AbstractPEP): type = 'activity' namespace = common.xmpp.NS_NICK - - def __init__(self, jid, account, items): - self._nick, self._retracted = self._extract_info(items) - self.user_nickname(items, account, jid) - + def _extract_info(self, items): nick = '' for item in items.getTags('item'): @@ -375,15 +362,15 @@ class UserNicknamePEP(AbstractPEP): retracted = items.getTag('retract') or not nick return (nick, retracted) - def user_nickname(self, items, name, jid): + def do(self, jid, name): if jid == common.gajim.get_jid_from_account(name): if self._retracted: common.gajim.nicks[name] = common.gajim.config.get_per('accounts', name, 'name') else: - common.gajim.nicks[name] = self._nick + common.gajim.nicks[name] = self._pep_specific_data - nick = '' if self._retracted else self._nick + nick = '' if self._retracted else self._pep_specific_data user = common.gajim.get_room_and_nick_from_fjid(jid)[0] for contact in common.gajim.contacts.get_contacts(name, user): From 088916f4e7709133023cd308972c938787376ace Mon Sep 17 00:00:00 2001 From: Stephan Erb Date: Sat, 14 Nov 2009 23:07:22 +0100 Subject: [PATCH 007/259] Strip PEP info at the network level. (Currently it is done at the UI level in many, many different places) --- src/common/pep.py | 26 ++++++++++++++++---------- 1 file changed, 16 insertions(+), 10 deletions(-) diff --git a/src/common/pep.py b/src/common/pep.py index 4b31fb58e..bd17e46ba 100644 --- a/src/common/pep.py +++ b/src/common/pep.py @@ -236,10 +236,11 @@ class UserMoodPEP(AbstractPEP): mood_tag = item.getTag('mood') if mood_tag: for child in mood_tag.getChildren(): - if child.getName() == 'text': + name = child.getName().strip() + if name == 'text': mood_dict['text'] = child.getData() - elif child.getName() in MOODS : - mood_dict['mood'] = child.getName() + elif name in MOODS : + mood_dict['mood'] = name retracted = items.getTag('retract') or not mood_dict return (mood_dict, retracted) @@ -276,8 +277,10 @@ class UserTunePEP(AbstractPEP): tune_tag = item.getTag('tune') if tune_tag: for child in tune_tag.getChildren(): + name = child.getName().strip() + data = child.getData().strip() if child.getName() in TUNE_DATA: - tune_dict[child.getName()] = child.getData() + tune_dict[name] = data retracted = items.getTag('retract') or not tune_dict return (tune_dict, retracted) @@ -315,13 +318,16 @@ class UserActivityPEP(AbstractPEP): activity_tag = item.getTag('activity') if activity_tag: for child in activity_tag.getChildren(): - if child.getName() == 'text': - activity_dict['text'] = child.getData() - elif child.getName() in ACTIVITIES: - activity_dict['activity'] = child.getName() + name = child.getName().strip() + data = child.getData().strip() + if name == 'text': + activity_dict['text'] = data + elif name in ACTIVITIES: + activity_dict['activity'] = name for subactivity in child.getChildren(): - if subactivity.getName() in ACTIVITIES[child.getName()]: - activity_dict['subactivity'] = subactivity.getName() + subactivity_name = subactivity.getName().strip() + if subactivity_name in ACTIVITIES[name]: + activity_dict['subactivity'] = subactivity_name retracted = items.getTag('retract') or not activity_dict return (activity_dict, retracted) From e41e4848559c0446107cc378d15d8887daaea129 Mon Sep 17 00:00:00 2001 From: Stephan Erb Date: Sun, 15 Nov 2009 00:12:15 +0100 Subject: [PATCH 008/259] Proof of concept: Move markup / pixbuf determination logic from the UI to the different PEP classes. Currently this is only done for UserMood. We can decide later on (if needed), to move the asPixbufIcon and asMarkupText methods to a more appropriate place. Goal is to remove as much redundant code as possible. --- src/chat_control.py | 31 +++++-------------------------- src/common/contacts.py | 1 + src/common/pep.py | 36 ++++++++++++++++++++++++++++++++---- 3 files changed, 38 insertions(+), 30 deletions(-) diff --git a/src/chat_control.py b/src/chat_control.py index 04d6abc00..fc59c2444 100644 --- a/src/chat_control.py +++ b/src/chat_control.py @@ -1432,34 +1432,13 @@ class ChatControl(ChatControlBase): self._convert_to_gc_button.set_sensitive(False) def update_mood(self): - mood = None - text = None - if isinstance(self.contact, GC_Contact): return - - if 'mood' in self.contact.mood: - mood = self.contact.mood['mood'].strip() - if 'text' in self.contact.mood: - text = self.contact.mood['text'].strip() - - if mood is not None: - if mood in MOODS: - self._mood_image.set_from_pixbuf(gtkgui_helpers.load_mood_icon( - mood).get_pixbuf()) - # Translate standard moods - mood = MOODS[mood] - else: - self._mood_image.set_from_pixbuf(gtkgui_helpers.load_mood_icon( - 'unknown').get_pixbuf()) - - mood = gobject.markup_escape_text(mood) - - tooltip = '%s' % mood - if text: - text = gobject.markup_escape_text(text) - tooltip += '\n' + text - self._mood_image.set_tooltip_markup(tooltip) + + pep = self.contact.pep + if 'mood' in pep and not pep['mood'].was_retracted(): + self._mood_image.set_from_pixbuf(pep['mood'].asPixbufIcon()) + self._mood_image.set_tooltip_markup(pep['mood'].asMarkup()) self._mood_image.show() else: self._mood_image.hide() diff --git a/src/common/contacts.py b/src/common/contacts.py index a4a64a0dd..b8b039288 100644 --- a/src/common/contacts.py +++ b/src/common/contacts.py @@ -110,6 +110,7 @@ class Contact(CommonContact): self.msg_id = msg_id self.last_status_time = last_status_time + self.pep = {} self.mood = mood.copy() self.tune = tune.copy() self.activity = activity.copy() diff --git a/src/common/pep.py b/src/common/pep.py index bd17e46ba..f11021ec7 100644 --- a/src/common/pep.py +++ b/src/common/pep.py @@ -197,8 +197,10 @@ TUNE_DATA = ['artist', 'title', 'source', 'track', 'length'] import logging log = logging.getLogger('gajim.c.pep') -import helpers -import atom +import common.helpers +import common.atom +import gtkgui_helpers +import gobject class AbstractPEP(object): @@ -223,6 +225,9 @@ class AbstractPEP(object): '''To be implemented by subclasses''' raise NotImplementedError + def was_rectacted(self): + return self._retracted + class UserMoodPEP(AbstractPEP): '''XEP-0107: User Mood''' @@ -239,10 +244,10 @@ class UserMoodPEP(AbstractPEP): name = child.getName().strip() if name == 'text': mood_dict['text'] = child.getData() - elif name in MOODS : + else: mood_dict['mood'] = name - retracted = items.getTag('retract') or not mood_dict + retracted = items.getTag('retract') or not 'mood' in mood_dict return (mood_dict, retracted) def do(self, jid, name): @@ -255,6 +260,7 @@ class UserMoodPEP(AbstractPEP): user = common.gajim.get_room_and_nick_from_fjid(jid)[0] for contact in common.gajim.contacts.get_contacts(name, user): contact.mood = mood_dict + contact.pep['mood'] = self if jid == common.gajim.get_jid_from_account(name): common.gajim.interface.roster.draw_account(name) @@ -262,7 +268,29 @@ class UserMoodPEP(AbstractPEP): ctrl = common.gajim.interface.msg_win_mgr.get_control(user, name) if ctrl: ctrl.update_mood() + + + def asPixbufIcon(self): + if self._retracted: + return None + else: + received_mood = self._pep_specific_data['mood'] + mood = received_mood if received_mood in MOODS else 'unknown' + pixbuf = gtkgui_helpers.load_mood_icon(mood).get_pixbuf() + return pixbuf + def asMarkupText(self): + if self._retracted: + return None + else: + untranslated_mood = self._pep_specific_data['mood'] + mood = MOODS[untranslated_mood] if untranslated_mood in MOODS else untranslated_mood + markuptext = '%s' % gobject.markup_escape_text(mood) + if 'text' in self._pep_specific_data: + text = self._pep_specific_data['text'] + markuptext += '(%s)' + gobject.markup_escape_text(text) + return markuptext + class UserTunePEP(AbstractPEP): '''XEP-0118: User Tune''' From 234a6520dd4a2639a3fdada45d9d9fe911a1fb5e Mon Sep 17 00:00:00 2001 From: Stephan Erb Date: Sun, 15 Nov 2009 00:15:31 +0100 Subject: [PATCH 009/259] Removed unused code. --- src/common/helpers.py | 49 ------------------------------------------- src/common/pep.py | 4 ++-- 2 files changed, 2 insertions(+), 51 deletions(-) diff --git a/src/common/helpers.py b/src/common/helpers.py index 70bdfc9fe..341ebb15f 100644 --- a/src/common/helpers.py +++ b/src/common/helpers.py @@ -569,8 +569,6 @@ def datetime_tuple(timestamp): # import gajim only when needed (after decode_string is defined) see #4764 import gajim -import pep - def convert_bytes(string): suffix = '' @@ -777,53 +775,6 @@ def get_global_status(): status = gajim.connections[account].status return status -def get_pep_dict(account): - pep_dict = {} - con = gajim.connections[account] - # activity - if 'activity' in con.activity and con.activity['activity'] in pep.ACTIVITIES: - activity = con.activity['activity'] - if 'subactivity' in con.activity and con.activity['subactivity'] in \ - pep.ACTIVITIES[activity]: - subactivity = con.activity['subactivity'] - else: - subactivity = 'other' - else: - activity = '' - subactivity = '' - if 'text' in con.activity: - text = con.activity['text'] - else: - text = '' - pep_dict['activity'] = activity - pep_dict['subactivity'] = subactivity - pep_dict['activity_text'] = text - - # mood - if 'mood' in con.mood and con.mood['mood'] in pep.MOODS: - mood = con.mood['mood'] - else: - mood = '' - if 'text' in con.mood: - text = con.mood['text'] - else: - text = '' - pep_dict['mood'] = mood - pep_dict['mood_text'] = text - return pep_dict - -def get_global_pep(): - maxi = 0 - pep_dict = {'activity': '', 'mood': ''} - for account in gajim.connections: - if not gajim.config.get_per('accounts', account, - 'sync_with_global_status'): - continue - connected = gajim.connections[account].connected - if connected > maxi: - maxi = connected - pep_dict = get_pep_dict(account) - return pep_dict def statuses_unified(): '''testing if all statuses are the same.''' diff --git a/src/common/pep.py b/src/common/pep.py index f11021ec7..e32c2c444 100644 --- a/src/common/pep.py +++ b/src/common/pep.py @@ -197,8 +197,8 @@ TUNE_DATA = ['artist', 'title', 'source', 'track', 'length'] import logging log = logging.getLogger('gajim.c.pep') -import common.helpers -import common.atom +import helpers +import atom import gtkgui_helpers import gobject From 5f4db2eed9c93e378317479cf3f2b28e6758017d Mon Sep 17 00:00:00 2001 From: Stephan Erb Date: Sun, 15 Nov 2009 10:55:31 +0100 Subject: [PATCH 010/259] Unify updating of accounts and contact pep information. Implement and use asMarkupText() for tunes. --- src/chat_control.py | 36 ++-------- src/common/connection.py | 1 + src/common/pep.py | 144 +++++++++++++++++++++++---------------- src/roster_window.py | 11 +-- src/tooltips.py | 36 ++-------- 5 files changed, 101 insertions(+), 127 deletions(-) diff --git a/src/chat_control.py b/src/chat_control.py index fc59c2444..ab6f10213 100644 --- a/src/chat_control.py +++ b/src/chat_control.py @@ -1434,11 +1434,10 @@ class ChatControl(ChatControlBase): def update_mood(self): if isinstance(self.contact, GC_Contact): return - pep = self.contact.pep - if 'mood' in pep and not pep['mood'].was_retracted(): + if 'mood' in pep: self._mood_image.set_from_pixbuf(pep['mood'].asPixbufIcon()) - self._mood_image.set_tooltip_markup(pep['mood'].asMarkup()) + self._mood_image.set_tooltip_markup(pep['mood'].asMarkupText()) self._mood_image.show() else: self._mood_image.hide() @@ -1489,35 +1488,12 @@ class ChatControl(ChatControlBase): self._activity_image.hide() def update_tune(self): - artist = None - title = None - source = None - if isinstance(self.contact, GC_Contact): return - - if 'artist' in self.contact.tune: - artist = self.contact.tune['artist'].strip() - artist = gobject.markup_escape_text(artist) - if 'title' in self.contact.tune: - title = self.contact.tune['title'].strip() - title = gobject.markup_escape_text(title) - if 'source' in self.contact.tune: - source = self.contact.tune['source'].strip() - source = gobject.markup_escape_text(source) - - if artist or title: - if not artist: - artist = _('Unknown Artist') - if not title: - title = _('Unknown Title') - if not source: - source = _('Unknown Source') - - self._tune_image.set_tooltip_markup( - _('"%(title)s" by %(artist)s\n' - 'from %(source)s') % {'title': title, 'artist': artist, - 'source': source}) + + pep = self.contact.pep + if 'tune' in pep: + self._tune_image.set_tooltip_markup(pep['tune'].asMarkupText()) self._tune_image.show() else: self._tune_image.hide() diff --git a/src/common/connection.py b/src/common/connection.py index 717684a6b..90df73d08 100644 --- a/src/common/connection.py +++ b/src/common/connection.py @@ -171,6 +171,7 @@ class Connection(ConnectionHandlers): self.mood = {} self.tune = {} self.activity = {} + self.pep = {} # Do we continue connection when we get roster (send presence,get vcard..) self.continue_connect_info = None # Do we auto accept insecure connection diff --git a/src/common/pep.py b/src/common/pep.py index e32c2c444..bbc388f2a 100644 --- a/src/common/pep.py +++ b/src/common/pep.py @@ -203,6 +203,13 @@ import gtkgui_helpers import gobject +def translate_mood(mood): + if mood in MOODS: + return MOODS[mood] + else: + return mood + + class AbstractPEP(object): type = '' @@ -219,14 +226,49 @@ class AbstractPEP(object): def __init__(self, jid, account, items): self._pep_specific_data, self._retracted = self._extract_info(items) + + self._update_contacts(jid, account) + if jid == common.gajim.get_jid_from_account(account): + self._update_account(account) + self.do(jid, account) def _extract_info(self, items): '''To be implemented by subclasses''' raise NotImplementedError - def was_rectacted(self): - return self._retracted + def _update_contacts(self, jid, account): + dict = {} if self._retracted else self._pep_specific_data + + for contact in common.gajim.contacts.get_contacts(account, jid): + setattr(contact, self.type, dict) + + if self._retracted: + if self.type in contact.pep: + del contact.pep[self.type] + else: + contact.pep[self.type] = self + + def _update_account(self, account): + dict = {} if self._retracted else self._pep_specific_data + + acc = common.gajim.connections[account] + setattr(acc, self.type, dict) + + if self._retracted: + if self.type in acc.pep: + del acc.pep[self.type] + else: + acc.pep[self.type] = self + + def asPixbufIcon(self): + '''To be implemented by subclasses''' + raise NotImplementedError + + def asMarkupText(self): + '''To be implemented by subclasses''' + raise NotImplementedError + class UserMoodPEP(AbstractPEP): '''XEP-0107: User Mood''' @@ -251,45 +293,31 @@ class UserMoodPEP(AbstractPEP): return (mood_dict, retracted) def do(self, jid, name): - mood_dict = {} if self._retracted else self._pep_specific_data - - if jid == common.gajim.get_jid_from_account(name): - acc = common.gajim.connections[name] - acc.mood = mood_dict - - user = common.gajim.get_room_and_nick_from_fjid(jid)[0] - for contact in common.gajim.contacts.get_contacts(name, user): - contact.mood = mood_dict - contact.pep['mood'] = self - + if jid == common.gajim.get_jid_from_account(name): common.gajim.interface.roster.draw_account(name) - common.gajim.interface.roster.draw_mood(user, name) - ctrl = common.gajim.interface.msg_win_mgr.get_control(user, name) + common.gajim.interface.roster.draw_mood(jid, name) + ctrl = common.gajim.interface.msg_win_mgr.get_control(jid, name) if ctrl: ctrl.update_mood() def asPixbufIcon(self): - if self._retracted: - return None - else: - received_mood = self._pep_specific_data['mood'] - mood = received_mood if received_mood in MOODS else 'unknown' - pixbuf = gtkgui_helpers.load_mood_icon(mood).get_pixbuf() - return pixbuf + assert not self._retracted + received_mood = self._pep_specific_data['mood'] + mood = received_mood if received_mood in MOODS else 'unknown' + pixbuf = gtkgui_helpers.load_mood_icon(mood).get_pixbuf() + return pixbuf def asMarkupText(self): - if self._retracted: - return None - else: - untranslated_mood = self._pep_specific_data['mood'] - mood = MOODS[untranslated_mood] if untranslated_mood in MOODS else untranslated_mood - markuptext = '%s' % gobject.markup_escape_text(mood) - if 'text' in self._pep_specific_data: - text = self._pep_specific_data['text'] - markuptext += '(%s)' + gobject.markup_escape_text(text) - return markuptext + assert not self._retracted + untranslated_mood = self._pep_specific_data['mood'] + mood = translate_mood(untranslated_mood) + markuptext = '%s' % gobject.markup_escape_text(mood) + if 'text' in self._pep_specific_data: + text = self._pep_specific_data['text'] + markuptext += ' (%s)' % gobject.markup_escape_text(text) + return markuptext class UserTunePEP(AbstractPEP): @@ -310,27 +338,36 @@ class UserTunePEP(AbstractPEP): if child.getName() in TUNE_DATA: tune_dict[name] = data - retracted = items.getTag('retract') or not tune_dict + retracted = items.getTag('retract') or not ('artist' in tune_dict or + 'title' in tune_dict) return (tune_dict, retracted) - def do(self, jid, name): - tune_dict = {} if self._retracted else self._pep_specific_data - - if jid == common.gajim.get_jid_from_account(name): - acc = common.gajim.connections[name] - acc.tune = tune_dict - - user = common.gajim.get_room_and_nick_from_fjid(jid)[0] - for contact in common.gajim.contacts.get_contacts(name, user): - contact.tune = tune_dict - + def do(self, jid, name): if jid == common.gajim.get_jid_from_account(name): common.gajim.interface.roster.draw_account(name) - common.gajim.interface.roster.draw_tune(user, name) - ctrl = common.gajim.interface.msg_win_mgr.get_control(user, name) + common.gajim.interface.roster.draw_tune(jid, name) + ctrl = common.gajim.interface.msg_win_mgr.get_control(jid, name) if ctrl: ctrl.update_tune() + + def asMarkupText(self): + assert not self._retracted + tune = self._pep_specific_data + + artist = tune.get('artist', _('Unknown Artist')) + artist = gobject.markup_escape_text(artist) + + title = tune.get('title', _('Unknown Title')) + title = gobject.markup_escape_text(title) + + source = tune.get('source', _('Unknown Source')) + source = gobject.markup_escape_text(source) + + tune_string = _('"%(title)s" by %(artist)s\n' + 'from %(source)s') % {'title': title, + 'artist': artist, 'source': source} + return tune_string class UserActivityPEP(AbstractPEP): @@ -361,20 +398,11 @@ class UserActivityPEP(AbstractPEP): return (activity_dict, retracted) def do(self, jid, name): - activity_dict = {} if self._retracted else self._pep_specific_data - - if jid == common.gajim.get_jid_from_account(name): - acc = common.gajim.connections[name] - acc.activity = activity_dict - - user = common.gajim.get_room_and_nick_from_fjid(jid)[0] - for contact in common.gajim.contacts.get_contacts(name, user): - contact.activity = activity_dict if jid == common.gajim.get_jid_from_account(name): common.gajim.interface.roster.draw_account(name) - common.gajim.interface.roster.draw_activity(user, name) - ctrl = common.gajim.interface.msg_win_mgr.get_control(user, name) + common.gajim.interface.roster.draw_activity(jid, name) + ctrl = common.gajim.interface.msg_win_mgr.get_control(jid, name) if ctrl: ctrl.update_activity() @@ -437,7 +465,7 @@ class ConnectionPEP: for pep_class in SUPPORTED_PERSONAL_USER_EVENTS: pep = pep_class.get_tag_as_PEP(jid, self.name, event_tag) if pep: - self.dispatch('PEP_RECEIVED', (pep.type, pep)) + self.dispatch('PEP_RECEIVED', (jid, pep.type)) items = event_tag.getTag('items') if items is None: return diff --git a/src/roster_window.py b/src/roster_window.py index 4ea9d884a..93bdef75a 100644 --- a/src/roster_window.py +++ b/src/roster_window.py @@ -1281,15 +1281,10 @@ class RosterWindow: iters = self._get_contact_iter(jid, account, model=self.model) if not iters or not gajim.config.get('show_mood_in_roster'): return - jid = self.model[iters[0]][C_JID] - jid = jid.decode('utf-8') + jid = self.model[iters[0]][C_JID].decode('utf-8') contact = gajim.contacts.get_contact(account, jid) - if 'mood' in contact.mood and contact.mood['mood'].strip() in MOODS: - pixbuf = gtkgui_helpers.load_mood_icon( - contact.mood['mood'].strip()).get_pixbuf() - elif 'mood' in contact.mood: - pixbuf = gtkgui_helpers.load_mood_icon( - 'unknown').get_pixbuf() + if 'mood' in contact.pep: + pixbuf = contact.pep['mood'].asPixbufIcon() else: pixbuf = None for child_iter in iters: diff --git a/src/tooltips.py b/src/tooltips.py index fa96cbd8c..47f44b1ff 100644 --- a/src/tooltips.py +++ b/src/tooltips.py @@ -579,17 +579,9 @@ class RosterTooltip(NotificationAreaTooltip): Append Tune, Mood, Activity information of the specified contact to the given property list. ''' - if 'mood' in contact.mood: - mood = contact.mood['mood'].strip() - mood = MOODS.get(mood, mood) - mood = gobject.markup_escape_text(mood) + if 'mood' in contact.pep: + mood = contact.pep['mood'].asMarkupText() mood_string = _('Mood:') + ' %s' % mood - if 'text' in contact.mood \ - and contact.mood['text'] != '': - mood_text = contact.mood['text'].strip() - mood_text = \ - gobject.markup_escape_text(mood_text) - mood_string += ' (%s)' % mood_text properties.append((mood_string, None)) if 'activity' in contact.activity: @@ -617,27 +609,9 @@ class RosterTooltip(NotificationAreaTooltip): activity_string += ' (%s)' % activity_text properties.append((activity_string, None)) - if 'artist' in contact.tune \ - or 'title' in contact.tune: - if 'artist' in contact.tune: - artist = contact.tune['artist'].strip() - artist = gobject.markup_escape_text(artist) - else: - artist = _('Unknown Artist') - if 'title' in contact.tune: - title = contact.tune['title'].strip() - title = gobject.markup_escape_text(title) - else: - title = _('Unknown Title') - if 'source' in contact.tune: - source = contact.tune['source'].strip() - source = gobject.markup_escape_text(source) - else: - source = _('Unknown Source') - tune_string = _('Tune:') + ' ' + \ - _('"%(title)s" by %(artist)s\n' - 'from %(source)s') % {'title': title, - 'artist': artist, 'source': source} + if 'tune' in contact.pep: + tune = contact.pep['tune'].asMarkupText() + tune_string = _('Tune:') + ' %s' % tune properties.append((tune_string, None)) From 6c0fb26e58ecd746a799a4998e7fa4b6d8c45f83 Mon Sep 17 00:00:00 2001 From: Stephan Erb Date: Sun, 15 Nov 2009 11:11:51 +0100 Subject: [PATCH 011/259] Use central event_handler in Interface() instead of updating the GUI directly from XMPP callbacks. --- src/common/pep.py | 70 ++++++++++---------------------------------- src/gui_interface.py | 30 +++++++++++++++++++ 2 files changed, 46 insertions(+), 54 deletions(-) diff --git a/src/common/pep.py b/src/common/pep.py index bbc388f2a..ad4d3f815 100644 --- a/src/common/pep.py +++ b/src/common/pep.py @@ -230,8 +230,6 @@ class AbstractPEP(object): self._update_contacts(jid, account) if jid == common.gajim.get_jid_from_account(account): self._update_account(account) - - self.do(jid, account) def _extract_info(self, items): '''To be implemented by subclasses''' @@ -291,16 +289,6 @@ class UserMoodPEP(AbstractPEP): retracted = items.getTag('retract') or not 'mood' in mood_dict return (mood_dict, retracted) - - def do(self, jid, name): - - if jid == common.gajim.get_jid_from_account(name): - common.gajim.interface.roster.draw_account(name) - common.gajim.interface.roster.draw_mood(jid, name) - ctrl = common.gajim.interface.msg_win_mgr.get_control(jid, name) - if ctrl: - ctrl.update_mood() - def asPixbufIcon(self): assert not self._retracted @@ -341,16 +329,7 @@ class UserTunePEP(AbstractPEP): retracted = items.getTag('retract') or not ('artist' in tune_dict or 'title' in tune_dict) return (tune_dict, retracted) - - - def do(self, jid, name): - if jid == common.gajim.get_jid_from_account(name): - common.gajim.interface.roster.draw_account(name) - common.gajim.interface.roster.draw_tune(jid, name) - ctrl = common.gajim.interface.msg_win_mgr.get_control(jid, name) - if ctrl: - ctrl.update_tune() - + def asMarkupText(self): assert not self._retracted tune = self._pep_specific_data @@ -397,20 +376,11 @@ class UserActivityPEP(AbstractPEP): retracted = items.getTag('retract') or not activity_dict return (activity_dict, retracted) - def do(self, jid, name): - - if jid == common.gajim.get_jid_from_account(name): - common.gajim.interface.roster.draw_account(name) - common.gajim.interface.roster.draw_activity(jid, name) - ctrl = common.gajim.interface.msg_win_mgr.get_control(jid, name) - if ctrl: - ctrl.update_activity() - - + class UserNicknamePEP(AbstractPEP): '''XEP-0172: User Nickname''' - type = 'activity' + type = 'nickname' namespace = common.xmpp.NS_NICK def _extract_info(self, items): @@ -423,29 +393,21 @@ class UserNicknamePEP(AbstractPEP): retracted = items.getTag('retract') or not nick return (nick, retracted) - - def do(self, jid, name): - if jid == common.gajim.get_jid_from_account(name): - if self._retracted: - common.gajim.nicks[name] = common.gajim.config.get_per('accounts', - name, 'name') - else: - common.gajim.nicks[name] = self._pep_specific_data - + + def _update_contacts(self, jid, account): + # TODO: use dict instead nick = '' if self._retracted else self._pep_specific_data - - user = common.gajim.get_room_and_nick_from_fjid(jid)[0] - for contact in common.gajim.contacts.get_contacts(name, user): + for contact in common.gajim.contacts.get_contacts(account, jid): contact.contact_name = nick - common.gajim.interface.roster.draw_contact(user, name) - - ctrl = common.gajim.interface.msg_win_mgr.get_control(user, name) - if ctrl: - ctrl.update_ui() - win = ctrl.parent_win - win.redraw_tab(ctrl) - win.show_title() - + + def _update_account(self, account): + # TODO: use dict instead + if self._retracted: + common.gajim.nicks[account] = common.gajim.config.get_per('accounts', + account, 'name') + else: + common.gajim.nicks[account] = self._pep_specific_data + SUPPORTED_PERSONAL_USER_EVENTS = [UserMoodPEP, UserTunePEP, UserActivityPEP, UserNicknamePEP] diff --git a/src/gui_interface.py b/src/gui_interface.py index 812aba08a..8aec6f993 100644 --- a/src/gui_interface.py +++ b/src/gui_interface.py @@ -1989,6 +1989,35 @@ class Interface: _('PEP node %(node)s was not removed: %(message)s') % { 'node': data[1], 'message': data[2]}) + def handle_event_pep_received(self, account, data): + # ('PEP_RECEIVED', account, (jid, pep_type)) + jid = data[0] + pep_type = data[1] + ctrl = common.gajim.interface.msg_win_mgr.get_control(jid, account) + + if jid == common.gajim.get_jid_from_account(account): + self.roster.draw_account(account) + + if pep_type == 'mood': + self.roster.draw_mood(jid, account) + if ctrl: + ctrl.update_mood() + elif pep_type == 'tune': + self.roster.draw_tune(jid, account) + if ctrl: + ctrl.update_tune() + elif pep_type == 'activity': + self.roster.draw_activity(jid, account) + if ctrl: + ctrl.update_activity() + elif pep_type == 'nickname': + self.roster.draw_contact(jid, account) + if ctrl: + ctrl.update_ui() + win = ctrl.parent_win + win.redraw_tab(ctrl) + win.show_title() + def register_handler(self, event, handler): if event not in self.handlers: self.handlers[event] = [] @@ -2088,6 +2117,7 @@ class Interface: 'JINGLE_CONNECTED': [self.handle_event_jingle_connected], 'JINGLE_DISCONNECTED': [self.handle_event_jingle_disconnected], 'JINGLE_ERROR': [self.handle_event_jingle_error], + 'PEP_RECEIVED': [self.handle_event_pep_received] } def dispatch(self, event, account, data): From 30191888bab4132556fd4a368271a3fa7026a4f1 Mon Sep 17 00:00:00 2001 From: Stephan Erb Date: Sun, 15 Nov 2009 16:52:19 +0100 Subject: [PATCH 012/259] Create asPixbufIcon and asMarkupText functions on the UserActivity class. --- src/chat_control.py | 43 ++++------------------------------ src/common/pep.py | 55 ++++++++++++++++++++++++++++++++++++++++---- src/roster_window.py | 21 ++++------------- src/tooltips.py | 28 ++++------------------ 4 files changed, 62 insertions(+), 85 deletions(-) diff --git a/src/chat_control.py b/src/chat_control.py index ab6f10213..b71033da5 100644 --- a/src/chat_control.py +++ b/src/chat_control.py @@ -1443,46 +1443,12 @@ class ChatControl(ChatControlBase): self._mood_image.hide() def update_activity(self): - activity = None - subactivity = None - text = None - if isinstance(self.contact, GC_Contact): return - - if 'activity' in self.contact.activity: - activity = self.contact.activity['activity'].strip() - if 'subactivity' in self.contact.activity: - subactivity = self.contact.activity['subactivity'].strip() - if 'text' in self.contact.activity: - text = self.contact.activity['text'].strip() - - if activity is not None: - if activity in ACTIVITIES: - # Translate standard activities - if subactivity in ACTIVITIES[activity]: - self._activity_image.set_from_pixbuf( - gtkgui_helpers.load_activity_icon(activity, subactivity). \ - get_pixbuf()) - subactivity = ACTIVITIES[activity][subactivity] - else: - self._activity_image.set_from_pixbuf( - gtkgui_helpers.load_activity_icon(activity).get_pixbuf()) - activity = ACTIVITIES[activity]['category'] - else: - self._activity_image.set_from_pixbuf( - gtkgui_helpers.load_activity_icon('unknown').get_pixbuf()) - - # Translate standard subactivities - - tooltip = '' + gobject.markup_escape_text(activity) - if subactivity: - tooltip += ': ' + gobject.markup_escape_text(subactivity) - tooltip += '' - if text: - tooltip += '\n' + gobject.markup_escape_text(text) - self._activity_image.set_tooltip_markup(tooltip) - + pep = self.contact.pep + if 'activity' in pep: + self._activity_image.set_from_pixbuf(pep['activity'].asPixbufIcon()) + self._activity_image.set_tooltip_markup(pep['activity'].asMarkupText()) self._activity_image.show() else: self._activity_image.hide() @@ -1490,7 +1456,6 @@ class ChatControl(ChatControlBase): def update_tune(self): if isinstance(self.contact, GC_Contact): return - pep = self.contact.pep if 'tune' in pep: self._tune_image.set_tooltip_markup(pep['tune'].asMarkupText()) diff --git a/src/common/pep.py b/src/common/pep.py index ad4d3f815..13a774a1b 100644 --- a/src/common/pep.py +++ b/src/common/pep.py @@ -201,6 +201,8 @@ import helpers import atom import gtkgui_helpers import gobject +import gajim +import gtk def translate_mood(mood): @@ -329,6 +331,11 @@ class UserTunePEP(AbstractPEP): retracted = items.getTag('retract') or not ('artist' in tune_dict or 'title' in tune_dict) return (tune_dict, retracted) + + def asPixbufIcon(self): + import os + path = os.path.join(gajim.DATA_DIR, 'emoticons', 'static', 'music.png') + return gtk.gdk.pixbuf_new_from_file(path) def asMarkupText(self): assert not self._retracted @@ -366,16 +373,54 @@ class UserActivityPEP(AbstractPEP): data = child.getData().strip() if name == 'text': activity_dict['text'] = data - elif name in ACTIVITIES: + else: activity_dict['activity'] = name for subactivity in child.getChildren(): subactivity_name = subactivity.getName().strip() - if subactivity_name in ACTIVITIES[name]: - activity_dict['subactivity'] = subactivity_name + activity_dict['subactivity'] = subactivity_name - retracted = items.getTag('retract') or not activity_dict + retracted = items.getTag('retract') or not 'activity' in activity_dict return (activity_dict, retracted) + + def asPixbufIcon(self): + assert not self._retracted + pep = self._pep_specific_data + activity = pep['activity'] + has_known_activity = activity in ACTIVITIES + has_known_subactivity = (has_known_activity and ('subactivity' in pep) + and (pep['subactivity'] in ACTIVITIES[activity])) + + if has_known_activity: + if has_known_subactivity: + subactivity = pep['subactivity'] + return gtkgui_helpers.load_activity_icon(activity, subactivity).get_pixbuf() + else: + return gtkgui_helpers.load_activity_icon(activity).get_pixbuf() + else: + return gtkgui_helpers.load_activity_icon('unknown').get_pixbuf() + + def asMarkupText(self): + assert not self._retracted + pep = self._pep_specific_data + activity = pep['activity'] + subactivity = pep['subactivity'] if 'subactivity' in pep else None + text = pep['text'] if 'text' in pep else None + + if activity in ACTIVITIES: + # Translate standard activities + if subactivity in ACTIVITIES[activity]: + subactivity = ACTIVITIES[activity][subactivity] + activity = ACTIVITIES[activity]['category'] + + markuptext = '' + gobject.markup_escape_text(activity) + if subactivity: + markuptext += ': ' + gobject.markup_escape_text(subactivity) + markuptext += '' + if text: + markuptext += ' (%s)' + gobject.markup_escape_text(text) + return markuptext + class UserNicknamePEP(AbstractPEP): '''XEP-0172: User Nickname''' @@ -404,7 +449,7 @@ class UserNicknamePEP(AbstractPEP): # TODO: use dict instead if self._retracted: common.gajim.nicks[account] = common.gajim.config.get_per('accounts', - account, 'name') + account, 'name') else: common.gajim.nicks[account] = self._pep_specific_data diff --git a/src/roster_window.py b/src/roster_window.py index 93bdef75a..4206a2844 100644 --- a/src/roster_window.py +++ b/src/roster_window.py @@ -1299,20 +1299,8 @@ class RosterWindow: jid = self.model[iters[0]][C_JID] jid = jid.decode('utf-8') contact = gajim.contacts.get_contact(account, jid) - if 'activity' in contact.activity \ - and contact.activity['activity'].strip() in ACTIVITIES: - if 'subactivity' in contact.activity \ - and contact.activity['subactivity'].strip() in \ - ACTIVITIES[contact.activity['activity'].strip()]: - pixbuf = gtkgui_helpers.load_activity_icon( - contact.activity['activity'].strip(), - contact.activity['subactivity'].strip()).get_pixbuf() - else: - pixbuf = gtkgui_helpers.load_activity_icon( - contact.activity['activity'].strip()).get_pixbuf() - elif 'activity' in contact.activity: - pixbuf = gtkgui_helpers.load_activity_icon( - 'unknown').get_pixbuf() + if 'activity' in contact.pep: + pixbuf = contact.pep['activity'].asPixbufIcon() else: pixbuf = None for child_iter in iters: @@ -1327,9 +1315,8 @@ class RosterWindow: jid = self.model[iters[0]][C_JID] jid = jid.decode('utf-8') contact = gajim.contacts.get_contact(account, jid) - if 'artist' in contact.tune or 'title' in contact.tune: - path = os.path.join(gajim.DATA_DIR, 'emoticons', 'static', 'music.png') - pixbuf = gtk.gdk.pixbuf_new_from_file(path) + if 'tune' in contact.pep: + pixbuf = contact.pep['tune'].asPixbufIcon() else: pixbuf = None for child_iter in iters: diff --git a/src/tooltips.py b/src/tooltips.py index 47f44b1ff..847e6a17a 100644 --- a/src/tooltips.py +++ b/src/tooltips.py @@ -581,32 +581,12 @@ class RosterTooltip(NotificationAreaTooltip): ''' if 'mood' in contact.pep: mood = contact.pep['mood'].asMarkupText() - mood_string = _('Mood:') + ' %s' % mood + mood_string = _('Mood:') + ' %s' % mood properties.append((mood_string, None)) - if 'activity' in contact.activity: - activity = act_plain = \ - contact.activity['activity'].strip() - activity = gobject.markup_escape_text(activity) - if act_plain in ACTIVITIES: - activity = ACTIVITIES[activity]['category'] - activity_string = _('Activity:') + ' %s' % activity - if 'subactivity' in contact.activity: - activity_sub = \ - contact.activity['subactivity'].strip() - if act_plain in ACTIVITIES and activity_sub in \ - ACTIVITIES[act_plain]: - activity_sub = ACTIVITIES[act_plain][activity_sub] - activity_sub = \ - gobject.markup_escape_text(activity_sub) - activity_string += ': %s' % activity_sub - else: - activity_string += '' - if 'text' in contact.activity: - activity_text = contact.activity['text'].strip() - activity_text = gobject.markup_escape_text( - activity_text) - activity_string += ' (%s)' % activity_text + if 'activity' in contact.pep: + activity = contact.pep['activity'].asMarkupText() + activity_string = _('Activity:') + ' %s' % activity properties.append((activity_string, None)) if 'tune' in contact.pep: From b7c7beafd96de0665581a7f4814c63468b24b482 Mon Sep 17 00:00:00 2001 From: Stephan Erb Date: Sun, 15 Nov 2009 17:00:39 +0100 Subject: [PATCH 013/259] Unify the PEP drawing methods in the RosterWindow. --- src/roster_window.py | 46 ++++++++++++-------------------------------- 1 file changed, 12 insertions(+), 34 deletions(-) diff --git a/src/roster_window.py b/src/roster_window.py index 4206a2844..01be6b2cc 100644 --- a/src/roster_window.py +++ b/src/roster_window.py @@ -1276,53 +1276,31 @@ class RosterWindow: return False - def draw_mood(self, jid, account): - iters = self._get_contact_iter(jid, account, model=self.model) - if not iters or not gajim.config.get('show_mood_in_roster'): - return - jid = self.model[iters[0]][C_JID].decode('utf-8') - contact = gajim.contacts.get_contact(account, jid) - if 'mood' in contact.pep: - pixbuf = contact.pep['mood'].asPixbufIcon() - else: - pixbuf = None - for child_iter in iters: - self.model[child_iter][C_MOOD_PIXBUF] = pixbuf - return False - + if gajim.config.get('show_mood_in_roster'): + self._draw_pep(jid, account, 'tune', C_MOOD_PIXBUF) def draw_activity(self, jid, account): - iters = self._get_contact_iter(jid, account, model=self.model) - if not iters or not gajim.config.get('show_activity_in_roster'): - return - jid = self.model[iters[0]][C_JID] - jid = jid.decode('utf-8') - contact = gajim.contacts.get_contact(account, jid) - if 'activity' in contact.pep: - pixbuf = contact.pep['activity'].asPixbufIcon() - else: - pixbuf = None - for child_iter in iters: - self.model[child_iter][C_ACTIVITY_PIXBUF] = pixbuf - return False - + if gajim.config.get('show_activity_in_roster'): + self._draw_pep(jid, account, 'tune', C_ACTIVITY_PIXBUF) def draw_tune(self, jid, account): + if gajim.config.get('show_tunes_in_roster'): + self._draw_pep(jid, account, 'tune', C_TUNE_PIXBUF) + + def _draw_pep(self, jid, account, pep_type, model_column): iters = self._get_contact_iter(jid, account, model=self.model) - if not iters or not gajim.config.get('show_tunes_in_roster'): + if not iters: return jid = self.model[iters[0]][C_JID] jid = jid.decode('utf-8') contact = gajim.contacts.get_contact(account, jid) - if 'tune' in contact.pep: - pixbuf = contact.pep['tune'].asPixbufIcon() + if pep_type in contact.pep: + pixbuf = contact.pep[pep_type].asPixbufIcon() else: pixbuf = None for child_iter in iters: - self.model[child_iter][C_TUNE_PIXBUF] = pixbuf - return False - + self.model[child_iter][model_column] = pixbuf def draw_avatar(self, jid, account): iters = self._get_contact_iter(jid, account, model=self.model) From 3b15d70782290a67bb32ef79bea1d2abb3ad48a5 Mon Sep 17 00:00:00 2001 From: Stephan Erb Date: Sun, 15 Nov 2009 17:11:06 +0100 Subject: [PATCH 014/259] Unify PEP cell_data_functions. --- src/roster_window.py | 150 +++++-------------------------------------- 1 file changed, 16 insertions(+), 134 deletions(-) diff --git a/src/roster_window.py b/src/roster_window.py index 01be6b2cc..6d06388f8 100644 --- a/src/roster_window.py +++ b/src/roster_window.py @@ -1278,11 +1278,11 @@ class RosterWindow: def draw_mood(self, jid, account): if gajim.config.get('show_mood_in_roster'): - self._draw_pep(jid, account, 'tune', C_MOOD_PIXBUF) + self._draw_pep(jid, account, 'mood', C_MOOD_PIXBUF) def draw_activity(self, jid, account): if gajim.config.get('show_activity_in_roster'): - self._draw_pep(jid, account, 'tune', C_ACTIVITY_PIXBUF) + self._draw_pep(jid, account, 'activity', C_ACTIVITY_PIXBUF) def draw_tune(self, jid, account): if gajim.config.get('show_tunes_in_roster'): @@ -4441,9 +4441,9 @@ class RosterWindow: renderer.set_property('xpad', 8) - def _fill_mood_pixbuf_renderer(self, column, renderer, model, titer, - data = None): - '''When a row is added, set properties for avatar renderer''' + def _fill_pep_pixbuf_renderer(self, column, renderer, model, titer, + data=None): + '''When a row is added, draw the respective pep icon''' theme = gajim.config.get('roster_theme') type_ = model[titer][C_TYPE] if type_ == 'group': @@ -4451,155 +4451,37 @@ class RosterWindow: return # allocate space for the icon only if needed - if model[titer][C_MOOD_PIXBUF]: + if model[titer][data]: renderer.set_property('visible', True) else: renderer.set_property('visible', False) if type_ == 'account': - color = gajim.config.get_per('themes', theme, - 'accountbgcolor') + color = gajim.config.get_per('themes', theme, 'accountbgcolor') if color: renderer.set_property('cell-background', color) else: - self.set_renderer_color(renderer, - gtk.STATE_ACTIVE) + self.set_renderer_color(renderer, gtk.STATE_ACTIVE) # align pixbuf to the right) renderer.set_property('xalign', 1) # prevent type_ = None, see http://trac.gajim.org/ticket/2534 elif type_: - if not model[titer][C_JID] \ - or not model[titer][C_ACCOUNT]: + if not model[titer][C_JID] or not model[titer][C_ACCOUNT]: # This can append at the moment we add the row return jid = model[titer][C_JID].decode('utf-8') account = model[titer][C_ACCOUNT].decode('utf-8') if jid in gajim.newly_added[account]: - renderer.set_property('cell-background', - gajim.config.get( + renderer.set_property('cell-background', gajim.config.get( 'just_connected_bg_color')) elif jid in gajim.to_be_removed[account]: - renderer.set_property('cell-background', - gajim.config.get( + renderer.set_property('cell-background', gajim.config.get( 'just_disconnected_bg_color')) else: - color = gajim.config.get_per('themes', - theme, 'contactbgcolor') - if color: - renderer.set_property( - 'cell-background', color) - else: - renderer.set_property( - 'cell-background', None) + color = gajim.config.get_per('themes', theme, 'contactbgcolor') + renderer.set_property('cell-background', color if color else None) # align pixbuf to the right renderer.set_property('xalign', 1) - - def _fill_activity_pixbuf_renderer(self, column, renderer, model, titer, - data = None): - '''When a row is added, set properties for avatar renderer''' - theme = gajim.config.get('roster_theme') - type_ = model[titer][C_TYPE] - if type_ == 'group': - renderer.set_property('visible', False) - return - - # allocate space for the icon only if needed - if model[titer][C_ACTIVITY_PIXBUF]: - renderer.set_property('visible', True) - else: - renderer.set_property('visible', False) - if type_ == 'account': - color = gajim.config.get_per('themes', theme, - 'accountbgcolor') - if color: - renderer.set_property('cell-background', color) - else: - self.set_renderer_color(renderer, - gtk.STATE_ACTIVE) - # align pixbuf to the right) - renderer.set_property('xalign', 1) - # prevent type_ = None, see http://trac.gajim.org/ticket/2534 - elif type_: - if not model[titer][C_JID] \ - or not model[titer][C_ACCOUNT]: - # This can append at the moment we add the row - return - jid = model[titer][C_JID].decode('utf-8') - account = model[titer][C_ACCOUNT].decode('utf-8') - if jid in gajim.newly_added[account]: - renderer.set_property('cell-background', - gajim.config.get( - 'just_connected_bg_color')) - elif jid in gajim.to_be_removed[account]: - renderer.set_property('cell-background', - gajim.config.get( - 'just_disconnected_bg_color')) - else: - color = gajim.config.get_per('themes', - theme, 'contactbgcolor') - if color: - renderer.set_property( - 'cell-background', color) - else: - renderer.set_property( - 'cell-background', None) - # align pixbuf to the right - renderer.set_property('xalign', 1) - - - def _fill_tune_pixbuf_renderer(self, column, renderer, model, titer, - data = None): - '''When a row is added, set properties for avatar renderer''' - theme = gajim.config.get('roster_theme') - type_ = model[titer][C_TYPE] - if type_ == 'group': - renderer.set_property('visible', False) - return - - # allocate space for the icon only if needed - if model[titer][C_TUNE_PIXBUF]: - renderer.set_property('visible', True) - else: - renderer.set_property('visible', False) - if type_ == 'account': - color = gajim.config.get_per('themes', theme, - 'accountbgcolor') - if color: - renderer.set_property('cell-background', color) - else: - self.set_renderer_color(renderer, - gtk.STATE_ACTIVE) - # align pixbuf to the right) - renderer.set_property('xalign', 1) - # prevent type_ = None, see http://trac.gajim.org/ticket/2534 - elif type_: - if not model[titer][C_JID] \ - or not model[titer][C_ACCOUNT]: - # This can append at the moment we add the row - return - jid = model[titer][C_JID].decode('utf-8') - account = model[titer][C_ACCOUNT].decode('utf-8') - if jid in gajim.newly_added[account]: - renderer.set_property('cell-background', - gajim.config.get( - 'just_connected_bg_color')) - elif jid in gajim.to_be_removed[account]: - renderer.set_property('cell-background', - gajim.config.get( - 'just_disconnected_bg_color')) - else: - color = gajim.config.get_per('themes', - theme, 'contactbgcolor') - if color: - renderer.set_property( - 'cell-background', color) - else: - renderer.set_property( - 'cell-background', None) - # align pixbuf to the right - renderer.set_property('xalign', 1) - - def _fill_avatar_pixbuf_renderer(self, column, renderer, model, titer, data = None): '''When a row is added, set properties for avatar renderer''' @@ -5893,19 +5775,19 @@ class RosterWindow: col.pack_start(render_pixbuf, expand=False) col.add_attribute(render_pixbuf, 'pixbuf', C_MOOD_PIXBUF) col.set_cell_data_func(render_pixbuf, - self._fill_mood_pixbuf_renderer, None) + self._fill_pep_pixbuf_renderer, C_MOOD_PIXBUF) render_pixbuf = gtk.CellRendererPixbuf() col.pack_start(render_pixbuf, expand=False) col.add_attribute(render_pixbuf, 'pixbuf', C_ACTIVITY_PIXBUF) col.set_cell_data_func(render_pixbuf, - self._fill_activity_pixbuf_renderer, None) + self._fill_pep_pixbuf_renderer, C_ACTIVITY_PIXBUF) render_pixbuf = gtk.CellRendererPixbuf() col.pack_start(render_pixbuf, expand=False) col.add_attribute(render_pixbuf, 'pixbuf', C_TUNE_PIXBUF) col.set_cell_data_func(render_pixbuf, - self._fill_tune_pixbuf_renderer, None) + self._fill_pep_pixbuf_renderer, C_TUNE_PIXBUF) if gajim.config.get('avatar_position_in_roster') == 'right': add_avatar_renderer() From b2c5810869f6a62de2dd69c893d7ad0385e79998 Mon Sep 17 00:00:00 2001 From: Thibaut GIRKA Date: Sun, 15 Nov 2009 20:47:06 +0100 Subject: [PATCH 015/259] Refactorize a bit jingle.py and split it into different files. There is still room for improvement, but it should be better. --- src/common/jingle.py | 1074 +------------------------------- src/common/jingle_content.py | 102 +++ src/common/jingle_rtp.py | 314 ++++++++++ src/common/jingle_session.py | 613 ++++++++++++++++++ src/common/jingle_transport.py | 139 +++++ 5 files changed, 1175 insertions(+), 1067 deletions(-) create mode 100644 src/common/jingle_content.py create mode 100644 src/common/jingle_rtp.py create mode 100644 src/common/jingle_session.py create mode 100644 src/common/jingle_transport.py diff --git a/src/common/jingle.py b/src/common/jingle.py index 6549ee10c..8a369ff7e 100644 --- a/src/common/jingle.py +++ b/src/common/jingle.py @@ -13,17 +13,6 @@ ''' Handles the jingle signalling protocol. ''' #TODO: -# * things in XEP 0166, including: -# - 'senders' attribute of 'content' element -# - security preconditions -# * actions: -# - content-modify -# - description-info, session-info -# - security-info -# - transport-accept, transport-reject -# * sid/content related: -# - tiebreaking -# - if there already is a session, use it # * things in XEP 0176, including: # - http://xmpp.org/extensions/xep-0176.html#protocol-restarts # - http://xmpp.org/extensions/xep-0176.html#fallback @@ -36,1064 +25,15 @@ # - codecs # - STUN -# * DONE: figure out why it doesn't work with pidgin: -# That's a bug in pidgin: http://xmpp.org/extensions/xep-0176.html#protocol-checks +# * figure out why it doesn't work with pidgin: +# That's maybe a bug in pidgin: +# http://xmpp.org/extensions/xep-0176.html#protocol-checks -# * timeout - -# * split this file in several modules -# For example, a file dedicated for XEP0166, one for XEP0176, -# and one for XEP0167 - -# * handle different kinds of sink and src elements - -import gobject - -import gajim import xmpp import helpers -import farsight, gst - -def get_first_gst_element(elements): - ''' Returns, if it exists, the first available element of the list. ''' - for name in elements: - factory = gst.element_factory_find(name) - if factory: - return factory.create() - -#FIXME: Move it to JingleSession.States? -class JingleStates(object): - ''' States in which jingle session may exist. ''' - ended = 0 - pending = 1 - active = 2 - -#FIXME: Move it to JingleTransport.Type? -class TransportType(object): - ''' Possible types of a JingleTransport ''' - datagram = 1 - streaming = 2 - -class OutOfOrder(Exception): - ''' Exception that should be raised when an action is received when in the wrong state. ''' - -class TieBreak(Exception): - ''' Exception that should be raised in case of a tie, when we overrule the other action. ''' - -class JingleSession(object): - ''' This represents one jingle session. ''' - def __init__(self, con, weinitiate, jid, sid=None): - ''' con -- connection object, - weinitiate -- boolean, are we the initiator? - jid - jid of the other entity''' - self.contents = {} # negotiated contents - self.connection = con # connection to use - # our full jid - self.ourjid = gajim.get_jid_from_account(self.connection.name) + '/' + \ - con.server_resource - self.peerjid = jid # jid we connect to - # jid we use as the initiator - self.initiator = weinitiate and self.ourjid or self.peerjid - # jid we use as the responder - self.responder = weinitiate and self.peerjid or self.ourjid - # are we an initiator? - self.weinitiate = weinitiate - # what state is session in? (one from JingleStates) - self.state = JingleStates.ended - if not sid: - sid = con.connection.getAnID() - self.sid = sid # sessionid - - self.accepted = True # is this session accepted by user - - # callbacks to call on proper contents - # use .prepend() to add new callbacks, especially when you're going - # to send error instead of ack - self.callbacks = { - 'content-accept': [self.__contentAcceptCB, self.__broadcastCB, - self.__defaultCB], - 'content-add': [self.__contentAddCB, self.__broadcastCB, - self.__defaultCB], #TODO - 'content-modify': [self.__defaultCB], #TODO - 'content-reject': [self.__defaultCB, self.__contentRemoveCB], #TODO - 'content-remove': [self.__defaultCB, self.__contentRemoveCB], - 'description-info': [self.__broadcastCB, self.__defaultCB], #TODO - 'security-info': [self.__defaultCB], #TODO - 'session-accept': [self.__sessionAcceptCB, self.__contentAcceptCB, - self.__broadcastCB, self.__defaultCB], - 'session-info': [self.__sessionInfoCB, self.__broadcastCB, self.__defaultCB], - 'session-initiate': [self.__sessionInitiateCB, self.__broadcastCB, - self.__defaultCB], - 'session-terminate': [self.__sessionTerminateCB, self.__broadcastAllCB, - self.__defaultCB], - 'transport-info': [self.__broadcastCB, self.__defaultCB], - 'transport-replace': [self.__broadcastCB, self.__transportReplaceCB], #TODO - 'transport-accept': [self.__defaultCB], #TODO - 'transport-reject': [self.__defaultCB], #TODO - 'iq-result': [], - 'iq-error': [self.__errorCB], - } - - ''' Interaction with user ''' - def approve_session(self): - ''' Called when user accepts session in UI (when we aren't the initiator). - ''' - self.accept_session() - - def decline_session(self): - ''' Called when user declines session in UI (when we aren't the initiator) - ''' - reason = xmpp.Node('reason') - reason.addChild('decline') - self._session_terminate(reason) - - def approve_content(self, media): - content = self.get_content(media) - if content: - content.accepted = True - self.on_session_state_changed(content) - - def reject_content(self, media): - content = self.get_content(media) - if content: - if self.state == JingleStates.active: - self.__content_reject(content) - content.destroy() - self.on_session_state_changed() - - def end_session(self): - ''' Called when user stops or cancel session in UI. ''' - reason = xmpp.Node('reason') - if self.state == JingleStates.active: - reason.addChild('success') - else: - reason.addChild('cancel') - self._session_terminate(reason) - - ''' Middle-level functions to manage contents. Handle local content - cache and send change notifications. ''' - def get_content(self, media=None): - if media == 'audio': - cls = JingleVoIP - elif media == 'video': - cls = JingleVideo - #elif media == None: - # cls = JingleContent - else: - return None - - for content in self.contents.values(): - if isinstance(content, cls): - return content - - def add_content(self, name, content, creator='we'): - ''' Add new content to session. If the session is active, - this will send proper stanza to update session. - Creator must be one of ('we', 'peer', 'initiator', 'responder')''' - assert creator in ('we', 'peer', 'initiator', 'responder') - - if (creator == 'we' and self.weinitiate) or (creator == 'peer' and \ - not self.weinitiate): - creator = 'initiator' - elif (creator == 'peer' and self.weinitiate) or (creator == 'we' and \ - not self.weinitiate): - creator = 'responder' - content.creator = creator - content.name = name - self.contents[(creator, name)] = content - - if (creator == 'initiator') == self.weinitiate: - # The content is from us, accept it - content.accepted = True - - def remove_content(self, creator, name): - ''' We do not need this now ''' - #TODO: - if (creator, name) in self.contents: - content = self.contents[(creator, name)] - if len(self.contents) > 1: - self.__content_remove(content) - self.contents[(creator, name)].destroy() - if len(self.contents) == 0: - self.end_session() - - def modify_content(self, creator, name, *someother): - ''' We do not need this now ''' - pass - - def on_session_state_changed(self, content=None): - if self.state == JingleStates.ended: - # Session not yet started, only one action possible: session-initiate - if self.is_ready() and self.weinitiate: - self.__session_initiate() - elif self.state == JingleStates.pending: - # We can either send a session-accept or a content-add - if self.is_ready() and not self.weinitiate: - self.__session_accept() - elif content and (content.creator == 'initiator') == self.weinitiate: - self.__content_add(content) - elif content and self.weinitiate: - self.__content_accept(content) - elif self.state == JingleStates.active: - # We can either send a content-add or a content-accept - if not content: - return - if (content.creator == 'initiator') == self.weinitiate: - # We initiated this content. It's a pending content-add. - self.__content_add(content) - else: - # The other side created this content, we accept it. - self.__content_accept(content) - - def is_ready(self): - ''' Returns True when all codecs and candidates are ready - (for all contents). ''' - return (all((content.is_ready() for content in self.contents.itervalues())) - and self.accepted) - - ''' Middle-level function to do stanza exchange. ''' - def accept_session(self): - ''' Mark the session as accepted. ''' - self.accepted = True - self.on_session_state_changed() - - def start_session(self): - ''' Mark the session as ready to be started. ''' - self.accepted = True - self.on_session_state_changed() - - def send_session_info(self): - pass - - def send_content_accept(self, content): - assert self.state != JingleStates.ended - stanza, jingle = self.__make_jingle('content-accept') - jingle.addChild(node=content) - self.connection.connection.send(stanza) - - def send_transport_info(self, content): - assert self.state != JingleStates.ended - stanza, jingle = self.__make_jingle('transport-info') - jingle.addChild(node=content) - self.connection.connection.send(stanza) - - ''' Session callbacks. ''' - def stanzaCB(self, stanza): - ''' A callback for ConnectionJingle. It gets stanza, then - tries to send it to all internally registered callbacks. - First one to raise xmpp.NodeProcessed breaks function.''' - jingle = stanza.getTag('jingle') - error = stanza.getTag('error') - if error: - # it's an iq-error stanza - action = 'iq-error' - elif jingle: - # it's a jingle action - action = jingle.getAttr('action') - if action not in self.callbacks: - self.__send_error(stanza, 'bad_request') - return - #FIXME: If we aren't initiated and it's not a session-initiate... - if action != 'session-initiate' and self.state == JingleStates.ended: - self.__send_error(stanza, 'item-not-found', 'unknown-session') - return - else: - # it's an iq-result (ack) stanza - action = 'iq-result' - - callables = self.callbacks[action] - - try: - for callable in callables: - callable(stanza=stanza, jingle=jingle, error=error, action=action) - except xmpp.NodeProcessed: - pass - except TieBreak: - self.__send_error(stanza, 'conflict', 'tiebreak') - except OutOfOrder: - self.__send_error(stanza, 'unexpected-request', 'out-of-order')#FIXME - - def __defaultCB(self, stanza, jingle, error, action): - ''' Default callback for action stanzas -- simple ack - and stop processing. ''' - response = stanza.buildReply('result') - self.connection.connection.send(response) - - def __errorCB(self, stanza, jingle, error, action): - #FIXME - text = error.getTagData('text') - jingle_error = None - xmpp_error = None - for child in error.getChildren(): - if child.getNamespace() == xmpp.NS_JINGLE_ERRORS: - jingle_error = child.getName() - elif child.getNamespace() == xmpp.NS_STANZAS: - xmpp_error = child.getName() - self.__dispatch_error(xmpp_error, jingle_error, text) - #FIXME: Not sure when we would want to do that... - if xmpp_error == 'item-not-found': - self.connection.delete_jingle_session(self.peerjid, self.sid) - - def __transportReplaceCB(self, stanza, jingle, error, action): - for content in jingle.iterTags('content'): - creator = content['creator'] - name = content['name'] - if (creator, name) in self.contents: - transport_ns = content.getTag('transport').getNamespace() - if transport_ns == xmpp.JINGLE_ICE_UDP: - #FIXME: We don't manage anything else than ICE-UDP now... - #What was the previous transport?!? - #Anyway, content's transport is not modifiable yet - pass - else: - stanza, jingle = self.__make_jingle('transport-reject') - content = jingle.setTag('content', attrs={'creator': creator, - 'name': name}) - content.setTag('transport', namespace=transport_ns) - self.connection.connection.send(stanza) - raise xmpp.NodeProcessed - else: - #FIXME: This ressource is unknown to us, what should we do? - #For now, reject the transport - stanza, jingle = self.__make_jingle('transport-reject') - c = jingle.setTag('content', attrs={'creator': creator, - 'name': name}) - c.setTag('transport', namespace=transport_ns) - self.connection.connection.send(stanza) - raise xmpp.NodeProcessed - - def __sessionInfoCB(self, stanza, jingle, error, action): - #TODO: ringing, active, (un)hold, (un)mute - payload = jingle.getPayload() - if len(payload) > 0: - self.__send_error(stanza, 'feature-not-implemented', 'unsupported-info') - raise xmpp.NodeProcessed - - def __contentRemoveCB(self, stanza, jingle, error, action): - for content in jingle.iterTags('content'): - creator = content['creator'] - name = content['name'] - if (creator, name) in self.contents: - content = self.contents[(creator, name)] - #TODO: this will fail if content is not an RTP content - self.connection.dispatch('JINGLE_DISCONNECTED', - (self.peerjid, self.sid, content.media, 'removed')) - content.destroy() - if len(self.contents) == 0: - reason = xmpp.Node('reason') - reason.setTag('success') - self._session_terminate(reason) - - def __sessionAcceptCB(self, stanza, jingle, error, action): - if self.state != JingleStates.pending: #FIXME - raise OutOfOrder - self.state = JingleStates.active - - def __contentAcceptCB(self, stanza, jingle, error, action): - ''' Called when we get content-accept stanza or equivalent one - (like session-accept).''' - # check which contents are accepted - for content in jingle.iterTags('content'): - creator = content['creator'] - name = content['name']#TODO... - - def __contentAddCB(self, stanza, jingle, error, action): - if self.state == JingleStates.ended: - raise OutOfOrder - - parse_result = self.__parse_contents(jingle) - contents = parse_result[2] - rejected_contents = parse_result[3] - - for name, creator in rejected_contents: - #TODO: - content = JingleContent() - self.add_content(name, content, creator) - self.__content_reject(content) - self.contents[(content.creator, content.name)].destroy() - - self.connection.dispatch('JINGLE_INCOMING', (self.peerjid, self.sid, - contents)) - - def __sessionInitiateCB(self, stanza, jingle, error, action): - ''' We got a jingle session request from other entity, - therefore we are the receiver... Unpack the data, - inform the user. ''' - - if self.state != JingleStates.ended: - raise OutOfOrder - - self.initiator = jingle['initiator'] - self.responder = self.ourjid - self.peerjid = self.initiator - self.accepted = False # user did not accept this session yet - - # TODO: If the initiator is unknown to the receiver (e.g., via presence - # subscription) and the receiver has a policy of not communicating via - # Jingle with unknown entities, it SHOULD return a - # error. - - # Lets check what kind of jingle session does the peer want - contents_ok, transports_ok, contents, pouet = self.__parse_contents(jingle) - - # If there's no content we understand... - if not contents_ok: - # TODO: http://xmpp.org/extensions/xep-0166.html#session-terminate - reason = xmpp.Node('reason') - reason.setTag('unsupported-applications') - self.__defaultCB(stanza, jingle, error, action) - self._session_terminate(reason) - raise xmpp.NodeProcessed - - if not transports_ok: - # TODO: http://xmpp.org/extensions/xep-0166.html#session-terminate - reason = xmpp.Node('reason') - reason.setTag('unsupported-transports') - self.__defaultCB(stanza, jingle, error, action) - self._session_terminate(reason) - raise xmpp.NodeProcessed - - self.state = JingleStates.pending - - # Send event about starting a session - self.connection.dispatch('JINGLE_INCOMING', (self.peerjid, self.sid, - contents)) - - def __broadcastCB(self, stanza, jingle, error, action): - ''' Broadcast the stanza contents to proper content handlers. ''' - for content in jingle.iterTags('content'): - name = content['name'] - creator = content['creator'] - cn = self.contents[(creator, name)] - cn.stanzaCB(stanza, content, error, action) - - def __sessionTerminateCB(self, stanza, jingle, error, action): - self.connection.delete_jingle_session(self.peerjid, self.sid) - reason, text = self.__reason_from_stanza(jingle) - if reason not in ('success', 'cancel', 'decline'): - self.__dispatch_error(reason, reason, text) - if text: - text = '%s (%s)' % (reason, text) - else: - text = reason#TODO - self.connection.dispatch('JINGLE_DISCONNECTED', - (self.peerjid, self.sid, None, text)) - - def __broadcastAllCB(self, stanza, jingle, error, action): - ''' Broadcast the stanza to all content handlers. ''' - for content in self.contents.itervalues(): - content.stanzaCB(stanza, None, error, action) - - ''' Internal methods. ''' - def __parse_contents(self, jingle): - #TODO: Needs some reworking - contents = [] - contents_rejected = [] - contents_ok = False - transports_ok = False - - for element in jingle.iterTags('content'): - desc = element.getTag('description') - desc_ns = desc.getNamespace() - tran_ns = element.getTag('transport').getNamespace() - if desc_ns == xmpp.NS_JINGLE_RTP and desc['media'] in ('audio', 'video'): - contents_ok = True - #TODO: Everything here should be moved somewhere else - if tran_ns == xmpp.NS_JINGLE_ICE_UDP: - if desc['media'] == 'audio': - self.add_content(element['name'], JingleVoIP(self), 'peer') - else: - self.add_content(element['name'], JingleVideo(self), 'peer') - contents.append((desc['media'],)) - transports_ok = True - else: - contents_rejected.append((element['name'], 'peer')) - else: - contents_rejected.append((element['name'], 'peer')) - - return (contents_ok, transports_ok, contents, contents_rejected) - - def __dispatch_error(self, error, jingle_error=None, text=None): - if jingle_error: - error = jingle_error - if text: - text = '%s (%s)' % (error, text) - else: - text = error - self.connection.dispatch('JINGLE_ERROR', (self.peerjid, self.sid, text)) - - def __reason_from_stanza(self, stanza): - reason = 'success' - reasons = ['success', 'busy', 'cancel', 'connectivity-error', - 'decline', 'expired', 'failed-application', 'failed-transport', - 'general-error', 'gone', 'incompatible-parameters', 'media-error', - 'security-error', 'timeout', 'unsupported-applications', - 'unsupported-transports'] - tag = stanza.getTag('reason') - if tag: - text = tag.getTagData('text') - for r in reasons: - if tag.getTag(r): - reason = r - break - return (reason, text) - - ''' Methods that make/send proper pieces of XML. They check if the session - is in appropriate state. ''' - def __make_jingle(self, action): - stanza = xmpp.Iq(typ='set', to=xmpp.JID(self.peerjid)) - attrs = {'action': action, - 'sid': self.sid} - if action == 'session-initiate': - attrs['initiator'] = self.initiator - elif action == 'session-accept': - attrs['responder'] = self.responder - jingle = stanza.addChild('jingle', attrs=attrs, namespace=xmpp.NS_JINGLE) - return stanza, jingle - - def __send_error(self, stanza, error, jingle_error=None, text=None): - err = xmpp.Error(stanza, error) - err.setNamespace(xmpp.NS_STANZAS) - if jingle_error: - err.setTag(jingle_error, namespace=xmpp.NS_JINGLE_ERRORS) - if text: - err.setTagData('text', text) - self.connection.connection.send(err) - self.__dispatch_error(error, jingle_error, text) - - def __append_content(self, jingle, content): - ''' Append element to element, - with (full=True) or without (full=False) - children. ''' - jingle.addChild('content', - attrs={'name': content.name, 'creator': content.creator}) - - def __append_contents(self, jingle): - ''' Append all elements to .''' - # TODO: integrate with __appendContent? - # TODO: parameters 'name', 'content'? - for content in self.contents.values(): - self.__append_content(jingle, content) - - def __session_initiate(self): - assert self.state == JingleStates.ended - stanza, jingle = self.__make_jingle('session-initiate') - self.__append_contents(jingle) - self.__broadcastCB(stanza, jingle, None, 'session-initiate-sent') - self.connection.connection.send(stanza) - self.state = JingleStates.pending - - def __session_accept(self): - assert self.state == JingleStates.pending - stanza, jingle = self.__make_jingle('session-accept') - self.__append_contents(jingle) - self.__broadcastCB(stanza, jingle, None, 'session-accept-sent') - self.connection.connection.send(stanza) - self.state = JingleStates.active - - def __session_info(self, payload=None): - assert self.state != JingleStates.ended - stanza, jingle = self.__make_jingle('session-info') - if payload: - jingle.addChild(node=payload) - self.connection.connection.send(stanza) - - def _session_terminate(self, reason=None): - assert self.state != JingleStates.ended - stanza, jingle = self.__make_jingle('session-terminate') - if reason is not None: - jingle.addChild(node=reason) - self.__broadcastAllCB(stanza, jingle, None, 'session-terminate-sent') - self.connection.connection.send(stanza) - reason, text = self.__reason_from_stanza(jingle) - if reason not in ('success', 'cancel', 'decline'): - self.__dispatch_error(reason, reason, text) - if text: - text = '%s (%s)' % (reason, text) - else: - text = reason - self.connection.delete_jingle_session(self.peerjid, self.sid) - self.connection.dispatch('JINGLE_DISCONNECTED', - (self.peerjid, self.sid, None, text)) - - def __content_add(self, content): - #TODO: test - assert self.state != JingleStates.ended - stanza, jingle = self.__make_jingle('content-add') - self.__append_content(jingle, content) - self.__broadcastCB(stanza, jingle, None, 'content-add-sent') - self.connection.connection.send(stanza) - - def __content_accept(self, content): - #TODO: test - assert self.state != JingleStates.ended - stanza, jingle = self.__make_jingle('content-accept') - self.__append_content(jingle, content) - self.__broadcastCB(stanza, jingle, None, 'content-accept-sent') - self.connection.connection.send(stanza) - - def __content_reject(self, content): - assert self.state != JingleStates.ended - stanza, jingle = self.__make_jingle('content-reject') - self.__append_content(jingle, content) - self.connection.connection.send(stanza) - #TODO: this will fail if content is not an RTP content - self.connection.dispatch('JINGLE_DISCONNECTED', - (self.peerjid, self.sid, content.media, 'rejected')) - - def __content_modify(self): - assert self.state != JingleStates.ended - - def __content_remove(self, content): - assert self.state != JingleStates.ended - stanza, jingle = self.__make_jingle('content-remove') - self.__append_content(jingle, content) - self.connection.connection.send(stanza) - #TODO: this will fail if content is not an RTP content - self.connection.dispatch('JINGLE_DISCONNECTED', - (self.peerjid, self.sid, content.media, 'removed')) - - def content_negociated(self, media): - self.connection.dispatch('JINGLE_CONNECTED', (self.peerjid, self.sid, - media)) - -#TODO: -#class JingleTransport(object): -# ''' An abstraction of a transport in Jingle sessions. ''' -# def __init__(self): -# pass - - -class JingleContent(object): - ''' An abstraction of content in Jingle sessions. ''' - def __init__(self, session, node=None): - self.session = session - # will be filled by JingleSession.add_content() - # don't uncomment these lines, we will catch more buggy code then - # (a JingleContent not added to session shouldn't send anything) - #self.creator = None - #self.name = None - self.accepted = False - self.sent = False - self.candidates = [] # Local transport candidates - self.remote_candidates = [] # Remote transport candidates - - self.senders = 'both' #FIXME - self.allow_sending = True # Used for stream direction, attribute 'senders' - - self.callbacks = { - # these are called when *we* get stanzas - 'content-accept': [self.__transportInfoCB], - 'content-add': [self.__transportInfoCB], - 'content-modify': [], - 'content-reject': [], - 'content-remove': [], - 'description-info': [], - 'security-info': [], - 'session-accept': [self.__transportInfoCB], - 'session-info': [], - 'session-initiate': [self.__transportInfoCB], - 'session-terminate': [], - 'transport-info': [self.__transportInfoCB], - 'transport-replace': [], - 'transport-accept': [], - 'transport-reject': [], - 'iq-result': [], - 'iq-error': [], - # these are called when *we* sent these stanzas - 'content-accept-sent': [self.__fillJingleStanza], - 'content-add-sent': [self.__fillJingleStanza], - 'session-initiate-sent': [self.__fillJingleStanza], - 'session-accept-sent': [self.__fillJingleStanza], - 'session-terminate-sent': [], - } - - def is_ready(self): - #print '[%s] %s, %s' % (self.media, self.candidates_ready, - # self.p2psession.get_property('codecs-ready')) - return (self.accepted and self.candidates_ready and not self.sent - and self.p2psession.get_property('codecs-ready')) - - def stanzaCB(self, stanza, content, error, action): - ''' Called when something related to our content was sent by peer. ''' - if action in self.callbacks: - for callback in self.callbacks[action]: - callback(stanza, content, error, action) - - def __transportInfoCB(self, stanza, content, error, action): - ''' Got a new transport candidate. ''' - candidates = [] - transport = content.getTag('transport') - for candidate in transport.iterTags('candidate'): - cand = farsight.Candidate() - cand.component_id = int(candidate['component']) - cand.ip = str(candidate['ip']) - cand.port = int(candidate['port']) - cand.foundation = str(candidate['foundation']) - #cand.type = farsight.CANDIDATE_TYPE_LOCAL - cand.priority = int(candidate['priority']) - - if candidate['protocol'] == 'udp': - cand.proto = farsight.NETWORK_PROTOCOL_UDP - else: - # we actually don't handle properly different tcp options in jingle - cand.proto = farsight.NETWORK_PROTOCOL_TCP - - cand.username = str(transport['ufrag']) - cand.password = str(transport['pwd']) - - #FIXME: huh? - types = {'host': farsight.CANDIDATE_TYPE_HOST, - 'srflx': farsight.CANDIDATE_TYPE_SRFLX, - 'prflx': farsight.CANDIDATE_TYPE_PRFLX, - 'relay': farsight.CANDIDATE_TYPE_RELAY, - 'multicast': farsight.CANDIDATE_TYPE_MULTICAST} - if 'type' in candidate and candidate['type'] in types: - cand.type = types[candidate['type']] - else: - print 'Unknown type %s', candidate['type'] - candidates.append(cand) - #FIXME: connectivity should not be etablished yet - # Instead, it should be etablished after session-accept! - if len(candidates) > 0: - if self.sent: - self.p2pstream.set_remote_candidates(candidates) - else: - self.remote_candidates.extend(candidates) - #self.p2pstream.set_remote_candidates(candidates) - #print self.media, self.creator, self.name, candidates - - def __content(self, payload=[]): - ''' Build a XML content-wrapper for our data. ''' - return xmpp.Node('content', - attrs={'name': self.name, 'creator': self.creator}, - payload=payload) - - def __candidate(self, candidate): - types = {farsight.CANDIDATE_TYPE_HOST: 'host', - farsight.CANDIDATE_TYPE_SRFLX: 'srflx', - farsight.CANDIDATE_TYPE_PRFLX: 'prflx', - farsight.CANDIDATE_TYPE_RELAY: 'relay', - farsight.CANDIDATE_TYPE_MULTICAST: 'multicast'} - attrs = { - 'component': candidate.component_id, - 'foundation': '1', # hack - 'generation': '0', - 'ip': candidate.ip, - 'network': '0', - 'port': candidate.port, - 'priority': int(candidate.priority), # hack - } - if candidate.type in types: - attrs['type'] = types[candidate.type] - if candidate.proto == farsight.NETWORK_PROTOCOL_UDP: - attrs['protocol'] = 'udp' - else: - # we actually don't handle properly different tcp options in jingle - attrs['protocol'] = 'tcp' - return xmpp.Node('candidate', attrs=attrs) - - def iter_candidates(self): - for candidate in self.candidates: - yield self.__candidate(candidate) - - def send_candidate(self, candidate): - content = self.__content() - transport = content.addChild(xmpp.NS_JINGLE_ICE_UDP + ' transport') - - if candidate.username and candidate.password: - transport['ufrag'] = candidate.username - transport['pwd'] = candidate.password - - transport.addChild(node=self.__candidate(candidate)) - self.session.send_transport_info(content) - - def __fillJingleStanza(self, stanza, content, error, action): - ''' Add our things to session-initiate stanza. ''' - self._fillContent(content) - - self.sent = True - - if self.candidates and self.candidates[0].username and \ - self.candidates[0].password: - attrs = {'ufrag': self.candidates[0].username, - 'pwd': self.candidates[0].password} - else: - attrs = {} - content.addChild(xmpp.NS_JINGLE_ICE_UDP + ' transport', attrs=attrs, - payload=self.iter_candidates()) - - def destroy(self): - self.callbacks = None - del self.session.contents[(self.creator, self.name)] - - -class JingleRTPContent(JingleContent): - def __init__(self, session, media, node=None): - JingleContent.__init__(self, session, node) - self.media = media - self._dtmf_running = False - self.farsight_media = {'audio': farsight.MEDIA_TYPE_AUDIO, - 'video': farsight.MEDIA_TYPE_VIDEO}[media] - self.got_codecs = False - - self.candidates_ready = False # True when local candidates are prepared - - self.callbacks['session-initiate'] += [self.__getRemoteCodecsCB] - self.callbacks['content-add'] += [self.__getRemoteCodecsCB] - self.callbacks['content-accept'] += [self.__getRemoteCodecsCB, - self.__contentAcceptCB] - self.callbacks['session-accept'] += [self.__getRemoteCodecsCB, - self.__contentAcceptCB] - self.callbacks['session-accept-sent'] += [self.__contentAcceptCB] - self.callbacks['content-accept-sent'] += [self.__contentAcceptCB] - self.callbacks['session-terminate'] += [self.__stop] - self.callbacks['session-terminate-sent'] += [self.__stop] - - def setup_stream(self): - # pipeline and bus - self.pipeline = gst.Pipeline() - bus = self.pipeline.get_bus() - bus.add_signal_watch() - bus.connect('message', self._on_gst_message) - - # conference - self.conference = gst.element_factory_make('fsrtpconference') - self.conference.set_property("sdes-cname", self.session.ourjid) - self.pipeline.add(self.conference) - self.funnel = None - - self.p2psession = self.conference.new_session(self.farsight_media) - - participant = self.conference.new_participant(self.session.peerjid) - #FIXME: Consider a workaround, here... - # pidgin and telepathy-gabble don't follow the XEP, and it won't work - # due to bad controlling-mode - params = {'controlling-mode': self.session.weinitiate,# 'debug': False} - 'stun-ip': '69.0.208.27', 'debug': False} - - self.p2pstream = self.p2psession.new_stream(participant, - farsight.DIRECTION_RECV, 'nice', params) - - def batch_dtmf(self, events): - if self._dtmf_running: - raise Exception #TODO: Proper exception - self._dtmf_running = True - self._start_dtmf(events.pop(0)) - gobject.timeout_add(500, self._next_dtmf, events) - - def _next_dtmf(self, events): - self._stop_dtmf() - if events: - self._start_dtmf(events.pop(0)) - gobject.timeout_add(500, self._next_dtmf, events) - else: - self._dtmf_running = False - - def _start_dtmf(self, event): - if event in ('*', '#'): - event = {'*': farsight.DTMF_EVENT_STAR, - '#': farsight.DTMF_EVENT_POUND}[event] - else: - event = int(event) - self.p2psession.start_telephony_event(event, 2, - farsight.DTMF_METHOD_RTP_RFC4733) - - def _stop_dtmf(self): - self.p2psession.stop_telephony_event(farsight.DTMF_METHOD_RTP_RFC4733) - - def _fillContent(self, content): - content.addChild(xmpp.NS_JINGLE_RTP + ' description', - attrs={'media': self.media}, payload=self.iter_codecs()) - - def _setup_funnel(self): - self.funnel = gst.element_factory_make('fsfunnel') - self.pipeline.add(self.funnel) - self.funnel.set_state(gst.STATE_PLAYING) - self.sink.set_state(gst.STATE_PLAYING) - self.funnel.link(self.sink) - - def _on_src_pad_added(self, stream, pad, codec): - if not self.funnel: - self._setup_funnel() - pad.link(self.funnel.get_pad('sink%d')) - - def _on_gst_message(self, bus, message): - if message.type == gst.MESSAGE_ELEMENT: - name = message.structure.get_name() - if name == 'farsight-new-active-candidate-pair': - pass - elif name == 'farsight-recv-codecs-changed': - pass - elif name == 'farsight-codecs-changed': - if self.is_ready(): - self.session.on_session_state_changed(self) - #TODO: description-info - elif name == 'farsight-local-candidates-prepared': - self.candidates_ready = True - if self.is_ready(): - self.session.on_session_state_changed(self) - elif name == 'farsight-new-local-candidate': - candidate = message.structure['candidate'] - self.candidates.append(candidate) - if self.candidates_ready: - #FIXME: Is this case even possible? - self.send_candidate(candidate) - elif name == 'farsight-component-state-changed': - state = message.structure['state'] - print message.structure['component'], state - if state == farsight.STREAM_STATE_FAILED: - reason = xmpp.Node('reason') - reason.setTag('failed-transport') - self.session._session_terminate(reason) - elif name == 'farsight-error': - print 'Farsight error #%d!' % message.structure['error-no'] - print 'Message: %s' % message.structure['error-msg'] - print 'Debug: %s' % message.structure['debug-msg'] - else: - print name - - def __contentAcceptCB(self, stanza, content, error, action): - if self.accepted: - if len(self.remote_candidates) > 0: - self.p2pstream.set_remote_candidates(self.remote_candidates) - self.remote_candidates = [] - #TODO: farsight.DIRECTION_BOTH only if senders='both' - self.p2pstream.set_property('direction', farsight.DIRECTION_BOTH) - self.session.content_negociated(self.media) - - def __getRemoteCodecsCB(self, stanza, content, error, action): - ''' Get peer codecs from what we get from peer. ''' - if self.got_codecs: - return - - codecs = [] - for codec in content.getTag('description').iterTags('payload-type'): - c = farsight.Codec(int(codec['id']), codec['name'], - self.farsight_media, int(codec['clockrate'])) - if 'channels' in codec: - c.channels = int(codec['channels']) - else: - c.channels = 1 - c.optional_params = [(str(p['name']), str(p['value'])) for p in \ - codec.iterTags('parameter')] - codecs.append(c) - - if len(codecs) > 0: - #FIXME: Handle this case: - # glib.GError: There was no intersection between the remote codecs and - # the local ones - self.p2pstream.set_remote_codecs(codecs) - self.got_codecs = True - - def iter_codecs(self): - codecs = self.p2psession.get_property('codecs') - for codec in codecs: - attrs = {'name': codec.encoding_name, - 'id': codec.id, - 'channels': codec.channels} - if codec.clock_rate: - attrs['clockrate'] = codec.clock_rate - if codec.optional_params: - payload = (xmpp.Node('parameter', {'name': name, 'value': value}) - for name, value in codec.optional_params) - else: payload = () - yield xmpp.Node('payload-type', attrs, payload) - - def __stop(self, *things): - self.pipeline.set_state(gst.STATE_NULL) - - def __del__(self): - self.__stop() - - def destroy(self): - JingleContent.destroy(self) - self.p2pstream.disconnect_by_func(self._on_src_pad_added) - self.pipeline.get_bus().disconnect_by_func(self._on_gst_message) - - -class JingleVoIP(JingleRTPContent): - ''' Jingle VoIP sessions consist of audio content transported - over an ICE UDP protocol. ''' - def __init__(self, session, node=None): - JingleRTPContent.__init__(self, session, 'audio', node) - self.setup_stream() - - - ''' Things to control the gstreamer's pipeline ''' - def setup_stream(self): - JingleRTPContent.setup_stream(self) - - # Configure SPEEX - # Workaround for psi (not needed since rev - # 147aedcea39b43402fe64c533d1866a25449888a): - # place 16kHz before 8kHz, as buggy psi versions will take in - # account only the first codec - - codecs = [farsight.Codec(farsight.CODEC_ID_ANY, 'SPEEX', - farsight.MEDIA_TYPE_AUDIO, 16000), - farsight.Codec(farsight.CODEC_ID_ANY, 'SPEEX', - farsight.MEDIA_TYPE_AUDIO, 8000)] - self.p2psession.set_codec_preferences(codecs) - - # the local parts - # TODO: use gconfaudiosink? - # sink = get_first_gst_element(['alsasink', 'osssink', 'autoaudiosink']) - self.sink = gst.element_factory_make('alsasink') - self.sink.set_property('sync', False) - #sink.set_property('latency-time', 20000) - #sink.set_property('buffer-time', 80000) - - # TODO: use gconfaudiosrc? - src_mic = gst.element_factory_make('alsasrc') - src_mic.set_property('blocksize', 320) - - self.mic_volume = gst.element_factory_make('volume') - self.mic_volume.set_property('volume', 1) - - # link gst elements - self.pipeline.add(self.sink, src_mic, self.mic_volume) - src_mic.link(self.mic_volume) - - self.mic_volume.get_pad('src').link(self.p2psession.get_property( - 'sink-pad')) - self.p2pstream.connect('src-pad-added', self._on_src_pad_added) - - # The following is needed for farsight to process ICE requests: - self.pipeline.set_state(gst.STATE_PLAYING) - - -class JingleVideo(JingleRTPContent): - def __init__(self, session, node=None): - JingleRTPContent.__init__(self, session, 'video', node) - self.setup_stream() - - ''' Things to control the gstreamer's pipeline ''' - def setup_stream(self): - #TODO: Everything is not working properly: - # sometimes, one window won't show up, - # sometimes it'll freeze... - JingleRTPContent.setup_stream(self) - # the local parts - src_vid = gst.element_factory_make('videotestsrc') - src_vid.set_property('is-live', True) - videoscale = gst.element_factory_make('videoscale') - caps = gst.element_factory_make('capsfilter') - caps.set_property('caps', gst.caps_from_string('video/x-raw-yuv, width=320, height=240')) - colorspace = gst.element_factory_make('ffmpegcolorspace') - - self.pipeline.add(src_vid, videoscale, caps, colorspace) - gst.element_link_many(src_vid, videoscale, caps, colorspace) - - self.sink = gst.element_factory_make('xvimagesink') - self.pipeline.add(self.sink) - - colorspace.get_pad('src').link(self.p2psession.get_property('sink-pad')) - self.p2pstream.connect('src-pad-added', self._on_src_pad_added) - - # The following is needed for farsight to process ICE requests: - self.pipeline.set_state(gst.STATE_PLAYING) +from jingle_session import JingleSession +from jingle_rtp import JingleAudio, JingleVideo class ConnectionJingle(object): @@ -1158,11 +98,11 @@ class ConnectionJingle(object): return self.get_jingle_session(jid, media='audio').sid jingle = self.get_jingle_session(jid, media='video') if jingle: - jingle.add_content('voice', JingleVoIP(jingle)) + jingle.add_content('voice', JingleAudio(jingle)) else: jingle = JingleSession(self, weinitiate=True, jid=jid) self.add_jingle(jingle) - jingle.add_content('voice', JingleVoIP(jingle)) + jingle.add_content('voice', JingleAudio(jingle)) jingle.start_session() return jingle.sid diff --git a/src/common/jingle_content.py b/src/common/jingle_content.py new file mode 100644 index 000000000..98b5dfa0a --- /dev/null +++ b/src/common/jingle_content.py @@ -0,0 +1,102 @@ +## +## Copyright (C) 2006 Gajim Team +## +## 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; version 2 only. +## +## 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. +## +''' Handles Jingle contents (XEP 0166). ''' + +contents = {} + +def get_jingle_content(node): + namespace = node.getNamespace() + if namespace in contents: + return contents[namespace](node) + else: + return None + + +class JingleContent(object): + ''' An abstraction of content in Jingle sessions. ''' + def __init__(self, session, transport): + self.session = session + self.transport = transport + # will be filled by JingleSession.add_content() + # don't uncomment these lines, we will catch more buggy code then + # (a JingleContent not added to session shouldn't send anything) + #self.creator = None + #self.name = None + self.accepted = False + self.sent = False + + self.media = None + + self.senders = 'both' #FIXME + self.allow_sending = True # Used for stream direction, attribute 'senders' + + self.callbacks = { + # these are called when *we* get stanzas + 'content-accept': [self.__transportInfoCB], + 'content-add': [self.__transportInfoCB], + 'content-modify': [], + 'content-reject': [], + 'content-remove': [], + 'description-info': [], + 'security-info': [], + 'session-accept': [self.__transportInfoCB], + 'session-info': [], + 'session-initiate': [self.__transportInfoCB], + 'session-terminate': [], + 'transport-info': [self.__transportInfoCB], + 'transport-replace': [], + 'transport-accept': [], + 'transport-reject': [], + 'iq-result': [], + 'iq-error': [], + # these are called when *we* sent these stanzas + 'content-accept-sent': [self.__fillJingleStanza], + 'content-add-sent': [self.__fillJingleStanza], + 'session-initiate-sent': [self.__fillJingleStanza], + 'session-accept-sent': [self.__fillJingleStanza], + 'session-terminate-sent': [], + } + + def is_ready(self): + return (self.accepted and not self.sent) + + def stanzaCB(self, stanza, content, error, action): + ''' Called when something related to our content was sent by peer. ''' + if action in self.callbacks: + for callback in self.callbacks[action]: + callback(stanza, content, error, action) + + def __transportInfoCB(self, stanza, content, error, action): + ''' Got a new transport candidate. ''' + self.transport.transportInfoCB(content.getTag('transport')) + + def __content(self, payload=[]): + ''' Build a XML content-wrapper for our data. ''' + return xmpp.Node('content', + attrs={'name': self.name, 'creator': self.creator}, + payload=payload) + + def send_candidate(self, candidate): + content = self.__content() + content.addChild(self.transport.make_transport([candidate])) + self.session.send_transport_info(content) + + def __fillJingleStanza(self, stanza, content, error, action): + ''' Add our things to session-initiate stanza. ''' + self._fillContent(content) + self.sent = True + content.addChild(node=self.transport.make_transport()) + + def destroy(self): + self.callbacks = None + del self.session.contents[(self.creator, self.name)] diff --git a/src/common/jingle_rtp.py b/src/common/jingle_rtp.py new file mode 100644 index 000000000..7fb9c2611 --- /dev/null +++ b/src/common/jingle_rtp.py @@ -0,0 +1,314 @@ +## +## Copyright (C) 2006 Gajim Team +## +## 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; version 2 only. +## +## 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. +## +''' Handles Jingle RTP sessions (XEP 0167). ''' + + +import gobject + +import xmpp +import farsight, gst + +from jingle_transport import JingleTransportICEUDP +from jingle_content import contents, JingleContent + +# TODO: Will that be even used? +def get_first_gst_element(elements): + ''' Returns, if it exists, the first available element of the list. ''' + for name in elements: + factory = gst.element_factory_find(name) + if factory: + return factory.create() + + +class JingleRTPContent(JingleContent): + def __init__(self, session, media, transport=None): + if transport is None: + transport = JingleTransportICEUDP() + JingleContent.__init__(self, session, transport) + self.media = media + self._dtmf_running = False + self.farsight_media = {'audio': farsight.MEDIA_TYPE_AUDIO, + 'video': farsight.MEDIA_TYPE_VIDEO}[media] + self.got_codecs = False + + self.candidates_ready = False # True when local candidates are prepared + + self.callbacks['session-initiate'] += [self.__getRemoteCodecsCB] + self.callbacks['content-add'] += [self.__getRemoteCodecsCB] + self.callbacks['content-accept'] += [self.__getRemoteCodecsCB, + self.__contentAcceptCB] + self.callbacks['session-accept'] += [self.__getRemoteCodecsCB, + self.__contentAcceptCB] + self.callbacks['session-accept-sent'] += [self.__contentAcceptCB] + self.callbacks['content-accept-sent'] += [self.__contentAcceptCB] + self.callbacks['session-terminate'] += [self.__stop] + self.callbacks['session-terminate-sent'] += [self.__stop] + + def setup_stream(self): + # pipeline and bus + self.pipeline = gst.Pipeline() + bus = self.pipeline.get_bus() + bus.add_signal_watch() + bus.connect('message', self._on_gst_message) + + # conference + self.conference = gst.element_factory_make('fsrtpconference') + self.conference.set_property("sdes-cname", self.session.ourjid) + self.pipeline.add(self.conference) + self.funnel = None + + self.p2psession = self.conference.new_session(self.farsight_media) + + participant = self.conference.new_participant(self.session.peerjid) + #FIXME: Consider a workaround, here... + # pidgin and telepathy-gabble don't follow the XEP, and it won't work + # due to bad controlling-mode + params = {'controlling-mode': self.session.weinitiate,# 'debug': False} + 'stun-ip': '69.0.208.27', 'debug': False} + + self.p2pstream = self.p2psession.new_stream(participant, + farsight.DIRECTION_RECV, 'nice', params) + + def is_ready(self): + return (JingleContent.is_ready(self) and self.candidates_ready + and self.p2psession.get_property('codecs-ready')) + + def batch_dtmf(self, events): + if self._dtmf_running: + raise Exception #TODO: Proper exception + self._dtmf_running = True + self._start_dtmf(events.pop(0)) + gobject.timeout_add(500, self._next_dtmf, events) + + def _next_dtmf(self, events): + self._stop_dtmf() + if events: + self._start_dtmf(events.pop(0)) + gobject.timeout_add(500, self._next_dtmf, events) + else: + self._dtmf_running = False + + def _start_dtmf(self, event): + if event in ('*', '#'): + event = {'*': farsight.DTMF_EVENT_STAR, + '#': farsight.DTMF_EVENT_POUND}[event] + else: + event = int(event) + self.p2psession.start_telephony_event(event, 2, + farsight.DTMF_METHOD_RTP_RFC4733) + + def _stop_dtmf(self): + self.p2psession.stop_telephony_event(farsight.DTMF_METHOD_RTP_RFC4733) + + def _fillContent(self, content): + content.addChild(xmpp.NS_JINGLE_RTP + ' description', + attrs={'media': self.media}, payload=self.iter_codecs()) + + def _setup_funnel(self): + self.funnel = gst.element_factory_make('fsfunnel') + self.pipeline.add(self.funnel) + self.funnel.set_state(gst.STATE_PLAYING) + self.sink.set_state(gst.STATE_PLAYING) + self.funnel.link(self.sink) + + def _on_src_pad_added(self, stream, pad, codec): + if not self.funnel: + self._setup_funnel() + pad.link(self.funnel.get_pad('sink%d')) + + def _on_gst_message(self, bus, message): + if message.type == gst.MESSAGE_ELEMENT: + name = message.structure.get_name() + if name == 'farsight-new-active-candidate-pair': + pass + elif name == 'farsight-recv-codecs-changed': + pass + elif name == 'farsight-codecs-changed': + if self.is_ready(): + self.session.on_session_state_changed(self) + #TODO: description-info + elif name == 'farsight-local-candidates-prepared': + self.candidates_ready = True + if self.is_ready(): + self.session.on_session_state_changed(self) + elif name == 'farsight-new-local-candidate': + candidate = message.structure['candidate'] + self.transport.candidates.append(candidate) + if self.candidates_ready: + #FIXME: Is this case even possible? + self.send_candidate(candidate) + elif name == 'farsight-component-state-changed': + state = message.structure['state'] + print message.structure['component'], state + if state == farsight.STREAM_STATE_FAILED: + reason = xmpp.Node('reason') + reason.setTag('failed-transport') + self.session._session_terminate(reason) + elif name == 'farsight-error': + print 'Farsight error #%d!' % message.structure['error-no'] + print 'Message: %s' % message.structure['error-msg'] + print 'Debug: %s' % message.structure['debug-msg'] + else: + print name + + def __contentAcceptCB(self, stanza, content, error, action): + if self.accepted: + if self.transport.remote_candidates: + self.p2pstream.set_remote_candidates(self.transport.remote_candidates) + self.transport.remote_candidates = [] + #TODO: farsight.DIRECTION_BOTH only if senders='both' + self.p2pstream.set_property('direction', farsight.DIRECTION_BOTH) + self.session.content_negociated(self.media) + + def __getRemoteCodecsCB(self, stanza, content, error, action): + ''' Get peer codecs from what we get from peer. ''' + if self.got_codecs: + return + + codecs = [] + for codec in content.getTag('description').iterTags('payload-type'): + c = farsight.Codec(int(codec['id']), codec['name'], + self.farsight_media, int(codec['clockrate'])) + if 'channels' in codec: + c.channels = int(codec['channels']) + else: + c.channels = 1 + c.optional_params = [(str(p['name']), str(p['value'])) for p in \ + codec.iterTags('parameter')] + codecs.append(c) + + if len(codecs) > 0: + #FIXME: Handle this case: + # glib.GError: There was no intersection between the remote codecs and + # the local ones + self.p2pstream.set_remote_codecs(codecs) + self.got_codecs = True + + def iter_codecs(self): + codecs = self.p2psession.get_property('codecs') + for codec in codecs: + attrs = {'name': codec.encoding_name, + 'id': codec.id, + 'channels': codec.channels} + if codec.clock_rate: + attrs['clockrate'] = codec.clock_rate + if codec.optional_params: + payload = (xmpp.Node('parameter', {'name': name, 'value': value}) + for name, value in codec.optional_params) + else: payload = () + yield xmpp.Node('payload-type', attrs, payload) + + def __stop(self, *things): + self.pipeline.set_state(gst.STATE_NULL) + + def __del__(self): + self.__stop() + + def destroy(self): + JingleContent.destroy(self) + self.p2pstream.disconnect_by_func(self._on_src_pad_added) + self.pipeline.get_bus().disconnect_by_func(self._on_gst_message) + + +class JingleAudio(JingleRTPContent): + ''' Jingle VoIP sessions consist of audio content transported + over an ICE UDP protocol. ''' + def __init__(self, session, transport=None): + JingleRTPContent.__init__(self, session, 'audio', transport) + self.setup_stream() + + + ''' Things to control the gstreamer's pipeline ''' + def setup_stream(self): + JingleRTPContent.setup_stream(self) + + # Configure SPEEX + # Workaround for psi (not needed since rev + # 147aedcea39b43402fe64c533d1866a25449888a): + # place 16kHz before 8kHz, as buggy psi versions will take in + # account only the first codec + + codecs = [farsight.Codec(farsight.CODEC_ID_ANY, 'SPEEX', + farsight.MEDIA_TYPE_AUDIO, 16000), + farsight.Codec(farsight.CODEC_ID_ANY, 'SPEEX', + farsight.MEDIA_TYPE_AUDIO, 8000)] + self.p2psession.set_codec_preferences(codecs) + + # the local parts + # TODO: use gconfaudiosink? + # sink = get_first_gst_element(['alsasink', 'osssink', 'autoaudiosink']) + self.sink = gst.element_factory_make('alsasink') + self.sink.set_property('sync', False) + #sink.set_property('latency-time', 20000) + #sink.set_property('buffer-time', 80000) + + # TODO: use gconfaudiosrc? + src_mic = gst.element_factory_make('alsasrc') + src_mic.set_property('blocksize', 320) + + self.mic_volume = gst.element_factory_make('volume') + self.mic_volume.set_property('volume', 1) + + # link gst elements + self.pipeline.add(self.sink, src_mic, self.mic_volume) + src_mic.link(self.mic_volume) + + self.mic_volume.get_pad('src').link(self.p2psession.get_property( + 'sink-pad')) + self.p2pstream.connect('src-pad-added', self._on_src_pad_added) + + # The following is needed for farsight to process ICE requests: + self.pipeline.set_state(gst.STATE_PLAYING) + + +class JingleVideo(JingleRTPContent): + def __init__(self, session, transport=None): + JingleRTPContent.__init__(self, session, 'video', transport) + self.setup_stream() + + ''' Things to control the gstreamer's pipeline ''' + def setup_stream(self): + #TODO: Everything is not working properly: + # sometimes, one window won't show up, + # sometimes it'll freeze... + JingleRTPContent.setup_stream(self) + # the local parts + src_vid = gst.element_factory_make('videotestsrc') + src_vid.set_property('is-live', True) + videoscale = gst.element_factory_make('videoscale') + caps = gst.element_factory_make('capsfilter') + caps.set_property('caps', gst.caps_from_string('video/x-raw-yuv, width=320, height=240')) + colorspace = gst.element_factory_make('ffmpegcolorspace') + + self.pipeline.add(src_vid, videoscale, caps, colorspace) + gst.element_link_many(src_vid, videoscale, caps, colorspace) + + self.sink = gst.element_factory_make('xvimagesink') + self.pipeline.add(self.sink) + + colorspace.get_pad('src').link(self.p2psession.get_property('sink-pad')) + self.p2pstream.connect('src-pad-added', self._on_src_pad_added) + + # The following is needed for farsight to process ICE requests: + self.pipeline.set_state(gst.STATE_PLAYING) + + +def get_content(desc): + if desc['media'] == 'audio': + return JingleAudio + elif desc['media'] == 'video': + return JingleVideo + else: + return None + +contents[xmpp.NS_JINGLE_RTP] = get_content diff --git a/src/common/jingle_session.py b/src/common/jingle_session.py new file mode 100644 index 000000000..9118affdf --- /dev/null +++ b/src/common/jingle_session.py @@ -0,0 +1,613 @@ +## +## Copyright (C) 2006 Gajim Team +## +## 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; version 2 only. +## +## 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. +## +''' Handles Jingle sessions (XEP 0166). ''' + +#TODO: +# * Have JingleContent here +# * 'senders' attribute of 'content' element +# * security preconditions +# * actions: +# - content-modify +# - description-info, session-info +# - security-info +# - transport-accept, transport-reject +# - Tie-breaking +# * timeout + +import gajim #Get rid of that? +import xmpp +from jingle_transport import get_jingle_transport +from jingle_content import get_jingle_content + +#FIXME: Move it to JingleSession.States? +class JingleStates(object): + ''' States in which jingle session may exist. ''' + ended = 0 + pending = 1 + active = 2 + +class OutOfOrder(Exception): + ''' Exception that should be raised when an action is received when in the wrong state. ''' + +class TieBreak(Exception): + ''' Exception that should be raised in case of a tie, when we overrule the other action. ''' + +class JingleSession(object): + ''' This represents one jingle session. ''' + def __init__(self, con, weinitiate, jid, sid=None): + ''' con -- connection object, + weinitiate -- boolean, are we the initiator? + jid - jid of the other entity''' + self.contents = {} # negotiated contents + self.connection = con # connection to use + # our full jid + #FIXME: Get rid of gajim here? + self.ourjid = gajim.get_jid_from_account(self.connection.name) + '/' + \ + con.server_resource + self.peerjid = jid # jid we connect to + # jid we use as the initiator + self.initiator = weinitiate and self.ourjid or self.peerjid + # jid we use as the responder + self.responder = weinitiate and self.peerjid or self.ourjid + # are we an initiator? + self.weinitiate = weinitiate + # what state is session in? (one from JingleStates) + self.state = JingleStates.ended + if not sid: + sid = con.connection.getAnID() + self.sid = sid # sessionid + + self.accepted = True # is this session accepted by user + + # callbacks to call on proper contents + # use .prepend() to add new callbacks, especially when you're going + # to send error instead of ack + self.callbacks = { + 'content-accept': [self.__contentAcceptCB, self.__broadcastCB, + self.__defaultCB], + 'content-add': [self.__contentAddCB, self.__broadcastCB, + self.__defaultCB], #TODO + 'content-modify': [self.__defaultCB], #TODO + 'content-reject': [self.__defaultCB, self.__contentRemoveCB], #TODO + 'content-remove': [self.__defaultCB, self.__contentRemoveCB], + 'description-info': [self.__broadcastCB, self.__defaultCB], #TODO + 'security-info': [self.__defaultCB], #TODO + 'session-accept': [self.__sessionAcceptCB, self.__contentAcceptCB, + self.__broadcastCB, self.__defaultCB], + 'session-info': [self.__sessionInfoCB, self.__broadcastCB, self.__defaultCB], + 'session-initiate': [self.__sessionInitiateCB, self.__broadcastCB, + self.__defaultCB], + 'session-terminate': [self.__sessionTerminateCB, self.__broadcastAllCB, + self.__defaultCB], + 'transport-info': [self.__broadcastCB, self.__defaultCB], + 'transport-replace': [self.__broadcastCB, self.__transportReplaceCB], #TODO + 'transport-accept': [self.__defaultCB], #TODO + 'transport-reject': [self.__defaultCB], #TODO + 'iq-result': [], + 'iq-error': [self.__errorCB], + } + + ''' Interaction with user ''' + def approve_session(self): + ''' Called when user accepts session in UI (when we aren't the initiator). + ''' + self.accept_session() + + def decline_session(self): + ''' Called when user declines session in UI (when we aren't the initiator) + ''' + reason = xmpp.Node('reason') + reason.addChild('decline') + self._session_terminate(reason) + + def approve_content(self, media): + content = self.get_content(media) + if content: + content.accepted = True + self.on_session_state_changed(content) + + def reject_content(self, media): + content = self.get_content(media) + if content: + if self.state == JingleStates.active: + self.__content_reject(content) + content.destroy() + self.on_session_state_changed() + + def end_session(self): + ''' Called when user stops or cancel session in UI. ''' + reason = xmpp.Node('reason') + if self.state == JingleStates.active: + reason.addChild('success') + else: + reason.addChild('cancel') + self._session_terminate(reason) + + ''' Middle-level functions to manage contents. Handle local content + cache and send change notifications. ''' + def get_content(self, media=None): + if media is None: + return None + + for content in self.contents.values(): + if content.media == media: + return content + + def add_content(self, name, content, creator='we'): + ''' Add new content to session. If the session is active, + this will send proper stanza to update session. + Creator must be one of ('we', 'peer', 'initiator', 'responder')''' + assert creator in ('we', 'peer', 'initiator', 'responder') + + if (creator == 'we' and self.weinitiate) or (creator == 'peer' and \ + not self.weinitiate): + creator = 'initiator' + elif (creator == 'peer' and self.weinitiate) or (creator == 'we' and \ + not self.weinitiate): + creator = 'responder' + content.creator = creator + content.name = name + self.contents[(creator, name)] = content + + if (creator == 'initiator') == self.weinitiate: + # The content is from us, accept it + content.accepted = True + + def remove_content(self, creator, name): + ''' We do not need this now ''' + #TODO: + if (creator, name) in self.contents: + content = self.contents[(creator, name)] + if len(self.contents) > 1: + self.__content_remove(content) + self.contents[(creator, name)].destroy() + if len(self.contents) == 0: + self.end_session() + + def modify_content(self, creator, name, *someother): + ''' We do not need this now ''' + pass + + def on_session_state_changed(self, content=None): + if self.state == JingleStates.ended: + # Session not yet started, only one action possible: session-initiate + if self.is_ready() and self.weinitiate: + self.__session_initiate() + elif self.state == JingleStates.pending: + # We can either send a session-accept or a content-add + if self.is_ready() and not self.weinitiate: + self.__session_accept() + elif content and (content.creator == 'initiator') == self.weinitiate: + self.__content_add(content) + elif content and self.weinitiate: + self.__content_accept(content) + elif self.state == JingleStates.active: + # We can either send a content-add or a content-accept + if not content: + return + if (content.creator == 'initiator') == self.weinitiate: + # We initiated this content. It's a pending content-add. + self.__content_add(content) + else: + # The other side created this content, we accept it. + self.__content_accept(content) + + def is_ready(self): + ''' Returns True when all codecs and candidates are ready + (for all contents). ''' + return (all((content.is_ready() for content in self.contents.itervalues())) + and self.accepted) + + ''' Middle-level function to do stanza exchange. ''' + def accept_session(self): + ''' Mark the session as accepted. ''' + self.accepted = True + self.on_session_state_changed() + + def start_session(self): + ''' Mark the session as ready to be started. ''' + self.accepted = True + self.on_session_state_changed() + + def send_session_info(self): + pass + + def send_content_accept(self, content): + assert self.state != JingleStates.ended + stanza, jingle = self.__make_jingle('content-accept') + jingle.addChild(node=content) + self.connection.connection.send(stanza) + + def send_transport_info(self, content): + assert self.state != JingleStates.ended + stanza, jingle = self.__make_jingle('transport-info') + jingle.addChild(node=content) + self.connection.connection.send(stanza) + + ''' Session callbacks. ''' + def stanzaCB(self, stanza): + ''' A callback for ConnectionJingle. It gets stanza, then + tries to send it to all internally registered callbacks. + First one to raise xmpp.NodeProcessed breaks function.''' + jingle = stanza.getTag('jingle') + error = stanza.getTag('error') + if error: + # it's an iq-error stanza + action = 'iq-error' + elif jingle: + # it's a jingle action + action = jingle.getAttr('action') + if action not in self.callbacks: + self.__send_error(stanza, 'bad_request') + return + #FIXME: If we aren't initiated and it's not a session-initiate... + if action != 'session-initiate' and self.state == JingleStates.ended: + self.__send_error(stanza, 'item-not-found', 'unknown-session') + return + else: + # it's an iq-result (ack) stanza + action = 'iq-result' + + callables = self.callbacks[action] + + try: + for callable in callables: + callable(stanza=stanza, jingle=jingle, error=error, action=action) + except xmpp.NodeProcessed: + pass + except TieBreak: + self.__send_error(stanza, 'conflict', 'tiebreak') + except OutOfOrder: + self.__send_error(stanza, 'unexpected-request', 'out-of-order')#FIXME + + def __defaultCB(self, stanza, jingle, error, action): + ''' Default callback for action stanzas -- simple ack + and stop processing. ''' + response = stanza.buildReply('result') + self.connection.connection.send(response) + + def __errorCB(self, stanza, jingle, error, action): + #FIXME + text = error.getTagData('text') + jingle_error = None + xmpp_error = None + for child in error.getChildren(): + if child.getNamespace() == xmpp.NS_JINGLE_ERRORS: + jingle_error = child.getName() + elif child.getNamespace() == xmpp.NS_STANZAS: + xmpp_error = child.getName() + self.__dispatch_error(xmpp_error, jingle_error, text) + #FIXME: Not sure when we would want to do that... + if xmpp_error == 'item-not-found': + self.connection.delete_jingle_session(self.peerjid, self.sid) + + def __transportReplaceCB(self, stanza, jingle, error, action): + for content in jingle.iterTags('content'): + creator = content['creator'] + name = content['name'] + if (creator, name) in self.contents: + transport_ns = content.getTag('transport').getNamespace() + if transport_ns == xmpp.JINGLE_ICE_UDP: + #FIXME: We don't manage anything else than ICE-UDP now... + #What was the previous transport?!? + #Anyway, content's transport is not modifiable yet + pass + else: + stanza, jingle = self.__make_jingle('transport-reject') + content = jingle.setTag('content', attrs={'creator': creator, + 'name': name}) + content.setTag('transport', namespace=transport_ns) + self.connection.connection.send(stanza) + raise xmpp.NodeProcessed + else: + #FIXME: This ressource is unknown to us, what should we do? + #For now, reject the transport + stanza, jingle = self.__make_jingle('transport-reject') + c = jingle.setTag('content', attrs={'creator': creator, + 'name': name}) + c.setTag('transport', namespace=transport_ns) + self.connection.connection.send(stanza) + raise xmpp.NodeProcessed + + def __sessionInfoCB(self, stanza, jingle, error, action): + #TODO: ringing, active, (un)hold, (un)mute + payload = jingle.getPayload() + if len(payload) > 0: + self.__send_error(stanza, 'feature-not-implemented', 'unsupported-info') + raise xmpp.NodeProcessed + + def __contentRemoveCB(self, stanza, jingle, error, action): + for content in jingle.iterTags('content'): + creator = content['creator'] + name = content['name'] + if (creator, name) in self.contents: + content = self.contents[(creator, name)] + #TODO: this will fail if content is not an RTP content + self.connection.dispatch('JINGLE_DISCONNECTED', + (self.peerjid, self.sid, content.media, 'removed')) + content.destroy() + if len(self.contents) == 0: + reason = xmpp.Node('reason') + reason.setTag('success') + self._session_terminate(reason) + + def __sessionAcceptCB(self, stanza, jingle, error, action): + if self.state != JingleStates.pending: #FIXME + raise OutOfOrder + self.state = JingleStates.active + + def __contentAcceptCB(self, stanza, jingle, error, action): + ''' Called when we get content-accept stanza or equivalent one + (like session-accept).''' + # check which contents are accepted + for content in jingle.iterTags('content'): + creator = content['creator'] + name = content['name']#TODO... + + def __contentAddCB(self, stanza, jingle, error, action): + if self.state == JingleStates.ended: + raise OutOfOrder + + parse_result = self.__parse_contents(jingle) + contents = parse_result[2] + rejected_contents = parse_result[3] + + for name, creator in rejected_contents: + #TODO: + content = JingleContent() + self.add_content(name, content, creator) + self.__content_reject(content) + self.contents[(content.creator, content.name)].destroy() + + self.connection.dispatch('JINGLE_INCOMING', (self.peerjid, self.sid, + contents)) + + def __sessionInitiateCB(self, stanza, jingle, error, action): + ''' We got a jingle session request from other entity, + therefore we are the receiver... Unpack the data, + inform the user. ''' + + if self.state != JingleStates.ended: + raise OutOfOrder + + self.initiator = jingle['initiator'] + self.responder = self.ourjid + self.peerjid = self.initiator + self.accepted = False # user did not accept this session yet + + # TODO: If the initiator is unknown to the receiver (e.g., via presence + # subscription) and the receiver has a policy of not communicating via + # Jingle with unknown entities, it SHOULD return a + # error. + + # Lets check what kind of jingle session does the peer want + contents_ok, transports_ok, contents, pouet = self.__parse_contents(jingle) + + # If there's no content we understand... + if not contents_ok: + # TODO: http://xmpp.org/extensions/xep-0166.html#session-terminate + reason = xmpp.Node('reason') + reason.setTag('unsupported-applications') + self.__defaultCB(stanza, jingle, error, action) + self._session_terminate(reason) + raise xmpp.NodeProcessed + + if not transports_ok: + # TODO: http://xmpp.org/extensions/xep-0166.html#session-terminate + reason = xmpp.Node('reason') + reason.setTag('unsupported-transports') + self.__defaultCB(stanza, jingle, error, action) + self._session_terminate(reason) + raise xmpp.NodeProcessed + + self.state = JingleStates.pending + + # Send event about starting a session + self.connection.dispatch('JINGLE_INCOMING', (self.peerjid, self.sid, + contents)) + + def __broadcastCB(self, stanza, jingle, error, action): + ''' Broadcast the stanza contents to proper content handlers. ''' + for content in jingle.iterTags('content'): + name = content['name'] + creator = content['creator'] + cn = self.contents[(creator, name)] + cn.stanzaCB(stanza, content, error, action) + + def __sessionTerminateCB(self, stanza, jingle, error, action): + self.connection.delete_jingle_session(self.peerjid, self.sid) + reason, text = self.__reason_from_stanza(jingle) + if reason not in ('success', 'cancel', 'decline'): + self.__dispatch_error(reason, reason, text) + if text: + text = '%s (%s)' % (reason, text) + else: + text = reason#TODO + self.connection.dispatch('JINGLE_DISCONNECTED', + (self.peerjid, self.sid, None, text)) + + def __broadcastAllCB(self, stanza, jingle, error, action): + ''' Broadcast the stanza to all content handlers. ''' + for content in self.contents.itervalues(): + content.stanzaCB(stanza, None, error, action) + + ''' Internal methods. ''' + def __parse_contents(self, jingle): + #TODO: Needs some reworking + contents = [] + contents_rejected = [] + contents_ok = False + transports_ok = False + + for element in jingle.iterTags('content'): + transport = get_jingle_transport(element.getTag('transport')) + content_type = get_jingle_content(element.getTag('description')) + if content_type: + contents_ok = True + if transport: + content = content_type(self, transport) + self.add_content(element['name'], + content, 'peer') + contents.append((content.media,)) + transports_ok = True + else: + contents_rejected.append((element['name'], 'peer')) + else: + contents_rejected.append((element['name'], 'peer')) + + return (contents_ok, transports_ok, contents, contents_rejected) + + def __dispatch_error(self, error, jingle_error=None, text=None): + if jingle_error: + error = jingle_error + if text: + text = '%s (%s)' % (error, text) + else: + text = error + self.connection.dispatch('JINGLE_ERROR', (self.peerjid, self.sid, text)) + + def __reason_from_stanza(self, stanza): + reason = 'success' + reasons = ['success', 'busy', 'cancel', 'connectivity-error', + 'decline', 'expired', 'failed-application', 'failed-transport', + 'general-error', 'gone', 'incompatible-parameters', 'media-error', + 'security-error', 'timeout', 'unsupported-applications', + 'unsupported-transports'] + tag = stanza.getTag('reason') + if tag: + text = tag.getTagData('text') + for r in reasons: + if tag.getTag(r): + reason = r + break + return (reason, text) + + ''' Methods that make/send proper pieces of XML. They check if the session + is in appropriate state. ''' + def __make_jingle(self, action): + stanza = xmpp.Iq(typ='set', to=xmpp.JID(self.peerjid)) + attrs = {'action': action, + 'sid': self.sid} + if action == 'session-initiate': + attrs['initiator'] = self.initiator + elif action == 'session-accept': + attrs['responder'] = self.responder + jingle = stanza.addChild('jingle', attrs=attrs, namespace=xmpp.NS_JINGLE) + return stanza, jingle + + def __send_error(self, stanza, error, jingle_error=None, text=None): + err = xmpp.Error(stanza, error) + err.setNamespace(xmpp.NS_STANZAS) + if jingle_error: + err.setTag(jingle_error, namespace=xmpp.NS_JINGLE_ERRORS) + if text: + err.setTagData('text', text) + self.connection.connection.send(err) + self.__dispatch_error(error, jingle_error, text) + + def __append_content(self, jingle, content): + ''' Append element to element, + with (full=True) or without (full=False) + children. ''' + jingle.addChild('content', + attrs={'name': content.name, 'creator': content.creator}) + + def __append_contents(self, jingle): + ''' Append all elements to .''' + # TODO: integrate with __appendContent? + # TODO: parameters 'name', 'content'? + for content in self.contents.values(): + self.__append_content(jingle, content) + + def __session_initiate(self): + assert self.state == JingleStates.ended + stanza, jingle = self.__make_jingle('session-initiate') + self.__append_contents(jingle) + self.__broadcastCB(stanza, jingle, None, 'session-initiate-sent') + self.connection.connection.send(stanza) + self.state = JingleStates.pending + + def __session_accept(self): + assert self.state == JingleStates.pending + stanza, jingle = self.__make_jingle('session-accept') + self.__append_contents(jingle) + self.__broadcastCB(stanza, jingle, None, 'session-accept-sent') + self.connection.connection.send(stanza) + self.state = JingleStates.active + + def __session_info(self, payload=None): + assert self.state != JingleStates.ended + stanza, jingle = self.__make_jingle('session-info') + if payload: + jingle.addChild(node=payload) + self.connection.connection.send(stanza) + + def _session_terminate(self, reason=None): + assert self.state != JingleStates.ended + stanza, jingle = self.__make_jingle('session-terminate') + if reason is not None: + jingle.addChild(node=reason) + self.__broadcastAllCB(stanza, jingle, None, 'session-terminate-sent') + self.connection.connection.send(stanza) + reason, text = self.__reason_from_stanza(jingle) + if reason not in ('success', 'cancel', 'decline'): + self.__dispatch_error(reason, reason, text) + if text: + text = '%s (%s)' % (reason, text) + else: + text = reason + self.connection.delete_jingle_session(self.peerjid, self.sid) + self.connection.dispatch('JINGLE_DISCONNECTED', + (self.peerjid, self.sid, None, text)) + + def __content_add(self, content): + #TODO: test + assert self.state != JingleStates.ended + stanza, jingle = self.__make_jingle('content-add') + self.__append_content(jingle, content) + self.__broadcastCB(stanza, jingle, None, 'content-add-sent') + self.connection.connection.send(stanza) + + def __content_accept(self, content): + #TODO: test + assert self.state != JingleStates.ended + stanza, jingle = self.__make_jingle('content-accept') + self.__append_content(jingle, content) + self.__broadcastCB(stanza, jingle, None, 'content-accept-sent') + self.connection.connection.send(stanza) + + def __content_reject(self, content): + assert self.state != JingleStates.ended + stanza, jingle = self.__make_jingle('content-reject') + self.__append_content(jingle, content) + self.connection.connection.send(stanza) + #TODO: this will fail if content is not an RTP content + self.connection.dispatch('JINGLE_DISCONNECTED', + (self.peerjid, self.sid, content.media, 'rejected')) + + def __content_modify(self): + assert self.state != JingleStates.ended + + def __content_remove(self, content): + assert self.state != JingleStates.ended + stanza, jingle = self.__make_jingle('content-remove') + self.__append_content(jingle, content) + self.connection.connection.send(stanza) + #TODO: this will fail if content is not an RTP content + self.connection.dispatch('JINGLE_DISCONNECTED', + (self.peerjid, self.sid, content.media, 'removed')) + + def content_negociated(self, media): + self.connection.dispatch('JINGLE_CONNECTED', (self.peerjid, self.sid, + media)) + diff --git a/src/common/jingle_transport.py b/src/common/jingle_transport.py new file mode 100644 index 000000000..83db8c039 --- /dev/null +++ b/src/common/jingle_transport.py @@ -0,0 +1,139 @@ +## +## Copyright (C) 2006 Gajim Team +## +## 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; version 2 only. +## +## 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. +## +''' Handles Jingle Transports (currently only ICE-UDP). ''' + +import xmpp + +transports = {} + +def get_jingle_transport(node): + namespace = node.getNamespace() + if namespace in transports: + return transports[namespace]() + else: + return None + + +class TransportType(object): + ''' Possible types of a JingleTransport ''' + datagram = 1 + streaming = 2 + + +class JingleTransport(object): + ''' An abstraction of a transport in Jingle sessions. ''' + def __init__(self, type_): + self.type = type_ + self.candidates = [] + self.remote_candidates = [] + + def _iter_candidates(self): + for candidate in self.candidates: + yield self.make_candidate(candidate) + + def make_candidate(self, candidate): + ''' Build a candidate stanza for the given candidate. ''' + pass + + def make_transport(self, candidates=None): + ''' Build a transport stanza with the given candidates (or self.candidates + if candidates is None). ''' + if not candidates: + candidates = self._iter_candidates() + transport = xmpp.Node('transport', payload=candidates) + return transport + + +import farsight + +class JingleTransportICEUDP(JingleTransport): + def __init__(self): + JingleTransport.__init__(self, TransportType.datagram) + + def make_candidate(self, candidate): + types = {farsight.CANDIDATE_TYPE_HOST: 'host', + farsight.CANDIDATE_TYPE_SRFLX: 'srflx', + farsight.CANDIDATE_TYPE_PRFLX: 'prflx', + farsight.CANDIDATE_TYPE_RELAY: 'relay', + farsight.CANDIDATE_TYPE_MULTICAST: 'multicast'} + attrs = { + 'component': candidate.component_id, + 'foundation': '1', # hack + 'generation': '0', + 'ip': candidate.ip, + 'network': '0', + 'port': candidate.port, + 'priority': int(candidate.priority), # hack + } + if candidate.type in types: + attrs['type'] = types[candidate.type] + if candidate.proto == farsight.NETWORK_PROTOCOL_UDP: + attrs['protocol'] = 'udp' + else: + # we actually don't handle properly different tcp options in jingle + attrs['protocol'] = 'tcp' + return xmpp.Node('candidate', attrs=attrs) + + def make_transport(self, candidates=None): + transport = JingleTransport.make_transport(self, candidates) + transport.setNamespace(xmpp.NS_JINGLE_ICE_UDP) + if self.candidates and self.candidates[0].username and \ + self.candidates[0].password: + transport.setAttr('ufrag', self.candidates[0].username) + transport.setAttr('pwd', self.candidates[0].password) + return transport + + def transportInfoCB(self, transport): + candidates = [] + for candidate in transport.iterTags('candidate'): + cand = farsight.Candidate() + cand.component_id = int(candidate['component']) + cand.ip = str(candidate['ip']) + cand.port = int(candidate['port']) + cand.foundation = str(candidate['foundation']) + #cand.type = farsight.CANDIDATE_TYPE_LOCAL + cand.priority = int(candidate['priority']) + + if candidate['protocol'] == 'udp': + cand.proto = farsight.NETWORK_PROTOCOL_UDP + else: + # we actually don't handle properly different tcp options in jingle + cand.proto = farsight.NETWORK_PROTOCOL_TCP + + cand.username = str(transport['ufrag']) + cand.password = str(transport['pwd']) + + #FIXME: huh? + types = {'host': farsight.CANDIDATE_TYPE_HOST, + 'srflx': farsight.CANDIDATE_TYPE_SRFLX, + 'prflx': farsight.CANDIDATE_TYPE_PRFLX, + 'relay': farsight.CANDIDATE_TYPE_RELAY, + 'multicast': farsight.CANDIDATE_TYPE_MULTICAST} + if 'type' in candidate and candidate['type'] in types: + cand.type = types[candidate['type']] + else: + print 'Unknown type %s', candidate['type'] + candidates.append(cand) + #FIXME: connectivity should not be etablished yet + # Instead, it should be etablished after session-accept! + #FIXME: + #if len(candidates) > 0: + # if self.sent: + # self.p2pstream.set_remote_candidates(candidates) + # else: + self.remote_candidates.extend(candidates) + #self.p2pstream.set_remote_candidates(candidates) + #print self.media, self.creator, self.name, candidates + +transports[xmpp.NS_JINGLE_ICE_UDP] = JingleTransportICEUDP + From b1173a2e87c48bbfb519a2e27e0d9ac7b1a418fd Mon Sep 17 00:00:00 2001 From: Thibaut GIRKA Date: Sun, 15 Nov 2009 21:21:10 +0100 Subject: [PATCH 016/259] Fix a regression introduced by my last patch --- src/common/jingle_content.py | 9 ++++++++- src/common/jingle_rtp.py | 7 +++++++ src/common/jingle_transport.py | 20 ++++++++------------ 3 files changed, 23 insertions(+), 13 deletions(-) diff --git a/src/common/jingle_content.py b/src/common/jingle_content.py index 98b5dfa0a..2feb5d8de 100644 --- a/src/common/jingle_content.py +++ b/src/common/jingle_content.py @@ -70,6 +70,10 @@ class JingleContent(object): def is_ready(self): return (self.accepted and not self.sent) + def add_remote_candidates(self, candidates): + ''' Add a list of candidates to the list of remote candidates. ''' + pass + def stanzaCB(self, stanza, content, error, action): ''' Called when something related to our content was sent by peer. ''' if action in self.callbacks: @@ -78,7 +82,10 @@ class JingleContent(object): def __transportInfoCB(self, stanza, content, error, action): ''' Got a new transport candidate. ''' - self.transport.transportInfoCB(content.getTag('transport')) + candidates = self.transport.parse_transport_stanza( + content.getTag('transport')) + if candidates: + self.add_remote_candidates(candidates) def __content(self, payload=[]): ''' Build a XML content-wrapper for our data. ''' diff --git a/src/common/jingle_rtp.py b/src/common/jingle_rtp.py index 7fb9c2611..d67b0f465 100644 --- a/src/common/jingle_rtp.py +++ b/src/common/jingle_rtp.py @@ -83,6 +83,13 @@ class JingleRTPContent(JingleContent): return (JingleContent.is_ready(self) and self.candidates_ready and self.p2psession.get_property('codecs-ready')) + def add_remote_candidates(self, candidates): + JingleContent.add_remote_candidates(self, candidates) + #FIXME: connectivity should not be etablished yet + # Instead, it should be etablished after session-accept! + if self.sent: + self.p2pstream.set_remote_candidates(candidates) + def batch_dtmf(self, events): if self._dtmf_running: raise Exception #TODO: Proper exception diff --git a/src/common/jingle_transport.py b/src/common/jingle_transport.py index 83db8c039..487c66d70 100644 --- a/src/common/jingle_transport.py +++ b/src/common/jingle_transport.py @@ -46,13 +46,17 @@ class JingleTransport(object): pass def make_transport(self, candidates=None): - ''' Build a transport stanza with the given candidates (or self.candidates - if candidates is None). ''' + ''' Build a transport stanza with the given candidates (or + self.candidates if candidates is None). ''' if not candidates: candidates = self._iter_candidates() transport = xmpp.Node('transport', payload=candidates) return transport + def parse_transport_stanza(self, transport): + ''' Returns the list of transport candidates from a transport stanza. ''' + return [] + import farsight @@ -93,7 +97,7 @@ class JingleTransportICEUDP(JingleTransport): transport.setAttr('pwd', self.candidates[0].password) return transport - def transportInfoCB(self, transport): + def parse_transport_stanza(self, transport): candidates = [] for candidate in transport.iterTags('candidate'): cand = farsight.Candidate() @@ -124,16 +128,8 @@ class JingleTransportICEUDP(JingleTransport): else: print 'Unknown type %s', candidate['type'] candidates.append(cand) - #FIXME: connectivity should not be etablished yet - # Instead, it should be etablished after session-accept! - #FIXME: - #if len(candidates) > 0: - # if self.sent: - # self.p2pstream.set_remote_candidates(candidates) - # else: self.remote_candidates.extend(candidates) - #self.p2pstream.set_remote_candidates(candidates) - #print self.media, self.creator, self.name, candidates + return candidates transports[xmpp.NS_JINGLE_ICE_UDP] = JingleTransportICEUDP From 4c03c1ab85297f2c25aea8bc1521504a63c8bfe9 Mon Sep 17 00:00:00 2001 From: Stephan Erb Date: Sun, 15 Nov 2009 22:41:17 +0100 Subject: [PATCH 017/259] Remove duplicated Icon determination logic used when drawing accounts. --- src/roster_window.py | 48 +++++++------------------------------------- 1 file changed, 7 insertions(+), 41 deletions(-) diff --git a/src/roster_window.py b/src/roster_window.py index 6d06388f8..e425c9cb3 100644 --- a/src/roster_window.py +++ b/src/roster_window.py @@ -1022,55 +1022,21 @@ class RosterWindow: self.model[child_iter][C_NAME] = account_name - if gajim.config.get('show_mood_in_roster') \ - and 'mood' in gajim.connections[account].mood \ - and gajim.connections[account].mood['mood'].strip() in MOODS: - - self.model[child_iter][C_MOOD_PIXBUF] = gtkgui_helpers.load_mood_icon( - gajim.connections[account].mood['mood'].strip()).get_pixbuf() - - elif gajim.config.get('show_mood_in_roster') \ - and 'mood' in gajim.connections[account].mood: - self.model[child_iter][C_MOOD_PIXBUF] = \ - gtkgui_helpers.load_mood_icon('unknown'). \ - get_pixbuf() + pep = gajim.connections[account].pep + if gajim.config.get('show_mood_in_roster') and 'mood' in pep: + self.model[child_iter][C_MOOD_PIXBUF] = pep['mood'].asPixbufIcon() else: self.model[child_iter][C_MOOD_PIXBUF] = None - if gajim.config.get('show_activity_in_roster') \ - and 'activity' in gajim.connections[account].activity \ - and gajim.connections[account].activity['activity'].strip() \ - in ACTIVITIES: - if 'subactivity' in gajim.connections[account].activity \ - and gajim.connections[account].activity['subactivity'].strip() \ - in ACTIVITIES[gajim.connections[account].activity['activity'].strip()]: - self.model[child_iter][C_ACTIVITY_PIXBUF] = \ - gtkgui_helpers.load_activity_icon( - gajim.connections[account].activity['activity'].strip(), - gajim.connections[account].activity['subactivity'].strip()). \ - get_pixbuf() - else: - self.model[child_iter][C_ACTIVITY_PIXBUF] = \ - gtkgui_helpers.load_activity_icon( - gajim.connections[account].activity['activity'].strip()). \ - get_pixbuf() - elif gajim.config.get('show_activity_in_roster') \ - and 'activity' in gajim.connections[account].activity: - self.model[child_iter][C_ACTIVITY_PIXBUF] = \ - gtkgui_helpers.load_activity_icon('unknown'). \ - get_pixbuf() + if gajim.config.get('show_activity_in_roster') and 'activity' in pep: + self.model[child_iter][C_ACTIVITY_PIXBUF] = pep['activity'].asPixbufIcon() else: self.model[child_iter][C_ACTIVITY_PIXBUF] = None - if gajim.config.get('show_tunes_in_roster') \ - and ('artist' in gajim.connections[account].tune \ - or 'title' in gajim.connections[account].tune): - path = os.path.join(gajim.DATA_DIR, 'emoticons', 'static', 'music.png') - self.model[child_iter][C_TUNE_PIXBUF] = \ - gtk.gdk.pixbuf_new_from_file(path) + if gajim.config.get('show_tunes_in_roster') and 'tune' in pep: + self.model[child_iter][C_TUNE_PIXBUF] = pep['tune'].asPixbufIcon() else: self.model[child_iter][C_TUNE_PIXBUF] = None - return False def draw_group(self, group, account): From 338cb11dcce2218978f7e56bb45094c049431d57 Mon Sep 17 00:00:00 2001 From: Stephan Erb Date: Sun, 15 Nov 2009 22:54:20 +0100 Subject: [PATCH 018/259] Unify update_mood, update_tune, update_activity by using a single update_pep(pep_type) method. --- src/chat_control.py | 52 +++++++++++++++----------------------------- src/common/pep.py | 5 ++--- src/gui_interface.py | 6 ++--- 3 files changed, 22 insertions(+), 41 deletions(-) diff --git a/src/chat_control.py b/src/chat_control.py index b71033da5..d9607c4b5 100644 --- a/src/chat_control.py +++ b/src/chat_control.py @@ -1279,14 +1279,12 @@ class ChatControl(ChatControlBase): self.video_state = self.JINGLE_STATE_NOT_AVAILABLE self.update_toolbar() - - self._mood_image = self.xml.get_widget('mood_image') - self._activity_image = self.xml.get_widget('activity_image') - self._tune_image = self.xml.get_widget('tune_image') - - self.update_mood() - self.update_activity() - self.update_tune() + + self._pep_images = {} + self._pep_images['mood'] = self.xml.get_widget('mood_image') + self._pep_images['activity'] = self.xml.get_widget('activity_image') + self._pep_images['tune'] = self.xml.get_widget('tune_image') + self.update_all_pep_types() # keep timeout id and window obj for possible big avatar # it is on enter-notify and leave-notify so no need to be @@ -1430,38 +1428,22 @@ class ChatControl(ChatControlBase): self._convert_to_gc_button.set_sensitive(True) else: self._convert_to_gc_button.set_sensitive(False) + + def update_all_pep_types(self): + for pep_type in ('tune', 'mood', 'activity'): + self.update_pep(pep_type) - def update_mood(self): + def update_pep(self, pep_type): if isinstance(self.contact, GC_Contact): return pep = self.contact.pep - if 'mood' in pep: - self._mood_image.set_from_pixbuf(pep['mood'].asPixbufIcon()) - self._mood_image.set_tooltip_markup(pep['mood'].asMarkupText()) - self._mood_image.show() + img = self._pep_images[pep_type] + if pep_type in pep: + img.set_from_pixbuf(pep[pep_type].asPixbufIcon()) + img.set_tooltip_markup(pep[pep_type].asMarkupText()) + img.show() else: - self._mood_image.hide() - - def update_activity(self): - if isinstance(self.contact, GC_Contact): - return - pep = self.contact.pep - if 'activity' in pep: - self._activity_image.set_from_pixbuf(pep['activity'].asPixbufIcon()) - self._activity_image.set_tooltip_markup(pep['activity'].asMarkupText()) - self._activity_image.show() - else: - self._activity_image.hide() - - def update_tune(self): - if isinstance(self.contact, GC_Contact): - return - pep = self.contact.pep - if 'tune' in pep: - self._tune_image.set_tooltip_markup(pep['tune'].asMarkupText()) - self._tune_image.show() - else: - self._tune_image.hide() + img.hide() def _update_jingle(self, jingle_type): if jingle_type not in ('audio', 'video'): diff --git a/src/common/pep.py b/src/common/pep.py index 13a774a1b..18a27364a 100644 --- a/src/common/pep.py +++ b/src/common/pep.py @@ -594,8 +594,7 @@ def delete_pep(jid, name): common.gajim.interface.roster.draw_mood(user, name) ctrl = common.gajim.interface.msg_win_mgr.get_control(user, name) if ctrl: - ctrl.update_activity() - ctrl.update_tune() - ctrl.update_mood() + ctrl.update_all_pep_types() + # vim: se ts=3: diff --git a/src/gui_interface.py b/src/gui_interface.py index 8aec6f993..ec093b03b 100644 --- a/src/gui_interface.py +++ b/src/gui_interface.py @@ -2001,15 +2001,15 @@ class Interface: if pep_type == 'mood': self.roster.draw_mood(jid, account) if ctrl: - ctrl.update_mood() + ctrl.update_pep(pep_type) elif pep_type == 'tune': self.roster.draw_tune(jid, account) if ctrl: - ctrl.update_tune() + ctrl.update_pep(pep_type) elif pep_type == 'activity': self.roster.draw_activity(jid, account) if ctrl: - ctrl.update_activity() + ctrl.update_pep(pep_type) elif pep_type == 'nickname': self.roster.draw_contact(jid, account) if ctrl: From 28161dc33c2d0f0da693d37baea6980013d6ee2e Mon Sep 17 00:00:00 2001 From: Stephan Erb Date: Sun, 15 Nov 2009 22:59:43 +0100 Subject: [PATCH 019/259] Apply coding standards. --- src/common/pep.py | 33 ++++++++++++++------------------- src/roster_window.py | 3 +-- 2 files changed, 15 insertions(+), 21 deletions(-) diff --git a/src/common/pep.py b/src/common/pep.py index 18a27364a..e0394ce61 100644 --- a/src/common/pep.py +++ b/src/common/pep.py @@ -475,11 +475,12 @@ class ConnectionPEP: self.dispatch('PEP_RECEIVED', (jid, pep.type)) items = event_tag.getTag('items') - if items is None: return + if items is None: + return for item in items.getTags('item'): entry = item.getTag('entry') - if entry is not None: + if entry: # for each entry in feed (there shouldn't be more than one, # but to be sure... self.dispatch('ATOM_ENTRY', (atom.OldEntry(node=entry),)) @@ -493,9 +494,9 @@ def user_send_mood(account, mood, message=''): if not common.gajim.connections[account].pep_supported: return item = xmpp.Node('mood', {'xmlns': xmpp.NS_MOOD}) - if mood != '': + if mood: item.addChild(mood) - if message != '': + if message: i = item.addChild('text') i.addData(message) @@ -506,11 +507,11 @@ def user_send_activity(account, activity, subactivity='', message=''): if not common.gajim.connections[account].pep_supported: return item = xmpp.Node('activity', {'xmlns': xmpp.NS_ACTIVITY}) - if activity != '': + if activity: i = item.addChild(activity) - if subactivity != '': + if subactivity: i.addChild(subactivity) - if message != '': + if message: i = item.addChild('text') i.addData(message) @@ -523,22 +524,22 @@ items=None): common.gajim.connections[account].pep_supported): return item = xmpp.Node('tune', {'xmlns': xmpp.NS_TUNE}) - if artist != '': + if artist: i = item.addChild('artist') i.addData(artist) - if title != '': + if title: i = item.addChild('title') i.addData(title) - if source != '': + if source: i = item.addChild('source') i.addData(source) - if track != 0: + if track: i = item.addChild('track') i.addData(track) - if length != 0: + if length: i = item.addChild('length') i.addData(length) - if items is not None: + if items: item.addChild(payload=items) common.gajim.connections[account].send_pb_publish('', xmpp.NS_TUNE, item, @@ -570,20 +571,14 @@ def delete_pep(jid, name): if jid == common.gajim.get_jid_from_account(name): acc = common.gajim.connections[name] - del acc.activity acc.activity = {} user_send_tune(name) - del acc.tune acc.tune = {} - del acc.mood acc.mood = {} for contact in common.gajim.contacts.get_contacts(name, user): - del contact.activity contact.activity = {} - del contact.tune contact.tune = {} - del contact.mood contact.mood = {} if jid == common.gajim.get_jid_from_account(name): diff --git a/src/roster_window.py b/src/roster_window.py index e425c9cb3..046684b57 100644 --- a/src/roster_window.py +++ b/src/roster_window.py @@ -1934,8 +1934,7 @@ class RosterWindow: gajim.connections[account].send_custom_status(status, txt, to) else: if status in ('invisible', 'offline'): - pep.delete_pep(gajim.get_jid_from_account(account), \ - account) + pep.delete_pep(gajim.get_jid_from_account(account), account) was_invisible = gajim.connections[account].connected == \ gajim.SHOW_LIST.index('invisible') gajim.connections[account].change_status(status, txt, auto) From aa53988fd18d1f7f2b8d58bd5dd88c895c40331d Mon Sep 17 00:00:00 2001 From: Stephan Erb Date: Sun, 15 Nov 2009 23:23:56 +0100 Subject: [PATCH 020/259] Similar to update_pep, unify towards draw_pep of the RosterWindow. --- src/chat_control.py | 4 +++- src/common/pep.py | 4 +--- src/gui_interface.py | 18 +++++------------- src/roster_window.py | 40 +++++++++++++++++++++++++--------------- 4 files changed, 34 insertions(+), 32 deletions(-) diff --git a/src/chat_control.py b/src/chat_control.py index d9607c4b5..9c491b9e1 100644 --- a/src/chat_control.py +++ b/src/chat_control.py @@ -1430,12 +1430,14 @@ class ChatControl(ChatControlBase): self._convert_to_gc_button.set_sensitive(False) def update_all_pep_types(self): - for pep_type in ('tune', 'mood', 'activity'): + for pep_type in self._pep_images: self.update_pep(pep_type) def update_pep(self, pep_type): if isinstance(self.contact, GC_Contact): return + if pep_type not in self._pep_images: + return pep = self.contact.pep img = self._pep_images[pep_type] if pep_type in pep: diff --git a/src/common/pep.py b/src/common/pep.py index e0394ce61..85e72d8ea 100644 --- a/src/common/pep.py +++ b/src/common/pep.py @@ -584,9 +584,7 @@ def delete_pep(jid, name): if jid == common.gajim.get_jid_from_account(name): common.gajim.interface.roster.draw_account(name) - common.gajim.interface.roster.draw_activity(user, name) - common.gajim.interface.roster.draw_tune(user, name) - common.gajim.interface.roster.draw_mood(user, name) + common.gajim.interface.roster.draw_all_pep_types(jid, name) ctrl = common.gajim.interface.msg_win_mgr.get_control(user, name) if ctrl: ctrl.update_all_pep_types() diff --git a/src/gui_interface.py b/src/gui_interface.py index ec093b03b..f33e769e3 100644 --- a/src/gui_interface.py +++ b/src/gui_interface.py @@ -1998,25 +1998,17 @@ class Interface: if jid == common.gajim.get_jid_from_account(account): self.roster.draw_account(account) - if pep_type == 'mood': - self.roster.draw_mood(jid, account) - if ctrl: - ctrl.update_pep(pep_type) - elif pep_type == 'tune': - self.roster.draw_tune(jid, account) - if ctrl: - ctrl.update_pep(pep_type) - elif pep_type == 'activity': - self.roster.draw_activity(jid, account) - if ctrl: - ctrl.update_pep(pep_type) - elif pep_type == 'nickname': + if pep_type == 'nickname': self.roster.draw_contact(jid, account) if ctrl: ctrl.update_ui() win = ctrl.parent_win win.redraw_tab(ctrl) win.show_title() + else: + self.roster.draw_pep(jid, account, pep_type) + if ctrl: + ctrl.update_pep(pep_type) def register_handler(self, event, handler): if event not in self.handlers: diff --git a/src/roster_window.py b/src/roster_window.py index 046684b57..2745a3365 100644 --- a/src/roster_window.py +++ b/src/roster_window.py @@ -1242,19 +1242,27 @@ class RosterWindow: return False - def draw_mood(self, jid, account): - if gajim.config.get('show_mood_in_roster'): - self._draw_pep(jid, account, 'mood', C_MOOD_PIXBUF) - - def draw_activity(self, jid, account): - if gajim.config.get('show_activity_in_roster'): - self._draw_pep(jid, account, 'activity', C_ACTIVITY_PIXBUF) - - def draw_tune(self, jid, account): - if gajim.config.get('show_tunes_in_roster'): - self._draw_pep(jid, account, 'tune', C_TUNE_PIXBUF) + def _is_pep_shown_in_roster(self, pep_type): + if pep_type == 'mood': + return gajim.config.get('show_mood_in_roster') + elif pep_type == 'activity': + return gajim.config.get('show_activity_in_roster') + elif pep_type == 'tune': + return gajim.config.get('show_tunes_in_roster') + else: + return False + + def draw_all_pep_types(self, jid, account): + for pep_type in self._pep_type_to_model_column: + self.draw_pep(jid, account, pep_type) - def _draw_pep(self, jid, account, pep_type, model_column): + def draw_pep(self, jid, account, pep_type): + if pep_type not in self._pep_type_to_model_column: + return + if not self._is_pep_shown_in_roster(pep_type): + return + + model_column = self._pep_type_to_model_column[pep_type] iters = self._get_contact_iter(jid, account, model=self.model) if not iters: return @@ -1285,9 +1293,7 @@ class RosterWindow: def draw_completely(self, jid, account): self.draw_contact(jid, account) - self.draw_mood(jid, account) - self.draw_activity(jid, account) - self.draw_tune(jid, account) + self.draw_all_pep_types(jid, account) self.draw_avatar(jid, account) def adjust_and_draw_contact_context(self, jid, account): @@ -5753,6 +5759,10 @@ class RosterWindow: col.add_attribute(render_pixbuf, 'pixbuf', C_TUNE_PIXBUF) col.set_cell_data_func(render_pixbuf, self._fill_pep_pixbuf_renderer, C_TUNE_PIXBUF) + + self._pep_type_to_model_column = {'mood': C_MOOD_PIXBUF, + 'activity': C_ACTIVITY_PIXBUF, + 'tune': C_ACTIVITY_PIXBUF} if gajim.config.get('avatar_position_in_roster') == 'right': add_avatar_renderer() From a3ea00f4ea349b51b172a9f187842e3a3b6d4f4c Mon Sep 17 00:00:00 2001 From: Stephan Erb Date: Sun, 15 Nov 2009 23:52:43 +0100 Subject: [PATCH 021/259] Remove different dicts for tune, activity and mood and from now on only use the common 'pep' dict. The pep dict contacts the different UserPEP classes. --- src/common/connection.py | 3 --- src/common/contacts.py | 21 +++++++++--------- src/common/pep.py | 25 ++++++---------------- src/common/zeroconf/connection_zeroconf.py | 4 +--- src/roster_window.py | 9 ++++---- test/lib/gajim_mocks.py | 4 +--- 6 files changed, 22 insertions(+), 44 deletions(-) diff --git a/src/common/connection.py b/src/common/connection.py index 90df73d08..e2b6d2166 100644 --- a/src/common/connection.py +++ b/src/common/connection.py @@ -168,9 +168,6 @@ class Connection(ConnectionHandlers): self.pubsub_supported = False self.pubsub_publish_options_supported = False self.pep_supported = False - self.mood = {} - self.tune = {} - self.activity = {} self.pep = {} # Do we continue connection when we get roster (send presence,get vcard..) self.continue_connect_info = None diff --git a/src/common/contacts.py b/src/common/contacts.py index b8b039288..d012558bf 100644 --- a/src/common/contacts.py +++ b/src/common/contacts.py @@ -94,7 +94,7 @@ class Contact(CommonContact): def __init__(self, jid, account, name='', groups=[], show='', status='', sub='', ask='', resource='', priority=0, keyID='', client_caps=None, our_chatstate=None, chatstate=None, last_status_time=None, msg_id = None, - composing_xep=None, mood={}, tune={}, activity={}): + composing_xep=None): CommonContact.__init__(self, jid, account, resource, show, status, name, our_chatstate, composing_xep, chatstate, client_caps=client_caps) @@ -111,9 +111,6 @@ class Contact(CommonContact): self.last_status_time = last_status_time self.pep = {} - self.mood = mood.copy() - self.tune = tune.copy() - self.activity = activity.copy() def get_full_jid(self): if self.resource: @@ -229,23 +226,25 @@ class Contacts: def create_contact(self, jid, account, name='', groups=[], show='', status='', sub='', ask='', resource='', priority=0, keyID='', client_caps=None, our_chatstate=None, chatstate=None, last_status_time=None, - composing_xep=None, mood={}, tune={}, activity={}): + composing_xep=None): account = self._accounts.get(account, account) # Use Account object if available return Contact(jid=jid, account=account, name=name, groups=groups, show=show, status=status, sub=sub, ask=ask, resource=resource, priority=priority, keyID=keyID, client_caps=client_caps, our_chatstate=our_chatstate, chatstate=chatstate, last_status_time=last_status_time, - composing_xep=composing_xep, mood=mood, tune=tune, activity=activity) + composing_xep=composing_xep) - def create_self_contact(self, jid, account, resource, show, status, priority, keyID=''): + def create_self_contact(self, jid, account, resource, show, status, priority, + name='', keyID=''): conn = common.gajim.connections[account] - nick = common.gajim.nicks[account] + nick = name or common.gajim.nicks[account] account = self._accounts.get(account, account) # Use Account object if available - return self.create_contact(jid=jid, account=account, + self_contact = self.create_contact(jid=jid, account=account, name=nick, groups=['self_contact'], show=show, status=status, sub='both', ask='none', priority=priority, keyID=keyID, - resource=resource, mood=conn.mood, tune=conn.tune, - activity=conn.activity) + resource=resource) + self_contact.pep = conn.pep + return self_contact def create_not_in_roster_contact(self, jid, account, resource='', name='', keyID=''): account = self._accounts.get(account, account) # Use Account object if available diff --git a/src/common/pep.py b/src/common/pep.py index 85e72d8ea..fa4a31a3a 100644 --- a/src/common/pep.py +++ b/src/common/pep.py @@ -237,24 +237,16 @@ class AbstractPEP(object): '''To be implemented by subclasses''' raise NotImplementedError - def _update_contacts(self, jid, account): - dict = {} if self._retracted else self._pep_specific_data - - for contact in common.gajim.contacts.get_contacts(account, jid): - setattr(contact, self.type, dict) - + def _update_contacts(self, jid, account): + for contact in common.gajim.contacts.get_contacts(account, jid): if self._retracted: if self.type in contact.pep: del contact.pep[self.type] else: contact.pep[self.type] = self - def _update_account(self, account): - dict = {} if self._retracted else self._pep_specific_data - - acc = common.gajim.connections[account] - setattr(acc, self.type, dict) - + def _update_account(self, account): + acc = common.gajim.connections[account] if self._retracted: if self.type in acc.pep: del acc.pep[self.type] @@ -571,15 +563,10 @@ def delete_pep(jid, name): if jid == common.gajim.get_jid_from_account(name): acc = common.gajim.connections[name] - acc.activity = {} - user_send_tune(name) - acc.tune = {} - acc.mood = {} + acc.pep = {} for contact in common.gajim.contacts.get_contacts(name, user): - contact.activity = {} - contact.tune = {} - contact.mood = {} + contact.pep = {} if jid == common.gajim.get_jid_from_account(name): common.gajim.interface.roster.draw_account(name) diff --git a/src/common/zeroconf/connection_zeroconf.py b/src/common/zeroconf/connection_zeroconf.py index c5a93b4b8..26725f5f0 100644 --- a/src/common/zeroconf/connection_zeroconf.py +++ b/src/common/zeroconf/connection_zeroconf.py @@ -88,9 +88,7 @@ class ConnectionZeroconf(ConnectionHandlersZeroconf): self.no_log_for = False self.pep_supported = False - self.mood = {} - self.tune = {} - self.activity = {} + self.pep = {} # Do we continue connection when we get roster (send presence,get vcard...) self.continue_connect_info = None if gajim.HAVE_GPG: diff --git a/src/roster_window.py b/src/roster_window.py index 2745a3365..17697b3dd 100644 --- a/src/roster_window.py +++ b/src/roster_window.py @@ -2432,11 +2432,10 @@ class RosterWindow: account_name = account if gajim.account_is_connected(account): account_name += ' (%s/%s)' % (repr(nbr_on), repr(nbr_total)) - contact = gajim.contacts.create_contact(jid=jid, account=account, name=account_name, - show=connection.get_status(), sub='', status=connection.status, - resource=connection.server_resource, - priority=connection.priority, mood=connection.mood, - tune=connection.tune, activity=connection.activity) + contact = gajim.contacts.create_self_contact(jid=jid, account=account, + name=account_name, show=connection.get_status(), + status=connection.status, resource=connection.server_resource, + priority=connection.priority) if gajim.connections[account].gpg: contact.keyID = gajim.config.get_per('accounts', connection.name, 'keyid') diff --git a/test/lib/gajim_mocks.py b/test/lib/gajim_mocks.py index d45e488e6..9607a77c9 100644 --- a/test/lib/gajim_mocks.py +++ b/test/lib/gajim_mocks.py @@ -14,9 +14,7 @@ class MockConnection(Mock, ConnectionHandlersBase): self.name = account self.connected = 2 - self.mood = {} - self.activity = {} - self.tune = {} + self.pep = {} self.blocked_contacts = {} self.blocked_groups = {} self.sessions = {} From 1c28dbfae9518ed4c136d4c1406737220729fdcd Mon Sep 17 00:00:00 2001 From: Yann Leboulanger Date: Mon, 16 Nov 2009 16:42:40 +0100 Subject: [PATCH 022/259] properly decode string in history manager. Fixes #5430 --- src/history_manager.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/history_manager.py b/src/history_manager.py index 9ab638364..5cdac0369 100644 --- a/src/history_manager.py +++ b/src/history_manager.py @@ -610,8 +610,8 @@ class HistoryManager: liststore, list_of_paths)) def on_search_db_button_clicked(self, widget): - text = self.search_entry.get_text() - if text == '': + text = self.search_entry.get_text().decode('utf-8') + if not text: return self.welcome_vbox.hide() From 10428555aa87d512def8274bc06abb1de87f2ce7 Mon Sep 17 00:00:00 2001 From: Stephan Erb Date: Mon, 16 Nov 2009 19:31:17 +0100 Subject: [PATCH 023/259] Various pep-related cleanups. Most important change is that pep send/retract functions no reside on the ConnectionPEP object. --- src/common/pep.py | 208 +++++++++++++++++++----------------------- src/gui_interface.py | 22 ++--- src/profile_window.py | 3 +- src/roster_window.py | 74 +++++++-------- 4 files changed, 139 insertions(+), 168 deletions(-) diff --git a/src/common/pep.py b/src/common/pep.py index fa4a31a3a..21861c5e2 100644 --- a/src/common/pep.py +++ b/src/common/pep.py @@ -400,17 +400,17 @@ class UserActivityPEP(AbstractPEP): text = pep['text'] if 'text' in pep else None if activity in ACTIVITIES: - # Translate standard activities - if subactivity in ACTIVITIES[activity]: - subactivity = ACTIVITIES[activity][subactivity] - activity = ACTIVITIES[activity]['category'] + # Translate standard activities + if subactivity in ACTIVITIES[activity]: + subactivity = ACTIVITIES[activity][subactivity] + activity = ACTIVITIES[activity]['category'] markuptext = '' + gobject.markup_escape_text(activity) if subactivity: markuptext += ': ' + gobject.markup_escape_text(subactivity) markuptext += '' if text: - markuptext += ' (%s)' + gobject.markup_escape_text(text) + markuptext += ' (%s)' % gobject.markup_escape_text(text) return markuptext @@ -446,18 +446,17 @@ class UserNicknamePEP(AbstractPEP): common.gajim.nicks[account] = self._pep_specific_data -SUPPORTED_PERSONAL_USER_EVENTS = [UserMoodPEP, UserTunePEP, UserActivityPEP, UserNicknamePEP] +SUPPORTED_PERSONAL_USER_EVENTS = [UserMoodPEP, UserTunePEP, UserActivityPEP, + UserNicknamePEP] -class ConnectionPEP: - +class ConnectionPEP(object): + def _pubsubEventCB(self, xmpp_dispatcher, msg): ''' Called when we receive with pubsub event. ''' if msg.getTag('error'): log.warning('PubsubEventCB received error stanza') return - - # TODO: Logging? (actually services where logging would be useful, should - # TODO: allow to access archives remotely...) + jid = helpers.get_full_jid_from_iq(msg) event_tag = msg.getTag('event') @@ -467,114 +466,97 @@ class ConnectionPEP: self.dispatch('PEP_RECEIVED', (jid, pep.type)) items = event_tag.getTag('items') - if items is None: - return - - for item in items.getTags('item'): - entry = item.getTag('entry') - if entry: - # for each entry in feed (there shouldn't be more than one, - # but to be sure... - self.dispatch('ATOM_ENTRY', (atom.OldEntry(node=entry),)) - continue - # unknown type... probably user has another client who understands that event + if items: + for item in items.getTags('item'): + entry = item.getTag('entry') + if entry: + # for each entry in feed (there shouldn't be more than one, + # but to be sure... + self.dispatch('ATOM_ENTRY', (atom.OldEntry(node=entry),)) raise common.xmpp.NodeProcessed + + def send_activity(self, activity, subactivity=None, message=None): + if not self.pep_supported: + return + item = xmpp.Node('activity', {'xmlns': xmpp.NS_ACTIVITY}) + if activity: + i = item.addChild(activity) + if subactivity: + i.addChild(subactivity) + if message: + i = item.addChild('text') + i.addData(message) + self.send_pb_publish('', xmpp.NS_ACTIVITY, item, '0') + + def retract_activity(self): + if not self.pep_supported: + return + # not all server support retract, so send empty pep first + self.send_activity(None) + self.send_pb_retract('', xmpp.NS_ACTIVITY, '0') + def send_mood(self, mood, message=None): + if not self.pep_supported: + return + item = xmpp.Node('mood', {'xmlns': xmpp.NS_MOOD}) + if mood: + item.addChild(mood) + if message: + i = item.addChild('text') + i.addData(message) + self.send_pb_publish('', xmpp.NS_MOOD, item, '0') + + def retract_mood(self): + if not self.pep_supported: + return + self.send_mood(None) + self.send_pb_retract('', xmpp.NS_MOOD, '0') + + def send_tune(self, artist='', title='', source='', track=0, length=0, + items=None): + if not self.pep_supported: + return + item = xmpp.Node('tune', {'xmlns': xmpp.NS_TUNE}) + if artist: + i = item.addChild('artist') + i.addData(artist) + if title: + i = item.addChild('title') + i.addData(title) + if source: + i = item.addChild('source') + i.addData(source) + if track: + i = item.addChild('track') + i.addData(track) + if length: + i = item.addChild('length') + i.addData(length) + if items: + item.addChild(payload=items) + self.send_pb_publish('', xmpp.NS_TUNE, item, '0') -def user_send_mood(account, mood, message=''): - if not common.gajim.connections[account].pep_supported: - return - item = xmpp.Node('mood', {'xmlns': xmpp.NS_MOOD}) - if mood: - item.addChild(mood) - if message: - i = item.addChild('text') - i.addData(message) + def retract_tune(self): + if not self.pep_supported: + return + # not all server support retract, so send empty pep first + self.send_tune(None) + self.send_pb_retract('', xmpp.NS_TUNE, '0') - common.gajim.connections[account].send_pb_publish('', xmpp.NS_MOOD, item, - '0') + def send_nickname(self, nick): + if not self.pep_supported: + return + item = xmpp.Node('nick', {'xmlns': xmpp.NS_NICK}) + item.addData(nick) + self.send_pb_publish('', xmpp.NS_NICK, item, '0') -def user_send_activity(account, activity, subactivity='', message=''): - if not common.gajim.connections[account].pep_supported: - return - item = xmpp.Node('activity', {'xmlns': xmpp.NS_ACTIVITY}) - if activity: - i = item.addChild(activity) - if subactivity: - i.addChild(subactivity) - if message: - i = item.addChild('text') - i.addData(message) - - common.gajim.connections[account].send_pb_publish('', xmpp.NS_ACTIVITY, item, - '0') - -def user_send_tune(account, artist='', title='', source='', track=0, length=0, -items=None): - if not (common.gajim.config.get_per('accounts', account, 'publish_tune') and\ - common.gajim.connections[account].pep_supported): - return - item = xmpp.Node('tune', {'xmlns': xmpp.NS_TUNE}) - if artist: - i = item.addChild('artist') - i.addData(artist) - if title: - i = item.addChild('title') - i.addData(title) - if source: - i = item.addChild('source') - i.addData(source) - if track: - i = item.addChild('track') - i.addData(track) - if length: - i = item.addChild('length') - i.addData(length) - if items: - item.addChild(payload=items) - - common.gajim.connections[account].send_pb_publish('', xmpp.NS_TUNE, item, - '0') - -def user_send_nickname(account, nick): - if not common.gajim.connections[account].pep_supported: - return - item = xmpp.Node('nick', {'xmlns': xmpp.NS_NICK}) - item.addData(nick) - - common.gajim.connections[account].send_pb_publish('', xmpp.NS_NICK, item, - '0') - -def user_retract_mood(account): - common.gajim.connections[account].send_pb_retract('', xmpp.NS_MOOD, '0') - -def user_retract_activity(account): - common.gajim.connections[account].send_pb_retract('', xmpp.NS_ACTIVITY, '0') - -def user_retract_tune(account): - common.gajim.connections[account].send_pb_retract('', xmpp.NS_TUNE, '0') - -def user_retract_nickname(account): - common.gajim.connections[account].send_pb_retract('', xmpp.NS_NICK, '0') - -def delete_pep(jid, name): - user = common.gajim.get_room_and_nick_from_fjid(jid)[0] - - if jid == common.gajim.get_jid_from_account(name): - acc = common.gajim.connections[name] - acc.pep = {} - - for contact in common.gajim.contacts.get_contacts(name, user): - contact.pep = {} - - if jid == common.gajim.get_jid_from_account(name): - common.gajim.interface.roster.draw_account(name) - - common.gajim.interface.roster.draw_all_pep_types(jid, name) - ctrl = common.gajim.interface.msg_win_mgr.get_control(user, name) - if ctrl: - ctrl.update_all_pep_types() + def retract_nickname(self): + if not self.pep_supported: + return + # not all server support retract, so send empty pep first + self.send_tune(None) + self.send_pb_retract('', xmpp.NS_NICK, '0') # vim: se ts=3: diff --git a/src/gui_interface.py b/src/gui_interface.py index f33e769e3..98c1f3298 100644 --- a/src/gui_interface.py +++ b/src/gui_interface.py @@ -2796,33 +2796,27 @@ class Interface: listener.disconnect(self.music_track_changed_signal) self.music_track_changed_signal = None - def music_track_changed(self, unused_listener, music_track_info, account=''): - if account == '': + def music_track_changed(self, unused_listener, music_track_info, account=None): + if not account: accounts = gajim.connections.keys() else: accounts = [account] - if music_track_info is None: - artist = '' - title = '' - source = '' - elif hasattr(music_track_info, 'paused') and music_track_info.paused == 0: - artist = '' - title = '' - source = '' + + is_paused = hasattr(music_track_info, 'paused') and music_track_info.paused == 0 + if not music_track_info or is_paused: + artist = title = source = '' else: artist = music_track_info.artist title = music_track_info.title source = music_track_info.album for acct in accounts: - if acct not in gajim.connections: - continue if not gajim.account_is_connected(acct): continue - if not gajim.connections[acct].pep_supported: + if not gajim.config.get_per('accounts', acct, 'publish_tune'): continue if gajim.connections[acct].music_track_info == music_track_info: continue - pep.user_send_tune(acct, artist, title, source) + gajim.connections[acct].send_tune(artist, title, source) gajim.connections[acct].music_track_info = music_track_info def get_bg_fg_colors(self): diff --git a/src/profile_window.py b/src/profile_window.py index a417ede08..f3fe1faa4 100644 --- a/src/profile_window.py +++ b/src/profile_window.py @@ -322,8 +322,7 @@ class ProfileWindow: nick = '' if 'NICKNAME' in vcard_: nick = vcard_['NICKNAME'] - from common import pep - pep.user_send_nickname(self.account, nick) + gajim.connections[self.account].send_nickname(self.account, nick) if nick == '': nick = gajim.config.get_per('accounts', self.account, 'name') gajim.nicks[self.account] = nick diff --git a/src/roster_window.py b/src/roster_window.py index 17697b3dd..6cef52f35 100644 --- a/src/roster_window.py +++ b/src/roster_window.py @@ -1896,36 +1896,36 @@ class RosterWindow: self.send_status_continue(account, status, txt, auto, to) - def send_pep(self, account, pep_dict=None): - '''Sends pep information (activity, mood)''' - if not pep_dict: - return - # activity - if 'activity' in pep_dict and pep_dict['activity'] in pep.ACTIVITIES: + def send_pep(self, account, pep_dict): + connection = gajim.connections[account] + + if 'activity' in pep_dict: activity = pep_dict['activity'] - if 'subactivity' in pep_dict and \ - pep_dict['subactivity'] in pep.ACTIVITIES[activity]: - subactivity = pep_dict['subactivity'] - else: - subactivity = 'other' - if 'activity_text' in pep_dict: - activity_text = pep_dict['activity_text'] - else: - activity_text = '' - pep.user_send_activity(account, activity, subactivity, activity_text) + subactivity = pep_dict.get('subactivity', None) + activity_text = pep_dict.get('activity_text', None) + connection.send_activity(activity, subactivity, activity_text) else: - pep.user_send_activity(account, '') + connection.retract_activity() - # mood - if 'mood' in pep_dict and pep_dict['mood'] in pep.MOODS: + if 'mood' in pep_dict: mood = pep_dict['mood'] - if 'mood_text' in pep_dict: - mood_text = pep_dict['mood_text'] - else: - mood_text = '' - pep.user_send_mood(account, mood, mood_text) + mood_text = pep_dict.get('mood_text', None) + connection.send_mood(mood, mood_text) else: - pep.user_send_mood(account, '') + connection.retract_mood() + + def delete_pep(self, jid, account): + if jid == gajim.get_jid_from_account(account): + gajim.connections[account].pep = {} + self.draw_account(account) + + for contact in gajim.contacts.get_contacts(account, jid): + contact.pep = {} + + self.draw_all_pep_types(jid, account) + ctrl = gajim.interface.msg_win_mgr.get_control(jid, account) + if ctrl: + ctrl.update_all_pep_types() def send_status_continue(self, account, status, txt, auto, to): if gajim.account_is_connected(account) and not to: @@ -1940,7 +1940,7 @@ class RosterWindow: gajim.connections[account].send_custom_status(status, txt, to) else: if status in ('invisible', 'offline'): - pep.delete_pep(gajim.get_jid_from_account(account), account) + self.delete_pep(gajim.get_jid_from_account(account), account) was_invisible = gajim.connections[account].connected == \ gajim.SHOW_LIST.index('invisible') gajim.connections[account].change_status(status, txt, auto) @@ -2018,7 +2018,7 @@ class RosterWindow: contact_instances) if not keep_pep and contact.jid != gajim.get_jid_from_account(account) \ and not contact.is_groupchat(): - pep.delete_pep(contact.jid, account) + self.delete_pep(contact.jid, account) # Redraw everything and select the sender self.adjust_and_draw_contact_context(contact.jid, account) @@ -3318,23 +3318,19 @@ class RosterWindow: gajim.interface.instances['preferences'] = config.PreferencesWindow() def on_publish_tune_toggled(self, widget, account): - act = widget.get_active() - gajim.config.set_per('accounts', account, 'publish_tune', act) - if act: + active = widget.get_active() + gajim.config.set_per('accounts', account, 'publish_tune', active) + if active: gajim.interface.enable_music_listener() else: - # disable it only if no other account use it - for acct in gajim.connections: - if gajim.config.get_per('accounts', acct, 'publish_tune'): + gajim.connections[account].retract_tune() + # disable music listener only if no other account uses it + for acc in gajim.connections: + if gajim.config.get_per('accounts', acc, 'publish_tune'): break else: gajim.interface.disable_music_listener() - if gajim.connections[account].pep_supported: - # As many implementations don't support retracting items, we send a - # "Stopped" event first - pep.user_send_tune(account, '') - pep.user_retract_tune(account) helpers.update_optional_features(account) def on_pep_services_menuitem_activate(self, widget, account): @@ -5761,7 +5757,7 @@ class RosterWindow: self._pep_type_to_model_column = {'mood': C_MOOD_PIXBUF, 'activity': C_ACTIVITY_PIXBUF, - 'tune': C_ACTIVITY_PIXBUF} + 'tune': C_TUNE_PIXBUF} if gajim.config.get('avatar_position_in_roster') == 'right': add_avatar_renderer() From ff551cd75d54ae71dea842916a12223f7fabb29f Mon Sep 17 00:00:00 2001 From: Yann Leboulanger Date: Mon, 16 Nov 2009 20:56:51 +0100 Subject: [PATCH 024/259] make some strings translatable in RIE dialog --- src/dialogs.py | 72 ++++++++++++++++++++++++++------------------------ 1 file changed, 38 insertions(+), 34 deletions(-) diff --git a/src/dialogs.py b/src/dialogs.py index 1e4e6266b..4d197a896 100644 --- a/src/dialogs.py +++ b/src/dialogs.py @@ -2843,6 +2843,9 @@ class XMLConsoleWindow: # it's expanded!! self.input_textview.grab_focus() +#Action that can be done with an incoming list of contacts +TRANSLATED_ACTION = {'add': _('add'), 'modify': _('modify'), + 'remove': _('remove')} class RosterItemExchangeWindow: ''' Windows used when someone send you a exchange contact suggestion ''' def __init__(self, account, action, exchange_list, jid_from, @@ -2866,12 +2869,13 @@ class RosterItemExchangeWindow: # Set labels # self.action can be 'add', 'modify' or 'remove' - self.type_label.set_label(\ - _('%s would like you to %s some contacts in your ' - 'roster.') % (jid_from, _(self.action))) + self.type_label.set_label( + _('%(jid)s would like you to %(action)s some contacts ' + 'in your roster.') % {'jid': jid_from, + 'action': TRANSLATED_ACTION[self.action]}) if message_body: - buffer = self.body_textview.get_buffer() - buffer.set_text(self.message_body) + buffer_ = self.body_textview.get_buffer() + buffer_.set_text(self.message_body) else: self.body_scrolledwindow.hide() # Treeview @@ -2924,8 +2928,8 @@ class RosterItemExchangeWindow: groups = groups + group + ', ' if not is_in_roster: show_dialog = True - iter = model.append() - model.set(iter, 0, True, 1, jid, 2, name, 3, groups) + iter_ = model.append() + model.set(iter_, 0, True, 1, jid, 2, name, 3, groups) # Change label for accept_button to action name instead of 'OK'. self.accept_button_label.set_label(_('Add')) @@ -2955,8 +2959,8 @@ class RosterItemExchangeWindow: groups = groups + group + ', ' if not is_right and is_in_roster: show_dialog = True - iter = model.append() - model.set(iter, 0, True, 1, jid, 2, name, 3, groups) + iter_ = model.append() + model.set(iter_, 0, True, 1, jid, 2, name, 3, groups) # Change label for accept_button to action name instead of 'OK'. self.accept_button_label.set_label(_('Modify')) @@ -2979,8 +2983,8 @@ class RosterItemExchangeWindow: groups = groups + group + ', ' if is_in_roster: show_dialog = True - iter = model.append() - model.set(iter, 0, True, 1, jid, 2, name, 3, groups) + iter_ = model.append() + model.set(iter_, 0, True, 1, jid, 2, name, 3, groups) # Change label for accept_button to action name instead of 'OK'. self.accept_button_label.set_label(_('Delete')) @@ -2991,49 +2995,49 @@ class RosterItemExchangeWindow: def toggled_callback(self, cell, path): model = self.items_list_treeview.get_model() - iter = model.get_iter(path) - model[iter][0] = not cell.get_active() + iter_ = model.get_iter(path) + model[iter_][0] = not cell.get_active() def on_accept_button_clicked(self, widget): model = self.items_list_treeview.get_model() - iter = model.get_iter_root() + iter_ = model.get_iter_root() if self.action == 'add': a = 0 - while iter: - if model[iter][0]: + while iter_: + if model[iter_][0]: a+=1 # it is selected - #remote_jid = model[iter][1].decode('utf-8') + #remote_jid = model[iter_][1].decode('utf-8') message = _('%s suggested me to add you in my roster.' % self.jid_from) # keep same groups and same nickname - groups = model[iter][3].split(', ') + groups = model[iter_][3].split(', ') if groups == ['']: groups = [] - jid = model[iter][1].decode('utf-8') + jid = model[iter_][1].decode('utf-8') if gajim.jid_is_transport(self.jid_from): gajim.connections[self.account].automatically_added.append( jid) gajim.interface.roster.req_sub(self, jid, message, - self.account, groups=groups, nickname=model[iter][2], + self.account, groups=groups, nickname=model[iter_][2], auto_auth=True) - iter = model.iter_next(iter) - InformationDialog('Added %s contacts' % str(a)) + iter_ = model.iter_next(iter_) + InformationDialog(_('Added %s contacts') % str(a)) elif self.action == 'modify': a = 0 - while iter: - if model[iter][0]: + while iter_: + if model[iter_][0]: a+=1 # it is selected - jid = model[iter][1].decode('utf-8') + jid = model[iter_][1].decode('utf-8') # keep same groups and same nickname - groups = model[iter][3].split(', ') + groups = model[iter_][3].split(', ') if groups == ['']: groups = [] for u in gajim.contacts.get_contact(self.account, jid): - u.name = model[iter][2] + u.name = model[iter_][2] gajim.connections[self.account].update_contact(jid, - model[iter][2], groups) + model[iter_][2], groups) self.draw_contact(jid, account) # Update opened chat ctrl = gajim.interface.msg_win_mgr.get_control(jid, self.account) @@ -3043,19 +3047,19 @@ class RosterItemExchangeWindow: self.account) win.redraw_tab(ctrl) win.show_title() - iter = model.iter_next(iter) + iter_ = model.iter_next(iter_) elif self.action == 'delete': a = 0 - while iter: - if model[iter][0]: + while iter_: + if model[iter_][0]: a+=1 # it is selected - jid = model[iter][1].decode('utf-8') + jid = model[iter_][1].decode('utf-8') gajim.connections[self.account].unsubscribe(jid) gajim.interface.roster.remove_contact(jid, self.account) gajim.contacts.remove_jid(self.account, jid) - iter = model.iter_next(iter) - InformationDialog('Removed %s contacts' % str(a)) + iter_ = model.iter_next(iter_) + InformationDialog(_('Removed %s contacts') % str(a)) self.window.destroy() def on_cancel_button_clicked(self, widget): From d6e6a5d62d62bc4d3775d60a2525799db5c4e5df Mon Sep 17 00:00:00 2001 From: Stephan Erb Date: Tue, 17 Nov 2009 23:17:08 +0100 Subject: [PATCH 025/259] Do not try to send (and fail) sending PEP via Zeroconf. Fixes #5432. --- src/common/pep.py | 2 +- src/gui_interface.py | 2 ++ src/roster_window.py | 4 ++++ 3 files changed, 7 insertions(+), 1 deletion(-) diff --git a/src/common/pep.py b/src/common/pep.py index 21861c5e2..742325b4c 100644 --- a/src/common/pep.py +++ b/src/common/pep.py @@ -555,7 +555,7 @@ class ConnectionPEP(object): if not self.pep_supported: return # not all server support retract, so send empty pep first - self.send_tune(None) + self.send_nickname(None) self.send_pb_retract('', xmpp.NS_NICK, '0') diff --git a/src/gui_interface.py b/src/gui_interface.py index 98c1f3298..9cb53d646 100644 --- a/src/gui_interface.py +++ b/src/gui_interface.py @@ -2812,6 +2812,8 @@ class Interface: for acct in accounts: if not gajim.account_is_connected(acct): continue + if gajim.connections[acct].is_zeroconf: + continue if not gajim.config.get_per('accounts', acct, 'publish_tune'): continue if gajim.connections[acct].music_track_info == music_track_info: diff --git a/src/roster_window.py b/src/roster_window.py index 6cef52f35..25780f85c 100644 --- a/src/roster_window.py +++ b/src/roster_window.py @@ -1898,6 +1898,8 @@ class RosterWindow: def send_pep(self, account, pep_dict): connection = gajim.connections[account] + if connection.is_zeroconf: + return if 'activity' in pep_dict: activity = pep_dict['activity'] @@ -1915,6 +1917,8 @@ class RosterWindow: connection.retract_mood() def delete_pep(self, jid, account): + if gajim.connections[account].is_zeroconf: + return if jid == gajim.get_jid_from_account(account): gajim.connections[account].pep = {} self.draw_account(account) From 960e402cf06bc9310b81e22ef544848f399cdd5c Mon Sep 17 00:00:00 2001 From: Yann Leboulanger Date: Wed, 18 Nov 2009 11:04:05 +0100 Subject: [PATCH 026/259] typo in a comment --- src/common/xmpp/client_nb.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/common/xmpp/client_nb.py b/src/common/xmpp/client_nb.py index 489885f76..7d82ae4e3 100644 --- a/src/common/xmpp/client_nb.py +++ b/src/common/xmpp/client_nb.py @@ -112,7 +112,7 @@ class NonBlockingClient: log.debug('calling on_proxy_failure cb') self.on_proxy_failure(reason=message) else: - log.debug('ccalling on_connect_failure cb') + log.debug('calling on_connect_failure cb') self.on_connect_failure() else: # we are connected to XMPP server From 88f3104c4ecadd3e3945d3bd7e693a4e112c2162 Mon Sep 17 00:00:00 2001 From: Yann Leboulanger Date: Wed, 18 Nov 2009 11:06:09 +0100 Subject: [PATCH 027/259] refactor normal and zeroconf Connection objects with a CommonConnection class --- src/common/connection.py | 958 ++++++++++-------- src/common/xmpp/transports_nb.py | 1 + src/common/zeroconf/client_zeroconf.py | 31 +- .../zeroconf/connection_handlers_zeroconf.py | 4 +- src/common/zeroconf/connection_zeroconf.py | 472 +++------ 5 files changed, 691 insertions(+), 775 deletions(-) diff --git a/src/common/connection.py b/src/common/connection.py index e2b6d2166..3cd3acd43 100644 --- a/src/common/connection.py +++ b/src/common/connection.py @@ -98,17 +98,491 @@ ssl_error = { 32: _("Key usage does not include certificate signing"), 50: _("Application verification failure") } -class Connection(ConnectionHandlers): - '''Connection class''' + +class CommonConnection: + ''' + Common connection class, can be derivated for normal connection or zeroconf + connection + ''' def __init__(self, name): - ConnectionHandlers.__init__(self) self.name = name # self.connected: # 0=>offline, # 1=>connection in progress, - # 2=>authorised + # 2=>online + # 3=>free for chat + # ... self.connected = 0 self.connection = None # xmpppy ClientCommon instance + self.on_purpose = False + self.is_zeroconf = False + self.password = '' + self.server_resource = self._compute_resource() + self.gpg = None + self.USE_GPG = False + if gajim.HAVE_GPG: + self.USE_GPG = True + self.gpg = GnuPG.GnuPG(gajim.config.get('use_gpg_agent')) + self.status = '' + self.old_show = '' + self.priority = gajim.get_priority(name, 'offline') + self.time_to_reconnect = None + self.bookmarks = [] + + self.blocked_list = [] + self.blocked_contacts = [] + self.blocked_groups = [] + self.blocked_all = False + + self.pep_supported = False + self.pep = {} + # Do we continue connection when we get roster (send presence,get vcard..) + self.continue_connect_info = None + + # To know the groupchat jid associated with a sranza ID. Useful to + # request vcard or os info... to a real JID but act as if it comes from + # the fake jid + self.groupchat_jids = {} # {ID : groupchat_jid} + + self.privacy_rules_supported = False + self.vcard_supported = False + self.private_storage_supported = False + + self.muc_jid = {} # jid of muc server for each transport type + + self.get_config_values_or_default() + + def _compute_resource(self): + resource = gajim.config.get_per('accounts', self.name, 'resource') + # All valid resource substitution strings should be added to this hash. + if resource: + resource = Template(resource).safe_substitute({ + 'hostname': socket.gethostname() + }) + + def dispatch(self, event, data): + '''always passes account name as first param''' + gajim.interface.dispatch(event, self.name, data) + + def _reconnect(self): + '''To be implemented by derivated classes''' + raise NotImplementedError + + def quit(self, kill_core): + if kill_core and gajim.account_is_connected(self.name): + self.disconnect(on_purpose=True) + + def test_gpg_passphrase(self, password): + '''Returns 'ok', 'bad_pass' or 'expired' ''' + if not self.gpg: + return False + self.gpg.passphrase = password + keyID = gajim.config.get_per('accounts', self.name, 'keyid') + signed = self.gpg.sign('test', keyID) + self.gpg.password = None + if signed == 'KEYEXPIRED': + return 'expired' + elif signed == 'BAD_PASSPHRASE': + return 'bad_pass' + return 'ok' + + def get_signed_msg(self, msg, callback = None): + '''returns the signed message if possible + or an empty string if gpg is not used + or None if waiting for passphrase. + callback is the function to call when user give the passphrase''' + signed = '' + keyID = gajim.config.get_per('accounts', self.name, 'keyid') + if keyID and self.USE_GPG: + use_gpg_agent = gajim.config.get('use_gpg_agent') + if self.gpg.passphrase is None and not use_gpg_agent: + # We didn't set a passphrase + return None + if self.gpg.passphrase is not None or use_gpg_agent: + signed = self.gpg.sign(msg, keyID) + if signed == 'BAD_PASSPHRASE': + self.USE_GPG = False + signed = '' + self.dispatch('BAD_PASSPHRASE', ()) + return signed + + def _on_disconnected(self): + ''' called when a disconnect request has completed successfully''' + self.disconnect(on_purpose=True) + self.dispatch('STATUS', 'offline') + + def get_status(self): + return gajim.SHOW_LIST[self.connected] + + def check_jid(self, jid): + '''this function must be implemented by derivated classes. + It has to return the valid jid, or raise a helpers.InvalidFormat exception + ''' + raise NotImplementedError + + def _prepare_message(self, jid, msg, keyID, type_='chat', subject='', + chatstate=None, msg_id=None, composing_xep=None, resource=None, + user_nick=None, xhtml=None, session=None, forward_from=None, form_node=None, + original_message=None, delayed=None, callback=None): + if not self.connection or self.connected < 2: + return 1 + try: + jid = self.check_jid(jid) + except helpers.InvalidFormat: + self.dispatch('ERROR', (_('Invalid Jabber ID'), + _('It is not possible to send a message to %s, this JID is not ' + 'valid.') % jid)) + return + + if msg and not xhtml and gajim.config.get( + 'rst_formatting_outgoing_messages'): + from common.rst_xhtml_generator import create_xhtml + xhtml = create_xhtml(msg) + if not msg and chatstate is None and form_node is None: + return + fjid = jid + if resource: + fjid += '/' + resource + msgtxt = msg + msgenc = '' + + if session: + fjid = session.get_to() + + if keyID and self.USE_GPG: + xhtml = None + if keyID == 'UNKNOWN': + error = _('Neither the remote presence is signed, nor a key was ' + 'assigned.') + elif keyID.endswith('MISMATCH'): + error = _('The contact\'s key (%s) does not match the key assigned ' + 'in Gajim.' % keyID[:8]) + else: + def encrypt_thread(msg, keyID, always_trust=False): + # encrypt message. This function returns (msgenc, error) + return self.gpg.encrypt(msg, [keyID], always_trust) + def _on_encrypted(output): + msgenc, error = output + if error == 'NOT_TRUSTED': + def _on_always_trust(answer): + if answer: + gajim.thread_interface(encrypt_thread, [msg, keyID, + True], _on_encrypted, []) + else: + self._message_encrypted_cb(output, type_, msg, msgtxt, + original_message, fjid, resource, jid, xhtml, + subject, chatstate, composing_xep, forward_from, + delayed, session, form_node, user_nick, keyID, + callback) + self.dispatch('GPG_ALWAYS_TRUST', _on_always_trust) + else: + self._message_encrypted_cb(output, type_, msg, msgtxt, + original_message, fjid, resource, jid, xhtml, subject, + chatstate, composing_xep, forward_from, delayed, session, + form_node, user_nick, keyID, callback) + gajim.thread_interface(encrypt_thread, [msg, keyID, False], + _on_encrypted, []) + return + + self._message_encrypted_cb(('', error), type_, msg, msgtxt, + original_message, fjid, resource, jid, xhtml, subject, chatstate, + composing_xep, forward_from, delayed, session, form_node, user_nick, + keyID, callback) + + self._on_continue_message(type_, msg, msgtxt, original_message, fjid, + resource, jid, xhtml, subject, msgenc, keyID, chatstate, composing_xep, + forward_from, delayed, session, form_node, user_nick, callback) + + def _message_encrypted_cb(self, output, type_, msg, msgtxt, original_message, + fjid, resource, jid, xhtml, subject, chatstate, composing_xep, forward_from, + delayed, session, form_node, user_nick, keyID, callback): + msgenc, error = output + + if msgenc and not error: + msgtxt = '[This message is *encrypted* (See :XEP:`27`]' + lang = os.getenv('LANG') + if lang is not None and lang != 'en': # we're not english + # one in locale and one en + msgtxt = _('[This message is *encrypted* (See :XEP:`27`]') + \ + ' (' + msgtxt + ')' + self._on_continue_message(type_, msg, msgtxt, original_message, fjid, + resource, jid, xhtml, subject, msgenc, keyID, chatstate, + composing_xep, forward_from, delayed, session, form_node, user_nick, + callback) + return + # Encryption failed, do not send message + tim = localtime() + self.dispatch('MSGNOTSENT', (jid, error, msgtxt, tim, session)) + + def _on_continue_message(self, type_, msg, msgtxt, original_message, fjid, + resource, jid, xhtml, subject, msgenc, keyID, chatstate, composing_xep, + forward_from, delayed, session, form_node, user_nick, callback): + if type_ == 'chat': + msg_iq = common.xmpp.Message(to=fjid, body=msgtxt, typ=type_, + xhtml=xhtml) + else: + if subject: + msg_iq = common.xmpp.Message(to=fjid, body=msgtxt, typ='normal', + subject=subject, xhtml=xhtml) + else: + msg_iq = common.xmpp.Message(to=fjid, body=msgtxt, typ='normal', + xhtml=xhtml) + if msgenc: + msg_iq.setTag(common.xmpp.NS_ENCRYPTED + ' x').setData(msgenc) + + if form_node: + msg_iq.addChild(node=form_node) + + # XEP-0172: user_nickname + if user_nick: + msg_iq.setTag('nick', namespace = common.xmpp.NS_NICK).setData( + user_nick) + + # TODO: We might want to write a function so we don't need to + # reproduce that ugly if somewhere else. + if resource: + contact = gajim.contacts.get_contact(self.name, jid, resource) + else: + contact = gajim.contacts.get_contact_with_highest_priority(self.name, + jid) + + # chatstates - if peer supports xep85 or xep22, send chatstates + # please note that the only valid tag inside a message containing a + # tag is the active event + if chatstate is not None and contact: + if ((composing_xep == 'XEP-0085' or not composing_xep) \ + and composing_xep != 'asked_once') or \ + contact.supports(common.xmpp.NS_CHATSTATES): + # XEP-0085 + msg_iq.setTag(chatstate, namespace=common.xmpp.NS_CHATSTATES) + if composing_xep in ('XEP-0022', 'asked_once') or \ + not composing_xep: + # XEP-0022 + chatstate_node = msg_iq.setTag('x', namespace=common.xmpp.NS_EVENT) + if chatstate is 'composing' or msgtxt: + chatstate_node.addChild(name='composing') + + if forward_from: + addresses = msg_iq.addChild('addresses', + namespace=common.xmpp.NS_ADDRESS) + addresses.addChild('address', attrs = {'type': 'ofrom', + 'jid': forward_from}) + + # XEP-0203 + if delayed: + our_jid = gajim.get_jid_from_account(self.name) + '/' + \ + self.server_resource + timestamp = time.strftime('%Y-%m-%dT%H:%M:%SZ', time.gmtime(delayed)) + msg_iq.addChild('delay', namespace=common.xmpp.NS_DELAY2, + attrs={'from': our_jid, 'stamp': timestamp}) + + # XEP-0184 + if msgtxt and gajim.config.get_per('accounts', self.name, + 'request_receipt') and contact and contact.supports( + common.xmpp.NS_RECEIPTS): + msg_iq.setTag('request', namespace=common.xmpp.NS_RECEIPTS) + + if session: + # XEP-0201 + session.last_send = time.time() + msg_iq.setThread(session.thread_id) + + # XEP-0200 + if session.enable_encryption: + msg_iq = session.encrypt_stanza(msg_iq) + + if callback: + callback(jid, msg, keyID, forward_from, session, original_message, + subject, type_, msg_iq) + + def log_message(self, jid, msg, forward_from, session, original_message, + subject, type_): + if not forward_from and session and session.is_loggable(): + ji = gajim.get_jid_without_resource(jid) + if gajim.config.should_log(self.name, ji): + log_msg = msg + if original_message is not None: + log_msg = original_message + if subject: + log_msg = _('Subject: %(subject)s\n%(message)s') % \ + {'subject': subject, 'message': log_msg} + if log_msg: + if type_ == 'chat': + kind = 'chat_msg_sent' + else: + kind = 'single_msg_sent' + try: + gajim.logger.write(kind, jid, log_msg) + except exceptions.PysqliteOperationalError, e: + self.dispatch('ERROR', (_('Disk Write Error'), str(e))) + except exceptions.DatabaseMalformed: + pritext = _('Database Error') + sectext = _('The database file (%s) cannot be read. Try to ' + 'repair it (see http://trac.gajim.org/wiki/DatabaseBackup)' + ' or remove it (all history will be lost).') % \ + common.logger.LOG_DB_PATH + + def ack_subscribed(self, jid): + '''To be implemented by derivated classes''' + raise NotImplementedError + + def ack_unsubscribed(self, jid): + '''To be implemented by derivated classes''' + raise NotImplementedError + + def request_subscription(self, jid, msg='', name='', groups=[], + auto_auth=False): + '''To be implemented by derivated classes''' + raise NotImplementedError + + def send_authorization(self, jid): + '''To be implemented by derivated classes''' + raise NotImplementedError + + def refuse_authorization(self, jid): + '''To be implemented by derivated classes''' + raise NotImplementedError + + def unsubscribe(self, jid, remove_auth = True): + '''To be implemented by derivated classes''' + raise NotImplementedError + + def unsubscribe_agent(self, agent): + '''To be implemented by derivated classes''' + raise NotImplementedError + + def update_contact(self, jid, name, groups): + if self.connection: + self.connection.getRoster().setItem(jid=jid, name=name, groups=groups) + + def update_contacts(self, contacts): + '''update multiple roster items''' + if self.connection: + self.connection.getRoster().setItemMulti(contacts) + + def new_account(self, name, config, sync=False): + '''To be implemented by derivated classes''' + raise NotImplementedError + + def _on_new_account(self, con=None, con_type=None): + '''To be implemented by derivated classes''' + raise NotImplementedError + + def account_changed(self, new_name): + self.name = new_name + + def request_last_status_time(self, jid, resource): + '''To be implemented by derivated classes''' + raise NotImplementedError + + def request_os_info(self, jid, resource): + '''To be implemented by derivated classes''' + raise NotImplementedError + + def get_settings(self): + '''To be implemented by derivated classes''' + raise NotImplementedError + + def get_bookmarks(self): + '''To be implemented by derivated classes''' + raise NotImplementedError + + def store_bookmarks(self): + '''To be implemented by derivated classes''' + raise NotImplementedError + + def get_metacontacts(self): + '''To be implemented by derivated classes''' + raise NotImplementedError + + def send_agent_status(self, agent, ptype): + '''To be implemented by derivated classes''' + raise NotImplementedError + + def gpg_passphrase(self, passphrase): + if self.gpg: + use_gpg_agent = gajim.config.get('use_gpg_agent') + if use_gpg_agent: + self.gpg.passphrase = None + else: + self.gpg.passphrase = passphrase + + def ask_gpg_keys(self): + if self.gpg: + keys = self.gpg.get_keys() + return keys + return None + + def ask_gpg_secrete_keys(self): + if self.gpg: + keys = self.gpg.get_secret_keys() + return keys + return None + + def load_roster_from_db(self): + # Do nothing by default + return + + def _event_dispatcher(self, realm, event, data): + if realm == '': + if event == common.xmpp.transports_nb.DATA_RECEIVED: + self.dispatch('STANZA_ARRIVED', unicode(data, errors='ignore')) + elif event == common.xmpp.transports_nb.DATA_SENT: + self.dispatch('STANZA_SENT', unicode(data)) + + def change_status(self, show, msg, auto=False): + if not show in ['offline', 'online', 'chat', 'away', 'xa', 'dnd']: + return -1 + if not msg: + msg = '' + sign_msg = False + if not auto and not show == 'offline': + sign_msg = True + if show != 'invisible': + # We save it only when privacy list is accepted + self.status = msg + if show != 'offline' and self.connected < 1: + # set old_show to requested 'show' in case we need to + # recconect before we auth to server + self.old_show = show + self.on_purpose = False + self.server_resource = self._compute_resource() + if gajim.HAVE_GPG: + self.USE_GPG = True + self.gpg = GnuPG.GnuPG(gajim.config.get('use_gpg_agent')) + self.connect_and_init(show, msg, sign_msg) + + elif show == 'offline': + if self.connection: + p = common.xmpp.Presence(typ = 'unavailable') + p = self.add_sha(p, False) + if msg: + p.setStatus(msg) + + self.connection.RegisterDisconnectHandler(self._on_disconnected) + self.connection.send(p, now=True) + self.connection.start_disconnect() + else: + self._on_disconnected() + + elif show != 'offline' and self.connected > 0: + # dont'try to connect, when we are in state 'connecting' + if self.connected == 1: + return + if show == 'invisible': + self._change_to_invisible(msg) + return + was_invisible = self.connected == gajim.SHOW_LIST.index('invisible') + self.connected = gajim.SHOW_LIST.index(show) + if was_invisible: + self._change_from_invisible() + self._update_status(show, msg) + +class Connection(CommonConnection, ConnectionHandlers): + '''Connection class''' + def __init__(self, name): + CommonConnection.__init__(self, name) + ConnectionHandlers.__init__(self) # this property is used to prevent double connections self.last_connection = None # last ClientCommon instance # If we succeed to connect, remember it so next time we try (after a @@ -117,36 +591,39 @@ class Connection(ConnectionHandlers): self.lang = None if locale.getdefaultlocale()[0]: self.lang = locale.getdefaultlocale()[0].split('_')[0] - self.is_zeroconf = False - self.gpg = None - self.USE_GPG = False - if gajim.HAVE_GPG: - self.USE_GPG = True - self.gpg = GnuPG.GnuPG(gajim.config.get('use_gpg_agent')) - self.status = '' - self.priority = gajim.get_priority(name, 'offline') - self.old_show = '' # increase/decrease default timeout for server responses self.try_connecting_for_foo_secs = 45 # holds the actual hostname to which we are connected self.connected_hostname = None - self.time_to_reconnect = None self.last_time_to_reconnect = None self.new_account_info = None self.new_account_form = None - self.bookmarks = [] self.annotations = {} - self.on_purpose = False self.last_io = gajim.idlequeue.current_time() self.last_sent = [] self.last_history_time = {} self.password = passwords.get_password(name) - self.server_resource = gajim.config.get_per('accounts', name, 'resource') - # All valid resource substitution strings should be added to this hash. - if self.server_resource: - self.server_resource = Template(self.server_resource).safe_substitute({ - 'hostname': socket.gethostname() - }) + + # Used to ask privacy only once at connection + self.music_track_info = 0 + self.pubsub_supported = False + self.pubsub_publish_options_supported = False + # Do we auto accept insecure connection + self.connection_auto_accepted = False + self.pasword_callback = None + + self.on_connect_success = None + self.on_connect_failure = None + self.retrycount = 0 + self.jids_for_auto_auth = [] # list of jid to auto-authorize + self.available_transports = {} # list of available transports on this + # server {'icq': ['icq.server.com', 'icq2.server.com'], } + self.private_storage_supported = True + self.streamError = '' + self.secret_hmac = str(random.random())[2:] + # END __init__ + + def get_config_values_or_default(): if gajim.config.get_per('accounts', self.name, 'keep_alives_enabled'): self.keepalives = gajim.config.get_per('accounts', self.name, 'keep_alive_every_foo_secs') @@ -157,45 +634,9 @@ class Connection(ConnectionHandlers): 'ping_alive_every_foo_secs') else: self.pingalives = 0 - self.privacy_rules_supported = False - # Used to ask privacy only once at connection - self.privacy_rules_requested = False - self.blocked_list = [] - self.blocked_contacts = [] - self.blocked_groups = [] - self.blocked_all = False - self.music_track_info = 0 - self.pubsub_supported = False - self.pubsub_publish_options_supported = False - self.pep_supported = False - self.pep = {} - # Do we continue connection when we get roster (send presence,get vcard..) - self.continue_connect_info = None - # Do we auto accept insecure connection - self.connection_auto_accepted = False - # To know the groupchat jid associated with a sranza ID. Useful to - # request vcard or os info... to a real JID but act as if it comes from - # the fake jid - self.groupchat_jids = {} # {ID : groupchat_jid} - self.pasword_callback = None - - self.on_connect_success = None - self.on_connect_failure = None - self.retrycount = 0 - self.jids_for_auto_auth = [] # list of jid to auto-authorize - self.muc_jid = {} # jid of muc server for each transport type - self.available_transports = {} # list of available transports on this - # server {'icq': ['icq.server.com', 'icq2.server.com'], } - self.vcard_supported = False - self.private_storage_supported = True - self.streamError = '' - self.secret_hmac = str(random.random())[2:] - # END __init__ - - def dispatch(self, event, data): - '''always passes account name as first param''' - gajim.interface.dispatch(event, self.name, data) + def check_jid(self, jid): + return helpers.parse_jid(jid) def _reconnect(self): # Do not try to reco while we are already trying @@ -222,6 +663,8 @@ class Connection(ConnectionHandlers): if self.connection: # make sure previous connection is completely closed gajim.proxy65_manager.disconnect(self.connection) + self.terminate_sessions() + self.remove_all_transfers() self.connection.disconnect() self.last_connection = None self.connection = None @@ -277,6 +720,7 @@ class Connection(ConnectionHandlers): _('Reconnect manually.'))) def _event_dispatcher(self, realm, event, data): + CommonConnection._event_dispatcher(self, realm, event, data) if realm == common.xmpp.NS_REGISTER: if event == common.xmpp.features_nb.REGISTER_DATA_RECEIVED: # data is (agent, DataFrom, is_form, error_msg) @@ -382,11 +826,6 @@ class Connection(ConnectionHandlers): elif event == common.xmpp.features_nb.PRIVACY_LISTS_ACTIVE_DEFAULT: # data is (dict) self.dispatch('PRIVACY_LISTS_ACTIVE_DEFAULT', (data)) - elif realm == '': - if event == common.xmpp.transports_nb.DATA_RECEIVED: - self.dispatch('STANZA_ARRIVED', unicode(data, errors = 'ignore')) - elif event == common.xmpp.transports_nb.DATA_SENT: - self.dispatch('STANZA_SENT', unicode(data)) def _select_next_host(self, hosts): '''Selects the next host according to RFC2782 p.3 based on it's @@ -800,10 +1239,6 @@ class Connection(ConnectionHandlers): self.on_connect_auth = None # END connect - def quit(self, kill_core): - if kill_core and gajim.account_is_connected(self.name): - self.disconnect(on_purpose=True) - def add_lang(self, stanza): if self.lang: stanza.setAttr('xml:lang', self.lang) @@ -983,45 +1418,11 @@ class Connection(ConnectionHandlers): #Inform GUI we just signed in self.dispatch('SIGNED_IN', ()) - def test_gpg_passphrase(self, password): - '''Returns 'ok', 'bad_pass' or 'expired' ''' - if not self.gpg: - return False - self.gpg.passphrase = password - keyID = gajim.config.get_per('accounts', self.name, 'keyid') - signed = self.gpg.sign('test', keyID) - self.gpg.password = None - if signed == 'KEYEXPIRED': - return 'expired' - elif signed == 'BAD_PASSPHRASE': - return 'bad_pass' - return 'ok' - def get_signed_presence(self, msg, callback = None): if gajim.config.get_per('accounts', self.name, 'gpg_sign_presence'): return self.get_signed_msg(msg, callback) return '' - def get_signed_msg(self, msg, callback = None): - '''returns the signed message if possible - or an empty string if gpg is not used - or None if waiting for passphrase. - callback is the function to call when user give the passphrase''' - signed = '' - keyID = gajim.config.get_per('accounts', self.name, 'keyid') - if keyID and self.USE_GPG: - use_gpg_agent = gajim.config.get('use_gpg_agent') - if self.gpg.passphrase is None and not use_gpg_agent: - # We didn't set a passphrase - return None - if self.gpg.passphrase is not None or use_gpg_agent: - signed = self.gpg.sign(msg, keyID) - if signed == 'BAD_PASSPHRASE': - self.USE_GPG = False - signed = '' - self.dispatch('BAD_PASSPHRASE', ()) - return signed - def connect_and_auth(self): self.on_connect_success = self._connect_success self.on_connect_failure = self._connect_failure @@ -1075,92 +1476,30 @@ class Connection(ConnectionHandlers): p.setTag(common.xmpp.NS_SIGNED + ' x').setData(signed) self.connection.send(p) - def change_status(self, show, msg, auto = False): - if not show in gajim.SHOW_LIST: - return -1 - sshow = helpers.get_xmpp_show(show) - if not msg: - msg = '' - sign_msg = False - if not auto and not show == 'offline': - sign_msg = True - if show != 'invisible': - # We save it only when privacy list is accepted - self.status = msg - if show != 'offline' and self.connected < 1: - # set old_show to requested 'show' in case we need to - # recconect before we auth to server - self.old_show = show - self.on_purpose = False - self.server_resource = gajim.config.get_per('accounts', self.name, - 'resource') - # All valid resource substitution strings should be added to this hash. - if self.server_resource: - self.server_resource = Template(self.server_resource).\ - safe_substitute({ - 'hostname': socket.gethostname() - }) - if gajim.HAVE_GPG: - self.USE_GPG = True - self.gpg = GnuPG.GnuPG(gajim.config.get('use_gpg_agent')) - self.connect_and_init(show, msg, sign_msg) + def _change_to_invisible(self, msg): + signed = self.get_signed_presence(msg) + self.send_invisible_presence(msg, signed) - elif show == 'offline': - self.connected = 0 - if self.connection: - self.terminate_sessions() - - self.on_purpose = True - p = common.xmpp.Presence(typ = 'unavailable') - p = self.add_sha(p, False) - if msg: - p.setStatus(msg) - self.remove_all_transfers() - self.time_to_reconnect = None - - self.connection.RegisterDisconnectHandler(self._on_disconnected) - self.connection.send(p, now=True) - self.connection.start_disconnect() - #self.connection.start_disconnect(p, self._on_disconnected) - else: - self.time_to_reconnect = None - self._on_disconnected() - - elif show != 'offline' and self.connected > 0: - # dont'try to connect, when we are in state 'connecting' - if self.connected == 1: - return - if show == 'invisible': - signed = self.get_signed_presence(msg) - self.send_invisible_presence(msg, signed) - return - was_invisible = self.connected == gajim.SHOW_LIST.index('invisible') - self.connected = gajim.SHOW_LIST.index(show) - if was_invisible and self.privacy_rules_supported: - iq = self.build_privacy_rule('visible', 'allow') - self.connection.send(iq) - self.activate_privacy_rule('visible') - priority = unicode(gajim.get_priority(self.name, sshow)) - p = common.xmpp.Presence(typ = None, priority = priority, show = sshow) - p = self.add_sha(p) - if msg: - p.setStatus(msg) - signed = self.get_signed_presence(msg) - if signed: - p.setTag(common.xmpp.NS_SIGNED + ' x').setData(signed) - if self.connection: - self.connection.send(p) - self.priority = priority - self.dispatch('STATUS', show) - - def _on_disconnected(self): - ''' called when a disconnect request has completed successfully''' - self.disconnect(on_purpose=True) - self.dispatch('STATUS', 'offline') - - def get_status(self): - return gajim.SHOW_LIST[self.connected] + def _change_from_invisible(self): + if self.privacy_rules_supported: + iq = self.build_privacy_rule('visible', 'allow') + self.connection.send(iq) + self.activate_privacy_rule('visible') + def _update_status(self, show, msg): + xmpp_show = helpers.get_xmpp_show(show) + priority = unicode(gajim.get_priority(self.name, xmpp_show)) + p = common.xmpp.Presence(typ=None, priority=priority, show=xmpp_show) + p = self.add_sha(p) + if msg: + p.setStatus(msg) + signed = self.get_signed_presence(msg) + if signed: + p.setTag(common.xmpp.NS_SIGNED + ' x').setData(signed) + if self.connection: + self.connection.send(p) + self.priority = priority + self.dispatch('STATUS', show) def send_motd(self, jid, subject = '', msg = '', xhtml = None): if not self.connection: @@ -1174,202 +1513,23 @@ class Connection(ConnectionHandlers): chatstate=None, msg_id=None, composing_xep=None, resource=None, user_nick=None, xhtml=None, session=None, forward_from=None, form_node=None, original_message=None, delayed=None, callback=None, callback_args=[]): - if not self.connection or self.connected < 2: - return 1 - try: + + def cb(jid, msg, keyID, forward_from, session, original_message, subject, + type_, msg_iq): + msg_id = self.connection.send(msg_iq) jid = helpers.parse_jid(jid) - except helpers.InvalidFormat: - self.dispatch('ERROR', (_('Invalid Jabber ID'), - _('It is not possible to send a message to %s, this JID is not ' - 'valid.') % jid)) - return + self.dispatch('MSGSENT', (jid, msg, keyID)) + if callback: + callback(msg_id, *callback_args) - if msg and not xhtml and gajim.config.get( - 'rst_formatting_outgoing_messages'): - from common.rst_xhtml_generator import create_xhtml - xhtml = create_xhtml(msg) - if not msg and chatstate is None and form_node is None: - return - fjid = jid - if resource: - fjid += '/' + resource - msgtxt = msg - msgenc = '' + self.log_message(jid, msg, forward_from, session, original_message, + subject, type_) - if session: - fjid = session.get_to() - - if keyID and self.USE_GPG: - xhtml = None - if keyID == 'UNKNOWN': - error = _('Neither the remote presence is signed, nor a key was assigned.') - elif keyID.endswith('MISMATCH'): - error = _('The contact\'s key (%s) does not match the key assigned in Gajim.' % keyID[:8]) - else: - def encrypt_thread(msg, keyID, always_trust=False): - # encrypt message. This function returns (msgenc, error) - return self.gpg.encrypt(msg, [keyID], always_trust) - def _on_encrypted(output): - msgenc, error = output - if error == 'NOT_TRUSTED': - def _on_always_trust(answer): - if answer: - gajim.thread_interface(encrypt_thread, [msg, keyID, - True], _on_encrypted, []) - else: - self._on_message_encrypted(output, type_, msg, msgtxt, - original_message, fjid, resource, jid, xhtml, - subject, chatstate, composing_xep, forward_from, - delayed, session, form_node, user_nick, keyID, - callback, callback_args) - self.dispatch('GPG_ALWAYS_TRUST', _on_always_trust) - else: - self._on_message_encrypted(output, type_, msg, msgtxt, - original_message, fjid, resource, jid, xhtml, subject, - chatstate, composing_xep, forward_from, delayed, session, - form_node, user_nick, keyID, callback, callback_args) - gajim.thread_interface(encrypt_thread, [msg, keyID, False], - _on_encrypted, []) - return - - self._on_message_encrypted(('', error), type_, msg, msgtxt, - original_message, fjid, resource, jid, xhtml, subject, chatstate, - composing_xep, forward_from, delayed, session, form_node, user_nick, - keyID, callback, callback_args) - - self._on_continue_message(type_, msg, msgtxt, original_message, fjid, - resource, jid, xhtml, subject, msgenc, keyID, chatstate, composing_xep, - forward_from, delayed, session, form_node, user_nick, callback, - callback_args) - - def _on_message_encrypted(self, output, type_, msg, msgtxt, original_message, - fjid, resource, jid, xhtml, subject, chatstate, composing_xep, forward_from, - delayed, session, form_node, user_nick, keyID, callback, callback_args): - msgenc, error = output - - if msgenc and not error: - msgtxt = '[This message is *encrypted* (See :XEP:`27`]' - lang = os.getenv('LANG') - if lang is not None and lang != 'en': # we're not english - # one in locale and one en - msgtxt = _('[This message is *encrypted* (See :XEP:`27`]') + \ - ' (' + msgtxt + ')' - self._on_continue_message(type_, msg, msgtxt, original_message, fjid, - resource, jid, xhtml, subject, msgenc, keyID, chatstate, - composing_xep, forward_from, delayed, session, form_node, user_nick, - callback, callback_args) - return - # Encryption failed, do not send message - tim = localtime() - self.dispatch('MSGNOTSENT', (jid, error, msgtxt, tim, session)) - - def _on_continue_message(self, type_, msg, msgtxt, original_message, fjid, - resource, jid, xhtml, subject, msgenc, keyID, chatstate, composing_xep, - forward_from, delayed, session, form_node, user_nick, callback, - callback_args): - if type_ == 'chat': - msg_iq = common.xmpp.Message(to=fjid, body=msgtxt, typ=type_, - xhtml=xhtml) - else: - if subject: - msg_iq = common.xmpp.Message(to=fjid, body=msgtxt, typ='normal', - subject=subject, xhtml=xhtml) - else: - msg_iq = common.xmpp.Message(to=fjid, body=msgtxt, typ='normal', - xhtml=xhtml) - if msgenc: - msg_iq.setTag(common.xmpp.NS_ENCRYPTED + ' x').setData(msgenc) - - if form_node: - msg_iq.addChild(node=form_node) - - # XEP-0172: user_nickname - if user_nick: - msg_iq.setTag('nick', namespace = common.xmpp.NS_NICK).setData( - user_nick) - - # TODO: We might want to write a function so we don't need to - # reproduce that ugly if somewhere else. - if resource: - contact = gajim.contacts.get_contact(self.name, jid, resource) - else: - contact = gajim.contacts.get_contact_with_highest_priority(self.name, - jid) - - # chatstates - if peer supports xep85 or xep22, send chatstates - # please note that the only valid tag inside a message containing a - # tag is the active event - if chatstate is not None and contact: - if ((composing_xep == 'XEP-0085' or not composing_xep) \ - and composing_xep != 'asked_once') or \ - contact.supports(common.xmpp.NS_CHATSTATES): - # XEP-0085 - msg_iq.setTag(chatstate, namespace=common.xmpp.NS_CHATSTATES) - if composing_xep in ('XEP-0022', 'asked_once') or \ - not composing_xep: - # XEP-0022 - chatstate_node = msg_iq.setTag('x', namespace=common.xmpp.NS_EVENT) - if chatstate is 'composing' or msgtxt: - chatstate_node.addChild(name='composing') - - if forward_from: - addresses = msg_iq.addChild('addresses', - namespace=common.xmpp.NS_ADDRESS) - addresses.addChild('address', attrs = {'type': 'ofrom', - 'jid': forward_from}) - - # XEP-0203 - if delayed: - our_jid = gajim.get_jid_from_account(self.name) + '/' + \ - self.server_resource - timestamp = time.strftime('%Y-%m-%dT%H:%M:%SZ', time.gmtime(delayed)) - msg_iq.addChild('delay', namespace=common.xmpp.NS_DELAY2, - attrs={'from': our_jid, 'stamp': timestamp}) - - # XEP-0184 - if msgtxt and gajim.config.get_per('accounts', self.name, - 'request_receipt') and contact and contact.supports( - common.xmpp.NS_RECEIPTS): - msg_iq.setTag('request', namespace=common.xmpp.NS_RECEIPTS) - - if session: - # XEP-0201 - session.last_send = time.time() - msg_iq.setThread(session.thread_id) - - # XEP-0200 - if session.enable_encryption: - msg_iq = session.encrypt_stanza(msg_iq) - - msg_id = self.connection.send(msg_iq) - if not forward_from and session and session.is_loggable(): - ji = gajim.get_jid_without_resource(jid) - if gajim.config.should_log(self.name, ji): - log_msg = msg - if original_message is not None: - log_msg = original_message - if subject: - log_msg = _('Subject: %(subject)s\n%(message)s') % \ - {'subject': subject, 'message': msg} - if log_msg: - if type_ == 'chat': - kind = 'chat_msg_sent' - else: - kind = 'single_msg_sent' - try: - gajim.logger.write(kind, jid, log_msg) - except exceptions.PysqliteOperationalError, e: - self.dispatch('ERROR', (_('Disk Write Error'), str(e))) - except exceptions.DatabaseMalformed: - pritext = _('Database Error') - sectext = _('The database file (%s) cannot be read. Try to ' - 'repair it (see http://trac.gajim.org/wiki/DatabaseBackup)' - ' or remove it (all history will be lost).') % \ - common.logger.LOG_DB_PATH - self.dispatch('MSGSENT', (jid, msg, keyID)) - - if callback: - callback(msg_id, *callback_args) + self._prepare_message(jid, msg, keyID, type_=type_, subject=subject, + chatstate=chatstate, msg_id=msg_id, composing_xep=composing_xep, + resource=resource, user_nick=user_nick, xhtml=xhtml, session=session, + forward_from=forward_from, form_node=form_node, + original_message=original_message, delayed=delayed, callback=cb) def send_contacts(self, contacts, jid): '''Send contacts with RosterX (Xep-0144)''' @@ -1474,17 +1634,6 @@ class Connection(ConnectionHandlers): self.connection.send(iq) self.connection.getRoster().delItem(agent) - def update_contact(self, jid, name, groups): - '''update roster item on jabber server''' - if self.connection: - self.connection.getRoster().setItem(jid = jid, name = name, - groups = groups) - - def update_contacts(self, contacts): - '''update multiple roster items on jabber server''' - if self.connection: - self.connection.getRoster().setItemMulti(contacts) - def send_new_account_infos(self, form, is_form): if is_form: # Get username and password and put them in new_account_info @@ -1502,7 +1651,7 @@ class Connection(ConnectionHandlers): self.new_account_form = form self.new_account(self.name, self.new_account_info) - def new_account(self, name, config, sync = False): + def new_account(self, name, config, sync=False): # If a connection already exist we cannot create a new account if self.connection: return @@ -1513,7 +1662,7 @@ class Connection(ConnectionHandlers): self.on_connect_failure = self._on_new_account self.connect(config) - def _on_new_account(self, con = None, con_type = None): + def _on_new_account(self, con=None, con_type=None): if not con_type: if len(self._connection_types) or len(self._hosts): # There are still other way to try to connect @@ -1525,9 +1674,6 @@ class Connection(ConnectionHandlers): self.connection = con common.xmpp.features_nb.getRegInfo(con, self._hostname) - def account_changed(self, new_name): - self.name = new_name - def request_last_status_time(self, jid, resource, groupchat_jid=None): '''groupchat_jid is used when we want to send a request to a real jid and act as if the answer comes from the groupchat_jid''' @@ -1918,26 +2064,6 @@ class Connection(ConnectionHandlers): query.addChild(node = form) self.connection.send(iq) - def gpg_passphrase(self, passphrase): - if self.gpg: - use_gpg_agent = gajim.config.get('use_gpg_agent') - if use_gpg_agent: - self.gpg.passphrase = None - else: - self.gpg.passphrase = passphrase - - def ask_gpg_keys(self): - if self.gpg: - keys = self.gpg.get_keys() - return keys - return None - - def ask_gpg_secrete_keys(self): - if self.gpg: - keys = self.gpg.get_secret_keys() - return keys - return None - def change_password(self, password): if not self.connection: return diff --git a/src/common/xmpp/transports_nb.py b/src/common/xmpp/transports_nb.py index 704cad170..dd60269bf 100644 --- a/src/common/xmpp/transports_nb.py +++ b/src/common/xmpp/transports_nb.py @@ -92,6 +92,7 @@ RECV_BUFSIZE = 32768 # 2x maximum size of ssl packet, should be plenty DATA_RECEIVED = 'DATA RECEIVED' DATA_SENT = 'DATA SENT' +DATA_ERROR = 'DATA ERROR' DISCONNECTED = 'DISCONNECTED' DISCONNECTING = 'DISCONNECTING' diff --git a/src/common/zeroconf/client_zeroconf.py b/src/common/zeroconf/client_zeroconf.py index 730eb3ec3..6b50a9fea 100644 --- a/src/common/zeroconf/client_zeroconf.py +++ b/src/common/zeroconf/client_zeroconf.py @@ -23,7 +23,7 @@ from common.xmpp.idlequeue import IdleObject from common.xmpp import dispatcher_nb, simplexml from common.xmpp.plugin import * from common.xmpp.simplexml import ustr -from common.xmpp.transports_nb import DATA_RECEIVED, DATA_SENT +from common.xmpp.transports_nb import DATA_RECEIVED, DATA_SENT, DATA_ERROR from common.zeroconf import zeroconf from common.xmpp.protocol import * @@ -395,6 +395,7 @@ class P2PConnection(IdleObject, PlugIn): False, else send it instantly. If supplied data is unicode string, encode it to utf-8. ''' + print 'ici' if self.state <= 0: return @@ -416,8 +417,11 @@ class P2PConnection(IdleObject, PlugIn): ids = self.client.conn_holder.ids_of_awaiting_messages if self.fd in ids and len(ids[self.fd]) > 0: for (id_, thread_id) in ids[self.fd]: - self._owner.Dispatcher.Event('', DATA_ERROR, (self.client.to, - thread_id)) + if hasattr(self._owner, 'Dispatcher'): + self._owner.Dispatcher.Event('', DATA_ERROR, (self.client.to, + thread_id)) + else: + self._owner.on_not_ok('conenction timeout') ids[self.fd] = [] self.pollend() @@ -578,6 +582,8 @@ class ClientZeroconf: self.hash_to_port = {} self.listener = None self.ids_of_awaiting_messages = {} + self.disconnect_handlers = [] + self.disconnecting = False def connect(self, show, msg): self.port = self.start_listener(self.caller.port) @@ -632,6 +638,9 @@ class ClientZeroconf: self.last_msg = msg def disconnect(self): + # to avoid recursive calls + if self.disconnecting: + return if self.listener: self.listener.disconnect() self.listener = None @@ -642,6 +651,14 @@ class ClientZeroconf: self.roster.zeroconf = None self.roster._data = None self.roster = None + self.disconnecting = True + for i in reversed(self.disconnect_handlers): + log.debug('Calling disconnect handler %s' % i) + i() + self.disconnecting = False + + def start_disconnect(self): + self.disconnect() def kill_all_connections(self): for connection in self.connections.values(): @@ -720,6 +737,14 @@ class ClientZeroconf: P2PClient(None, item['address'], item['port'], self, [(stanza, is_message)], to, on_ok=on_ok, on_not_ok=on_not_ok) + def RegisterDisconnectHandler(self, handler): + ''' Register handler that will be called on disconnect.''' + self.disconnect_handlers.append(handler) + + def UnregisterDisconnectHandler(self, handler): + ''' Unregister handler that is called on disconnect.''' + self.disconnect_handlers.remove(handler) + def SendAndWaitForResponse(self, stanza, timeout=None, func=None, args=None): ''' Send stanza and wait for recipient's response to it. Will call transports diff --git a/src/common/zeroconf/connection_handlers_zeroconf.py b/src/common/zeroconf/connection_handlers_zeroconf.py index 09818be47..b08fba1ce 100644 --- a/src/common/zeroconf/connection_handlers_zeroconf.py +++ b/src/common/zeroconf/connection_handlers_zeroconf.py @@ -57,10 +57,10 @@ from session import ChatControlSession class ConnectionVcard(connection_handlers.ConnectionVcard): def add_sha(self, p, send_caps = True): - pass + return p def add_caps(self, p): - pass + return p def request_vcard(self, jid = None, is_fake_jid = False): pass diff --git a/src/common/zeroconf/connection_zeroconf.py b/src/common/zeroconf/connection_zeroconf.py index 26725f5f0..52876c8d6 100644 --- a/src/common/zeroconf/connection_zeroconf.py +++ b/src/common/zeroconf/connection_zeroconf.py @@ -5,7 +5,7 @@ ## - Nikos Kouremenos ## - Dimitur Kirov ## - Travis Shirk -## - Stefan Bethge +## - Stefan Bethge ## ## Copyright (C) 2003-2004 Yann Leboulanger ## Vincent Hanquez @@ -43,64 +43,29 @@ if os.name != 'nt': import getpass import gobject +from common.connection import CommonConnection from common import gajim from common import GnuPG from common.zeroconf import client_zeroconf from common.zeroconf import zeroconf from connection_handlers_zeroconf import * -class ConnectionZeroconf(ConnectionHandlersZeroconf): +class ConnectionZeroconf(CommonConnection, ConnectionHandlersZeroconf): '''Connection class''' def __init__(self, name): + CommonConnection.__init__(self, name) ConnectionHandlersZeroconf.__init__(self) # system username self.username = None - self.name = name self.server_resource = '' # zeroconf has no resource, fake an empty one - self.connected = 0 # offline - self.connection = None - self.gpg = None - self.USE_GPG = False - if gajim.HAVE_GPG: - self.USE_GPG = True - self.gpg = GnuPG.GnuPG(gajim.config.get('use_gpg_agent')) self.is_zeroconf = True - self.privacy_rules_supported = False - self.blocked_list = [] - self.blocked_contacts = [] - self.blocked_groups = [] - self.blocked_all = False - self.status = '' - self.old_show = '' - self.priority = 0 - self.call_resolve_timeout = False - - self.time_to_reconnect = None - #self.new_account_info = None - self.bookmarks = [] - - #we don't need a password, but must be non-empty + # we don't need a password, but must be non-empty self.password = 'zeroconf' - self.autoconnect = False - self.sync_with_global_status = True - self.no_log_for = False - - self.pep_supported = False - self.pep = {} - # Do we continue connection when we get roster (send presence,get vcard...) - self.continue_connect_info = None - if gajim.HAVE_GPG: - self.USE_GPG = True - self.gpg = GnuPG.GnuPG(gajim.config.get('use_gpg_agent')) self.get_config_values_or_default() - self.muc_jid = {} # jid of muc server for each transport type - self.vcard_supported = False - self.private_storage_supported = False - def get_config_values_or_default(self): ''' get name, host, port from config, or create zeroconf account with default values''' @@ -108,79 +73,61 @@ class ConnectionZeroconf(ConnectionHandlersZeroconf): if not gajim.config.get_per('accounts', gajim.ZEROCONF_ACC_NAME, 'name'): gajim.log.debug('Creating zeroconf account') gajim.config.add_per('accounts', gajim.ZEROCONF_ACC_NAME) - gajim.config.set_per('accounts', gajim.ZEROCONF_ACC_NAME, 'autoconnect', True) - gajim.config.set_per('accounts', gajim.ZEROCONF_ACC_NAME, 'no_log_for', '') - gajim.config.set_per('accounts', gajim.ZEROCONF_ACC_NAME, 'password', 'zeroconf') - gajim.config.set_per('accounts', gajim.ZEROCONF_ACC_NAME, 'sync_with_global_status', True) + gajim.config.set_per('accounts', gajim.ZEROCONF_ACC_NAME, + 'autoconnect', True) + gajim.config.set_per('accounts', gajim.ZEROCONF_ACC_NAME, 'no_log_for', + '') + gajim.config.set_per('accounts', gajim.ZEROCONF_ACC_NAME, 'password', + 'zeroconf') + gajim.config.set_per('accounts', gajim.ZEROCONF_ACC_NAME, + 'sync_with_global_status', True) - gajim.config.set_per('accounts', gajim.ZEROCONF_ACC_NAME, 'custom_port', 5298) - gajim.config.set_per('accounts', gajim.ZEROCONF_ACC_NAME, 'is_zeroconf', True) + gajim.config.set_per('accounts', gajim.ZEROCONF_ACC_NAME, + 'custom_port', 5298) + gajim.config.set_per('accounts', gajim.ZEROCONF_ACC_NAME, + 'is_zeroconf', True) #XXX make sure host is US-ASCII self.host = unicode(socket.gethostname()) - gajim.config.set_per('accounts', gajim.ZEROCONF_ACC_NAME, 'hostname', self.host) - self.port = gajim.config.get_per('accounts', gajim.ZEROCONF_ACC_NAME, 'custom_port') - self.autoconnect = gajim.config.get_per('accounts', gajim.ZEROCONF_ACC_NAME, 'autoconnect') - self.sync_with_global_status = gajim.config.get_per('accounts', gajim.ZEROCONF_ACC_NAME, 'sync_with_global_status') - self.no_log_for = gajim.config.get_per('accounts', gajim.ZEROCONF_ACC_NAME, 'no_log_for') - self.first = gajim.config.get_per('accounts', gajim.ZEROCONF_ACC_NAME, 'zeroconf_first_name') - self.last = gajim.config.get_per('accounts', gajim.ZEROCONF_ACC_NAME, 'zeroconf_last_name') - self.jabber_id = gajim.config.get_per('accounts', gajim.ZEROCONF_ACC_NAME, 'zeroconf_jabber_id') - self.email = gajim.config.get_per('accounts', gajim.ZEROCONF_ACC_NAME, 'zeroconf_email') + gajim.config.set_per('accounts', gajim.ZEROCONF_ACC_NAME, 'hostname', + self.host) + self.port = gajim.config.get_per('accounts', gajim.ZEROCONF_ACC_NAME, + 'custom_port') + self.autoconnect = gajim.config.get_per('accounts', + gajim.ZEROCONF_ACC_NAME, 'autoconnect') + self.sync_with_global_status = gajim.config.get_per('accounts', + gajim.ZEROCONF_ACC_NAME, 'sync_with_global_status') + self.first = gajim.config.get_per('accounts', gajim.ZEROCONF_ACC_NAME, + 'zeroconf_first_name') + self.last = gajim.config.get_per('accounts', gajim.ZEROCONF_ACC_NAME, + 'zeroconf_last_name') + self.jabber_id = gajim.config.get_per('accounts', gajim.ZEROCONF_ACC_NAME, + 'zeroconf_jabber_id') + self.email = gajim.config.get_per('accounts', gajim.ZEROCONF_ACC_NAME, + 'zeroconf_email') if not self.username: self.username = unicode(getpass.getuser()) - gajim.config.set_per('accounts', gajim.ZEROCONF_ACC_NAME, 'name', self.username) + gajim.config.set_per('accounts', gajim.ZEROCONF_ACC_NAME, 'name', + self.username) else: - self.username = gajim.config.get_per('accounts', gajim.ZEROCONF_ACC_NAME, 'name') + self.username = gajim.config.get_per('accounts', + gajim.ZEROCONF_ACC_NAME, 'name') # END __init__ - def dispatch(self, event, data): - gajim.interface.dispatch(event, self.name, data) + def check_jid(self, jid): + return jid def _reconnect(self): # Do not try to reco while we are already trying self.time_to_reconnect = None gajim.log.debug('reconnect') -# signed = self.get_signed_msg(self.status) self.disconnect() self.change_status(self.old_show, self.status) - def quit(self, kill_core): - if kill_core and self.connected > 1: - self.disconnect() - def disable_account(self): self.disconnect() - def test_gpg_passphrase(self, password): - self.gpg.passphrase = password - keyID = gajim.config.get_per('accounts', self.name, 'keyid') - signed = self.gpg.sign('test', keyID) - self.gpg.password = None - return signed != 'BAD_PASSPHRASE' - - def get_signed_msg(self, msg): - signed = '' - keyID = gajim.config.get_per('accounts', self.name, 'keyid') - if keyID and self.USE_GPG: - use_gpg_agent = gajim.config.get('use_gpg_agent') - if self.connected < 2 and self.gpg.passphrase is None and \ - not use_gpg_agent: - # We didn't set a passphrase - self.dispatch('ERROR', (_('OpenPGP passphrase was not given'), - #%s is the account name here - _('You will be connected to %s without OpenPGP.') % self.name)) - self.USE_GPG = False - elif self.gpg.passphrase is not None or use_gpg_agent: - signed = self.gpg.sign(msg, keyID) - if signed == 'BAD_PASSPHRASE': - self.USE_GPG = False - signed = '' - if self.connected < 2: - self.dispatch('BAD_PASSPHRASE', ()) - return signed - def _on_resolve_timeout(self): if self.connected: self.connection.resolve_all() @@ -197,8 +144,10 @@ class ConnectionZeroconf(ConnectionHandlersZeroconf): # callbacks called from zeroconf def _on_new_service(self, jid): self.roster.setItem(jid) - self.dispatch('ROSTER_INFO', (jid, self.roster.getName(jid), 'both', 'no', self.roster.getGroups(jid))) - self.dispatch('NOTIFY', (jid, self.roster.getStatus(jid), self.roster.getMessage(jid), 'local', 0, None, 0, None)) + self.dispatch('ROSTER_INFO', (jid, self.roster.getName(jid), 'both', 'no', + self.roster.getGroups(jid))) + self.dispatch('NOTIFY', (jid, self.roster.getStatus(jid), + self.roster.getMessage(jid), 'local', 0, None, 0, None)) def _on_remove_service(self, jid): self.roster.delItem(jid) @@ -206,15 +155,6 @@ class ConnectionZeroconf(ConnectionHandlersZeroconf): # keyID, timestamp, contact_nickname)) self.dispatch('NOTIFY', (jid, 'offline', '', 'local', 0, None, 0, None)) - def _on_disconnected(self): - self.disconnect() - self.dispatch('STATUS', 'offline') - self.dispatch('CONNECTION_LOST', - (_('Connection with account "%s" has been lost') % self.name, - _('To continue sending and receiving messages, you will need to reconnect.'))) - self.status = 'offline' - self.disconnect() - def _disconnectedReconnCB(self): '''Called when we are disconnected. Comes from network manager for example we don't try to reconnect, network manager will tell us when we can''' @@ -234,9 +174,10 @@ class ConnectionZeroconf(ConnectionHandlersZeroconf): self.dispatch('ZC_NAME_CONFLICT', alt_name) def _on_error(self, message): - self.dispatch('ERROR', (_('Avahi error'), _("%s\nLink-local messaging might not work properly.") % message)) + self.dispatch('ERROR', (_('Avahi error'), + _('%s\nLink-local messaging might not work properly.') % message)) - def connect(self, show = 'online', msg = ''): + def connect(self, show='online', msg=''): self.get_config_values_or_default() if not self.connection: self.connection = client_zeroconf.ClientZeroconf(self) @@ -267,10 +208,12 @@ class ConnectionZeroconf(ConnectionHandlersZeroconf): self.roster = self.connection.getRoster() self.dispatch('ROSTER', self.roster) - #display contacts already detected and resolved + # display contacts already detected and resolved for jid in self.roster.keys(): - self.dispatch('ROSTER_INFO', (jid, self.roster.getName(jid), 'both', 'no', self.roster.getGroups(jid))) - self.dispatch('NOTIFY', (jid, self.roster.getStatus(jid), self.roster.getMessage(jid), 'local', 0, None, 0, None)) + self.dispatch('ROSTER_INFO', (jid, self.roster.getName(jid), 'both', + 'no', self.roster.getGroups(jid))) + self.dispatch('NOTIFY', (jid, self.roster.getStatus(jid), + self.roster.getMessage(jid), 'local', 0, None, 0, None)) self.connected = STATUS_LIST.index(show) @@ -279,7 +222,7 @@ class ConnectionZeroconf(ConnectionHandlersZeroconf): gobject.timeout_add_seconds(5, self._on_resolve_timeout) return True - def disconnect(self, on_purpose = False): + def disconnect(self, on_purpose=False): self.connected = 0 self.time_to_reconnect = None if self.connection: @@ -291,15 +234,20 @@ class ConnectionZeroconf(ConnectionHandlersZeroconf): def reannounce(self): if self.connected: txt = {} - txt['1st'] = gajim.config.get_per('accounts', gajim.ZEROCONF_ACC_NAME, 'zeroconf_first_name') - txt['last'] = gajim.config.get_per('accounts', gajim.ZEROCONF_ACC_NAME, 'zeroconf_last_name') - txt['jid'] = gajim.config.get_per('accounts', gajim.ZEROCONF_ACC_NAME, 'zeroconf_jabber_id') - txt['email'] = gajim.config.get_per('accounts', gajim.ZEROCONF_ACC_NAME, 'zeroconf_email') + txt['1st'] = gajim.config.get_per('accounts', gajim.ZEROCONF_ACC_NAME, + 'zeroconf_first_name') + txt['last'] = gajim.config.get_per('accounts', gajim.ZEROCONF_ACC_NAME, + 'zeroconf_last_name') + txt['jid'] = gajim.config.get_per('accounts', gajim.ZEROCONF_ACC_NAME, + 'zeroconf_jabber_id') + txt['email'] = gajim.config.get_per('accounts', + gajim.ZEROCONF_ACC_NAME, 'zeroconf_email') self.connection.reannounce(txt) def update_details(self): if self.connection: - port = gajim.config.get_per('accounts', gajim.ZEROCONF_ACC_NAME, 'custom_port') + port = gajim.config.get_per('accounts', gajim.ZEROCONF_ACC_NAME, + 'custom_port') if port != self.port: self.port = port last_msg = self.connection.last_msg @@ -311,41 +259,18 @@ class ConnectionZeroconf(ConnectionHandlersZeroconf): else: self.reannounce() - def change_status(self, show, msg, sync = False, auto = False): - if not show in STATUS_LIST: - return -1 - self.status = show - - check = True #to check for errors from zeroconf - # 'connect' - if show != 'offline' and not self.connected: - if not self.connect(show, msg): - return - if show != 'invisible': - check = self.connection.announce() - else: - self.connected = STATUS_LIST.index(show) - self.dispatch('SIGNED_IN', ()) - - # 'disconnect' - elif show == 'offline' and self.connected: - self.disconnect() - self.time_to_reconnect = None - - # update status - elif show != 'offline' and self.connected: - was_invisible = self.connected == STATUS_LIST.index('invisible') + def connect_and_init(self, show, msg, sign_msg): + # to check for errors from zeroconf + check = True + if not self.connect(show, msg): + return + if show != 'invisible': + check = self.connection.announce() + else: self.connected = STATUS_LIST.index(show) - if show == 'invisible': - check = check and self.connection.remove_announce() - elif was_invisible: - if not self.connected: - check = check and self.connect(show, msg) - check = check and self.connection.announce() - if self.connection and not show == 'invisible': - check = check and self.connection.set_show_msg(show, msg) + self.dispatch('SIGNED_IN', ()) - #stay offline when zeroconf does something wrong + # stay offline when zeroconf does something wrong if check: self.dispatch('STATUS', show) else: @@ -356,136 +281,63 @@ class ConnectionZeroconf(ConnectionHandlersZeroconf): (_('Could not change status of account "%s"') % self.name, _('Please check if avahi-daemon is running.'))) - def get_status(self): - return STATUS_LIST[self.connected] + def _change_to_invisible(self, msg): + if self.connection.remove_announce(): + self.dispatch('STATUS', 'invisible') + else: + # show notification that avahi or system bus is down + self.dispatch('STATUS', 'offline') + self.status = 'offline' + self.dispatch('CONNECTION_LOST', + (_('Could not change status of account "%s"') % self.name, + _('Please check if avahi-daemon is running.'))) + + def _change_from_invisible(self): + self.connection.announce() + + def _update_status(self, show, msg): + if self.connection.set_show_msg(show, msg): + self.dispatch('STATUS', show) + else: + # show notification that avahi or system bus is down + self.dispatch('STATUS', 'offline') + self.status = 'offline' + self.dispatch('CONNECTION_LOST', + (_('Could not change status of account "%s"') % self.name, + _('Please check if avahi-daemon is running.'))) def send_message(self, jid, msg, keyID, type_='chat', subject='', chatstate=None, msg_id=None, composing_xep=None, resource=None, user_nick=None, xhtml=None, session=None, forward_from=None, form_node=None, original_message=None, delayed=None, callback=None, callback_args=[]): - fjid = jid - - if msg and not xhtml and gajim.config.get( - 'rst_formatting_outgoing_messages'): - from common.rst_xhtml_generator import create_xhtml - xhtml = create_xhtml(msg) - if not self.connection: - return - if not msg and chatstate is None: - return - - if self.status in ('invisible', 'offline'): - self.dispatch('MSGERROR', [unicode(jid), -1, - _('You are not connected or not visible to others. Your message ' - 'could not be sent.'), None, None, session]) - return - - msgtxt = msg - msgenc = '' - if keyID and self.USE_GPG: - if keyID == 'UNKNOWN': - error = _('Neither the remote presence is signed, nor a key was assigned.') - elif keyID.endswith('MISMATCH'): - error = _('The contact\'s key (%s) does not match the key assigned in Gajim.' % keyID[:8]) - else: - # encrypt - msgenc, error = self.gpg.encrypt(msg, [keyID]) - if msgenc and not error: - msgtxt = '[This message is encrypted]' - lang = os.getenv('LANG') - if lang is not None or lang != 'en': # we're not english - msgtxt = _('[This message is encrypted]') +\ - ' ([This message is encrypted])' # one in locale and one en - else: - # Encryption failed, do not send message - tim = time.localtime() - self.dispatch('MSGNOTSENT', (jid, error, msgtxt, tim, session)) - return - - if type_ == 'chat': - msg_iq = common.xmpp.Message(to=fjid, body=msgtxt, typ=type_, - xhtml=xhtml) - - else: - if subject: - msg_iq = common.xmpp.Message(to=fjid, body=msgtxt, typ='normal', - subject=subject, xhtml=xhtml) - else: - msg_iq = common.xmpp.Message(to=fjid, body=msgtxt, typ='normal', - xhtml=xhtml) - - if msgenc: - msg_iq.setTag(common.xmpp.NS_ENCRYPTED + ' x').setData(msgenc) - - # chatstates - if peer supports jep85 or jep22, send chatstates - # please note that the only valid tag inside a message containing a - # tag is the active event - if chatstate is not None: - if composing_xep == 'XEP-0085' or not composing_xep: - # JEP-0085 - msg_iq.setTag(chatstate, namespace = common.xmpp.NS_CHATSTATES) - if composing_xep == 'XEP-0022' or not composing_xep: - # JEP-0022 - chatstate_node = msg_iq.setTag('x', namespace = common.xmpp.NS_EVENT) - if not msgtxt: # when no , add - if not msg_id: # avoid putting 'None' in tag - msg_id = '' - chatstate_node.setTagData('id', msg_id) - # when msgtxt, requests JEP-0022 composing notification - if chatstate is 'composing' or msgtxt: - chatstate_node.addChild(name = 'composing') - - if forward_from: - addresses = msg_iq.addChild('addresses', - namespace=common.xmpp.NS_ADDRESS) - addresses.addChild('address', attrs = {'type': 'ofrom', - 'jid': forward_from}) - - # XEP-0203 - if delayed: - our_jid = gajim.get_jid_from_account(self.name) + '/' + \ - self.server_resource - timestamp = time.strftime('%Y-%m-%dT%TZ', time.gmtime(delayed)) - msg_iq.addChild('delay', namespace=common.xmpp.NS_DELAY2, - attrs={'from': our_jid, 'stamp': timestamp}) - - if session: - session.last_send = time.time() - msg_iq.setThread(session.thread_id) - - if session.enable_encryption: - msg_iq = session.encrypt_stanza(msg_iq) - - def on_send_ok(id): - no_log_for = gajim.config.get_per('accounts', self.name, 'no_log_for') - ji = gajim.get_jid_without_resource(jid) - if session.is_loggable() and self.name not in no_log_for and\ - ji not in no_log_for: - log_msg = msg - if subject: - log_msg = _('Subject: %(subject)s\n%(message)s') % \ - {'subject': subject, 'message': msg} - if log_msg: - if type_ == 'chat': - kind = 'chat_msg_sent' - else: - kind = 'single_msg_sent' - gajim.logger.write(kind, jid, log_msg) + def on_send_ok(msg_id): self.dispatch('MSGSENT', (jid, msg, keyID)) - if callback: - callback(id, *callback_args) + callback(msg_id, *callback_args) + + self.log_message(jid, msg, forward_from, session, original_message, + subject, type_) def on_send_not_ok(reason): reason += ' ' + _('Your message could not be sent.') self.dispatch('MSGERROR', [jid, -1, reason, None, None, session]) - ret = self.connection.send(msg_iq, msg is not None, on_ok=on_send_ok, - on_not_ok=on_send_not_ok) - if ret == -1: - # Contact Offline - self.dispatch('MSGERROR', [jid, -1, _('Contact is offline. Your message could not be sent.'), None, None, session]) + def cb(jid, msg, keyID, forward_from, session, original_message, subject, + type_, msg_iq): + ret = self.connection.send(msg_iq, msg is not None, on_ok=on_send_ok, + on_not_ok=on_send_not_ok) + + if ret == -1: + # Contact Offline + self.dispatch('MSGERROR', [jid, -1, _('Contact is offline. Your ' + 'message could not be sent.'), None, None, session]) + + self._prepare_message(jid, msg, keyID, type_=type_, subject=subject, + chatstate=chatstate, msg_id=msg_id, composing_xep=composing_xep, + resource=resource, user_nick=user_nick, xhtml=xhtml, session=session, + forward_from=forward_from, form_node=form_node, + original_message=original_message, delayed=delayed, callback=cb) def send_stanza(self, stanza): # send a stanza untouched @@ -495,95 +347,10 @@ class ConnectionZeroconf(ConnectionHandlersZeroconf): stanza = common.xmpp.Protocol(node=stanza) self.connection.send(stanza) - def ack_subscribed(self, jid): - gajim.log.debug('This should not happen (ack_subscribed)') - - def ack_unsubscribed(self, jid): - gajim.log.debug('This should not happen (ack_unsubscribed)') - - def request_subscription(self, jid, msg = '', name = '', groups = [], - auto_auth = False): - gajim.log.debug('This should not happen (request_subscription)') - - def send_authorization(self, jid): - gajim.log.debug('This should not happen (send_authorization)') - - def refuse_authorization(self, jid): - gajim.log.debug('This should not happen (refuse_authorization)') - - def unsubscribe(self, jid, remove_auth = True): - gajim.log.debug('This should not happen (unsubscribe)') - - def unsubscribe_agent(self, agent): - gajim.log.debug('This should not happen (unsubscribe_agent)') - - def update_contact(self, jid, name, groups): - if self.connection: - self.connection.getRoster().setItem(jid = jid, name = name, - groups = groups) - - def update_contacts(self, contacts): - '''update multiple roster items''' - if self.connection: - self.connection.getRoster().setItemMulti(contacts) - - def new_account(self, name, config, sync = False): - gajim.log.debug('This should not happen (new_account)') - - def _on_new_account(self, con = None, con_type = None): - gajim.log.debug('This should not happen (_on_new_account)') - - def account_changed(self, new_name): - self.name = new_name - - def request_last_status_time(self, jid, resource): - gajim.log.debug('This should not happen (request_last_status_time)') - - def request_os_info(self, jid, resource): - gajim.log.debug('This should not happen (request_os_info)') - - def get_settings(self): - gajim.log.debug('This should not happen (get_settings)') - - def get_bookmarks(self): - gajim.log.debug('This should not happen (get_bookmarks)') - - def store_bookmarks(self): - gajim.log.debug('This should not happen (store_bookmarks)') - - def get_metacontacts(self): - gajim.log.debug('This should not happen (get_metacontacts)') - - def send_agent_status(self, agent, ptype): - gajim.log.debug('This should not happen (send_agent_status)') - - def gpg_passphrase(self, passphrase): - if self.gpg: - use_gpg_agent = gajim.config.get('use_gpg_agent') - if use_gpg_agent: - self.gpg.passphrase = None - else: - self.gpg.passphrase = passphrase - - def ask_gpg_keys(self): - if self.gpg: - keys = self.gpg.get_keys() - return keys - return None - - def ask_gpg_secrete_keys(self): - if self.gpg: - keys = self.gpg.get_secret_keys() - return keys - return None - def _event_dispatcher(self, realm, event, data): + CommonConnection._event_dispatcher(self, realm, event, data) if realm == '': - if event == common.xmpp.transports_nb.DATA_RECEIVED: - self.dispatch('STANZA_ARRIVED', unicode(data, errors = 'ignore')) - elif event == common.xmpp.transports_nb.DATA_SENT: - self.dispatch('STANZA_SENT', unicode(data)) - elif event == common.xmpp.transports.DATA_ERROR: + if event == common.xmpp.transports_nb.DATA_ERROR: thread_id = data[1] frm = unicode(data[0]) session = self.get_or_create_session(frm, thread_id) @@ -591,9 +358,6 @@ class ConnectionZeroconf(ConnectionHandlersZeroconf): _('Connection to host could not be established: Timeout while ' 'sending data.'), None, None, session]) - def load_roster_from_db(self): - return - # END ConnectionZeroconf # vim: se ts=3: From 86b39a72c6efc9ea7cab56e174af7d962509083b Mon Sep 17 00:00:00 2001 From: Yann Leboulanger Date: Wed, 18 Nov 2009 11:12:06 +0100 Subject: [PATCH 028/259] fix http message parsing, it may contain \n\n! --- src/common/xmpp/transports_nb.py | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/src/common/xmpp/transports_nb.py b/src/common/xmpp/transports_nb.py index dd60269bf..1aac5b52d 100644 --- a/src/common/xmpp/transports_nb.py +++ b/src/common/xmpp/transports_nb.py @@ -651,7 +651,7 @@ class NonBlockingHTTP(NonBlockingTCP): self.recvbuff = '%s%s' % (self.recvbuff or '', data) statusline, headers, httpbody, buffer_rest = self.parse_http_message( self.recvbuff) - + if not (statusline and headers and httpbody): log.debug('Received incomplete HTTP response') return @@ -663,12 +663,12 @@ class NonBlockingHTTP(NonBlockingTCP): self.expected_length = int(headers['Content-Length']) if 'Connection' in headers and headers['Connection'].strip()=='close': self.close_current_connection = True - + if self.expected_length > len(httpbody): # If we haven't received the whole HTTP mess yet, let's end the thread. # It will be finnished from one of following recvs on plugged socket. - log.info('not enough bytes in HTTP response - %d expected, %d got' % - (self.expected_length, len(self.recvbuff))) + log.info('not enough bytes in HTTP response - %d expected, got %d' % + (self.expected_length, len(httpbody))) else: # First part of buffer has been extraced and is going to be handled, # remove it from buffer @@ -720,6 +720,7 @@ class NonBlockingHTTP(NonBlockingTCP): http_rest - what is left in the message after a full HTTP header + body ''' message = message.replace('\r','') + message = message.lstrip('\n') splitted = message.split('\n\n') if len(splitted) < 2: # no complete http message. Keep filling the buffer until we find one @@ -727,9 +728,6 @@ class NonBlockingHTTP(NonBlockingTCP): return ('', '', '', buffer_rest) else: (header, httpbody) = splitted[:2] - if httpbody.endswith('\n'): - httpbody = httpbody[:-1] - buffer_rest = "\n\n".join(splitted[2:]) header = header.split('\n') statusline = header[0].split(' ', 2) header = header[1:] @@ -737,6 +735,12 @@ class NonBlockingHTTP(NonBlockingTCP): for dummy in header: row = dummy.split(' ', 1) headers[row[0][:-1]] = row[1] + body_size = headers['Content-Length'] + rest_splitted = splitted[2:] + while (len(httpbody) < body_size) and rest_splitted: + # Complete httpbody until it has the announced size + httpbody = '\n\n'.join([httpbody, rest_splitted.pop(0)]) + buffer_rest = "\n\n".join(rest_splitted) return (statusline, headers, httpbody, buffer_rest) From 4671f62d2fd7d54e9501ff5307a07847e976772d Mon Sep 17 00:00:00 2001 From: Yann Leboulanger Date: Wed, 18 Nov 2009 11:16:15 +0100 Subject: [PATCH 029/259] fix ConnectionZeroconf initialization --- src/common/zeroconf/connection_zeroconf.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/common/zeroconf/connection_zeroconf.py b/src/common/zeroconf/connection_zeroconf.py index 52876c8d6..e1cc30971 100644 --- a/src/common/zeroconf/connection_zeroconf.py +++ b/src/common/zeroconf/connection_zeroconf.py @@ -53,7 +53,6 @@ from connection_handlers_zeroconf import * class ConnectionZeroconf(CommonConnection, ConnectionHandlersZeroconf): '''Connection class''' def __init__(self, name): - CommonConnection.__init__(self, name) ConnectionHandlersZeroconf.__init__(self) # system username self.username = None @@ -64,7 +63,7 @@ class ConnectionZeroconf(CommonConnection, ConnectionHandlersZeroconf): self.password = 'zeroconf' self.autoconnect = False - self.get_config_values_or_default() + CommonConnection.__init__(self, name) def get_config_values_or_default(self): ''' get name, host, port from config, or From 1b22a33239e99592b4e2b27df68315605d28dbc4 Mon Sep 17 00:00:00 2001 From: Yann Leboulanger Date: Wed, 18 Nov 2009 11:22:48 +0100 Subject: [PATCH 030/259] add a HTML message parsser test --- test/integration/test_xmpp_transports_nb.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/test/integration/test_xmpp_transports_nb.py b/test/integration/test_xmpp_transports_nb.py index 6e56ddf94..ef9908903 100644 --- a/test/integration/test_xmpp_transports_nb.py +++ b/test/integration/test_xmpp_transports_nb.py @@ -254,12 +254,12 @@ class TestNonBlockingHTTP(AbstractTransportTest): def test_receive_http_message_in_chunks(self): ''' Let _on_receive handle some chunked http messages ''' transport = self._get_transport(self.bosh_http_dict) - - header = ("HTTP/1.1 200 OK\r\nContent-Type: text/xml; charset=utf-8\r\n" + - "Content-Length: 88\r\n\r\n") - payload = "Please don't fail!" + + payload = "Please don't fail!\n\n" body = "%s" \ % payload + header = "HTTP/1.1 200 OK\r\nContent-Type: text/xml; charset=utf-8\r\n" +\ + "Content-Length: %i\r\n\r\n" % len(body) message = "%s%s" % (header, body) chunk1, chunk2, chunk3, chunk4 = message[:20], message[20:73], \ From c9c5f72ff9abb0c889edef20c0f5e7a20bf60e0a Mon Sep 17 00:00:00 2001 From: Yann Leboulanger Date: Wed, 18 Nov 2009 21:07:11 +0100 Subject: [PATCH 031/259] fix traceback on startup. Fixes #5435 --- src/common/connection.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/common/connection.py b/src/common/connection.py index 3cd3acd43..ee79c1ddf 100644 --- a/src/common/connection.py +++ b/src/common/connection.py @@ -623,7 +623,7 @@ class Connection(CommonConnection, ConnectionHandlers): self.secret_hmac = str(random.random())[2:] # END __init__ - def get_config_values_or_default(): + def get_config_values_or_default(self): if gajim.config.get_per('accounts', self.name, 'keep_alives_enabled'): self.keepalives = gajim.config.get_per('accounts', self.name, 'keep_alive_every_foo_secs') From 750fbc844dafd82a403a0694b4bfa9f342948361 Mon Sep 17 00:00:00 2001 From: Yann Leboulanger Date: Wed, 18 Nov 2009 21:32:10 +0100 Subject: [PATCH 032/259] [Urcher] ability to copy emoticons when they are selected. Fixes #2570 --- src/conversation_textview.py | 6 ++++-- src/htmltextview.py | 40 ++++++++++++++++++++++++++++++++++++ 2 files changed, 44 insertions(+), 2 deletions(-) diff --git a/src/conversation_textview.py b/src/conversation_textview.py index 837e2a0ce..fa5dcd25e 100644 --- a/src/conversation_textview.py +++ b/src/conversation_textview.py @@ -67,13 +67,15 @@ def has_focus(widget): class TextViewImage(gtk.Image): - def __init__(self, anchor): + def __init__(self, anchor, text): super(TextViewImage, self).__init__() self.anchor = anchor self._selected = False self._disconnect_funcs = [] self.connect('parent-set', self.on_parent_set) self.connect('expose-event', self.on_expose) + self.set_tooltip_text(text) + self.anchor.set_data('plaintext', text) def _get_selected(self): parent = self.get_parent() @@ -1043,7 +1045,7 @@ class ConversationTextview(gobject.GObject): emot_ascii = possible_emot_ascii_caps end_iter = buffer_.get_end_iter() anchor = buffer_.create_child_anchor(end_iter) - img = TextViewImage(anchor) + img = TextViewImage(anchor, special_text) animations = gajim.interface.emoticons_animations if not emot_ascii in animations: animations[emot_ascii] = gtk.gdk.PixbufAnimation( diff --git a/src/htmltextview.py b/src/htmltextview.py index 36f3ac131..5c12a049c 100644 --- a/src/htmltextview.py +++ b/src/htmltextview.py @@ -804,6 +804,10 @@ class HtmlTextView(gtk.TextView): self.connect('motion-notify-event', self.__motion_notify_event) self.connect('leave-notify-event', self.__leave_event) self.connect('enter-notify-event', self.__motion_notify_event) + self.connect('realize', self.on_html_text_view_realized) + self.connect('unrealize', self.on_html_text_view_unrealized) + self.connect('copy-clipboard', self.on_html_text_view_copy_clipboard) + self.get_buffer().connect_after('mark-set', self.on_text_buffer_mark_set) self.get_buffer().create_tag('eol', scale = pango.SCALE_XX_SMALL) self.tooltip = tooltips.BaseTooltip() self.config = gajim.config @@ -873,7 +877,43 @@ class HtmlTextView(gtk.TextView): #if not eob.starts_line(): # buffer_.insert(eob, '\n') + def on_html_text_view_copy_clipboard(self, unused_data): + clipboard = self.get_clipboard(gtk.gdk.SELECTION_CLIPBOARD) + clipboard.set_text(self.get_selected_text()) + self.emit_stop_by_name('copy-clipboard') + def on_html_text_view_realized(self, unused_data): + self.get_buffer().remove_selection_clipboard(self.get_clipboard(gtk.gdk.SELECTION_PRIMARY)) + + def on_html_text_view_unrealized(self, unused_data): + self.get_buffer().add_selection_clipboard(self.get_clipboard(gtk.gdk.SELECTION_PRIMARY)) + + def on_text_buffer_mark_set(self, location, mark, unused_data): + bounds = self.get_buffer().get_selection_bounds() + if bounds: + clipboard = self.get_clipboard(gtk.gdk.SELECTION_PRIMARY) + clipboard.set_text(self.get_selected_text()) + + def get_selected_text(self): + bounds = self.get_buffer().get_selection_bounds() + selection = '' + if bounds: + (search_iter, end) = bounds + + while (search_iter.compare(end)): + character = search_iter.get_char() + if character == u'\ufffc': + anchor = search_iter.get_child_anchor() + if anchor: + text = anchor.get_data('plaintext') + if text: + selection+=text + else: + selection+=character + else: + selection+=character + search_iter.forward_char() + return selection change_cursor = None From 909ef8da53e25b956cca6161645781997b317cca Mon Sep 17 00:00:00 2001 From: red-agent Date: Thu, 19 Nov 2009 07:39:04 +0200 Subject: [PATCH 033/259] Added /grep command. Fixes #5438 --- src/command_system/implementation/standard.py | 44 +++++++++++++++++++ 1 file changed, 44 insertions(+) diff --git a/src/command_system/implementation/standard.py b/src/command_system/implementation/standard.py index 8afa044e5..3b46a30db 100644 --- a/src/command_system/implementation/standard.py +++ b/src/command_system/implementation/standard.py @@ -17,10 +17,14 @@ Provides an actual implementation for the standard commands. """ +from time import localtime, strftime +from datetime import date + import dialogs from common import gajim from common import helpers from common.exceptions import GajimGeneralException +from common.logger import Constants from ..errors import CommandError from ..framework import CommandContainer, command, documentation @@ -28,6 +32,10 @@ from ..mapping import generate_usage from hosts import ChatCommands, PrivateChatCommands, GroupChatCommands +# This holds constants fron the logger, which we'll be using in some of our +# commands. +lc = Constants() + class StandardCommonCommands(CommandContainer): """ This command container contains standard commands which are common to all - @@ -84,6 +92,42 @@ class StandardCommonCommands(CommandContainer): def me(self, action): self.send("/me %s" % action) + @command('lastlog', overlap=True) + @documentation(_("Show logged messages which mention given text")) + def grep(self, text, limit=None): + results = gajim.logger.get_search_results_for_query(self.contact.jid, + text, self.account) + + if not results: + raise CommandError(_("%s: Nothing found") % text) + + if limit: + try: + results = results[len(results) - int(limit):] + except ValueError: + raise CommandError(_("Limit must be an integer")) + + for row in results: + contact, time, kind, show, message, subject = row + + if not contact: + if kind == lc.KIND_CHAT_MSG_SENT: + contact = gajim.nicks[self.account] + else: + contact = self.contact.name + + time_obj = localtime(time) + date_obj = date.fromtimestamp(time) + date_ = strftime('%Y-%m-%d', time_obj) + time_ = strftime('%H:%M:%S', time_obj) + + if date_obj == date.today(): + formatted = "[%s] %s: %s" % (time_, contact, message) + else: + formatted = "[%s, %s] %s: %s" % (date_, time_, contact, message) + + self.echo(formatted) + class StandardChatCommands(CommandContainer): """ This command container contains standard command which are unique to a chat. From d664daad1a715bb5fe8e1eff7aac7089a5520411 Mon Sep 17 00:00:00 2001 From: Yann Leboulanger Date: Thu, 19 Nov 2009 20:36:40 +0100 Subject: [PATCH 034/259] we can now send pep thing to a zeroconf connection objec, it will just send nothing. so GUI doesn't have to know it's a zeroconf connection or not. fixes #5432 --- src/common/zeroconf/connection_handlers_zeroconf.py | 3 ++- src/gui_interface.py | 2 -- src/roster_window.py | 6 +----- 3 files changed, 3 insertions(+), 8 deletions(-) diff --git a/src/common/zeroconf/connection_handlers_zeroconf.py b/src/common/zeroconf/connection_handlers_zeroconf.py index b08fba1ce..4ea0e65bb 100644 --- a/src/common/zeroconf/connection_handlers_zeroconf.py +++ b/src/common/zeroconf/connection_handlers_zeroconf.py @@ -35,6 +35,7 @@ from common import helpers from common import gajim from common.zeroconf import zeroconf from common.commands import ConnectionCommands +from common.pep import ConnectionPEP import logging log = logging.getLogger('gajim.c.z.connection_handlers_zeroconf') @@ -376,7 +377,7 @@ class ConnectionBytestream(connection_handlers.ConnectionBytestream): raise common.xmpp.NodeProcessed class ConnectionHandlersZeroconf(ConnectionVcard, ConnectionBytestream, -ConnectionCommands, connection_handlers.ConnectionHandlersBase): +ConnectionCommands, ConnectionPEP, connection_handlers.ConnectionHandlersBase): def __init__(self): ConnectionVcard.__init__(self) ConnectionBytestream.__init__(self) diff --git a/src/gui_interface.py b/src/gui_interface.py index 9cb53d646..98c1f3298 100644 --- a/src/gui_interface.py +++ b/src/gui_interface.py @@ -2812,8 +2812,6 @@ class Interface: for acct in accounts: if not gajim.account_is_connected(acct): continue - if gajim.connections[acct].is_zeroconf: - continue if not gajim.config.get_per('accounts', acct, 'publish_tune'): continue if gajim.connections[acct].music_track_info == music_track_info: diff --git a/src/roster_window.py b/src/roster_window.py index 25780f85c..6e3bcdc2d 100644 --- a/src/roster_window.py +++ b/src/roster_window.py @@ -1898,9 +1898,7 @@ class RosterWindow: def send_pep(self, account, pep_dict): connection = gajim.connections[account] - if connection.is_zeroconf: - return - + if 'activity' in pep_dict: activity = pep_dict['activity'] subactivity = pep_dict.get('subactivity', None) @@ -1917,8 +1915,6 @@ class RosterWindow: connection.retract_mood() def delete_pep(self, jid, account): - if gajim.connections[account].is_zeroconf: - return if jid == gajim.get_jid_from_account(account): gajim.connections[account].pep = {} self.draw_account(account) From 8720eb221d1e767cab60b63336949c8fb89f3406 Mon Sep 17 00:00:00 2001 From: Yann Leboulanger Date: Thu, 19 Nov 2009 22:13:16 +0100 Subject: [PATCH 035/259] don't propose to add contacts we already have in our roster when we get a RIE request. --- src/common/connection_handlers.py | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/src/common/connection_handlers.py b/src/common/connection_handlers.py index cb9197d5e..15a979415 100644 --- a/src/common/connection_handlers.py +++ b/src/common/connection_handlers.py @@ -1860,9 +1860,23 @@ class ConnectionHandlers(ConnectionVcard, ConnectionBytestream, ConnectionDisco, log.warn('Invalid JID: %s, ignoring it' % item.getAttr('jid')) continue name = item.getAttr('name') - groups=[] + contact = gajim.contact.get_contact(self.name, jid) + groups = [] + same_groups = True for group in item.getTags('group'): groups.append(group.getData()) + # check that all suggested groups are in the groups we have for this + # contact + if not contact or group not in contact.groups: + same_groups = False + if contact: + # check that all groups we have for this contact are in the + # suggested groups + for group in contact.groups: + if group not in groups: + same_groups = False + if contact.subscription in ('both', 'to') and same_groups: + continue exchange_items_list[jid] = [] exchange_items_list[jid].append(name) exchange_items_list[jid].append(groups) From 094941f89e8bc57354e2a6019d10908d341094f0 Mon Sep 17 00:00:00 2001 From: Yann Leboulanger Date: Thu, 19 Nov 2009 22:42:35 +0100 Subject: [PATCH 036/259] don't try to send thing after we are disconnected. Fixes #5437 --- src/common/connection.py | 1 + 1 file changed, 1 insertion(+) diff --git a/src/common/connection.py b/src/common/connection.py index ee79c1ddf..3c8cf537d 100644 --- a/src/common/connection.py +++ b/src/common/connection.py @@ -553,6 +553,7 @@ class CommonConnection: self.connect_and_init(show, msg, sign_msg) elif show == 'offline': + self.connected = 0 if self.connection: p = common.xmpp.Presence(typ = 'unavailable') p = self.add_sha(p, False) From bafca7579fb94c84f094a02eaf7b46681cd69899 Mon Sep 17 00:00:00 2001 From: Yann Leboulanger Date: Fri, 20 Nov 2009 13:49:56 +0100 Subject: [PATCH 037/259] [Dmitry Korzhevin] new tango emoticon set. Fixes #5421 --- THANKS.artists | 2 +- data/emoticons/tango/alien.png | Bin 0 -> 1452 bytes data/emoticons/tango/angel.png | Bin 0 -> 1587 bytes data/emoticons/tango/arrogant.png | Bin 0 -> 1307 bytes data/emoticons/tango/beer.png | Bin 0 -> 1382 bytes data/emoticons/tango/bomb.png | Bin 0 -> 1110 bytes data/emoticons/tango/clap.png | Bin 0 -> 1334 bytes data/emoticons/tango/confused.png | Bin 0 -> 1280 bytes data/emoticons/tango/cowboy.png | Bin 0 -> 1490 bytes data/emoticons/tango/crying.png | Bin 0 -> 1319 bytes data/emoticons/tango/curl-lip.png | Bin 0 -> 1269 bytes data/emoticons/tango/cute.png | Bin 0 -> 1275 bytes data/emoticons/tango/dance.png | Bin 0 -> 1359 bytes data/emoticons/tango/devil.png | Bin 0 -> 1457 bytes data/emoticons/tango/disapointed.png | Bin 0 -> 1225 bytes data/emoticons/tango/doh.png | Bin 0 -> 1284 bytes data/emoticons/tango/dont-know.png | Bin 0 -> 1265 bytes data/emoticons/tango/embarrassed.png | Bin 0 -> 1284 bytes data/emoticons/tango/emoticons.py | 52 +++++++++++++++++++++++ data/emoticons/tango/fingers-crossed.png | Bin 0 -> 1373 bytes data/emoticons/tango/freaked-out.png | Bin 0 -> 1236 bytes data/emoticons/tango/giggle.png | Bin 0 -> 1305 bytes data/emoticons/tango/glasses-cool.png | Bin 0 -> 1302 bytes data/emoticons/tango/go-away.png | Bin 0 -> 1324 bytes data/emoticons/tango/good.png | Bin 0 -> 1011 bytes data/emoticons/tango/handshake.png | Bin 0 -> 1390 bytes data/emoticons/tango/hypnotized.png | Bin 0 -> 1315 bytes data/emoticons/tango/kiss.png | Bin 0 -> 1345 bytes data/emoticons/tango/laugh.png | Bin 0 -> 1250 bytes data/emoticons/tango/love.png | Bin 0 -> 1069 bytes data/emoticons/tango/mail.png | Bin 0 -> 881 bytes data/emoticons/tango/musical-note.png | Bin 0 -> 941 bytes data/emoticons/tango/party.png | Bin 0 -> 1488 bytes data/emoticons/tango/pissed-off.png | Bin 0 -> 1342 bytes data/emoticons/tango/question.png | Bin 0 -> 1491 bytes data/emoticons/tango/rose.png | Bin 0 -> 1062 bytes data/emoticons/tango/rotfl.png | Bin 0 -> 1318 bytes data/emoticons/tango/sad.png | Bin 0 -> 1283 bytes data/emoticons/tango/sarcastic.png | Bin 0 -> 1274 bytes data/emoticons/tango/shout.png | Bin 0 -> 1288 bytes data/emoticons/tango/shut-mouth.png | Bin 0 -> 1306 bytes data/emoticons/tango/sick.png | Bin 0 -> 1309 bytes data/emoticons/tango/silly.png | Bin 0 -> 1266 bytes data/emoticons/tango/sleepy.png | Bin 0 -> 1400 bytes data/emoticons/tango/smirk.png | Bin 0 -> 1256 bytes data/emoticons/tango/terror.png | Bin 0 -> 1259 bytes data/emoticons/tango/thinking.png | Bin 0 -> 1282 bytes data/emoticons/tango/tongue.png | Bin 0 -> 1260 bytes data/emoticons/tango/tremble.png | Bin 0 -> 1298 bytes data/emoticons/tango/victory.png | Bin 0 -> 1387 bytes data/emoticons/tango/wink.png | Bin 0 -> 1276 bytes 51 files changed, 53 insertions(+), 1 deletion(-) create mode 100644 data/emoticons/tango/alien.png create mode 100644 data/emoticons/tango/angel.png create mode 100644 data/emoticons/tango/arrogant.png create mode 100644 data/emoticons/tango/beer.png create mode 100644 data/emoticons/tango/bomb.png create mode 100644 data/emoticons/tango/clap.png create mode 100644 data/emoticons/tango/confused.png create mode 100644 data/emoticons/tango/cowboy.png create mode 100644 data/emoticons/tango/crying.png create mode 100644 data/emoticons/tango/curl-lip.png create mode 100644 data/emoticons/tango/cute.png create mode 100644 data/emoticons/tango/dance.png create mode 100644 data/emoticons/tango/devil.png create mode 100644 data/emoticons/tango/disapointed.png create mode 100644 data/emoticons/tango/doh.png create mode 100644 data/emoticons/tango/dont-know.png create mode 100644 data/emoticons/tango/embarrassed.png create mode 100644 data/emoticons/tango/emoticons.py create mode 100644 data/emoticons/tango/fingers-crossed.png create mode 100644 data/emoticons/tango/freaked-out.png create mode 100644 data/emoticons/tango/giggle.png create mode 100644 data/emoticons/tango/glasses-cool.png create mode 100644 data/emoticons/tango/go-away.png create mode 100644 data/emoticons/tango/good.png create mode 100644 data/emoticons/tango/handshake.png create mode 100644 data/emoticons/tango/hypnotized.png create mode 100644 data/emoticons/tango/kiss.png create mode 100644 data/emoticons/tango/laugh.png create mode 100644 data/emoticons/tango/love.png create mode 100644 data/emoticons/tango/mail.png create mode 100644 data/emoticons/tango/musical-note.png create mode 100644 data/emoticons/tango/party.png create mode 100644 data/emoticons/tango/pissed-off.png create mode 100644 data/emoticons/tango/question.png create mode 100644 data/emoticons/tango/rose.png create mode 100644 data/emoticons/tango/rotfl.png create mode 100644 data/emoticons/tango/sad.png create mode 100644 data/emoticons/tango/sarcastic.png create mode 100644 data/emoticons/tango/shout.png create mode 100644 data/emoticons/tango/shut-mouth.png create mode 100644 data/emoticons/tango/sick.png create mode 100644 data/emoticons/tango/silly.png create mode 100644 data/emoticons/tango/sleepy.png create mode 100644 data/emoticons/tango/smirk.png create mode 100644 data/emoticons/tango/terror.png create mode 100644 data/emoticons/tango/thinking.png create mode 100644 data/emoticons/tango/tongue.png create mode 100644 data/emoticons/tango/tremble.png create mode 100644 data/emoticons/tango/victory.png create mode 100644 data/emoticons/tango/wink.png diff --git a/THANKS.artists b/THANKS.artists index 5cdff9134..7f8f24c99 100644 --- a/THANKS.artists +++ b/THANKS.artists @@ -1,10 +1,10 @@ Anders Ström Christophe Got Dennis Craven +Dmitry Korzhevin Guillaume Morin Gvorcek Spajreh Josef Vybíral Membris Khan Rederick Asher Jakub Szypulka - diff --git a/data/emoticons/tango/alien.png b/data/emoticons/tango/alien.png new file mode 100644 index 0000000000000000000000000000000000000000..ca83124f833b1e8ad9e76cfcdcd2b950a375d6c3 GIT binary patch literal 1452 zcmV;d1ylNoP)41R~3f8wa+>CX~&LVX?krZvJ>~=M95T5o3@ca1tl#}jUrJ6iAe<>BbXtWFesBE zF{*@Oh{{7kA{D7ykw(x`wITt>PNGs*b!glQJ9gsQv7PICeeQYey%^l2q_$JBq&-<% z>;LxFzxFx@Rb}IP_C%(zRsM_CvnMj%R(ZpQICe6B3aB1Cng7kky`hn;42@)Ei<;j9 z$+469lN7P5NlFelRTA9X2~geYBS$MzD>AO4YdrScZ=!6vPZ zCLhY@3gH6{Pq7+ZCrM*Gas*N&kRmy=jl5|jXBx>!k&G14)KH0*d7$Ab^0`6?9NH2v zG?F#OGcO%Ea6G?mS8&c@@bC%n$PkbtbLLfoKc6Ne4Fu%zC5ul6QIDD}bL7DByz$IS zLnB$U2>=`~we*y_+V^lPTErNG5ud^vXUU#<6;A@>!rzebxA4j1zwrv0GoygPh)0;L z(cRHUsimg`9Nz>mo*eDl-CroDHvoro4#klhA0sn<4yO*d{eZBT3vZJdKZnSjHWw=C z5`DY-3&xY9n@kpwfsSpRgtiREqH0kr)Mc>}VGn!-K}fZVht~6Iv6|vEC3Yzt+d2`E zfzJVkMzSJ8PisRbv&jS=0iGnJ8dDt{zz~q?I_{aHpdLa6Gx!*mlvHCJF%C;=YjiX` zgtM+^Xe2A6!;#+Ars7aVCBdpA)eMFjD^EXJH&iR68sLeCa~Avb*GZ|7YDh|iCB~70 zYF!Kcp9iDEks41X7b|lFk|))Olp0sYZxFjGk*gBv8Zm2xdW(oPA}y0>l@BN8NHiqT z5Z?<}tju9NnH(LC^m8U#>)u^hnQ=Lo?V)LVRm7ooFFdAUQug@at_BpkvSgghry*9f1L4I}Sg<6z^kB<&Vm$!P!j1EVa z>vcK=^&=r5_!Rb$NZzsAN^^)As(fIG2w?_R&y-rnFM*JRKJC*+JF z*tJ{$0000B;sx}fO55=Zc5UD6ue6T_v zEEG{HDr&%&q|ss`MD#&ulhmlwrfHbOTxM*frp;W>WzL+l_dffwJ|AW#sTnJNu-NNm z{eSEG|JS!gRavfyD}TIWZszrUBKB_IFR!zH*P!*g`m8Oj@@%PKZP6Ix<1}?y+KIC) zYG-LMpQb@IO@k>T-nqdw_njz~hR6H*1{MHBRXKKKj}QDfm+SfB>fu6ZV6aHO&`U1Y zkM;ZU>}re*fb^qU1R_*xxU5Q=R!QO-ov2Q|7Eqt-w3DR$ViZn4@yPyD&K^6mM}S`q zt!eDvdGB?ScrEqXM$*J5j!TGiV@x;JcH`%|$rlEQJ5|yoA=^Nz~qX{48_MdvnF6Dc0 zW~#UKrxU{mRuAWUR}VP~g@9bXj`bbZ5Ae)9Vv2x=a}MVsvb05-G)dw%ohaq%-v_A8 zbvMFr<`AUcyczOx%{|lm;b3^fYvFyL&!tI&j4qH>ASFcdARb0MKoN1E5omxA;QM6? zuOE+#rvFm|2VQ!0S@Ra)QSsVa7?Vez-r@$jC5~pn8wN9onm)v=LMZ?iBN?h8xCL-^ zaI^Ti5~kKr{q-}K%a_~^exn(HStbP|?3E8}-(c2ml1_URAp|<8c6j;pTbw*IjtGdc zoc`-LC(n$7c2JFgh$Os(S+icuom)2qBkWz)y$L|LM@F_6lJE_14b&}wTR>>>@}DO- zedY>i0ItpHzg*<>nJWk(LL0OVS(Pk2kBn?DAl$PoYq_<1K!z*ECFe1c;oLmN6j7IB ze!hY4=OC+tc+~4PvMfbiW6`2)1|`BJv)JK^QOg4>0Ftsp`YL4gKY$8iV$?MOVdqxx ztcSQs9F`rMeX=Y=vq^AGL?c8K(sY`9-(DnT$I1?Fde*_gqPH$U#PZm_UXT)+O<|13 zfzR{+pDnF-}S6T#=pVQ0QX+4{rcs?lfe1$^a0niZ9 zI_m1+YD=rW7`SUw=>6=X_=)EO?X;eKulR}%0QjDm>CpRbSGo8N@8N?*S+`lz;1n*t zMi##XfS3CqCU+OMv(ogIB%x*njK`R~5d%wM{;P`dcjtLtA0oT;hN zhB2l#HagnS_lT~vXsIfditQR4EW3{DF=*Kd1ta1+amJ`|3NhjWfu?n?34~|Qp3QF8 ld0)VPD-n_9z5bsE{|({E33t-kYh?fc002ovPDHLkV1h!+3a|hG literal 0 HcmV?d00001 diff --git a/data/emoticons/tango/arrogant.png b/data/emoticons/tango/arrogant.png new file mode 100644 index 0000000000000000000000000000000000000000..42b85ff14c9468acfb701b4a1201041c204db0c7 GIT binary patch literal 1307 zcmV+$1?2jPP)WiB(v?QK647O`P>S71X(7-oqzj>TQTjo# z6fAVnQba8D!`Mv~ieNyrjZxb)hUl1Rg2_x`=FOXV@7>cyw0^{h8!sHVaJl~<|8wp= zM^u$(xy&hzVs&t+%*~-|>a#0zNUuB{;6pK`kWPsux^#O-irfkbgGsCk zNSv9hR&WFycOK*iR8Dq#8u$m(E{8av_CdK>H7JF2l56T>@4j@Dt&?hHoJf=edkT~Uv%h~fq zdM|q%{`LZ5YPrxi&87Y_$9}y{|J9I43h4HZlq5LDZgFM-yjFIQZEhmhBvpR|5d-3) zI3yEso^P1Xm*1SFv9SRq&6?Fq`02MiR|f8o%_a$|laO03WSg73R(9Oez5h&w&C=4G z464@wi>d{+h_Q$$E1K*0>XSV{67Y%F2p{aEDg_E`=j zWWCleLH$cW95GeY`e4dHj3eLuOV9b+v~OL;dvC9$z80?Z-{SKl1AKa*5zzn}c~IZR zy$|`Yga3c(FlYpc8sW`74WI=y54mN0G-CWdFUW;qBs&Dh8mQ(I@E zU>H${nLn;wE<8;wM;Cv0rGj}=FqiNKPP58II5BQ?2?n+o@3f@VvE2|&g9(| z;BJVWaiLKGp$N8!aqDo+D&%Chr#`zLY~K&{qRb(^qJe)Ad##*30qf!04Yp-ux zmhoTAW-9CJoG=G49>s=lOvNt`-bwWx{wH_Jvt~k#7L73zy*)ieeL!^1k-2KsDmT4g zLB>|>a|X>=Az?&fR;)2;b;(t|eTT71+ Ry4e5#002ovPDHLkV1hKzV>JK( literal 0 HcmV?d00001 diff --git a/data/emoticons/tango/beer.png b/data/emoticons/tango/beer.png new file mode 100644 index 0000000000000000000000000000000000000000..e955770a388b2a40e5426c96f07a337b9a4527b9 GIT binary patch literal 1382 zcmV-s1)2JZP)M z*zfnPsI08yUT+>`MFBtn160+8!ongntZLwa(m;jF?Y@2X{FycYY+1nRbEj8xS^m!D zQdEz}4M7fsAdnCsA_zeM1ONd7Ls_5VUidlb$;T^1k+ua^e`a$|iHBs+!R*eDXoBrMwo2p}SuW)|T{1b6P- zfDs$RvrTK^_xeDBRy+wHKLU_PQB~aP{Sj+7>_$5HJHn|560tZY3=2XKd^(3u&7z@{ z;I7<)fg3*~zoG$-aJ=p3PiHun2OY=y?BF}^Us#|3f?QnU$RuO9{?!W*lf4LNNz|<@ zz?Kagv2EifG}Hu8=5-(?2GMhB7eWtigE5Aeo_`TLwzj&~G&D6zl63au`IB1~D4^M- zRMl-pMvo));5y>{9gE6lYCcM;pM$4<2LRw|cb6zBEKXNHRpY6zt<&$^yZbqS4LJbD zm>>Zd@i6i$TOe1hL#q1&XpM(K)-=emz_cQmw@yHBIRXV5!tp8i-NkSmfr(J)xM^93 zo9Y_<1k^0Fh(KV3RD2SW9R+2h01+UvV2U4-Rtz>9cae!f%1$8>9e?Dog5&Xc+@-lR z2qFA!ZEbR{MGOQY7>Ni(o;>$*gc$>qlz9db$c#cTj#S*9Gr$8+Dg#3X2mq+Oyqx7) zG?PSFnFK6@pl~*`SvCe@xh;##C@hD;O3yuDmbQ~`y7fFGok{y-Nt!tD-a#t|00uz> zWX%+^h6!1n1(-2_&Fd&c5Sa)}6Udr60DyDu=$iYBhShbxNGwWBlKyzO{E-4;1V-Sp z3(?2~v_d}XcQh9O0Wu>9hHS`M9ROhG_8lC6FE|;(-NAvBBk1Tt0ApF(b`Yp;#=tLq zDDy}&mz<3ur&m4zAN~%=K_q8FpOjz3=Hl(Kk^EmM$4;jqpEHjhzLXX|4P}m z{rzH_&sab2!|C{@z0;rXe{D^DlddZ2V(aJ1c5L+D?l*&>$?mT^FYf8NeA!qM(AwH6 zd5ekyyLN8>Qq#0IR#aB7veGiet-Ik;T_6H7nKX>FflzqT9vK^Prl%9vE?&IyNqjmU zWD1MsYg)9ct1CxIPQV|Gj%M52zx}wjwz^~8y5@I>yni=wE|p3W%L4$%5r$>kk!U13 z(A#t4hq3YTVPaDDVFXG_N|v?=0M@Tx&oip3amUfgW*(B@R%Mn)#9X$pEk-;8Aq+?& o17q-U-X<)U2*H(mjD0&07*qoM6N<$g8A!tg#Z8m literal 0 HcmV?d00001 diff --git a/data/emoticons/tango/bomb.png b/data/emoticons/tango/bomb.png new file mode 100644 index 0000000000000000000000000000000000000000..9f28ff03b898bae02cea32cb874bfed608cb1106 GIT binary patch literal 1110 zcmV-c1gZOpP);i0bnz*2z;sK_G&ZC0 zo*B_TIM4gpgc@)ycU1Z72Aus$4x!kx=PllazmwfVvg6NK*=DomBf04<$&D%g3m`c~gJ?$g_J2 zxj2sST$g&ij_bM@hQWq>p7!<*emXnuUSC)^cXDL>g@JBHfC0b(e$5?Kiz@=2+*SDS z!A<=~p4&T`3&Rl8Fp1*`*KJU(RVkMp!Z4(>vy;KWA;x|gcduPvIDG!M@lRTcZ3c`K z3PYNvPrms4{+upCS9dqrtVI}xRH_w9#S*1*iCV1&Ku3EATOQiVw?F*orfD*~d?t57 zYbjsJ!R>?FtTc(qSQ&D;EctvM+qN-{42EH#>-rsewN|B8tFnD?n}w2t&2}vSLH2cZ zb?AW~5GM(~AL2L_!Z09CB9b&AP11XEoN}42t`1$0ea(I?ziEov*_N|$eHXo9pb2=M zN1Q~sjRwB&6Gq`ZIiByaA)hBj?OYQ85XUiY!$m1Y6ou%zL7F7^zE8bg$M^kv^hzn> zI9|!B6`&zgCC7P2B{6~H<9Qysu8|}uVHmcU1DK{s$#Kw-sWkx#HC8G)yZU?chEs6} zg0NZA5?01y;bt*bsIk_9n?uxzE7umHBvqKExu&^knk1>>%GK*pqh39|CSY=6Vj*z7 zPiHR9dA4n17^^>5hGAgaHZ!xAeYf5?K07__h)CQ0cL3JR)cLQgwc5q$nM=NiPS(m| z=msK!h+yajSu2Z(&h*TspjxfX%})RR4PepK_LiG0BJDsP=pA_E(RUu`Xn(V(yVGoI zvo+hY0Puo&%9Xh4R8Gy$UN{L9fhFLoQYu~*une)e^~QJg^z}WqA>aE_#>x(B zy0#UNG)b-mzCTsGx%ho)Y3Tw`;nrMUQcZ^U9ho9x0Bt}Hu$NmPK*X&X-~lxtXg2;w cfd3-?0_$hgRTXiI5l=FZH$=X23EEldD6p5)6(zLUJ~ zdEax+dqh?FKZo_dq65xdSJ#T2uB8>B5r-!6SO%aDr}5}OIUYI3LH4VECkVNdMH6jO zFCh+4kxacwf8Z_F|o8d}tpSr9mZr8v58^OC`r99ds5ZbQIEfM0? z;^oIMDj-27UCm+(*v=dnxS(?QP+Ifuj;KRB@2Hs#S8xU?k2d0o?QGf{^(#sxmmS8} zFe+sjVi@knFdxs9kjN#LL>|lLN$OdqiAzWL_!>3t=I(w=~`N;NG6CUBY09!w-C%o%3)AcT`*~qRSxJl3o9b1e*??1NmTlv z84{H~YEnQ3a1qVl4mU%f4yPHp{3OLu^5diY*mwrbD+ja3$ex)47v>=%NX<0@OKx)hm{L_YhX-C3oNxmS3@BH6 z`y%H!IE_1VP4}y>E^FlQp|ow)V+R&c+vxJ(D~oYndyC-eGWr%=pug%of#>JryuOv% zjdAK*^H@$Pj#YykK9p9MHM8UUmar>s*S|FH?$ASDrHVqUu&+k2RyN@U|HgjmY3g3E zsA;vZo_Yo^coA9oG|tr`f}!WogI}dI@9wxgwhPiU>d-#XbLl;^XJ=ZjO~BkzeD`-K zDMPLsWW*qI%O-oJWysJ3{+?Z#tLLwLw63FJ_w9HE1Pxy{1)e+d=*OS_S-Rec<`^5r z4lRcp!%#jC?vJ5k!;`(yVSM$oAD$|Ie(yFB7;>A4x)_vWulJ{QZkKX~lihU)v=_5I^TA8kEZxAR8E83i(3 sU0sELv#Q>+QrobnHX_qC-Md%)3)v@5_Fi%IwEzGB07*qoM6N<$f^o%kc>n+a literal 0 HcmV?d00001 diff --git a/data/emoticons/tango/confused.png b/data/emoticons/tango/confused.png new file mode 100644 index 0000000000000000000000000000000000000000..e1a76fc38a4cca82781578d4a5a208b7c74c55ac GIT binary patch literal 1280 zcmV+b1^@bqP)Xkap9~E<+~XNP-bwNf3<~A`wzT1lEN? zNwc--X#$JDNttNI5ypFWZ;{Tw_T51Q(vT$&}&C@Sl*)MI%R z%LaT~OR1E{Ha7?d564Ni^yhr~9++UcPdZIJ@*@Wi$IJc%fyNNC4oodb0x?m*Me)EE zK$pNSAS@7e8sXDZIh!l)T#f5qf?jbX!UgS4#R6uq)*|A9gi#_OaWJ*0sYg}}ktj$6 z)ewQqq1~yNM7Th&I8_Gu4ti*6Z6Vnr<>E9V2E;{iIP=AIPM;e_iGiu(lh1zU^ts`c zGzP@MD=$EDtI*WilJB6WI)SiD+FGN2`6ggdwV)OeOZwZJq%V%b3YzpcBcv~mA_5{S zh!p~F8fj~dBJ8>=d#?{%cGK8wtUryB0INPmd{n(kHGo|LDF7BwR7;>fsE6WX0}mRT z4KBN@48&)<)^9?KzXD;zlu=s*Qy{gc5hR4@9M-y|UfhDJhuR$2BBCWkJ#3JN`cCdP zo)&Q7wYaBjR#s|9X%Z8q8yi!=e4nKpAui)f`X&iimpumAhx4F2iJ}o+A-Q z{RJ>JfI$PmSVYPoHE19eWLgGF81krH2AjjUQOHhJw5k<xMqaSyNkQ0&faYXNA0i z^()U2m)SYX$De2U>1u%;PuB3-enUfD0W^o0Mwpql_*|}jMaqzljTfBo;|L|Ni>L`*AaiN z+7otTx%IDZ%{;yDv6+)Ko0CnZZEKC$&@8JLj=eLj!Jp$^aWZq~%Gx%;jEv+!?V{Y6w%mwGDz0000fEGiNS)FCJ!`hPn=H zY3oQwYkmLPYyCR=psL(yKRI$po*X$8`h@r1|H@TWL{-^n4UY~D8e?7r?gP@Q`W%3W zJgurN#+biaYkxhK96z%WW1Yb8=ul`ZIbIna9XgmuB$5w(>7j=9_IA?gMczLDP643r z3!jfQH@7f%b575lJ6Bv@UOqUM9RJ(!=#Uvpj=N737#&KT5ERzcX^)o+9O|m zWUuiIi;D|1C7RgO)&{`h!UDOK9BrH0C|4?a>eQ*fSZf~#mOam#verH`mK=W*z|`S= z4Gj&i?AfztS0a(90^3w|uzmAp78X)C=g2N)nVx>1>FM{$E@iRSGM}2KqoY$)^--WR z7K{0VgI^wqMx!T(M~C_Vd;nw2(+>;`M7y_jbLC%GTrQW}1DNaozRu+2+Z)aZAl{f* zD|E0a(Nw*+rw3Jyo;ma8kAM*$KvfTPbaa{^2TuiK@gE! z65ZY1D2TI`bUMSO%a;OGePJv)?$%Clv^4v!|H0xve|oyo;#IBURH-oqR6xMu#t0sPVYX)P<@lx@Kq}+qMt?S$7m5Wyp(+s8syk-s^ehU!( z^wMD<%E-5W2RKgrVIS(!;FiE<2u0g5=dWAykBL;nue5N>MF1|!0ol?Ow&fcbv8YxN zse)Fh%|h`_9^YFAT&-DJ0MG$)eW2`KCtyI-2!;ZVFscE#0wO+#pK1k( zp>_#lJPtqA36w!sP|X8HAV4%gMG!@9Xb-7xfHH+Fb zXck-+G{?mGMR2R&@)$1+nb{ia;{sGUt*JR@{ASQqL|3U)ioBT2)ZlIjwHa`k`g4ij zAD^RKUabje9xx&gTb@Bo6eWU4sO|}=Tht;_MO_IK+Ds(65B_*8@AAPw{HRW?ZxIkbs#97Cp4F2l z^5N*?gyUZUmq#>Ytpv~B4qtZy0Dd86zUckDF&278 z9^2o*)_cST7je~_X!XNdlD`?_ci=^L!pseICr<{c75BmqChq^ut7qQL-cexZ&b<*o zmT&z|&rJWweW~Ze_iXJj_x6NMd#BK{r52Q##m&#Dy>hJ*+?bhv>C%>;C1>t_$B1OA zg~s&7i*J-R6c7>FIWTY+&=ObM^25(u-`5onKGzX1?P~U_TLIEGG4Z7i_zkU05zpQkn^3( s0maG5N&9im9serU1>bfF=>M7cAA_I!lq&6X(*OVf07*qoM6N<$f*eP^s{jB1 literal 0 HcmV?d00001 diff --git a/data/emoticons/tango/crying.png b/data/emoticons/tango/crying.png new file mode 100644 index 0000000000000000000000000000000000000000..016b82eb5cc418e18c6122cecf42d1eb59d830e9 GIT binary patch literal 1319 zcmV+?1=#wDP)!F(7h<#s=4cf*rgPJs^gNsMygtwK|8=qHmUH5be|X@5KmYHS@AvzA z5mn_u9`iua0r#G_?cx+$*oCkemo^Dl2cRx}1e`^=#)sjOLy!{ka<`Fe*&ul z5@X8M3XXu|E`Z?+DyO=O>X#2DT@GDZsF1{Vo6ftZD0YC%$nsR3LR zA8ZM966^%R1Tm)$J~>jbh4RMPcFibg7f0e8(;Yh#AvvtIh`1mzlsHHdOf72C$TT5R z0}@9yLMR@(V`oC*9HU*FIRwQPc2S>gBGV+*@+cw(#6@u!^jMa1&%w~Oh$;KH;uy%&^szKJ6O zBGVQtg#IYfoUK9Fd<%A_4_w-)YcMt##Yl+N03!jaK3B&b(y4IDcPWuhMHw3h)e2|; z>Z1hM(1*GPgG<{S1ro51bR!yisI4MYIn%#{eTN^zHLz{{1fm`qdTd)?z%{V%gDhvx zKLlDq)W?Q5Al=BVhP-Q;8md5RCiF+xlhf2=cXOltcHzLMk*V>;DljQA>qICZ-Bm3Bi zNeVZMy#DeSsuhe$qT#=|3!X*?KQD>Wb35DHo!l-?p_M*%Ki6uPm84qu86<&7g3!jO z_z`@6s_vr^ODq~<#0M$>L{m><#;o$)7X!%w*4>)0Ga(<3td{9hY@9#fbnU_FBWX;Bn zwLm(hVfxiaFKu6$DzC3kRn{$Xf(*d*FfwxaM(mHl$wdE=zcOcw*5uXbxG^T**V8ku zvq0xvnX6Z?c9Tn&rfkJ7G-%2SaU&A3VvSK_6{?6W3fyq5y#bVZdwb{X=6MP3c0@#O d{p)=`{13Z9M?xF>hWh{j002ovPDHLkV1is~Yg7OL literal 0 HcmV?d00001 diff --git a/data/emoticons/tango/curl-lip.png b/data/emoticons/tango/curl-lip.png new file mode 100644 index 0000000000000000000000000000000000000000..bf12d34c8d15a08494342fd8a84ddcddb90aeeaf GIT binary patch literal 1269 zcmV~JFn$la&yz;nNwH8A(5FxU1&FM-UJeg7X^Y|2tfqFh!GMYIV~plG`mNfTsylEw&Ai}JT?QU%P<}TD1(u!^zp6w%R$I;7A^EhhlDsqb8AA{ zTEjH980uG7lIba!PFWot%X4#VTnoGwJF1r-jo^JTS&tqGgnG5BJ3@TDc;z{)3P_NO zt3@0E$9)2l|EQep&uO`EBOwB(KBYXmVXz|?}o5EBMmlrq>n zXa?*Y!W==T5k5bbwb{bfrFPv{utyvTaZ0ajFP%?d+ntH9wjiUjs-4^=C20;lREYpahyhHOtw78Qy$D5H0^7?mmIK z43nOEiC7f%=D^ed2K51B5h;PxpuSWr(-Kg`kmJTg39N^4!;qe;U{xvb7+^Z}qN%Mj zet8N}XVG~D>s8tj7ZE{K5j<2&To}sGQ0IYW5z`3MDT~KIbr&gvIy#njg3lln!OmBP zNaqlpMePitX|OXGWB~A}<0L0L0!=SS zDSHv{!FpV}Tqcvt^V}vwBx0D$Sbq8izBui0aBr41O|!V+Es#tqH^;^!SLwUgJjbYcM$SVb_j^MR|PYMW-?lXrJAfM zBYt57>)k}XTa_Yr6~=AG33WnpQf+^KVLD?!d26u!qccDMG4oJ@&dwb{H1&Q*ts@Vc(yrK++62)aezC1U}|zc_}6GAGIH!n{Cv)uv>Kf?#-xV_ z2WNE&=&~ns0(r39&hWdDq%`AU`xTRCSw|C3sMX fh}?baBNqM(Ob|z0ykkOl00000NkvXXu0mjfe=tgN literal 0 HcmV?d00001 diff --git a/data/emoticons/tango/cute.png b/data/emoticons/tango/cute.png new file mode 100644 index 0000000000000000000000000000000000000000..ca6b4018a85cf223c1904a89261aabb14d11dc1e GIT binary patch literal 1275 zcmVqV6Bkv55P zminfQv^2%2YcQl5mo{^gFg;~;bgaa^v2pcyBY9eHJ{{mAF$JF<2}OIgvnx(|hxpZb ztO`hkrBur}0*<=@vUgOzA1G?o>r1$t=9Jpia%*Z(@aZ9)>81NbBB-yGN_mDrW2kJx zlEU&FmM!?UhH|-xZP+YypGc6-^cH-2p6DRoBW)%Ty+ZeiM8zK`&^Tf?f~f&XA|?j7 zC{?f}&_%HG2=hdoI{5NT!4|xOtK(X6a7-MDa#lOL;sMiGYY}llA}CRi1ehAsq>yDG z5(9~%8X}Ncw6iNNQO@s%c4I&s zs+D<2Hw*PmnPMwP*E$dmOG{JCuiOPJsut8TG(1Dso8NKe>I5uDbLHwNUB|y-=-MC_<`@hd<isVo&bkfp%20+cZnQJV)_z_>BUO)hDz zse#WWrl+iNYeDmf=0WqIi;RxVfSp5w9M~Khi-B#h9C#Yl*6Ge$25?a2`QVmoCM10hiF`=zQqDTIxRRGD;dQ+=j zpAMWWgrlzzPIiDTAUccMS+Kd~XBKo84HgL}4iSkSLHo}YwCeRe+O{9tt{;?~Q;B%! zL+R{_k=`bOH-h!=q5l1)L+)0LTaOcMhwOyffdOxN(SG*+VC%={f4)BZL_mA{%MmwT z*z|65_J!j+r#}sEOV^v0=CIk)Agc$CeK4iLpJP>TBKzQrTaCS6XX~ySk(^&l%#4g& zEUya?5oteoum(saHAsE1=kAg1NpF9Bvb?X>@zVe^L1=PfA@cj^VtnMxAL)xlYjSFI z&KQ#$9vqz0Rif*T%w4;7xrxo2leTO(8Z>Ezs1XTSvBs#e3Khf_1r}Uu7l6{x(9oLM lye{BzOGM=1yFTT?e*h9;T1x+Fw1WTu002ovPDHLkV1mIWM34Xg literal 0 HcmV?d00001 diff --git a/data/emoticons/tango/dance.png b/data/emoticons/tango/dance.png new file mode 100644 index 0000000000000000000000000000000000000000..709701d9b4b22d7bdacdf14963ba9717749fbe08 GIT binary patch literal 1359 zcmV-V1+e;wP)-0f{h0HHRbMxJA(SyUL-qwEEdM<1Tx6P3@eBGQ~Vi&5gTd?fRI; zz>Kwn4v^0cqf!JCM=6*#2~e9O$W7o?mW#9XnK*5q?n?DtAP#R|E$~m0)#Z8CZH)Qu zcLc%rxWyY$Kq&+%0x8Bgr5L9aaZ11xgDJ)jTyo(M(z-b=UUb*wi_$z>Kt!y?!w6tO zEs_JG5s(N<6eJF&1T|%dDFI1<#6Y5`dW4chH?s!9 zxTJ}$Q^T}A`Z*`N`vD(phLhbrv_AX+T|W&WGF>DJp+AT;*2fT5&q^{bcgbycNIo$D z8epXq@PqBkvwX%JodmmYOBj=X)Z%FiM1||KiEKRmB+Frpf-y$a1pP)1Al!BG;HGU z4><$Tm5V%(MKz1sG_{o>=mhmuAsUWiNK#iBB05f8WeA$W{h=FMt+?Ii|Ltx@nVw=~ z08AXU8PGK7Bwrr6OfoqFb`&&;hQpvq#zz0-NJl@031oDVpaoFCY!xUIWN*2L08gmUuj2IBG|8?X4xW#+R~0`#_<+{9h>5AlQ6x-j(|;~VG>~!>?mP#IeNSu z*I$k6uY{xRIehlO9PK*ws=Q21-7aa}91rao{K>CD1jR#e0GTElf( zCXyM1aeVd&ykGd1W@pcX*Tr1UIIqPEy%%ItYmAy|3A3lM!6h{KW9rYi3o&j5PP7I3 z`qj3zWrrs0yU%tm-u=b#pOaU+nfOwD_;p>O5Gi-z7QsII9njSU56L8V+h zaO~wl4bS)b+5W!E@Bdb{>*K!p-9}_2NXLgypFWzqrhte@%c@l+Kv_b=vgdBTxUn{o zT~U$9EiZL~8i3)@8|WX8{Ms{7c>2AwHAmCdjHuC3W6a2@&dyQ2%ITaV6QHT7$&Htn zCv48%V9H?6EOcoUtq6;rek-F-(5-eZ? z6?LtBIWCF;NqdnuvVL{*yJ4AJs$-?Yt9J z-Pz0mp+F)cKeMXe0-C^AU1MGVK9gEI45(wwec;2y+Mffz0bGHX5&4d)W`Nx6w(!RQ zfJ??S&X0@?EN^ah*V^q=AShR>#bYN=7E6^1g~NwIgz%$}Xx8g2-ntdGmX{lV^yPA; zk#f0sYkht7`7}MUqv`HW(TLoN()6?EM@GCxl8`-ju2>!)$Hp<5$zVMX977?Sp;)Of za^XV0ar<^Yc<((bp2za$Ccr;;YwiIg*8bvNqj9D>F;P4;JxvLkr0sxmwaUSW8CR!y2c3b;E{luh&UpzPR+~|Y$w1v4!92FvS==c=JQZ0p`|kP z_oIaZcpl_(*u000Bc^6%3XU;9sEL?;0N`uoYISJv=ur~CjTiyrpvLgZAO6Vwb^tjK z$|Y8UkXL?t85{={0b@v$gu#gk4pgfZ;OqMUM&#L}laqaRV*|FE1ht4-=2uqu{_o#} zBtg4fUY+|j^GizzAZ%5k0@`XZIyqTzjd^yT$wuT{|IiQ`1Q^%BCJBiXcuQNgz$Jy@>uw1z>6qpe7;$6NO3zyRZPc9K`XKK(EKl*eJLz z;3zHg7?e-uHd1q}MZMRXs z4J{x17TRn=s|BqV(r$C*{wmt(pq&nm2!6eeW6brPQSq_KskLu6>vb#n0)$&POTv(! z-nk3D55A9XHlf+vg7`i^xw$~x2_V=yPc}=lUbm^WZ||!jg?HAQwkGV+;fVgdt{dkow|cN8#Na-QCkP>xg`K z;koC=4`;KIEG&TMA^AMl5NctUg*XP_L^jK8UxBBLLE;#CU7XP|*1}M)zVXIls(NZx zHQEE%hD^Dh_t!7K^pa<;UBf)oW= z{oJhT`;Y2mW>w#}z20l{b913RdlvW9DF`}3?Dm|9T*xi{X;_l`1LxQ^}1cX zb0=P3S!uj;=8A&PgZS07|EH#a=*#-ERjzSVKv2WoWF7_;%g{QRcw65R*biOI=Hw>UW1XM476 z&^{}8E@Z7(15TC7PQAcYpjmLiRf4KYz*N9u}}xHPzC;ewShG3lZUVgd)GA7}X_@|!n$FPa{CP9;-Z?I&h00K5!%bdtZ*K1Qo%4O~oFit& zt6c7tq67X5Z_kKV8Q?U+34DenWKHNwS9}Y^OcEHDIfL6ga zK-Ur0iF;k}^_8-ggJav}dYZu*@g%`D8yQVTtfH!j_#knN1V{>82j()!CLz)elE5rR zBn50_G${$LaYnorg317=>F(<#+bi{884(BKV|a*oAZ-{)aGe+_khaZi9EeAwz7E+# zLU&(pWq{MI83-q&zpp*4KLivr1ye*65o?~eq#*7F2LtF*afmFdluqtM?&3ywSM56|D^*DTnTL>iNsAUdd!LL9Z zadk`sa8)1%CI}5w{bm4K1uKIFh}95lpiu=fgKQP#e=~TZSsleN3qUJPqY=;uBfvQi ziz0+NSOv2(Pz3_S8qdN#^}u{)$S;9QVOj;NfR(VQNN#D3u?sU`1uR-)?7~khE(Ayxt_fo(8xd4)UoN?4Q!&2#5okxQ2!V$nJp ztv3m*jJRE}x~zoUZY40LZEn8m#ot1xffk!ZWb3T_6O!o=#PXm8G9ALoY6GzXSaI{K z;KdJPbMsY<=@t)?511@_^9$q_2V?t=OTGL95P^n_o_wtti`Fq5qbHjYSyTmTm{o}- z--TSxSeai)K49|6&$DBz2yPP9bBIe|#1V;Y#v@H|ix3Ght>I$(i6>6|PpbgZ6L#Mk z!9|<8QEp3oKwEkkw2W8*(*jqo3s5BlQ+uN2rfR`wx8RsA632c zsbuUk85wOSdr+ca77bUh@bBg$e?QLe#!C!AZqamVDp=jnFF%i{xoi!z_S{qWQq>ENC2bnR%T7iIz0qS(@6G5*`!MsoJbAK6YO<>s3TetDEg{JpnCW2 n-Im$BBf;~Qh{)F7Uh?6;`=ndM)=_Dn00000NkvXXu0mjfcR?#@ literal 0 HcmV?d00001 diff --git a/data/emoticons/tango/doh.png b/data/emoticons/tango/doh.png new file mode 100644 index 0000000000000000000000000000000000000000..d5cd84cc84a7345895f3992f31431aaa410e1c95 GIT binary patch literal 1284 zcmV+f1^fDmP)ZlOK1xeTBwv_(MnS_@`y2NQAt~HqLOx~4v2ANOwh)3KpYT-I5EaJ zB2h;|5M!d0PNXOd8cB$?QZ%8qlos2Bd;7Z2bIx84Zh_)$i4%6RlAY}A|Nqxod;d#R zl?S=Z14Rei`<`}+likKXgx$EbicbrGx(wpek1`Pdi!+?mU?m7ysYDCi(j-w%QB%KJ z8tP+I*BYuemJU-BFgb8pS&00#pV5Fd$7Q;-Guxd@Kc|q$R}kPWVf-8n)=PuZIb1R4u6GtCN4z^;RF} zE{wopY5Ff*q3hrYzC1CEgdBqHk5PQBouF$!@_37j@ML)pTw1BFHP)ZRNPtxzBR+3* z)^c#|RWy7V-!_2cc**^hy`8goFFpr$2Gm3Gv4IEGwFZ~gG6L~w(W;GT{tqC6m?CQP zU~+gbw1G(?n#Nj}VCS<~n**Bxn@6;OsD}-*P}Rik4_Wq#N;NBDQB?C_vx{{VumMUQ zV;nRH5Q?B#R5L&h$Rq0g7w#^Bx(t$~R4kVWkR z*bK&vL29CeRhEHIKhu*>n~F*kcoU$eq#On7gG71nqZ9zgKBz|UQ7xjHMKlYVK}C-Nvl0kQL7XAzx6bOyC)P!H6@kOrMWGz~hp7+IXiR&-=Ehca-d zw|Bg#Q=Ci_gY18$$*#{yF>?_lj!3-ZK@y_$iw%MW0@Qkl6i}NZ6n_e5Dy01Q-Ed-< zmfH?{H-nQJXr2Rdwm0jTCY;a)u(P1)lKRCEn*y6ggEYbn8q8qaN?g;3obAnOo&!tm z`yR7P9@Sy>@<+7ybS4~qnQ*cdYzDbQl3I*(i8z=ioY+Mq+J>Gvol!4;BzaVamtrn! z*Hby?a3UT$B<&qB>NZJ`AHw=KQU9OPC3geHt-*;l!}txgy}kMAdHdNr1KU3S;g{dj z_a$g<-V<@-nKcKujPK}rc>2@urn(x_uqABP*UHj?W2YuHxHjtLZ;VeJzq+yKoAK() zMkM8D6Sszj&J|W95D{tKxw8VON@`H`?)K|#4<++Y)FcZnm5yHra4QH++?b188JUj{ zeeq}AxvVuQH9BLANevDR%;*x(6-Q=cW22i`w=QW5cC|s1R)`vrkQHl;8mmx5Y*t{- uwRR53UAlCsY&Ne*u-p<6xxLr_dGTK^M^mQ^hUE7E0000#g##BZ=ll4+ zd(U@8Re74rJXLhSeeCIgI9?|Q5cc5GDM}yeHI(7h-(2FnM(aVydKTRulrBkd zf#$YWX>Uu?)M9AdRz1v5!R)lv@re?5CvK_Fq0C7gdoqHL#1umYC6*Y{zWx;1T@nWK zSQU^sRaeV60*?C(O#Y*CIp=BMpGdo$OV4 zER9&6#j=Ia)>AHf*p|)0kz;AHtwY6-!N)4NKPX)$o%n?#$I_MX7Lle9vk^=^NCq)U zz(onbmOvN5&LhkdcbedfQ$<_!cdxcYR4u4Q#FG2*Hn}S|p=M3)hf#7@ zZXyCAHH#IZU>a#}OCs!9f?b&dmtLA$j18wT5@9vONQi1s?FO)mASJ*8ifS1&1PxF^ zY!pCKi@~LL4S|I8XyZ22{{x64rh-}@Oo{$|O&~Eu3s~#Y|Jn{z1JoA5`iPbh4X}|1 zja@7aA}&V{Zvsi7(HzD&96j6uR6rL|EdnLLM>KdCZiPTyM#xXS zN+ykl^I+-#gGPX{h*Uu8&`7G5X$2@_@KAdnY!TxoAwN~cTB9K38ne@TO?`ujf+<9u zn)3=a1WC~M?p-!+aH!uP9Nd@Utv6z*dWd?UMZ`40?6f81+S*s74D0wr$%#LYPzJkD z9U`4abPlxzzCE4d^N$m}zE?PVegV+}=t8YLocJzue4>OhynMIIlRO|!v5OH7zTIWF zl%!Jp86<^Bs+vI(W9i)s7Kl(A0AnF6TV;IkY;y9|*h5NgdO`KcTsc#k$0s z)Ma|X7LjF=e60#q;%Je&^ee;@`_W4miyHVR9**rt#`R3eIi60%K9s)xB-!l}`J>qI zE*kzH78SYyReS2_CgXM3(mY bgpL0L;mb?*CgEqS00000NkvXXu0mjfLA^`X literal 0 HcmV?d00001 diff --git a/data/emoticons/tango/embarrassed.png b/data/emoticons/tango/embarrassed.png new file mode 100644 index 0000000000000000000000000000000000000000..93c1c2624ce3121de6cfc5fa413d266d9f265cd4 GIT binary patch literal 1284 zcmV+f1^fDmP)9$t0-_4Gl%mwu+mmizY>PQYo$q3U(!ekVO{7MZqpb zp$l6Cr6N+gDv1kgTSREED8$s-4@1()M>Eiwe9dIu%zO8^NZO`OQ@iPf3l|RO|G)qL zJ@*_@Ri5QC&lDYSo)|qOkx~~25%%NID*<}|)M1o>ODH4mO@{bE!;K(hBa4;?q+1f4 zCDoph&h|Q*TMUh@tHJy<rmN( zr4h^XShf<_dVIfxZD|sY9Q8n&In{MO!TIU2oSz1&1Ue3C?O?zZ;UnT8oGS5=TjZcwp*L(}=7Q zB6T1MRHKAaK>PY#NpO}!5~(35b#ahXdxmsID&-kO42Xjg;q-SmICW+e#Rb#ASKt25 zsWYQ%Y79t(YGnb^9YU%-Q|jVitpZ`cbhg(8l{+rHfkQ9NEye~j7zwc&U?f1bx|$7Omq1nk3n;2SXaHJ8 z39w-mnp+GGy)^_9utytP(egEdoDgJvY;hj5sh+oAsV8tfLADprkxfJ@|NUN!X%#(2{tdSa+VK`gKU)<SkJ#7ZQ-3&97w$mJ^~^7#cs=TTcgG!M3bp#VBhKA-3El_k(c z&=QgO4s?8C1!bg0fqRpoVq{{H>{NGj>prOze`Qw(eECfile1NdrI6*)YCR`i#dDRm zRLF;imrz?I>b?ZotTH<>>E2}MLGf(ZD$3^xD_O)OP~wP0*X|>0B^n|Upw`Dkw-HYq z_@7n*Bv0sdt(K4L@VR0v@fNXUFW4fY1=JS6=GS%sw19?7#JqjP69>?tb49I|kN>xA zKek=ZtwfG_ZuArB>#rldUBdDhHkd_&yQ@jgHjI-ZlIVf#l-l9pa&F0f@zF@vXXk(U zv+zWMo}Sm^j$7RFK}YuGcVEbT9^0Nyna+-w+1euO2acVa(eR&%YI!O', ']:->', '>:-)', '>:)', '(6)'], + 'musical-note.png': ['[:-}'], + 'sick.png': [':-!'], + 'giggle.png': ['*JOKINGLY*'], + 'cute.png': ['*KISSED*'], + 'sleepy.png': ['*TIRED*'], + 'terror.png': ['*STOP*'], + 'handshake.png': ['*KISSING*'], + 'rose.png': ['@}->--', '(F)'], + 'good.png': ['(Y)', '*THUMBS UP*'], + 'beer.png': ['(B)', '*DRINK*'], + 'love.png': ['<3', '(L)', '*IN LOVE*'], + 'bomb.png': ['@='], + 'question.png': ['*HELP*'], + 'cowboy.png': ['\m/'], + 'fingers-crossed.png': ['*OK*'], + 'alien.png': ['*WASSUP*'], + 'disapointed.png': ['*SORRY*'], + 'clap.png': ['*BRAVO*'], + 'rotfl.png': ['*ROFL*'], + 'dont-know.png': ['*PARDON*'], + 'confused.png': ['*NO*'], + 'silly.png': ['*CRAZY*'], + 'doh.png': ['*DONT_KNOW*'], + 'party.png': ['*DANCE*'], + 'dance.png': ['*YAHOO*'], + 'victory.png': ['*HI*'], + 'go-away.png': ['*BYE*'], + 'smirk.png': ['*YES*'], + 'pissed-off.png': ['*WALL*'], + 'mail.png': ['*WRITE*', '(E)'], + 'tremble.png': ['*SCRATCH*'], +} \ No newline at end of file diff --git a/data/emoticons/tango/fingers-crossed.png b/data/emoticons/tango/fingers-crossed.png new file mode 100644 index 0000000000000000000000000000000000000000..6494707c5d6ea127bb15f740b473de6503de026e GIT binary patch literal 1373 zcmV-j1)}_D*)z zf93!G@3oeg8NcUpzbiW6|LSYMc;#-^BlO_YD-kOI%x8p%e_;%#kFbZ=EWQ$iTuGvH z1F}St?54G&T{=5b&x5?W>WeY1$W_-4@#q?6R%RDGW43KZ%%!ZAbxV2eo z)w9Hw!sKd{7L;pH77*z?s?{>uHecAVF+;w6b17orR~eiekR>jY{E`hDGqvahv853= z7u-CMEaFmtj}d~-g3W+VAxx3*a`57gl9no~E|u#dgMRTO$!=TMmyS7usv_cpBruX7 z8F2G3*Mc+>A}Nq0W&yDjv2}fENwS-M@h(eH?q)r$9qr`XrB<0h#DVx29xuFdm|cS- z7-?|L?0oqEy9P%ZY#fM3Set_UVxhI8z1+?E%NYng(%F%UYGZ(6reKPQGW5Y1L+>Aj zhBQO(9c1YJqlkb=Lt=wCoIpA|QV2cgVK3H!PcOMPr_lsXV$>p>M3{y3XaJo7nFSOu z%&K4!Scnm!aR|9KhfnX%5|sZTJIz?b@iCeXen#AR4c2oDrWJ6r^xcyK2@ory>eF}c zBFsWeOQ03Rssx{Yg*SE@U9uWc)|9u%v+1q&n3x%*zspp#lsW#l5Z?rD)T7$J7Gw_M z&1o2#1`>$#FpYs4SQ*n2!Zb~TZxMIJ_=h068G=I;(%bCnx(6N~yHgM?1IvKsl3-;% zKQM*G)0j?!PJ$J&_$*ivv#TMaKgcRI7p7W$1EC=*IEp4NY4+)z)az*Sk^U1s}Vg9c$~e9;&o!r}@z z2PPo(c!>dF_F|#MJZ1a#Rs*|>z}CXPcai0H(3I^3Eg@FKv|(?48Je;^$g(x) zzP$vTkAJTsG5@^K?8=)YZH^~!`~@J481WN{wbHjfMgBU8D+kf&M=Uy3C+si8`K@@# zWiWoybkCkjr5b*b^7UqMgid)n<+Fn=R{2>sEpHNe;N9C3|CPAqkBi4wK77NOXPU0d zx4O>7O>RM(Tsm;{^n}I#84W8Z$4|fT{k5B49nXE0GAquV4$i)F~00000NkvXXu0mjfZXAgR literal 0 HcmV?d00001 diff --git a/data/emoticons/tango/freaked-out.png b/data/emoticons/tango/freaked-out.png new file mode 100644 index 0000000000000000000000000000000000000000..3bb6d58e5ec87252a81521c70db0bc51c1fdac6d GIT binary patch literal 1236 zcmV;_1S|WAP)Ln7o`PlBZ3ecT1=~LvuOToCYhvZlF7`S$=rKB7fI>QB&C~vs|)9x_u+ld zx!)(M%9AYfMAZTJk*hu8d|hm#3B*Zh}jIL8YGFBsx?3fYyg@C zyNKu<6&gcM_2+E9xaa=3?!BTOaio%ddth%OaF)kQkzOu-2uq=LJ+tsLg>bAX-GUM5F<+ z+Gn`?L$3Qw4Mh||wE#Ach)dh?T_6cGTEG~Gw&O1XE1+3ab3gzT5M6m#?jAs0hMCX2 zEY)#r6o9GV`gjYMu5Bk@C_4v0q7ruRoM8LbDX=*l$H07MRjbTF$N-tym!!@!gmZ{G z3|?vD^@DHX`~JFs>FG3Q&;7#o#>=2NkowgY5;9N@PzD)G2TtcJUR1mRR;byWCo?zA zt?9{i0Wmj5U3DIG2{gco?Sir21C+rsKw^Y5IcI8|iJ5lSZ`+a{fee?F0 zM+Q2+eps)}K}W}HaW|2xduQ9^?jz4-KCke%_@<>HCR-jHI65Kt!Zt&z@?aHmOnV`#UENZcP@R_mjoW8YgT5xE;lA{kIhV z_hvS6^{X3A7xLE3tI-8x%>3}+;DX*Ky5Y!dZEbbE`ue0T+RX+{TA|X2#H?6j)L4ZT y#O4K-Tx*wrU}$KlY&LHQSg%Ax?tbfI9{e8-=p2twE#M3Q0000B&TA^B7q;0w=CekjXqLg-HOBdpz6bdQ0kS>I} zDU>c;l|olV#6>GcZBf(GMKDF`PyNA$iTP^+nK+3vb7$t>^L3Gk(J|u20~Zb)?)&h* z-#OnWs>-um=9#Jk?h{Y=vguronO&vRp*>`lM4L z9H+50Ep4q)8k!8r=7q!TI80Ai9nKV)%#5hV?!*zj{&aw^#N>VYBosNQJ-snf>%_0* zuqq&77E&$Y2srL@FnU|%bbmoB-r=~*5e}(cDpys5yiXsg^g;IRj|Yu)QZCI9XcU!t zEJ-ZSV_A)FYbliq*rrv&zWs4h>4SNnz9%}k*C(AO9=XWA{qeFtLZC6ktOQdFl0Zxp za8W8?i=gvha|k)YP6PaKG;j0X)}?VhaIi-liEvzddSe08SZfh+LBc2zkT{rH)FhEb zAQA=ZwrYS&Hw{h3`dN$wsQQTb{5J3(2lj2??D?Bu=RvcaJ@+>UKH1E# z0~t^sw1VPegL}}>WN_(zAba0{&n8VaquwWNJwDu3Ps^GlU7blpXR+4hqxaX+ z(i~#rdQj^jT0*pf4GNI#r`QK^@K%osI9s{o-F>=Rg9)_*}VB!^l{H?U8B1IWW6E#-QlH8L%1bhB&B)6JCc7 z|6CMhu<91YZgGmq%m|}n8j8J&>OANi*c@-XGSA6#9;KlX%v(FCnBS?GKan@z!M!nw z+8l1Q3r0tk$;?RX7N@GO=`jt|W4D~{FF2+XC-ef?9Ox{`6;0boI#g%1l@ zj9Z6m+L6=!1@+jyw0%F+>=H-xx>mfy+J7Qn6M2`KL^s$xqO+)-#qS8A1O0^jZG`+S zFmMJot|uJXfu1^%*NS)e(YF2Ac0E;e4#i`kFQlh8N@|S+-c_tWiIygDZkKUxRu&w* z{2HuSsrKwyZ+hN-_t{{_*C+qDGW$e8SJ&HNHU_bPtQx&*jLBXe9K5SbM3)_z?d|PueATLi zE!mX@O;{mfL_$`qF>0(r8LUP)Xd_f=_&6#BUIB~@Z=j0GuC0)_!CDv61~fg|FBFfu-?>3}#O3KL@- zFaYAf)DT0!1fV&8*teoKFt8?(udDkl%D7xoaQSHmV%I_B%11wwG!qS6}2@| zUmKyk(oj}49ZU|w@Q~Fj{TXibU)3xx#`o)m|3~nln3PY4gu-Dxdk_r+ZHvsdjxxJ4eMd^$+fbh2wtET|}zd~Sq5Bd9FLQikP0 zEGzMC3AtPvTe(8mwI@cRrZeT!anB5<<$N}y51ECW*l5=Tq~a8U|i zGoX`T#}UTyoO1a5V9KVl>ley3pTSOXB+M~wYmWvDW35HR1@TbAATcl{s3}8c2$2X# z7}XGgjG}GrQ3-R5o#HGaNH?;birN|yHImN`A!0yW6o(^UUgU6BA4(KVDTluJnZsRu zGuaprheCcF5_LjFZB4q7?X$S^$5hxL^|g^g{u=LnlwmTJ2N?kzF7>AX;o{{nz~Nlq zRRDT_xd!S30mU)PCwo2I`q~JC{TqOjw@c)*h4M;c{Ui;m1<(Z(K-t_{&E}2ObMNSU ztbVnN4W^*H(%`aXkwoItOj#8gjPm?eAJ+xc0+waPAxcX;Hg7CtQ)?NeB_7L)i-764 z>%xw$E;g8evMOdTnglxrb_@-YV3RY?F%ESN zkP7E`2<8KCs{^97? zH+lX28+f5Co7Sa4CqUCUUITiiKZDXU=k450-YHIMEqy%u!dkmBBl*<#AW=l3^j(b7 zbu!GKe@*|-nmTxSN1n$T^FR(XLnzvUb1S5LbK*km0?o4(cIi@)Jw=coKuj3LLnJg~ z+4K=s4G{5Bo5O@w;f1&TN2vhf`}Kkrvir3Ac&aG;97XXhU{i>WqIMK)a%PUs7(Pi+ z>`A=vHuUuIloqo4?kwAPE!Vd)&fZuw^p3Q(M@UplkUfv}Z=n9o=}qn`j9Y;dZi0d9 zYP-9$!;|*2H+mXBKK0$NqxU3eYI??Vqp9Vu)eWqB>7n6Ii>eb9roOJotgMuU4aeRZ z(%^D`A$xt`){)<v-Wp6%uZQJU2_VJ2% zuDR6l696MYXz==k_uG}p==p;e6KB%aB-QAcF(%p9(=(H6mzfBQnccY8{>3H6>?uXPrBD=HB}|JZ4p7XiC z^ZWjOM^u$-Y37<%2i%!xrzE^8PvWpm1l5o|$trJpaW){V!=+C`RsyKYQ9_QO3?_#; z#D^MP4Imd<Ab$vXsXP1t3(fW%P}ASp0&$$WK!%vV{EG)NP*?&IUTVnz-+N{PRC!oMtcy6bBIpq@lJNWV)vfpch3L zR40jdE)v?h7J5@Z8bayod)l+~))q+~YSVR=779pVjt`$HCSVW+I!+cO5 z6rx}px4Wy6vFtkP04{yBwi_FcV;N00JRmwcwh}%9$f(%f|gLNu;q~sum#i> zuu%Z5?FN^=dKHDNq-6mb6;NA6sG`;fErXUor}%#8I2siYoj`37wWaBADu@Qys0b|! zxNsmZ0bG1g1$;!kLb!l*Xo__Ir-uq~nvD5!h_9i*{>m+aNFVUEAAwO2Db-9WNIl|fT z^=59fiGndi9cpJ>!G<6S6qm;yjI*kziT6I9N}iqa&Y|MH#FEB!@Xv za{?4^Hexu#=!Q2{P?s^EFvU1%wH(6BxG{*DOH}XFT=UJp1~-L`CV{dRzm4mu3!@ z8WQ)=knRIpLS`WOX)n~k(G(4-wZsz}(L)DI8u+^|zqX}rWbPDmrtIuUC1Wqhrv64c zJ0$XtVZ+mC_;)SIy%FQK;Usz?H>x(1@y|}#*Pa_(`ts-B{!;i)KyUAzaW`4I{;5T| zH4iU7`)Wf+XPfC>)L`bf%j|(;&x~vIS2plRb7%JbzF_+Yxz?YINIvvZ=Z+m4s9Y5w zBGP;N?Q?;av_>t@-+F4}O=*91Te`Bc*$F!V&PB1Y(PI3!k*Vady?=BLc-G|A=!7vQ ze{^tgLT44NZ_%_ZS+c}U&6}6D6?>gQ(^g0rk(d>0j2f#@MXV=KbgeA{<)NXWy4ieH iz?Doyj literal 0 HcmV?d00001 diff --git a/data/emoticons/tango/good.png b/data/emoticons/tango/good.png new file mode 100644 index 0000000000000000000000000000000000000000..127d07313db268573d39468940611007f2caddb0 GIT binary patch literal 1011 zcmVw}^~U%U|zW23Zz5H~hPb7|5h&2=}K+1=ThbN)W0rJJ}}Qf)nOn1M6=erLXq zGegXbTRFrnrT-rSwcSGT1U&{JPcvvnQ}}4|bsqaS0;<-5`yw4wPIAaP@^sYXE^;t* zX36-bBk>k5+^C>>L;}sIYb;YlLGErNb@2YQh^lY!JVkDbfHX#VdD>zl!0S^`ZCy&X z95_&@mtWvDx}n~xKJ1+2c|f1i;{zp1>;bQ4VIAs;Qo5zPP?qn2i2joR00L?H^yE3s zECG_>^}k@>`*@sE4Nnz&)dlZ3J+u=+)si<>h>E@9W7*pIh-&YQa(*0$H-VfxU}lC8 zjt#o(dkYNyh(q(a^9GOXSm5>2Q2}`x_04Ik<3UG671*5yNCL_MIW2&lgvnolo*xf* zW+X8F+GW=IIj4`mt0^e-%3g}4PFS4}$3?ms>|O#2a{!4A0ZBkefE3710agOAk}!)C z2!8$2=W=;({7t@mjkmdj7bpfHU$q~2CQh~iU-<>_X0PpKW75?t01iEHX$kDjLS$MY zcD49MVSgoZv*2wmf_0&=oWs=j{Q#RSfo|&Px)coPGN``M7N(W}07?00ZekMYy{*@& zM4N#m{`p3%LCJWOkTH;o19l1!5$MGUgyVyr zUcKbyeDU(T=YscM>F2Pfpu4+UEr((9v%}|~Y-_MiTK64`in`rkzW^@g!QKkOxpCjj zU7)o!^6W~C2!jw&J$-lzB+YyOdR_0{o@KI6B<)0u(g;g zs@VzG8u@T?-w(g%67!)jF0|5+VO37mh}wI4B9UCqk;cSrt)2auayq*d(V9pxGYKsW zh{`0iZ-Al!3ZZR#V*>*&Zvk%qu>;W6)n%1Rr3g|f8)0ZmArt^;V?u{0SRo1`u3O4x hv%yyIjs!Pj{0)Pnn!GlKRP_J=002ovPDHLkV1m)p+Km7J literal 0 HcmV?d00001 diff --git a/data/emoticons/tango/handshake.png b/data/emoticons/tango/handshake.png new file mode 100644 index 0000000000000000000000000000000000000000..5c6d6a53198adecf978de2a448bfb6ae355686e6 GIT binary patch literal 1390 zcmV-!1(EuRP)mT}F7vc(NAA#dT zmV*NULj!{nvD{y)KmAMi)#|dD#+F7}n$pZ}G?HlmRU|+7v{o`z!WeMe>2UafvZH&P z^294*dCgy|_B>!m9bUpquO^%IWp1lP;Rvb*B?$Ib(yLi|uV0Q15k(Q08jxvVYN>J!rVeB#m9qvUg_tB(J*>&Y(yXs8 zo5$CPa~9lFm(66mQZYxdsvsUB$w~Vfs$7HAfXT3K!yeXe><1jyy*J4EO(%%T1>}+z zp`p16xZ|t~WVz(h1}<)tsPrf6HjT33;}fVlyt&~Q-u>XmN}5atgGQ(Zbbqmr?w!9P zqICBhqq`@MVu{K_(Au0<;l`=l8``zCDIJ#%Ap)QE6xrUBN5ryy=K$Mx?x)Ii(E_65 zfCUt^1l8`=2pf;$%xW-rbWFwX(IFQ$h_#0iIa6S&QT2-|*G2QFb;;f~7c>Gbl3knu zNY-ZH7Qhxj%IB)k$%sRQ306Ij0+R$g#;S+w5lK_!8qqx1Q;6nKJA%fA3S7tN-8+t$ zM5W6ezMmqy?9=?87{_PVw-M+#=oo58!JbC#2vx4J@i1zKvC%N-2-p#@qpW|wNE8Mb zGrb}qA-O3BAvrxcq~g>O1SQ`3ChCcw>Ja^CFXSmR9Fo(ap!V3t{;&&=%ass zhK<|m*gxPQB3#j`thif|Q$IH=$Yg0npdnDgcnx?5=D@%Jvgr0o=(*3!6vu?F`#gqE zpe@0o|WyB7G08e=FEAY&^-CWE#OB2*z!|P2WH=^C;$MTJ@bb0vpD~%Iz#v z6+5<5|I&6H@$Z8{{Pr7xb7Gn%XFh@F-;D9*Qsufye^sTXrv}caL3CvB$fg6cpKYrv zc3zYF{3&no5)YI(w^eN2p3#z=nEm{Mft8of9J^mZb|0J3W38C$=bY{kQSCojyY;mnT0R__ zNF2K$T^e0?-Otz0@kE|HP)~rbGrCEf^diIt zbzQC0*OgLLW2l%r8B7eo@SxS6-V8&%eVXOv=uSQV{|G)5lk#YjK&V~UHiwBV5U((b zRRIYy>1qx~z;VkUep%)F&a@V?J0dPS*`{_XTu}~E9&N;G+i7Wy_|@f-&)vY+QdDMQ zslYM|%WOP5gIq3+t*I1RS|h}2+fyEG_f#;^CJiPM`i+*>NZ#w?>r?YM)m=_vqJ(d@ z3XT&7T$BRX4Cpx6QG`)~P8ICmm$Iqs(y4acRT`jR%$!7=I zad18@t4G*Ibo=)^4Y&dIsR)NZdx;Rqrmek0_^!tcw%9JGd-oC;1>pw`npnt z<;4UptEj3m)=OZ-r>Sm??w%lTtRLg(Pd@cE3U(Yc!HX*cyuNFKD?>_kd4X&m6c6i9 zKvj*wWz}uiTLL_qv|=ur{SyfC{!176?05rP_s`;ynB{|(ETT!Qb!mOU=jo;#1H*Z~ z=m_)Lv)2$UVEr^yG;pgR|3z?HQXY$9B*U8#s0f(0@~{yw(YXLtJusu=>|B@mA*L%n_BOLYA6d8Ta@ z*<<+mIATI5K|}&K-!qv5RUZ)#wK+^+4#Cix|7aCJbf=!zLUxCC9!Zsi)>9H)1vZ6f z617RNiJLnKnne9^N+Qb$hSs1RM^akI?zppU-?d#|&p6v6;lO*cwz-tpJn^$E9d`sCP;eSP zs$cQ$qgU5F6wN+f9nCeBJ6;Unh94N{9}AxA84sV`cQJM%ZB0Urju>MS-CbQHIt6sv zk-2c;LN`)b8MQh4ph2Tn2pN%p6>E$dtB^-*T42nzb_~dzK7G1qHcv}%w#YCt Z;@?ZGT^{=1yjuVO002ovPDHLkV1hIlVF>^L literal 0 HcmV?d00001 diff --git a/data/emoticons/tango/kiss.png b/data/emoticons/tango/kiss.png new file mode 100644 index 0000000000000000000000000000000000000000..8d0d2e8b13cebb0e625674ce0d03dc2e3efb1020 GIT binary patch literal 1345 zcmV-H1-|-;P)=Ob=Dw-}?mc(6i<4c=R)kHsY!Q!j0P50cu>6J z6jlW!#7$RcaReOq0Z9F&a=bIE#r&bD%V7?vohw(8LB^wvM6#V-d!l~4LJG4J_*#a_ zA}p0y7Gqh8XUmzL&0?#U2)p(~NhI4d9&Pum;6|G?m}vMkyY@s2-XOk45VH_WIYRo0;&QrYnyouJINfsvB?6{` zQ)jQz^6clF{%sP)fH)KjQ;?_^;&sXFYPObEAZ(Hqb!A@RGGI})pq6ic9A)qBMoxVH z7u>Su+pa$L?r!2lR|=6^7AyG0G_s_%2qC6`+B~)KAiwVZ zl;Vs>`TiEv2{QK9H(b6t&4y35p%z4E5iMf{}U;It2 z6Q48{q-=qQYi-p&%4^Xxl#4y#G(c0>_V1>DK;%ob&M0Q7`uk_0NY` zu%?Ey`_k0M>#1D3ma>`}oLCH-%W<{0mrLin+4$K?Vo3{{#R)x#_J5TVrMm1Ef;Q$iQIa z5*?)>A5~xTw94_$tYaE*0?WWov2q{89uG2BW%x4yf4VTT#38gP#LAb0V6S7`3S6@a zIo_GoJgsxvcS$$RydnEZB-^EBThzA~Dc<-FL{I{V8dL=_g5rZhF!m^pX+S%^%rG=~ zDEg+pJy-9p?RqTd9Ee5&uSs)D8HwfM=lihU2_58FbY)Xk^tG7uAKDn4lr1F{aTj zjSE-qO;fv21EkhaS`&lCD1};WmGXC5CSjlyhWYc}y)GyOI?%A`w|aRe_ndpa``vTJ z7{ik+^+eeL`>|-7SebpaA~a)jR2-TBjLmf%E@SBT-=d3i#@&oUHfzyBhs4Fpd8%S{ zQXlhC5mAJzm%;QDq>|c3~o$eszn zcA=@n(L2cHGU!OTaPm}uXkF)`L&u|h>jV}$BrYCrrzDOA^3E8ALZ06S9TM%=xHgzY zSs|1aVqhpsqP>r6LkN4(Vs~>(???7ml z`k2qjj{_QGG#E`R>O;g3jcfx7pqGe6w*#8GnleNl4v7J`kVNWZK7{5X2iP2?BBI=- zDSGzzVGPK!@WTxVBC@iXAP$H?YIu zM~7m=a_8pgJGdXC79f0pl?%DPMXNvZ1nNu3-M+mga)8{OJNRQ>#1x9KRR_lAI_asy z1OseqEMd6yRm!)RgEInUZ&siz52UA-xr!V(Tqc#&$_^1ZZZlshY#K0Y$^iGhikjmA zM3q4*sd2bmEMVw2Bcn@J>C=?OTz0?aBV8gJP_D083qmjW*%migrF$_Wqe~e2SMb#q z`ESv+XpN3BF&Xz%J}(XLU*(sd4AD?Ik?<}yl1k6db7w9|^G7~xUn5LR819aa`ESux z?BJYnO_meV)19$Y9A8C*!{3)OUYTZSdYt)%1@eUgxqO}nnG8e8aR%ic&EIV!7%RtC z4MJ+c2)Dm#otPzvn|~N%)A?h?^ZoJ9jb8z2!yrZj@bxA) zm}?4IP849q^-N99m;N>Kz(4%;KhfTdR%xTmoKh-%y}y6XtRda>$!ut7umk1gL7mgv z6(*5tz5No(Gl&1_p|*&ZYtzm8_;6m@O{+AINv))F}prssI20 M07*qoM6N<$g4aA$@c;k- literal 0 HcmV?d00001 diff --git a/data/emoticons/tango/love.png b/data/emoticons/tango/love.png new file mode 100644 index 0000000000000000000000000000000000000000..5171deed6713928ef6b1837673212c0191262bed GIT binary patch literal 1069 zcmV+|1k(G7P)Lj6l4?k;NmFezR%+&+nb~XkAQLmqaT>%dII!XTYkh0| zd$ZXjB3R2%Yg)Y+V35euO;o%AA_5T=mE3Jn57D!xQXgoMkOFdwXe!72Zl}nJyr!4v zX-lb(aw3lafFk-)Gk1523={=?Z5Rg~zyIaO+S^OZfo;8iJw)xkb?f@K@7w1yOcTgYE`oF_ zg`q=-5;~K4%Czktws&>;yk2jChI2WbID9yfh{c|HL1ZWoSn}91&F)P*b`%!>+h;hA zgHUU$4Pd0Pwbk-E&I*k(O>Ek^v&3TAx_4D*56>FIas+S*`R z7B~`FefQ<%$ap-sHZeg294r9m7cYtYAtLXeK6WfY_4Odf0kYY9f3^+P(16ne14(H8 z-d>S;R{#L))%rjz68UCgcsOZoUZ{4zBhQpW`9!|w0kt5G*{psD373VF={Mv6* zQ&+B@Kc6*QT7Z%g_u@Vu%&l8-_0px>uTxV$EiiYv$yVG&0Pq!2xuev#8yXrOZE9=t z@`VeK+qeHos;Gc!ZpP)4C)3v_CucLvPrfMPx@oQe0QlJNcY?`ePoT20qhClS&hiWay+Qm4ry#!yM0p3IIezOdkfrt&I3;+PL z22lo}#pM<$qIg|ZRjjYCPh0`Z?W)_h&GO`O4rj?W4Q&f68zP1n!o*4oC`$%sG*Q~G n)Z*yqXzrd9{NJ(WuZq6_OQXw4$XpyE00000NkvXXu0mjf)I#sZ literal 0 HcmV?d00001 diff --git a/data/emoticons/tango/mail.png b/data/emoticons/tango/mail.png new file mode 100644 index 0000000000000000000000000000000000000000..027bdb0900cf2cba554fd8fcc74438f94a5ddbda GIT binary patch literal 881 zcmV-%1CIQOP)K zl}~RQMHt3^GZQENx0XoKl3Zd6-+-*MR3N0JX-Zll5m4?Ghujh3Lm(mX1vphgjhZHP z1(gYP2+%|-ibL8H2TTz{!in++$KACZ@9s(e? zilG;WPnGS?&NfTgMUzUt&^I?X=R=D`v$M0I)>`Dg%CWb~Y6{(17MlnDZ# z-Mw9M%Q=iOrc^4ar&YCPV2mM?vB}wy)O1$yDlsuRiIucEWb5c6 zAq0s;oC_BwsMb6dZ{0*mg_X3>TBEhbN?J%MS<2p|Uav7RF-{_$K#0z!>`DNjlp-@W zMmjyh{Eh3B%ZCgM3^F({NV!~Q{>D7%m(q;dHcF|#&vwM`l&Bkw*5sD&F#4(uz~+wy zwE3%=W9dCRK^TT?7B+D`kC~bGsMe~it=&Ti!PL|gu~?jMR#w>G+sC$TRF48Wjk7}{ zV+@{GC7)j*8jW&!`Z9jdAkaR}c?ajbgCF`d{047LPZN(P$ltw-=X!KA=8g)sOC|2# z{{d%gjB_u)LZwnB)FF|c_N`&)Yoh6@N!FkQ$xc#@C5<;-CQQ*?0X;LW* z*R6mQDEZG<<+_gv} z5z|IQ1@r+CjA=G~2>1q$q%d`DOwEMK>(O<0YisN2*mosp;@tRnPwJr2XZrkJ6Utr* z5u>zH#^^xGFd~FcLp6dx9`*Lt8ihjP_+Xq&@NeM1|71P^Q5J>D9ZOYN00000NkvXX Hu0mjfr%IqN literal 0 HcmV?d00001 diff --git a/data/emoticons/tango/musical-note.png b/data/emoticons/tango/musical-note.png new file mode 100644 index 0000000000000000000000000000000000000000..5990ae544fa3e436d53fc1e2ccff3cd41d622540 GIT binary patch literal 941 zcmV;e15*5nP)V0eb^V7%g3DD{G4A2G^fO$lgMPvoldEjUm*78Og`!tTiG>z&>9P!Pi zpYE-KPPZ2VeQQmbCb4TYqIwd?QJO@=ah)^{@v6Z%ugLO(tZ+Oy+nl)P?m1c90A zy(hpkCt8%Q!j+EFRkzR1QIGsY}i%)Odf2jW#Kx8uZ&oh`}>U4XLi^$u+ zNmYGRM0Wnlf9PG*>GobR)_k%!*NSJF4Vxq(qjAyN8;o()I|@X%}%=RAO{KKp#z8wu=@ z7tUP#LEbyD*pB8~Gel9HEHBx;HPnlnS4SwPCjhECYmLGADOrtk1RY@L81?mZ_p9x! zc;cDXzcSxV8TE+S;e)!i5Wd{|sKg^!?U{ON;GvzIB8ss*zA3<5-?uc|6{2ifWN zUKEitik?Ji0%L>QstvEa9}X{HLr76cL8Ck4&JZ1<3`L~>C&2gB+WvRv&mRQb)!N#c z*=w#G3rCw?yiW`^QAj{TRO=XH0r0*;qyWhUMxJV<#*B=}V5!~ipF4L>0VV+Zo}(u%zn`~9o9@5}CY#Bz~*wJ!)0 P00000NkvXXu0mjf3?Ij0 literal 0 HcmV?d00001 diff --git a/data/emoticons/tango/party.png b/data/emoticons/tango/party.png new file mode 100644 index 0000000000000000000000000000000000000000..bcc7a4ffee8ba070364f79f9a83e284b82f0fc14 GIT binary patch literal 1488 zcmV;>1uy!EP)b#*bzQ0`m-+f)z{er5pf9Q#Ts`CFBvVZ7_08p_kD{mP|D_nM6?}Dmc29m2I_1rr@ ztMfldRF%he9LhcZjeX6&uN3knuI2K2Emv@|A1>FgE@T=C%X#y?UB8-$2TKD08sI!G zXHmw&7a8R@>fH(u05Ha6jIo-%l0#U6#JW0U>(*X7wyDW}^Tju44gOJE9(m{ifFP+-v5f1~SzcJ?!{k+JWrxMt3>PM+_`<;! zaay7{RB@=`#ACPvcNiYp8{xr+2Ta61S2`v~I44# zv3tKmAk>ITD?V|2HsaHc>o?;#W&Ex-;lQB?iQc0nm%}#&xUTn)!nLArM?!QDcC(?a zi5H$d#qHa(+`Fq0WCKVHW3^zc7Q|`>69W^Y?gntY3^KAOB0>9T@vsc60|0Z&*}T)# z*+PD~$S+SmPkT?AJ&$=HAru=V0;U-?al|x(L_r!sY*d4Il0%0_!ea9RUlr?yCIhL= zm5lY;Z(n2T!X>`=@FMq*2uK{oLc{`TKna7{fcgax2Q+|U5V5G&vV;xpMF+&`Q}#0T{mKflDtqc3xAVh*T-U*X)uG$Z?d!T5U_M0CYL z!K=?Bw{2-exOZKNp8EWA6C-0#6>egVSfGz%PJiIsN8)Jo)wQ z{Qj*Zs0&(0aq+z(Z0a%u*!2-WR9ALTIVO2M_?->a>S^4J;HHB3r4UzZVG=w0nJwD% z^=!n~0JC#BdNv1{`D>E)N)9dLFcF7_Z5H9Soyf@_6&g=yY;6zLbiIa`sZ+ZoIPW{e z@9MzIEwN=w2kI?jj74vk2U?+13OJV*aV8hA?+g*x6oIxI{jLKvz?fF?;-dW9eb&}PEDz<=S2}6&5l2C6HvgsACj{|TyOJ;tDX>KtM8`IbWHlP0S zi-hmK`{PO8pvvU?y!-et_U(!UVvw2laXGslpp5BsvSNK|cf_r{OX6!bZ|@$ar>g7g zxGE2rwT1p8?Vx3>&?nI8mnx!+tpkKFGFq~dGo1%ET~5}kbE(Cj|9$h(U#B)r7?G@7 zjx0@1o^fso5D^(18fpgOQT5{Ax^wn{o@jM@XVkf?#c~q>OI|QNmk(W-E`%qao=Ti4 z`zEVKmyI#m^J8Pny2f;UiB{F$-yevywMBi$Z!&1q7i=RE^u;$ujjvEc{IWnk;QM)? qGCn@O?r**&;AWERR~Yoa4Ez^E3AQNb$!XF60000P)fHx#M5M0Jg`e?PO$|KrBQGgtl3fO0BBQGJ-`G*(HnYBP9`wC<_Ex zMp@(!h@vi_t`sR#RZ)YREUKYcl?ZK$)f((EV@QCxGoCwl?yqyYFeZR8%7$-sj;`+e z9KHI!_Y-R^PqWlhRR^3WeLN?k6Q}^kwARN{V-5mnr7ovwx&YK1sGhVo-AO}svglKh z{e4QEFHB5Kjg`x8VSHQ-l}Z4#*VpkH4RdpOIq>TBmB^SAuUq@wPXc@(qGpwP$H`_- z9j;XJBeSz&;uxFBU~)Oo3KaxMoS+6sk?pNj0yx$ZxH z_tsne((Pgf2Vr0U1_z-(54kMjIM^hCpa;GWoerw$VU^;`Pd@Q`L2&dzyY6?Ohe6z_idS8jBC$mU>ph&4ap-Os-Ot+67Y6lsz$Ix{1MiHWIu zo%b*RI5t);yXMXvuoi1ASc6zYZEcM+fBp+33AWec>>vL`?fP{D5H>BgfN8ZDE0-#82W0C|(Q*4}2bY0e4E%1FL?9pg8DdzLoD1tbJB!M)=gb{`D zaiz6Bz73EXb8x6s!YnO8HVbjQDG-LdGBpW~gKV@hqN&VIW8(xH1Q10?6hWL|dOe25 z$JrXlhXD86Dvm(FhFRzah}OJWeim{$Y-sdDg*b+87lHr@Lx`fy?s}wtv`DGT z?e+DSclGs=_Cjz1{xh*RFwVaOA(s)DRXHzIrUc72(Lr8q(=NuZJEP;pW$02S9Bbz=5h)udm!% zS=qn0T$W^Mi5LELmAU0r;%pYlIQRNqA=W^eqM~>+GQu8ua*A8muUoHPUvZ$irF(x4 zPFkBr#++EJR=a7bgc=@(P6syHIG%_0S~y;djOXEaEwtA{ZEQfhjmo*0kr5WF)ox_W zi3j8Rp@s9hwcjOSc>3b}yl)R3!Z~mN{4R1&$hKP0YC*fbdG~#sav3`}$Hn=1KMBLr zkH+?6<9aHSc|Y$sZy&By+_9-CF{`WCW)tIio3APqkX^e_lat(BS+R@NYVWSKAAdGI zefFDgzimDdFgN#`tdsY5zg({$`Ni$qAMJVOXQfj4xy-Id7EZI#FpcHqW02eWZJ0nqE~yKy^{ z`S)!%e`VpBi3^cZcdfFXQtIyITFtW$i0-&DXJ%%c{=It#OlXD`cEAWZC6X~>l(NcL zh!E2iXgkKVf#A}mOWStyj)2FNh{)F2{=^^u4=Si_B2s&!2mk;807*qoM6N<$g2e)l Ao&W#< literal 0 HcmV?d00001 diff --git a/data/emoticons/tango/question.png b/data/emoticons/tango/question.png new file mode 100644 index 0000000000000000000000000000000000000000..fc657b46ad623ef1db0a7d71fe9408a75bc150bf GIT binary patch literal 1491 zcmV;^1uXiBP)*33(vG`wZ{P0w?{^;mXwjB}G1-%x z0H0^_L%BPb!mTe5%O$rlqW15v5Ra>o4@2 zJ(SxgXYjE_T-E`okGF9-h0+=7qk~t~yJZENpKhNx`O+f`upV7~qkQcrf9A-GpJ8Fh z@cvkdXMWJGukHA)Qd@6`-Zq_;z5=OXtCt7zj0_BFf!4@Dy?8T#@vNTi9~no*5DNHa zu;6(vHIV>Ls8Y&nW2RUWp-6!uC5q81-1u69dSgL|jGDe*Y~fUdUP)~Id%+_sNWwi_6E=I>gL3W_jskf zA0!N>npfH{^7HmfAQ6yCkRYmlJjtLBwuB_e@7N{I8~{Mb>W#)CDc0xLB_YweYZJdpoabjJ(tKrG zAA25K0#XG!iBRT=$72}ruyz783$}o05z#W%%Rw~G^#?fz@R!m?|LfbE!Is(c(8u`F zfxn{mABgw>A)77nw{ugR?MXA5F7m_g#zAwaW`R6VKy;m_$c^7mF^}yosjr}7mjt2PnhJ|dtD+)FP6fxvbI|Vk2@l`_l%Cwc-2>3$f?++dA zU+~i_z^!X@?4-r9i60D1A3Dq2;InXR(Y9TdjaXB>)Q17Hp z?Fqg1^q$8)9WIU?1%jvzBgO@as0I*mKn+F|RS(hPOrvw41)RX`=;c4;Md_Re2=&pC zbp{4W4#oXT@0L>bO~3=|f)o((gU;N0Ea0KGJOj_;4{d;CQW+T-4E51*{oMbW)2r%f zfmS(|$T=pC<6j1L95jR4%(Uh~^p%?3ppzizANxo$mUmZ@c8InV46Ny4<(*F3_&ZZZSoPHt*(bW3LXY_ufFcFqFLdi+69^dnj4^cO#N^ zbKz^fy(f#e1c-<uMag0pObFzcMrtxNvzg)cf+K zhLbsK(rR?f7?XaxvvW*m9Xem4nTW+=zVMPI5nHqi4H~gR(1`f0SYy;!g%V1ljwEP)MHI*XXXd-_C0RmPHbTJ$YJ#a+O`ys z3^6nQPZKK*7$SP(KLdP9^z0B(-(BJ_F>v@K(eAs}@+XO2X{14MCHjo$h$ecOnfm~w zP1pURXUi7v{OQw`$oKmJ1g7hrp&4QG2nB@0phaiRvp;I*4Kdp{mKHur+onU$YF%DGL44mBA<07QUk{_W5jh$4U)uq+Jk*%Q{7 zTXr*-{;6R!R0qJ!jNE$ZQrwB%WqoIlusJ z*XQTkj8X|)E-%hLm4big4kYjg8q_)#K+He^<AD}S-L}nX z?d%kGb2I8QGnl$^B^n(W@uPZu$BWD({~7=QpAfCGqdn7PShG{&L~#n&sBbY%bd-jo6`E((c)V*AFD0GJySx zc|8GU*JEpNxi|sC_tKn*_L`>s8Z)b~Ufy;1K;_J`Pq1J|2FhQ(J5YW+O;v{(aP1a= z86u5|_WRfG@7wrl2H+-UEcu=+`@L9ugWePp{oEJ%;po%0JhnTNCmk1>-UPaxHvawe{kWa&a>;*ndy$+-rD%N zb3rViySv*CfRsySQX47(O$mTKLBb^x5!g1s6n*n$$Mej>*UU8mTE#|KaqF`3Pptz3k9#Un45&25&!@I07*qoM6N<$f}8{P<^TWy literal 0 HcmV?d00001 diff --git a/data/emoticons/tango/rotfl.png b/data/emoticons/tango/rotfl.png new file mode 100644 index 0000000000000000000000000000000000000000..9f985a2e65780c4c0c264c3a3fa87a1b337dd986 GIT binary patch literal 1318 zcmV+>1=;$EP)%= zFfl4YjK&Q<7N)u|(GXLWuuwyy3zsf5uF=Hc0}7GYf+V(qL=amo*tDH?N~?^ekLh&g z`|fek2jBoF2Y}DPP?j&#LAD}n z#GzR{ngG<{JRa>RouOWia7g`I3CIGXbgQ%wU-=2m+k*hwek{x2r4&^)QK_pbWJQHV zN#)$G)G&-CjrR4=Fw#Gu8FohwYR~Nj-j_jMY>8#9p8yD$E$G)@z}^JmbvIVj+0xnnqwVPwCuf)A5Z>+Wfx=F#T@VW zo0gXv`SH|Ma-PGiKZfkw6&AOkb!wk9+!PUSOL#iSB|?Q|*n+ouC4NH_{i6}$u}Tsn z5U-A*1Q;OQA#X&qIFY5G%pp6NxFhEP-sl)^k%MS1Z*4IHbvRFIcoUH@;aZ38&5u%i zhXPYTpdo~1yO0{5^Ocu@M>}IlV>!iCJR4xVP*`|p9oMBW5+NLo5-uttQdEQ+2wW2g z3Z>h^h!usgq`{*-F9VcL?dzYhA9ylc`tVr-l{UdEQOcJu$8oOxcD?z&&*a1e7gM9G z-&24cycg~Jc1D!WybMCU9ATt?fW(lxp@(RA*QIxMoOC90OEhW>-IG@++ZH5TxfT)$ zWu$)~)XR~4M2FPZ47;W6Xxg?KD1D@gb)UO*O$_nJ$PoWdPNJ%)Dl?f3W8>p=UQV#& z8H=Wm>u{`kr0r;0Gwi!C?^Pq~ zC5`1#ENcjCHKkGk+fXa)-Jc}W)awQG+}FW;k8Cu_*w5_UpDYKXgqlFiDlpX`Da6D9 z7o`HW2$}~wi!e*nse><%de-wdEsg7rgWcjtjN`h!I}tL4wH6T1VnAFJhwbwK*P?uK^ZS3u+Ou^nLmZXU~tpVl-#ZU*+(T z9}oeN#fTNc$^_Ed97ou4OZLt?aOtA1!PsB|BOz7;j0C7wn3(cN*Tlf)L5ien;!IA> zp;`hBKr1K#HmpEhgTbY189)L$HQk8%zXMUklu_%0Dbl^Q4kUu;G}gLwzqlUN3Ti#D zKB6T=E7-6A>5bfakpFdXJF_wtMb!seK*VL=p4A`;G@QX0hkbh*fHG(vRSzfvKBASo z*j!y`o}`Zz)f>>Ov#7ATi}jvZ3=yd1D@O`gWOdEVG*Id-Uua>eJ& z**xeRXaOg>0UaJGq6{qqB(BiU1KHjkC$mmM{~|V+M1$)KhupOow;m_f0ogIN0|Wk4-hTGpQ2XJNXMUT$ zFQB7iYt&76tKVtKKJ(gRQ%9=SW$I09OO;vEAWIvLy)mKTKO+@?EPLaNKO1|$&DQ;D zL~=nPdGq4M)1?&wA|f4|HdO=Zl!oc|pS-qheae5TK2_?hae@rM%`h@PHW&S4IG?z9 z^m68O!J3>JoiWDbE({IL=n~NtTV`8Zo13hyP1%xNWzdurVn!rl#Tui=DwGjh5SVkV todb&J&YfGC6bUq=mK&EyXrA)@l?)V`3^BD1JpmjEOFYx?m+FCS8c6mKQ_k15Q7OS#RLP!xTqqAQZ0(sLTRy$oqo>Dn|bfuLa`P>8#-Cs)U)2=4J|2C_>cOc=?&VIG?wA_Jl-YZBwn%u((A##mO|# z#pBO3*owILg$$S#U`kObLCkW*S%wlt$fMyT=or{BuxTO@FoWaDH(&N7dT5$0{9Fdv zdbUwfQ%$N`3f>?h2E=908|T^l>{smBcXB!#Q^JRzp5>#@x&Rl&fH?StaY(HbDr%~; z^=w;ck+4Z>Yl?%yWx%3pK`jU0Y9bMLx%kfr;DgQ4ak86^?=B(&A~Oysg#I8>TT_g% zX;$`HAGkDAUTJJFh>;Mh0Y(B;eO8sl00-e&?0FZzt zEv-Vm-+&^-6j1Ad$+6|pGB8m@N3qtWW%F88ebi>adWhx`^|4_VN*kDM$m=th^Q?eH zQT4!P5pmi1)N+tG8jfL%!z(XT0tL`XR5L&h@DTNHl)DB{moCx+kC05D!8n*GV9*dS z7Lfu-6b)tCa4i6N3|Z7pfz4ptVn`26Yc0qi;55U751SPwCiDjobh1`q(Sn0IZ-<2YP)Eot;$Iu^CL(ckvK>ZNQBw{Ua&xjS|7-R=7_`}z!{1x-Dn)q zP(60YiH@ve8gL@3!H$EDqIMK!j@UHVQ8XMynC@ibmf)H?Fbs2W}kOi;nA|oU=a>kGw8h zTZ&1okd1e_oHi46{dDw)U2wM`3uJm4QlvzpYL7iANu%0RomzN<-Zz{bdXJqba$W1 zF9{G4Y23JR1yGvQuypU;m$$4{_th{)`>-r~dm0oln@S!yCm&Hw-a07*qoM6N<$f)h7W*#H0l literal 0 HcmV?d00001 diff --git a/data/emoticons/tango/shout.png b/data/emoticons/tango/shout.png new file mode 100644 index 0000000000000000000000000000000000000000..c7aa7a9d703477caabc0bd2953a007b93c64da7c GIT binary patch literal 1288 zcmV+j1^4=iP)C(NiLX@H}BF~7b>iiLal8bPHNO9IPtST^I?Y6^uMwqcWSv@b@oX&~#-|5OJn{nBn? z;a@r07b|)b_!>pbMljVNal}Lb2c-ly54sFCgODK819UPW`gc;QC zo~Tb6Yb_!UNQnMVerIaNf~iJLg6UbI|KrOb5s)ydL3~+2yL+M%W{|@Yr~u^JI7EGO z6Uinix+z2qh=UT~^0hQ4zxWv?3Z{lnKO5olwbZH`0}`NA%s_IRP~Y5?YvWL*17V-E zG)KJRUBIGhK`kPdL`|5P^fIibW@au!q9%d}h^(eq!7rtdmgWe;zWcHd`@o@#x&~vt z6h?fkdKmFgEzz^T0i+7-GDx1D1KUAMs1`uI@*WTCm!Ph};Lue85RaXjXhhvVfDmGe zsCB{QdH3x`FmXf|u-4(&J3Fv8kJ>C)7tsQuC9I!=L_7Bz@=*s5a#qBmsJdWtH}Z%sfG(|mIRc^W z=-7B3WwZhiz0D9a;}c9yX)wAM)#Y-a&9J+}s{rio@KJve>>_G2IFSyRoK$AUC!)6* zs&sHpeRb)T3&Xj9X(tfe0yYD>z=6(%3c!KR3_=-ToEjX{id-1ZsY~zL@%_lKi=Wb4 zT5?b5@cC?2_;sq{U0}1kx+_KBky+|$i`3N?dGAP?&Rw&pzf4tZFQM>3bm)9mOYVus z$MzG)^;|x1JQfXpDBV2~l3T@hZ(_X})GPl<;%vb<^#sBlFgc}mc-T!Z+b`cAZ9Dn> zr5g)R1$1=m4>{3n?Xhi>ue`M*{dv{aWW8zGR%JFf$l3?T&ZX49GhTA1Cg;BTt8w6) z$+~MsWZuig?%lk3v9K;cM5JTSo@yWwS3mK=i+2w`A9r7>j~8~<1iU1`JwG@-wG{eu zY&m-K%-_k2Icw(C=%O)Z{`%v|^1>V-<>s y%?T_y)-D10D_5>myv^$Zp0q?n?(g+~2L1;MlSb#GzD}h80000VW&i*UjSOma_q2H7;w#X9a+|bmDUnr6bzSSx#y&lZ4C^QKn6rB*H0b z8|tO8p@Nz^L-nG`$MhW-9<(eHoNV~3YiIP|Z zV|fnC0(@IZp^(GY%@#t1t#@YUh0&3db*$Mwj;W^p9KDP7+Z4H(8+i--#nMu~vLz*M598kqtj z6(A8*Lj>{wUEdOw2&dRAP8lG#oDI}A)RU-}qBn?$0dY|rj(vNRqsKc@qF}1{@|)i| zdc1SWjRA2e6~`d4M5t}3&n;&|xdUOfG&WTD#eTq|YC$a`mgGmi2mfYP#G32b$r-Ln%(2>8DgkgFZlm5lY1ozB_Z9eTTX+On}XR&0?Gor0+~>l{MMt zBEy5$xK*GTL^Gfnc5M~z4Q1K3=Qfuv5Af@i0k-YF!QFcqc5V%0gRx0~W)U+Rh6gP^ z7t143I<%)Z@4WO@%+LP@b{r&NZp>$AYlNS#I2`=^J_zi2H^S?y6m)E=(K%2LC%hEx z`93d7M;Rd6&DpHe+ed1kDYW2KDP}JL0psHVU!PVkcZS%#-2%cF$8%h}Zh2>;$DFu_ zYMxMZC8Scy-QK=vH)qQuI;nwrY?5=yoMW1BLJPr;aqvi(syR819T;NG$~0?Mra5-t zK2>w_d~(Eq9mTj+xMmr0E}2u0P1DDB*)+|5An%i?Z&L-%>$hu>@Wh*1wDT_a=+ng&4OM zC(;b50kz4bH#}iKd#_{p$3OgX{lOCf&CTn=ZZtb@`;ycvZ@)17>8!mRV3I z(-)2%8r0zL-jX+v8anpZqV^N1nrlWR?dM`6U0oLnGXg|Jnpdr=1ghg2RPTDR|IO#) z-pjS|!ip-#PXLSrp*sWP;XivOqFsk?CNAWxNvqLOV@$fUqhnO3iO#q(mn~c7#^%qD z+k%~I(6|*MMkHj#8l%Q46cL*f7*XNP)%5k@@oesW^5p)1`JbEfKccGq zo@IVlbs)U!?Qsd>y^JFqB;>GI_5*0h6)YD}rt8<3>M;q@wA|Xfxr3%sj(}kKA@*@zbfmBf~ z;ba*dJ6e}2XE`oG2O!?dIQ_#z3=T=2&Ld(#LX?2HZ&O})GSlE6FHJGC5aBT> z1|*=!S7C6s&_6sB?`6ExfpAdv4A*S_4d7ArIJKlE#VY_i(I@s!)tGR z!iHqTl9A&;!4>n!p5Yq8!8@`)&q2sx`UZ@*^B8f&WLT4u`jGi{#E$MV8}2*27wb-Zn3BenC8gD7QlRjTvF9o{Un0uC2NC{!tcHjs zvC9PHl!Fwj5#n8k;!j5nxx&)iQ?6Mjam%De$h;@h97hG~0=xu#{C*6;)6bRTq? z_Zg0qM%aL*x!YPD4lEaF&p%Z9WgO)q2p2G-?R%H&0ewFd8npJGiE6F4+*P|7iZqr3b7 zdVMkxWx4}Uzs6(~%-jfXF6`Uc_n7>5<1?&UoVB@2S(2V{&dPz9)E??O`w8MOYW%iWpZ!xFp8M3B`JXO;WUoad}KD z+|K=#{m8kgSW}K|j_+TDUGt27rA2yLr#^@tY&^@zwnK=|@IJ;D3BJg1ae_wa?Pr!V z+Vc>HdY^&G4fPDCe;Sb`8#flOUOk^}2@nw(J#e54Xf@Tf{`TNE zf4RSzKGNUJ_IC$%5Ma@j=5DT4zP!F(zxvjH2G7UdEUD2IW6aW(>FE{SB)a9w92pr2 z8@;_vpZOgIZF-?1U*j`&z$E%bg3NG@Hv)Ulhl1pHcwh}?PC-}vDV>y3nm TKG5EM00000NkvXXu0mjfS+axy literal 0 HcmV?d00001 diff --git a/data/emoticons/tango/silly.png b/data/emoticons/tango/silly.png new file mode 100644 index 0000000000000000000000000000000000000000..b944b7e9f91a3bd42753852cc9ef9ee87d78b07c GIT binary patch literal 1266 zcmVC9mNAT9kfwiHTIEyP3%x~mIAOLT|0X5oUB(MY;z6pbN>u8c9P zj3#ajHY~)nbp?rW(TEXB1*zJ!^q(~8OsDP4yqWjjJuaq&!cgLdo4nlna&y1$p6`73 z98p!C#-&#R4g#plI008s#^RFRZa2>3LXMusSteU~zgzJ&q;M>8<}q@R68Yz<@+zgWA_0C$(1sKZ{iX ziBeXzh$G;*J7D&2mC=#B`res@%Q;S~-3nKcgIvG>skT8*oJ@pGby6xW6KXXoJF(Pb zc^XS2fvu%j%wwB(2`5e_NVN^-0tOx%!TNx7nMCYYPMl1Xf*C@MBc=vSEvG)dj)=o& zr(Z?!!4^Q*z-AG$M4bls`h3pjyq>Lc-H+h7I1*z>`}*S{OIT|WaY3ReF%SpDMNK_o zYC)19)gUocBZQJc`}*S&V~FG8Y{K4iQGP#1X=-mH)h4C&>lmjF6&JA?tu!_v`S9hB|>7F7#s5wVD9`5&KCAAG~9 z55EU2A|SFMu|nuCARX=12!|^oz@?XlW@Cc|jD%PXFcP5ZqoId5d9Vi5FQaJz)govB z>Z1hM(1(U*gG+A(fdm}X`WDpt1BfD~ME1ra6YpLE3Z|g66<_ zh!zp`v0)zSyV!h?kF=?w1bC==OrE_)(`tm>S;Jpve?r3*3>h@cAi9d^TA73b;34Wi z40oSEUB*ezgGr#a0GcN|o}sm-hL)NdveyuUB$2lb{%XE<3u1mU&gA4 zAm9p13)Z-GpzDaP6O=5jF+>~(zu==`8f4cSu(V(axKf#9WlX20 z3(kSp6G7oOu&ac=W%Ty#O_MOXZ>U0ox}GF2ecKA^;Y9bMQ$G|$8LJ?OPcocyre~O) z>xwiUl2Yy$`foNO5--;vi2xhE#{wa0eV~ZiERpyNFgvR(PS3;{`H>uxtRw;9By!EPj)6|gH9w+`2IBBLXD^*FY*d_Ul#Sy1QSAy7Ao3xAx4w_~yQ) z&#PKfO{QZ{m1%62tqsTCUC{8KY2TZhz5CUlErZ|9HvDcx(m_74JTY;(xGjN*NOw<9 zEl{7-u>PIr?i_h0={?_+EFP?Lf)v1V7@412jozGEi%*=tow}U2Cap$Sj4|o)v9T51 z0=jL>?Ck7x6T5aLZPC^kG--vH5s6r_#;CChCB)_hR$XgXfx^|RS1Wq+wgitFA|jh> c{htT_15m_XcfC{Z`~Uy|07*qoM6N<$f+UMgPyhe` literal 0 HcmV?d00001 diff --git a/data/emoticons/tango/sleepy.png b/data/emoticons/tango/sleepy.png new file mode 100644 index 0000000000000000000000000000000000000000..25449039c580aba51339f2279d3b1ff316f3a2ab GIT binary patch literal 1400 zcmV-;1&8{HP)PvEHzFtxwO&F=Vl-2V!2%Of9jhE|`ost$@MNM+RdQ(@1cSMPs8E~{X>IQeC4LRgDSy9BHN zP?w_w^rG}_n*896NAGK`Ti3b(5y1%brzd&*^*%2MHGWBgvz^i+F%D4I*dWb~mDDaW z)GRLl%#6VJsMUc~;lq<{)BEx}=6L~$ZMQbDbMtcce)4na>mNqH>wS4g`&^5j5t9q( zG>ON?U8i#iVhd(0eLBC%c4u_aLo2J!t8N*rV!NEODZ#yHi8GapP9m?}=5O0fRM z21)Z2(YMHP>YB~M9XJ(}fD5KZ-OrRwAsOh5g4Omv(9w85@jZB*bcfkpNX6wME3_!5WYPXaHJ3wK%i) zQ37n}L+v7iOZzPB-wGsP1vQJ&FpJs}LJ74VsdN@J$I$Q?qFFS|GB`AZ+9?Lpf1uU_ zEh6e;!zrj)%l)?YSHJV#fqpccz>wwLkB;%#S0{MC>o?FG zPyjqc{R`p#AyAj2WJbUwP+I`agPvu>I)}acMp(Zt4w^;7Gi8 z!R9bd1TrIKtT{CZ=w*ELW;4Iqg#HMk4hpPlOVGWq8WA52Gl&SQT9ux67NT0hhIvHu zpgF|U!uY5qpm(lCN}mp-3Qom!2t}|{U?&lsM05hRS>E|*jD7pZFl0d|5Y2*4%|srj zVhK8sDxmbuQ4l{tcg{%-k{)h}ELbC@++iRD8-RF-M0jwEi(=3)2ZX5gfg-8}BJq`w zPAg-n!T1Tf=PKB*p?YkU&wKKYX~Bss1Up&w-DY7X#Ad*jyGfV;JArYlam`ZX^PaqV zY-PWO7ww|tZv91l?|JR%%0**$6HT^*&6V5JX2E7=B0E#?X`+cWRK)H=ySsAgd(S6# z>o4bG&YcI(h&f$wo=U_cPsqlOO6sqc&^wL|#?atYImum!aqDnmt&kp8+tcHXPuo`> z?OXQ3!9&NgmnCRzy}iPX=dRq@lwP&t+VPj7SJ&5>=BB7wut?4wIQI0YhQFnJZ#aGW zt^UQkK1|pCXhbqWK5^#w@o$TlBoGm4UA=lfP?OZK=CSLC?z$%F-B6b-uBdi`dVn)w zWMp`%;^%?s`0>|%t^YP}O-7AQ7-KR=`}!vI9MDUS%%w}0x{0fP)L;C<7poERM7$dvC+fg<=Z)kun(VZ3F!hbpFu*dV+X3B|J&qBCU527RMO`(Cr#JFt?NN9q>prSKSz%zqsBTZ74H*S4JKPq z>QSCS*+!_f6pMMZX{&Jbc#?E;e=el&u@x-#Nry|uf9B}%WGTEuWC_G=23HG`LR<~t zW0XM)U<;sg2y;|>4eX9Wv zqy{98S&T?#u%6z8#JR{}@zxRK+c`*MOEc+aDFu^=I1nGhu|=@O zrN2H4I*UbF&@2{Z86EqN6CaMD(H!U^SPpTUV0uysxxQW^W57m63*Pf@B*Vf@(0Pyu zaUmx@DsXe?At@ca|BeGIfaSpgyy`vJ$TtNs23C5zGRcR<%XKiwYj1Ywwt|#$KY=6= zNmM*YVl4lAL4gRHx)C!`+7JzOxLo*u1a*lA`3VqS2B6eb>PLegU*4? zU^)X!S2PPcgGDn473rK`hws{uE1A3n99nDN513u*v<+K1IAxhjxvKcbI1xw zcInPkh@%Cnk}p#oKY(4nl(TYh>S5b{q+L%Hypzd9?1c36){x#QQ80vt_ptEaN|L`F z=QrZTJ7N5;X(kg)FX*T54zz##?T^3BJeHudbAPp;$ZdIh_xMY1Jv;qL)y{OIYu#Pt zwl&Gxg`-oG7X33?4(^Umo%?e~|5xJ;zdDg@m`~mx8oE~8kU&JFbMM|-pgv_${d>=i z9oUr$UT91eyXw3!4RAk-P28QY{$pezF?8lu`dVIH)||~c=dyzX1GBaUbi!E?D`t?|k2~by8M{jSh^Uc@aTJu)$#qRC-8FZH_U0VB463QFlVI; z!sR^vS zLJ%crQG_rG5oQpL2SEnyj)5Kpbrtk5ot-mSHw%+*v0nE(nAmC$tU$ zw{iLcNDh;AoY|8AEde%d+T`y0u>EY^16%8=Baz%}{{pM)9Y#*~a>=P8QnqLi(6d@p zn28=Z*Z2Ff>gpw8VDJihGEV>H{+kk4R90Lo$7Suk^_=bgiI6XGU@AT>aMdXPAl4t> zo=i^Q_4-JrYyiqD%5N$#^JiIEu>h4^!MQ)WB2(|CZTifcp9~f0kb0I7k~WQY4GE3`~QuoH6J2Q6>EQeXsvXUfW}!}s0ah~J;bggs8yad4dMWMAc^ zCG-73Y}@AWp*CU%p1-ks8K7#8Kz;o>Z(d=htf{eXhgq`d#mMc;jH>Dy3W5dX2l5dJ z#wW%}B*wV-_ZiOr)vJ=R3w!ss_qJ%I1|2(p=+vpU^c3G50U?B_U$v?TD5)q2R6e>Y zyxkKlYH+Ng1>*!f00Cn>D^sKKWMZV}yJPWB;|aT88+z0*jN#vo92wO!NawvWYiep_ zepy*SrB$JU4k&@olG3AuGPI*z4H<;81tg?W2_Sj=_;L3}o_PgwL5S;TTK~tye*hUf V?Pd0r$cq2~002ovPDHLkV1m{lPg4K@ literal 0 HcmV?d00001 diff --git a/data/emoticons/tango/thinking.png b/data/emoticons/tango/thinking.png new file mode 100644 index 0000000000000000000000000000000000000000..9d1d752b10aa80e01c75a646c5daab990a6bc34a GIT binary patch literal 1282 zcmV+d1^xPoP)l2 z?)x86Ri5WC&s808pSpTToN^}z5ccBIBN00R)a4oxS5Su1HyPkNjn|TpwNkX$CtZ@_ z0!^(g($-o_W3!=Qb9Hfc5@x2Xjukwn3*+kZVfLincs9TnVoDKxl1TOI{(PETyF}pw ztO`hyYE~;a0*?Cv6mO~gI9S%uKap`c$#J#I@VcAGz>!?)9*yatwk=_ismi|&i-{X2K0E>OnC5cqOoR7`as9868i>T-?Q z$+yU6(C7h}8o;12U@Rg5NDUfGHQ^cn6%1w6E`lv#+*+8OtZJ=_AmR!$Q*WBOdJ~6} zh&t%Qw}XwU&k+}E;rc&5!=oO z(UsV^M}pF?K+N$|X%@YJUE7sUK7d!+4XzUaF=|7gf?AJ6`gJH4mFdEG`X&QQk7v2r zE%r&5$)tYcNN*Oxv~^v$0v0HynF+O5=YEp+8Z)d-ku*{ofWFhmFW= zRLWJL{b&2XHS=Ois)vua7OHM^68p zyIi(rR*l{_#>`$D8oIB`MAvMY9UUERX2XW8t=Jb0nzcg8h$O67W7JrM0I_9(dDq%` sz`J_&>Z;znCg4d!L>~Dx`iuwv1GdahBb)sINdN!<07*qoM6N<$ft<8 literal 0 HcmV?d00001 diff --git a/data/emoticons/tango/tongue.png b/data/emoticons/tango/tongue.png new file mode 100644 index 0000000000000000000000000000000000000000..144318dd1d05253f5f2cd77705e2596aca9c4839 GIT binary patch literal 1260 zcmV=^W8h0Uqf4<(8AEt+Qw=nEW~PbQQXL|Gz4Wyf(tep5|hR>h8RPXrE$SR zhzrFSLRgs&Q4taoW0h!9s|aXqJN>aunCY~gnL9K0e#gZWS{+K*@Fh37$(QrI_kC~9 zIijjO%3~fW9dI9bdsv)e4+jzYaTySwJpk%5iqAEak=QMUxuC&D2-zs2l|kv12p4JX zXqV28C@pP<<{h=m>qyep>QGbo|RkRC|INOp-|&0|$S z!qieN;|MtJW03h%<#M{HRqs^X$@U?R9*+mDO;Rb}AC7JwdUZkI1=Ha9!SLk7O>VL;(~-xA|P=vji_lxRt1qL zNCedof#lEwshC8#$YF8n1d2Tzq_v}+WV=+nSwswoi{fzZ^P8MKKZ+6q)5OQ0{><6) zqpNNVh(ooKhvaUdwWGb*!@+t7Lcer&ME%MXU{ST8772JnJU%8D4 zh^$7e5L9Q8&WwXy9`nSETE{CL4D9FijNJd z(9&jb8K@HwpFP^V1ND9b!icG$)&o-_wZ8=qZv(KBxCKFU=5Oq+X|Ffq- zqKHILTttMgpS;Atu1;KI_-gz%LIJdZm=;)=wfJ0HOJwbHMs$3lK|q&4i#XvfbbO+OGEyfHyTveb6O&}7H57Xm)#X~D&4XRM z2UnY8%X4x5&gGa|T%>7l1hskGXdh%U%G|_c>=wiI4lZb*9*5*|y6Bi*oY3|fTx(EP zAF)}w-iVRkzQX*bJY6RojN623x{=H2qIw)!KfddxY2h7tn`HZtq+W>!_6F6JD9n`7Y(IK)r00V#zxy@!K!Lu#{b4s&*!=qL%rmb(zVKng&Sb0U z+}&WdwaNO0W9Mfz_-mr-O=srM{jp={i%iQeMkMPO<9Ei!u9i0x5E1Fyx33XsPH514 z;;E^ZcO|^Nt%>rUCdW?#+zCQ6(@Wvs$CqPcXKp617Olyu(M4lSc64N9QP)8?T$$b7 z-EMsA)`TtFO$JR^A!0;AR;)2yp-FJP+!hZp9 WdOZGMYi4%<0000IY*b=UbYX}XWkHOI+C@!}g$cwJ zalrxz3xiQp6Bopyh&&o&8VPDC&niL-g_h7MZD%@<``zPWrchE#*l?3Cx%tjL|9}4H zDXPkYJm!I-1O7d&>%~jgvld|~J}bns5I}u8u^dI|h+g0azSUqV2$?EGqs`JFVOpuI zsg~NB2o+U^_}qeV@G1=SIlXvkjBA%JYlc@#cj(#sBiJS;WoedBxJB1AMM*p=Hh&AJ z0#ZUDs#!b%&z}yxf2$m9OKU#!S5+GtAKsGQZAKQGBI3t6s#9d!nEp|rf9$b&N)PUkP?(INDNFFYT`(d z5Q%_MHo`6ho{KTY17?h-l@%Z%M3Xq@)Aal!sOC|Z0+&HFi)bDf zq#@qGcthT;0Ki)O^Zl4}Hz5#$1$6`q8rigACP)+whA_rs(}pS_2R4a0+lhbr6oL{o zR6*l2cR}7JP@hgtwlDLNG32FnAc7qK3A#>^dZLlN-}La?iBSNaT|9$Lug@gfeH#DT zF!IXVfZ`qd5pwMXtVs$iN42|anY{cKdGjma2tBtN@B7{CY>#vBc<%Po)&n<4jg0ci ztkcN4P2|lnzz|x#3T@qoSdLC6P&&w42N=W@^Qwp{&F|*<_`L`sUcoGiYJhy_3JEX% z2M5+FO2_To-tOe};-%{8l|*eND^`JkwjUxW8^Sggl007bf&&7~nSMeyqR8^qg-Sbi z2<`dzdh7!8#wYAuqayW@JS9=TL#Ibeuxae$5Y)v`FN_okK#C z5%}&Yx!HRLR7JqvG=0uhnMB}>YHc&P^Q51#CK@sZNZ)0L&!h2@@2 z0Ne~hSFa40oVhp>?b>xdaU|``pc)-A#te3LbPVYP&?#4DU0t0Yn?1YKW!(&emO3G9 zL_$uSF>0Jb4smILVc)r7VC=++6O(rHlm!2GL`25#dY_K}0i-xJ1SW;DmjD0&07*qo IM6N<$f^(2qYXATM literal 0 HcmV?d00001 diff --git a/data/emoticons/tango/victory.png b/data/emoticons/tango/victory.png new file mode 100644 index 0000000000000000000000000000000000000000..d0b635e9b80d6d1673bf7c1baaa10537fc0c116e GIT binary patch literal 1387 zcmV-x1(f=UP)`)7;o~F z`ZEC!XsYQIS+_m`pgp@oMvqypztJPLSi)cus{#_IT-73ufaA`A?p;b|N~B{Wh(OOS zUj~1DqVidNndz@lk1f)%J`u#fBZz&AbZm4_TZIP;RTnYU7c1+yu!5qUCP|I_1KZibo(3k5syo_qz>EK0^+i}`y`w1 zYhzc}5bY~31v7^)_YSi8{?+X19%j`;%YXvTr|%#*AhA##j-FxD#Ix$>pOh0^xmJTE zH4+AC#28S^T{kaeQEDM=O9iG&bLXuqX>4#<(OQXkC8E})L`!OMy*TbKCtP~EE(JdP zt3+i~2el2xMj4DmsD_AyoL}#uwn$?t26hTGO=E)xS|C*)0}Vj~ln@)8hWYgdmyR=g z07%GkY8ucegW3{8iT!;U&;n=;b)vlIO?i(Ni8-nJnr7sS&b<2EGV}UA!$rv#^k)tH zXSDO9T&&`HV#yA$xw1WN25frzWXj-ZidfZZ;uRavogd{i@SjP(pg+&llvykDX)z}Y z&QnzhZ;Nc)R7q-~ME(Fa{0$9Hl#|>A7`G0mq78;e)OL3I<5TvvM|v-M{Zb@#+Y<}Z|{W85S?A3>1b|lcB{@iFKLVR9D^pUP+>$oE7lk_R-uI0yg=5q tHVYK``ub+==CcC+DP(#}0qB2B{2dXOe;N14SWt73#?_A`J25UjcS{5z#N~=UT zOKn5FG&Mx2sWVh>EpMhLU^-=WbS%&0*lqQAHE~==9*^JyF(fiJzK?@P;z4bd6bmy18bxIT zmTD{;v24b-l@tm&Y~3c|;E_1V`o64B?;{l~_DZXXM}Fquk$BO+O`tKvtVf*nDC-at z1zeO8*gWV0*g1qb!cGl*dLnDH-tLulJy6gijzl=CUEQ&OX{@z~xFBJyMnU3WDp6C7 zm`acYNE9T3YKTBGXjgYkBAlg1oK*z57WPxyP*1X6ie3s41LC4Mh&Uh>C^0Zqoc#PM zr}~GM)EE$lQgIHFjY4fheXfQ5s}%@)q^Tk57jFX=RSRnQ?943=9R7w&Ka9eXH3Q!c zGw|I_L_lQ8VuhfTLYf+)2z!=cAJlVuY0d~8sHnmU6^$0`ExY1itlsP`)nMoba49+*6(eVt$uh-R?XrF-9YR7r(IjC-Bxgh_o;J#-?EQ+cJHdhWB0UMxr7~}BfYjr>obOF^YkOw?OOAo_6 z$Ut3&NKb%?qc#tk<)^E2XfTi3d9bsf88nyy&4A5-&NF!R9@s^&S&S2c^h6nJRmeV< znNC^bR)H>pE>bGxIdwW+2Dh_lkOrGxde3sQKSi;)SSHXcV%EWQ%Hnf*HGwjyqhom| z{4_!Vu?y_oIY-#_IQ;$${pY7iP5#Y9>K>=RxXWAbO%e`y?A?_Eod?a~gm<8$V|kRp z``O;Fa Date: Fri, 20 Nov 2009 22:09:05 +0100 Subject: [PATCH 038/259] fix resizing of the MUC occupant treeview when we resize chat window. Fixes #5433 --- src/groupchat_control.py | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/src/groupchat_control.py b/src/groupchat_control.py index e71eefe32..e4db34610 100644 --- a/src/groupchat_control.py +++ b/src/groupchat_control.py @@ -317,6 +317,7 @@ class GroupchatControl(ChatControlBase): id_ = self.list_treeview.connect('style-set', self.on_list_treeview_style_set) self.handlers[id_] = self.list_treeview + self.resize_from_another_muc = False # we want to know when the the widget resizes, because that is # an indication that the hpaned has moved... # FIXME: Find a better indicator that the hpaned has moved. @@ -446,17 +447,29 @@ class GroupchatControl(ChatControlBase): menu.show_all() + def resize_occupant_treeview(self, position): + self.resize_from_another_muc = True + self.hpaned.set_position(position) + def reset_flag(): + self.resize_from_another_muc = False + # Reset the flag when everything will be redrawn, and in particular when + # on_treeview_size_allocate will have been called. + gobject.idle_add(reset_flag) + def on_treeview_size_allocate(self, widget, allocation): '''The MUC treeview has resized. Move the hpaned in all tabs to match''' + if self.resize_from_another_muc: + # Don't send the event to other MUC + return hpaned_position = self.hpaned.get_position() for account in gajim.gc_connected: for room_jid in [i for i in gajim.gc_connected[account] if \ - gajim.gc_connected[account][i]]: + gajim.gc_connected[account][i] and i != self.room_jid]: ctrl = gajim.interface.msg_win_mgr.get_gc_control(room_jid, account) if not ctrl: ctrl = gajim.interface.minimized_controls[account][room_jid] if ctrl: - ctrl.hpaned.set_position(hpaned_position) + ctrl.resize_occupant_treeview(hpaned_position) def iter_contact_rows(self): '''iterate over all contact rows in the tree model''' From 84ad8fb7234e8b530136efe41014b944eeab0300 Mon Sep 17 00:00:00 2001 From: red-agent Date: Sat, 21 Nov 2009 11:31:49 +0200 Subject: [PATCH 039/259] Added myself into the annals of history Sorry for not disclosing my real name to the wide audience. I'm just that paranoid... --- AUTHORS | 1 + 1 file changed, 1 insertion(+) diff --git a/AUTHORS b/AUTHORS index a3cfefe88..c23914bef 100644 --- a/AUTHORS +++ b/AUTHORS @@ -3,6 +3,7 @@ CURRENT DEVELOPERS: Nikos Kouremenos (kourem AT gmail.com) Yann Leboulanger (asterix AT lagaule.org) Julien Pivotto (roidelapluie AT gmail.com) +red-agent (hell.director AT gmail.com) Jonathan Schleifer (js-gajim AT webkeks.org) Travis Shirk (travis AT pobox.com) Brendan Taylor (whateley AT gmail.com) From 102126b330366322c1769ade3d9c0eb8f4e0dcca Mon Sep 17 00:00:00 2001 From: red-agent Date: Sun, 22 Nov 2009 13:33:19 +0200 Subject: [PATCH 040/259] Fixed broken resource setting --- src/common/connection.py | 1 + 1 file changed, 1 insertion(+) diff --git a/src/common/connection.py b/src/common/connection.py index 3c8cf537d..823f56824 100644 --- a/src/common/connection.py +++ b/src/common/connection.py @@ -159,6 +159,7 @@ class CommonConnection: resource = Template(resource).safe_substitute({ 'hostname': socket.gethostname() }) + return resource def dispatch(self, event, data): '''always passes account name as first param''' From 22ab1c955328fdbd30e6e3610ac74231306a4397 Mon Sep 17 00:00:00 2001 From: red-agent Date: Sun, 22 Nov 2009 20:05:30 +0200 Subject: [PATCH 041/259] Fixed refactoring artifact --- src/profile_window.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/profile_window.py b/src/profile_window.py index f3fe1faa4..132357b0b 100644 --- a/src/profile_window.py +++ b/src/profile_window.py @@ -322,7 +322,7 @@ class ProfileWindow: nick = '' if 'NICKNAME' in vcard_: nick = vcard_['NICKNAME'] - gajim.connections[self.account].send_nickname(self.account, nick) + gajim.connections[self.account].send_nickname(nick) if nick == '': nick = gajim.config.get_per('accounts', self.account, 'name') gajim.nicks[self.account] = nick From a53e906a921c6bac5758085925fdaeadcf2fae35 Mon Sep 17 00:00:00 2001 From: Stephan Erb Date: Sun, 22 Nov 2009 22:07:48 +0100 Subject: [PATCH 042/259] Ignore error stanzas with event tag. This prevents dialogs poping up with showing "Service unavailable". --- src/common/pep.py | 43 +++++++++++++++++++++---------------------- 1 file changed, 21 insertions(+), 22 deletions(-) diff --git a/src/common/pep.py b/src/common/pep.py index 742325b4c..0195341a7 100644 --- a/src/common/pep.py +++ b/src/common/pep.py @@ -23,9 +23,6 @@ ## along with Gajim. If not, see . ## -import common.gajim -from common import xmpp - MOODS = { 'afraid': _('Afraid'), 'amazed': _('Amazed'), @@ -194,16 +191,18 @@ ACTIVITIES = { TUNE_DATA = ['artist', 'title', 'source', 'track', 'length'] +import gobject +import gtk + import logging log = logging.getLogger('gajim.c.pep') -import helpers -import atom -import gtkgui_helpers -import gobject -import gajim -import gtk +from common import helpers +from common import atom +from common import xmpp +from common import gajim +import gtkgui_helpers def translate_mood(mood): if mood in MOODS: @@ -230,7 +229,7 @@ class AbstractPEP(object): self._pep_specific_data, self._retracted = self._extract_info(items) self._update_contacts(jid, account) - if jid == common.gajim.get_jid_from_account(account): + if jid == gajim.get_jid_from_account(account): self._update_account(account) def _extract_info(self, items): @@ -238,7 +237,7 @@ class AbstractPEP(object): raise NotImplementedError def _update_contacts(self, jid, account): - for contact in common.gajim.contacts.get_contacts(account, jid): + for contact in gajim.contacts.get_contacts(account, jid): if self._retracted: if self.type in contact.pep: del contact.pep[self.type] @@ -246,7 +245,7 @@ class AbstractPEP(object): contact.pep[self.type] = self def _update_account(self, account): - acc = common.gajim.connections[account] + acc = gajim.connections[account] if self._retracted: if self.type in acc.pep: del acc.pep[self.type] @@ -266,7 +265,7 @@ class UserMoodPEP(AbstractPEP): '''XEP-0107: User Mood''' type = 'mood' - namespace = common.xmpp.NS_MOOD + namespace = xmpp.NS_MOOD def _extract_info(self, items): mood_dict = {} @@ -306,7 +305,7 @@ class UserTunePEP(AbstractPEP): '''XEP-0118: User Tune''' type = 'tune' - namespace = common.xmpp.NS_TUNE + namespace = xmpp.NS_TUNE def _extract_info(self, items): tune_dict = {} @@ -352,7 +351,7 @@ class UserActivityPEP(AbstractPEP): '''XEP-0108: User Activity''' type = 'activity' - namespace = common.xmpp.NS_ACTIVITY + namespace = xmpp.NS_ACTIVITY def _extract_info(self, items): activity_dict = {} @@ -418,7 +417,7 @@ class UserNicknamePEP(AbstractPEP): '''XEP-0172: User Nickname''' type = 'nickname' - namespace = common.xmpp.NS_NICK + namespace = xmpp.NS_NICK def _extract_info(self, items): nick = '' @@ -434,16 +433,16 @@ class UserNicknamePEP(AbstractPEP): def _update_contacts(self, jid, account): # TODO: use dict instead nick = '' if self._retracted else self._pep_specific_data - for contact in common.gajim.contacts.get_contacts(account, jid): + for contact in gajim.contacts.get_contacts(account, jid): contact.contact_name = nick def _update_account(self, account): # TODO: use dict instead if self._retracted: - common.gajim.nicks[account] = common.gajim.config.get_per('accounts', + gajim.nicks[account] = gajim.config.get_per('accounts', account, 'name') else: - common.gajim.nicks[account] = self._pep_specific_data + gajim.nicks[account] = self._pep_specific_data SUPPORTED_PERSONAL_USER_EVENTS = [UserMoodPEP, UserTunePEP, UserActivityPEP, @@ -454,8 +453,8 @@ class ConnectionPEP(object): def _pubsubEventCB(self, xmpp_dispatcher, msg): ''' Called when we receive with pubsub event. ''' if msg.getTag('error'): - log.warning('PubsubEventCB received error stanza') - return + log.debug('PubsubEventCB received error stanza. Ignoring') + raise NodeProcessed jid = helpers.get_full_jid_from_iq(msg) event_tag = msg.getTag('event') @@ -474,7 +473,7 @@ class ConnectionPEP(object): # but to be sure... self.dispatch('ATOM_ENTRY', (atom.OldEntry(node=entry),)) - raise common.xmpp.NodeProcessed + raise xmpp.NodeProcessed def send_activity(self, activity, subactivity=None, message=None): if not self.pep_supported: From 07c008cbaafd788d193f0de75e27793e8ec147aa Mon Sep 17 00:00:00 2001 From: Stephan Erb Date: Sun, 22 Nov 2009 22:10:55 +0100 Subject: [PATCH 043/259] Remove TODO which was more or less a "might be useful one day" --- src/common/pep.py | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/src/common/pep.py b/src/common/pep.py index 0195341a7..a991c35c7 100644 --- a/src/common/pep.py +++ b/src/common/pep.py @@ -431,16 +431,13 @@ class UserNicknamePEP(AbstractPEP): return (nick, retracted) def _update_contacts(self, jid, account): - # TODO: use dict instead nick = '' if self._retracted else self._pep_specific_data for contact in gajim.contacts.get_contacts(account, jid): contact.contact_name = nick def _update_account(self, account): - # TODO: use dict instead if self._retracted: - gajim.nicks[account] = gajim.config.get_per('accounts', - account, 'name') + gajim.nicks[account] = gajim.config.get_per('accounts', account, 'name') else: gajim.nicks[account] = self._pep_specific_data From 96b9326b0f17235975b79bc772e267ce0d94909b Mon Sep 17 00:00:00 2001 From: Stephan Erb Date: Sun, 22 Nov 2009 22:14:05 +0100 Subject: [PATCH 044/259] Move function closer to where it is used. This makes it easier to reason about its usage. --- src/common/pep.py | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/common/pep.py b/src/common/pep.py index a991c35c7..3437d4a46 100644 --- a/src/common/pep.py +++ b/src/common/pep.py @@ -204,12 +204,6 @@ from common import gajim import gtkgui_helpers -def translate_mood(mood): - if mood in MOODS: - return MOODS[mood] - else: - return mood - class AbstractPEP(object): @@ -293,13 +287,19 @@ class UserMoodPEP(AbstractPEP): def asMarkupText(self): assert not self._retracted untranslated_mood = self._pep_specific_data['mood'] - mood = translate_mood(untranslated_mood) + mood = _translate_mood(untranslated_mood) markuptext = '%s' % gobject.markup_escape_text(mood) if 'text' in self._pep_specific_data: text = self._pep_specific_data['text'] markuptext += ' (%s)' % gobject.markup_escape_text(text) return markuptext + def _translate_mood(mood): + if mood in MOODS: + return MOODS[mood] + else: + return mood + class UserTunePEP(AbstractPEP): '''XEP-0118: User Tune''' From fb456b1ee4503bae02712e1b6b41aec4b028f382 Mon Sep 17 00:00:00 2001 From: Stephan Erb Date: Sun, 22 Nov 2009 22:57:52 +0100 Subject: [PATCH 045/259] Make dependencies of ConnectionPEP explicit. This means ConnectionPEP now knows the objects on which it calls method. Before, it just assumed that: "it will be subclassed and that the subclass defines a few methods". Big advantage is that false positives in the pylint report are gone --- src/common/connection_handlers.py | 2 ++ src/common/pep.py | 45 +++++++++++++++++-------------- 2 files changed, 27 insertions(+), 20 deletions(-) diff --git a/src/common/connection_handlers.py b/src/common/connection_handlers.py index 15a979415..e8abbae74 100644 --- a/src/common/connection_handlers.py +++ b/src/common/connection_handlers.py @@ -1458,6 +1458,8 @@ class ConnectionHandlers(ConnectionVcard, ConnectionBytestream, ConnectionDisco, ConnectionBytestream.__init__(self) ConnectionCommands.__init__(self) ConnectionPubSub.__init__(self) + ConnectionPEP.__init__(self, account=self.name, dispatcher=self, + pubsub_connection=self) ConnectionJingle.__init__(self) ConnectionHandlersBase.__init__(self) self.gmail_url = None diff --git a/src/common/pep.py b/src/common/pep.py index 3437d4a46..34f3bda46 100644 --- a/src/common/pep.py +++ b/src/common/pep.py @@ -247,12 +247,12 @@ class AbstractPEP(object): acc.pep[self.type] = self def asPixbufIcon(self): - '''To be implemented by subclasses''' - raise NotImplementedError + '''SHOULD be implemented by subclasses''' + return None def asMarkupText(self): - '''To be implemented by subclasses''' - raise NotImplementedError + '''SHOULD be implemented by subclasses''' + return '' class UserMoodPEP(AbstractPEP): @@ -287,14 +287,14 @@ class UserMoodPEP(AbstractPEP): def asMarkupText(self): assert not self._retracted untranslated_mood = self._pep_specific_data['mood'] - mood = _translate_mood(untranslated_mood) + mood = self._translate_mood(untranslated_mood) markuptext = '%s' % gobject.markup_escape_text(mood) if 'text' in self._pep_specific_data: text = self._pep_specific_data['text'] markuptext += ' (%s)' % gobject.markup_escape_text(text) return markuptext - def _translate_mood(mood): + def _translate_mood(self, mood): if mood in MOODS: return MOODS[mood] else: @@ -446,20 +446,25 @@ SUPPORTED_PERSONAL_USER_EVENTS = [UserMoodPEP, UserTunePEP, UserActivityPEP, UserNicknamePEP] class ConnectionPEP(object): - + + def __init__(self, account, dispatcher, pubsub_connection): + self._account = account + self._dispatcher = dispatcher + self._pubsub_connection = pubsub_connection + def _pubsubEventCB(self, xmpp_dispatcher, msg): ''' Called when we receive with pubsub event. ''' if msg.getTag('error'): log.debug('PubsubEventCB received error stanza. Ignoring') - raise NodeProcessed + raise xmpp.NodeProcessed jid = helpers.get_full_jid_from_iq(msg) event_tag = msg.getTag('event') for pep_class in SUPPORTED_PERSONAL_USER_EVENTS: - pep = pep_class.get_tag_as_PEP(jid, self.name, event_tag) + pep = pep_class.get_tag_as_PEP(jid, self._account, event_tag) if pep: - self.dispatch('PEP_RECEIVED', (jid, pep.type)) + self._dispatcher.dispatch('PEP_RECEIVED', (jid, pep.type)) items = event_tag.getTag('items') if items: @@ -468,7 +473,8 @@ class ConnectionPEP(object): if entry: # for each entry in feed (there shouldn't be more than one, # but to be sure... - self.dispatch('ATOM_ENTRY', (atom.OldEntry(node=entry),)) + self._dispatcher.dispatch('ATOM_ENTRY', + (atom.OldEntry(node=entry),)) raise xmpp.NodeProcessed @@ -483,14 +489,14 @@ class ConnectionPEP(object): if message: i = item.addChild('text') i.addData(message) - self.send_pb_publish('', xmpp.NS_ACTIVITY, item, '0') + self._pubsub_connection.send_pb_publish('', xmpp.NS_ACTIVITY, item, '0') def retract_activity(self): if not self.pep_supported: return # not all server support retract, so send empty pep first self.send_activity(None) - self.send_pb_retract('', xmpp.NS_ACTIVITY, '0') + self._pubsub_connection.send_pb_retract('', xmpp.NS_ACTIVITY, '0') def send_mood(self, mood, message=None): if not self.pep_supported: @@ -501,13 +507,13 @@ class ConnectionPEP(object): if message: i = item.addChild('text') i.addData(message) - self.send_pb_publish('', xmpp.NS_MOOD, item, '0') + self._pubsub_connection.send_pb_publish('', xmpp.NS_MOOD, item, '0') def retract_mood(self): if not self.pep_supported: return self.send_mood(None) - self.send_pb_retract('', xmpp.NS_MOOD, '0') + self._pubsub_connection.send_pb_retract('', xmpp.NS_MOOD, '0') def send_tune(self, artist='', title='', source='', track=0, length=0, items=None): @@ -531,28 +537,27 @@ class ConnectionPEP(object): i.addData(length) if items: item.addChild(payload=items) - self.send_pb_publish('', xmpp.NS_TUNE, item, '0') + self._pubsub_connection.send_pb_publish('', xmpp.NS_TUNE, item, '0') def retract_tune(self): if not self.pep_supported: return # not all server support retract, so send empty pep first self.send_tune(None) - self.send_pb_retract('', xmpp.NS_TUNE, '0') + self._pubsub_connection.send_pb_retract('', xmpp.NS_TUNE, '0') def send_nickname(self, nick): if not self.pep_supported: return item = xmpp.Node('nick', {'xmlns': xmpp.NS_NICK}) item.addData(nick) - self.send_pb_publish('', xmpp.NS_NICK, item, '0') + self._pubsub_connection.send_pb_publish('', xmpp.NS_NICK, item, '0') def retract_nickname(self): if not self.pep_supported: return # not all server support retract, so send empty pep first self.send_nickname(None) - self.send_pb_retract('', xmpp.NS_NICK, '0') - + self._pubsub_connection.send_pb_retract('', xmpp.NS_NICK, '0') # vim: se ts=3: From 8be7f9d2e102cc54c0d950591f3ee8e4cd9356cb Mon Sep 17 00:00:00 2001 From: Alexander Cherniuk Date: Mon, 23 Nov 2009 16:08:09 +0200 Subject: [PATCH 046/259] Setting my identity straight --- AUTHORS | 2 +- src/command_system/__init__.py | 2 +- src/command_system/dispatching.py | 2 +- src/command_system/errors.py | 2 +- src/command_system/framework.py | 2 +- src/command_system/implementation/__init__.py | 2 +- src/command_system/implementation/custom.py | 2 +- src/command_system/implementation/hosts.py | 2 +- src/command_system/implementation/middleware.py | 2 +- src/command_system/implementation/standard.py | 2 +- src/command_system/mapping.py | 2 +- 11 files changed, 11 insertions(+), 11 deletions(-) diff --git a/AUTHORS b/AUTHORS index c23914bef..3d1502324 100644 --- a/AUTHORS +++ b/AUTHORS @@ -1,9 +1,9 @@ CURRENT DEVELOPERS: +Alexander Cherniuk (ts33kr AT gmail.com) Nikos Kouremenos (kourem AT gmail.com) Yann Leboulanger (asterix AT lagaule.org) Julien Pivotto (roidelapluie AT gmail.com) -red-agent (hell.director AT gmail.com) Jonathan Schleifer (js-gajim AT webkeks.org) Travis Shirk (travis AT pobox.com) Brendan Taylor (whateley AT gmail.com) diff --git a/src/command_system/__init__.py b/src/command_system/__init__.py index c0a48f863..ff61c186e 100644 --- a/src/command_system/__init__.py +++ b/src/command_system/__init__.py @@ -1,4 +1,4 @@ -# Copyright (C) 2009 red-agent +# Copyright (C) 2009 Alexander Cherniuk # # 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 diff --git a/src/command_system/dispatching.py b/src/command_system/dispatching.py index 2bfd76b96..7f365a915 100644 --- a/src/command_system/dispatching.py +++ b/src/command_system/dispatching.py @@ -1,4 +1,4 @@ -# Copyright (C) 2009 red-agent +# Copyright (C) 2009 Alexander Cherniuk # # 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 diff --git a/src/command_system/errors.py b/src/command_system/errors.py index 992e83ccf..877a22acb 100644 --- a/src/command_system/errors.py +++ b/src/command_system/errors.py @@ -1,4 +1,4 @@ -# Copyright (C) 2009 red-agent +# Copyright (C) 2009 Alexander Cherniuk # # 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 diff --git a/src/command_system/framework.py b/src/command_system/framework.py index db9eb2e78..30f5cd53c 100644 --- a/src/command_system/framework.py +++ b/src/command_system/framework.py @@ -1,4 +1,4 @@ -# Copyright (C) 2009 red-agent +# Copyright (C) 2009 Alexander Cherniuk # # 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 diff --git a/src/command_system/implementation/__init__.py b/src/command_system/implementation/__init__.py index 66d097f42..c77c23e3f 100644 --- a/src/command_system/implementation/__init__.py +++ b/src/command_system/implementation/__init__.py @@ -1,4 +1,4 @@ -# Copyright (C) 2009 red-agent +# Copyright (C) 2009 Alexander Cherniuk # # 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 diff --git a/src/command_system/implementation/custom.py b/src/command_system/implementation/custom.py index 4f54670da..e4aa32dbf 100644 --- a/src/command_system/implementation/custom.py +++ b/src/command_system/implementation/custom.py @@ -1,4 +1,4 @@ -# Copyright (C) 2009 red-agent +# Copyright (C) 2009 Alexander Cherniuk # # 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 diff --git a/src/command_system/implementation/hosts.py b/src/command_system/implementation/hosts.py index b38bb1a35..a90dab464 100644 --- a/src/command_system/implementation/hosts.py +++ b/src/command_system/implementation/hosts.py @@ -1,4 +1,4 @@ -# Copyright (C) 2009 red-agent +# Copyright (C) 2009 Alexander Cherniuk # # 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 diff --git a/src/command_system/implementation/middleware.py b/src/command_system/implementation/middleware.py index 9ef4bea29..2f262f8ed 100644 --- a/src/command_system/implementation/middleware.py +++ b/src/command_system/implementation/middleware.py @@ -1,4 +1,4 @@ -# Copyright (C) 2009 red-agent +# Copyright (C) 2009 Alexander Cherniuk # # 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 diff --git a/src/command_system/implementation/standard.py b/src/command_system/implementation/standard.py index 3b46a30db..d0e585fec 100644 --- a/src/command_system/implementation/standard.py +++ b/src/command_system/implementation/standard.py @@ -1,4 +1,4 @@ -# Copyright (C) 2009 red-agent +# Copyright (C) 2009 Alexander Cherniuk # # 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 diff --git a/src/command_system/mapping.py b/src/command_system/mapping.py index 707866a20..ecf8f0783 100644 --- a/src/command_system/mapping.py +++ b/src/command_system/mapping.py @@ -1,4 +1,4 @@ -# Copyright (C) 2009 red-agent +# Copyright (C) 2009 Alexander Cherniuk # # 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 From 3a190b832849cf73d28ed5eb7300f05f242da2bc Mon Sep 17 00:00:00 2001 From: Alexander Cherniuk Date: Tue, 24 Nov 2009 12:20:40 +0200 Subject: [PATCH 047/259] Fixed a typo --- src/common/connection_handlers.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/common/connection_handlers.py b/src/common/connection_handlers.py index 15a979415..63e25bc00 100644 --- a/src/common/connection_handlers.py +++ b/src/common/connection_handlers.py @@ -1860,7 +1860,7 @@ class ConnectionHandlers(ConnectionVcard, ConnectionBytestream, ConnectionDisco, log.warn('Invalid JID: %s, ignoring it' % item.getAttr('jid')) continue name = item.getAttr('name') - contact = gajim.contact.get_contact(self.name, jid) + contact = gajim.contacts.get_contact(self.name, jid) groups = [] same_groups = True for group in item.getTags('group'): From 94f6d6b79ac357c98ec6d3089f891ec5d78968e4 Mon Sep 17 00:00:00 2001 From: Alexander Cherniuk Date: Tue, 24 Nov 2009 14:24:35 +0200 Subject: [PATCH 048/259] Fixed timezone parsing --- src/common/connection_handlers.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/common/connection_handlers.py b/src/common/connection_handlers.py index 63e25bc00..35679d771 100644 --- a/src/common/connection_handlers.py +++ b/src/common/connection_handlers.py @@ -1735,7 +1735,7 @@ class ConnectionHandlers(ConnectionVcard, ConnectionBytestream, ConnectionDisco, # wrong answer return tzo = qp.getTag('tzo').getData() - if tzo == 'Z': + if tzo.lower() == 'z': tzo = '0:0' tzoh, tzom = tzo.split(':') utc_time = qp.getTag('utc').getData() From eb11c24eea6b367d1774cfa8ae3b38c03e72085a Mon Sep 17 00:00:00 2001 From: Yann Leboulanger Date: Tue, 24 Nov 2009 14:33:49 +0100 Subject: [PATCH 049/259] egg.trayicon is dead. Light a candle :'( Fixes #3021, #5246 --- Makefile.am | 1 - README.html | 5 +- configure.ac | 16 +- scripts/gajim.in | 1 - src/Makefile.am | 31 +-- src/eggtrayicon.c | 584 ----------------------------------------- src/eggtrayicon.h | 80 ------ src/features_window.py | 13 - src/gui_interface.py | 18 +- src/statusicon.py | 354 ++++++++++++++++++++++++- src/systray.py | 459 -------------------------------- src/tooltips.py | 4 +- src/trayicon.defs | 59 ----- src/trayicon.override | 47 ---- src/trayiconmodule.c | 43 --- 15 files changed, 353 insertions(+), 1362 deletions(-) delete mode 100644 src/eggtrayicon.c delete mode 100644 src/eggtrayicon.h delete mode 100644 src/systray.py delete mode 100644 src/trayicon.defs delete mode 100644 src/trayicon.override delete mode 100644 src/trayiconmodule.c diff --git a/Makefile.am b/Makefile.am index 019f7a1d9..f708a0855 100644 --- a/Makefile.am +++ b/Makefile.am @@ -50,7 +50,6 @@ MAINTAINERCLEANFILES = \ aclocal.m4 \ libtool \ po/POTFILES.in \ - src/trayicon_la-eggtrayicon.loT \ m4/intltool.m4 MAINTAINERCLEANDIRS = \ diff --git a/README.html b/README.html index 558d23a80..8ddade813 100644 --- a/README.html +++ b/README.html @@ -16,7 +16,7 @@ Welcome to Gajim and thank you for trying out our client.

Runtime Requirements

  • python2.5 or higher
  • -
  • pygtk2.12 or higher
  • +
  • pygtk2.16 or higher
  • python-libglade
  • pysqlite2 (if you have python 2.5, you already have this)
@@ -34,7 +34,6 @@ Gajim is a GTK+ app that loves GNOME. You can do 'make' so you don't require gno
  • For zeroconf (bonjour), the "enable link-local messaging" checkbox, you need dbus-glib, python-avahi
  • dnsutils (or whatever package provides the nslookup binary) for SRV support
  • gtkspell and aspell-LANG where lang is your locale eg. en, fr etc
  • -
  • GnomePythonExtras 2.10 or above (aka gnome-python-desktop) so you can avoid compiling trayicon and gtkspell
  • gnome-python-desktop (for GnomeKeyring support)
  • notification-daemon or notify-python (and D-Bus) to get cooler popups
  • D-Bus running to have gajim-remote working. Some distributions split dbus-x11, which is needed for dbus to work with Gajim. Version >= 0.80 is required.
  • @@ -53,8 +52,6 @@ the xml lib that *comes* with python and not pyxml or whatever.
    • python-dev
    • python-gtk2-dev
    • -
    • libgtk2.0-dev aka. gtk2-devel
    • -
    • libgtkspell-dev (for the gtkspell module)
    • intltool (>= 0.40.1)
    diff --git a/configure.ac b/configure.ac index 6363cb90b..af9840989 100644 --- a/configure.ac +++ b/configure.ac @@ -39,7 +39,7 @@ AM_NLS dnl **** dnl pygtk and gtk+ dnl **** -PKG_CHECK_MODULES([PYGTK], [gtk+-2.0 >= 2.12.0 pygtk-2.0 >= 2.12.0]) +PKG_CHECK_MODULES([PYGTK], [gtk+-2.0 >= 2.16.0 pygtk-2.0 >= 2.16.0]) AC_SUBST(PYGTK_CFLAGS) AC_SUBST(PYGTK_LIBS) PYGTK_DEFS=`$PKG_CONFIG --variable=defsdir pygtk-2.0` @@ -50,15 +50,6 @@ if test "x$PYTHON" = "x:"; then AC_MSG_ERROR([Python not found]) fi -dnl **** -dnl tray icon -dnl **** -AC_ARG_ENABLE(trayicon, - [ --disable-trayicon do not build trayicon module [default yes]], - enable_trayicon=$enableval, enable_trayicon=yes) -test "x$enable_trayicon" = "xyes" && have_trayicon=true || have_trayicon=false -AM_CONDITIONAL(BUILD_TRAYICON, $have_trayicon) - ACLOCAL_AMFLAGS="\${ACLOCAL_FLAGS}" AC_SUBST(ACLOCAL_AMFLAGS) @@ -91,8 +82,3 @@ AC_CONFIG_FILES([ po/Makefile.in ]) AC_OUTPUT -echo " -***************************** - Build features: - trayicon ......... ${have_trayicon} -*****************************" diff --git a/scripts/gajim.in b/scripts/gajim.in index 711ddac1d..178d69b16 100644 --- a/scripts/gajim.in +++ b/scripts/gajim.in @@ -33,5 +33,4 @@ export datadir=@DATADIR@/gajim PYTHON_EXEC=@PYTHON@ cd ${datadir}/src -export PYTHONPATH="$PYTHONPATH:@LIBDIR@/gajim" exec ${PYTHON_EXEC} -OO $APP.py "$@" diff --git a/src/Makefile.am b/src/Makefile.am index 24e7e2234..9c5e23b85 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -1,31 +1,7 @@ -CLEANFILES = \ - trayicon.c INCLUDES = \ $(PYTHON_INCLUDES) export MACOSX_DEPLOYMENT_TARGET=10.4 -if BUILD_TRAYICON -trayiconlib_LTLIBRARIES = trayicon.la -trayiconlibdir = $(pkglibdir) -trayicon_la_LIBADD = $(PYGTK_LIBS) -trayicon_la_SOURCES = \ - eggtrayicon.c \ - trayiconmodule.c - -nodist_trayicon_la_SOURCES = \ - trayicon.c - -trayicon_la_LDFLAGS = \ - -module -avoid-version -trayicon_la_CFLAGS = $(PYGTK_CFLAGS) - -trayicon.c: - pygtk-codegen-2.0 --prefix trayicon \ - --register $(PYGTK_DEFS)/gdk-types.defs \ - --register $(PYGTK_DEFS)/gtk-types.defs \ - --override $(srcdir)/trayicon.override \ - $(srcdir)/trayicon.defs > $@ -endif gajimsrcdir = $(pkgdatadir)/src gajimsrc_PYTHON = $(srcdir)/*.py @@ -56,12 +32,7 @@ EXTRA_DIST = $(gajimsrc_PYTHON) \ $(gajimsrc2_PYTHON) \ $(gajimsrc3_PYTHON) \ $(gajimsrc4_PYTHON) \ - $(gajimsrc5_PYTHON) \ - eggtrayicon.c \ - trayiconmodule.c \ - eggtrayicon.h \ - trayicon.defs \ - trayicon.override + $(gajimsrc5_PYTHON) dist-hook: rm -f $(distdir)/ipython_view.py diff --git a/src/eggtrayicon.c b/src/eggtrayicon.c deleted file mode 100644 index 56b3a0fb9..000000000 --- a/src/eggtrayicon.c +++ /dev/null @@ -1,584 +0,0 @@ -/* eggtrayicon.c - * Copyright (C) 2002 Anders Carlsson - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library 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 - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ - -#include -#include -#include - -#include "eggtrayicon.h" - -#include -#if defined (GDK_WINDOWING_X11) -#include -#include -#elif defined (GDK_WINDOWING_WIN32) -#include -#endif - -#ifndef EGG_COMPILATION -#ifndef _ -#define _(x) dgettext (GETTEXT_PACKAGE, x) -#define N_(x) x -#endif -#else -#define _(x) x -#define N_(x) x -#endif - -#define SYSTEM_TRAY_REQUEST_DOCK 0 -#define SYSTEM_TRAY_BEGIN_MESSAGE 1 -#define SYSTEM_TRAY_CANCEL_MESSAGE 2 - -#define SYSTEM_TRAY_ORIENTATION_HORZ 0 -#define SYSTEM_TRAY_ORIENTATION_VERT 1 - -enum { - PROP_0, - PROP_ORIENTATION -}; - -static GtkPlugClass *parent_class = NULL; - -static void egg_tray_icon_init (EggTrayIcon *icon); -static void egg_tray_icon_class_init (EggTrayIconClass *klass); - -static void egg_tray_icon_get_property (GObject *object, - guint prop_id, - GValue *value, - GParamSpec *pspec); - -static void egg_tray_icon_add (GtkContainer *container, GtkWidget *widget); - -static void egg_tray_icon_realize (GtkWidget *widget); -static void egg_tray_icon_unrealize (GtkWidget *widget); - -#ifdef GDK_WINDOWING_X11 -static void egg_tray_icon_update_manager_window (EggTrayIcon *icon, - gboolean dock_if_realized); -static void egg_tray_icon_manager_window_destroyed (EggTrayIcon *icon); -#endif - -GType -egg_tray_icon_get_type (void) -{ - static GType our_type = 0; - - if (our_type == 0) - { - static const GTypeInfo our_info = - { - sizeof (EggTrayIconClass), - (GBaseInitFunc) NULL, - (GBaseFinalizeFunc) NULL, - (GClassInitFunc) egg_tray_icon_class_init, - NULL, /* class_finalize */ - NULL, /* class_data */ - sizeof (EggTrayIcon), - 0, /* n_preallocs */ - (GInstanceInitFunc) egg_tray_icon_init - }; - - our_type = g_type_register_static (GTK_TYPE_PLUG, "EggTrayIcon", &our_info, 0); - } - - return our_type; -} - -static void -egg_tray_icon_init (EggTrayIcon *icon) -{ - icon->stamp = 1; - icon->orientation = GTK_ORIENTATION_HORIZONTAL; - - gtk_widget_add_events (GTK_WIDGET (icon), GDK_PROPERTY_CHANGE_MASK); -} - -static void -egg_tray_icon_class_init (EggTrayIconClass *klass) -{ - GObjectClass *gobject_class = (GObjectClass *)klass; - GtkWidgetClass *widget_class = (GtkWidgetClass *)klass; - GtkContainerClass *container_class = (GtkContainerClass *)klass; - - parent_class = g_type_class_peek_parent (klass); - - gobject_class->get_property = egg_tray_icon_get_property; - - widget_class->realize = egg_tray_icon_realize; - widget_class->unrealize = egg_tray_icon_unrealize; - - container_class->add = egg_tray_icon_add; - - g_object_class_install_property (gobject_class, - PROP_ORIENTATION, - g_param_spec_enum ("orientation", - _("Orientation"), - _("The orientation of the tray."), - GTK_TYPE_ORIENTATION, - GTK_ORIENTATION_HORIZONTAL, - G_PARAM_READABLE)); - -#if defined (GDK_WINDOWING_X11) - /* Nothing */ -#elif defined (GDK_WINDOWING_WIN32) - g_warning ("Port eggtrayicon to Win32"); -#else - g_warning ("Port eggtrayicon to this GTK+ backend"); -#endif -} - -static void -egg_tray_icon_get_property (GObject *object, - guint prop_id, - GValue *value, - GParamSpec *pspec) -{ - EggTrayIcon *icon = EGG_TRAY_ICON (object); - - switch (prop_id) - { - case PROP_ORIENTATION: - g_value_set_enum (value, icon->orientation); - break; - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); - break; - } -} - -#ifdef GDK_WINDOWING_X11 - -static Display * -egg_tray_icon_get_x_display(EggTrayIcon *icon) -{ - Display *xdisplay = NULL; - - GdkDisplay *display = gtk_widget_get_display (GTK_WIDGET (icon)); - if (!GDK_IS_DISPLAY (display)) - display = gdk_display_get_default (); - - xdisplay = GDK_DISPLAY_XDISPLAY (display); - - return xdisplay; -} - -static void -egg_tray_icon_get_orientation_property (EggTrayIcon *icon) -{ - Display *xdisplay; - Atom type; - int format; - union { - gulong *prop; - guchar *prop_ch; - } prop = { NULL }; - gulong nitems; - gulong bytes_after; - int error, result; - - g_assert (icon->manager_window != None); - - xdisplay = egg_tray_icon_get_x_display(icon); - if (xdisplay == NULL) - return; - - gdk_error_trap_push (); - type = None; - result = XGetWindowProperty (xdisplay, - icon->manager_window, - icon->orientation_atom, - 0, G_MAXLONG, FALSE, - XA_CARDINAL, - &type, &format, &nitems, - &bytes_after, &(prop.prop_ch)); - error = gdk_error_trap_pop (); - - if (error || result != Success) - return; - - if (type == XA_CARDINAL) - { - GtkOrientation orientation; - - orientation = (prop.prop [0] == SYSTEM_TRAY_ORIENTATION_HORZ) ? - GTK_ORIENTATION_HORIZONTAL : - GTK_ORIENTATION_VERTICAL; - - if (icon->orientation != orientation) - { - icon->orientation = orientation; - - g_object_notify (G_OBJECT (icon), "orientation"); - } - } - - if (prop.prop) - XFree (prop.prop); -} - -static GdkFilterReturn -egg_tray_icon_manager_filter (GdkXEvent *xevent, GdkEvent *event, gpointer user_data) -{ - EggTrayIcon *icon = user_data; - XEvent *xev = (XEvent *)xevent; - - if (xev->xany.type == ClientMessage && - xev->xclient.message_type == icon->manager_atom && - xev->xclient.data.l[1] == icon->selection_atom) - { - egg_tray_icon_update_manager_window (icon, TRUE); - } - else if (xev->xany.window == icon->manager_window) - { - if (xev->xany.type == PropertyNotify && - xev->xproperty.atom == icon->orientation_atom) - { - egg_tray_icon_get_orientation_property (icon); - } - if (xev->xany.type == DestroyNotify) - { - egg_tray_icon_manager_window_destroyed (icon); - } - } - return GDK_FILTER_CONTINUE; -} - -#endif - -static void -egg_tray_icon_unrealize (GtkWidget *widget) -{ -#ifdef GDK_WINDOWING_X11 - EggTrayIcon *icon = EGG_TRAY_ICON (widget); - GdkWindow *root_window; - - if (icon->manager_window != None) - { - GdkWindow *gdkwin; - - gdkwin = gdk_window_lookup_for_display (gtk_widget_get_display (widget), - icon->manager_window); - - gdk_window_remove_filter (gdkwin, egg_tray_icon_manager_filter, icon); - } - - root_window = gdk_screen_get_root_window (gtk_widget_get_screen (widget)); - - gdk_window_remove_filter (root_window, egg_tray_icon_manager_filter, icon); - - if (GTK_WIDGET_CLASS (parent_class)->unrealize) - (* GTK_WIDGET_CLASS (parent_class)->unrealize) (widget); -#endif -} - -#ifdef GDK_WINDOWING_X11 - -static void -egg_tray_icon_send_manager_message (EggTrayIcon *icon, - long message, - Window window, - long data1, - long data2, - long data3) -{ - XClientMessageEvent ev; - Display *display; - - ev.type = ClientMessage; - ev.window = window; - ev.message_type = icon->system_tray_opcode_atom; - ev.format = 32; - ev.data.l[0] = gdk_x11_get_server_time (GTK_WIDGET (icon)->window); - ev.data.l[1] = message; - ev.data.l[2] = data1; - ev.data.l[3] = data2; - ev.data.l[4] = data3; - - display = egg_tray_icon_get_x_display(icon); - - if (display == NULL) - return; - - gdk_error_trap_push (); - XSendEvent (display, - icon->manager_window, False, NoEventMask, (XEvent *)&ev); - XSync (display, False); - gdk_error_trap_pop (); -} - -static void -egg_tray_icon_send_dock_request (EggTrayIcon *icon) -{ - egg_tray_icon_send_manager_message (icon, - SYSTEM_TRAY_REQUEST_DOCK, - icon->manager_window, - gtk_plug_get_id (GTK_PLUG (icon)), - 0, 0); -} - -static void -egg_tray_icon_update_manager_window (EggTrayIcon *icon, - gboolean dock_if_realized) -{ - Display *xdisplay; - - if (icon->manager_window != None) - return; - - xdisplay = egg_tray_icon_get_x_display(icon); - - if (xdisplay == NULL) - return; - - XGrabServer (xdisplay); - - icon->manager_window = XGetSelectionOwner (xdisplay, - icon->selection_atom); - - if (icon->manager_window != None) - XSelectInput (xdisplay, - icon->manager_window, StructureNotifyMask|PropertyChangeMask); - - XUngrabServer (xdisplay); - XFlush (xdisplay); - - if (icon->manager_window != None) - { - GdkWindow *gdkwin; - - gdkwin = gdk_window_lookup_for_display (gtk_widget_get_display (GTK_WIDGET (icon)), - icon->manager_window); - - gdk_window_add_filter (gdkwin, egg_tray_icon_manager_filter, icon); - - if (dock_if_realized && GTK_WIDGET_REALIZED (icon)) - egg_tray_icon_send_dock_request (icon); - - egg_tray_icon_get_orientation_property (icon); - } -} - -static gboolean -transparent_expose_event (GtkWidget *widget, GdkEventExpose *event, gpointer user_data) -{ - gdk_window_clear_area (widget->window, event->area.x, event->area.y, - event->area.width, event->area.height); - return FALSE; -} - -static void -make_transparent_again (GtkWidget *widget, GtkStyle *previous_style, - gpointer user_data) -{ - gdk_window_set_back_pixmap (widget->window, NULL, TRUE); -} - -static void -make_transparent (GtkWidget *widget, gpointer user_data) -{ - if (GTK_WIDGET_NO_WINDOW (widget) || GTK_WIDGET_APP_PAINTABLE (widget)) - return; - - gtk_widget_set_app_paintable (widget, TRUE); - gtk_widget_set_double_buffered (widget, FALSE); - gdk_window_set_back_pixmap (widget->window, NULL, TRUE); - g_signal_connect (widget, "expose_event", - G_CALLBACK (transparent_expose_event), NULL); - g_signal_connect_after (widget, "style_set", - G_CALLBACK (make_transparent_again), NULL); -} - -static void -egg_tray_icon_manager_window_destroyed (EggTrayIcon *icon) -{ - GdkWindow *gdkwin; - - g_return_if_fail (icon->manager_window != None); - - gdkwin = gdk_window_lookup_for_display (gtk_widget_get_display (GTK_WIDGET (icon)), - icon->manager_window); - - gdk_window_remove_filter (gdkwin, egg_tray_icon_manager_filter, icon); - - icon->manager_window = None; - - egg_tray_icon_update_manager_window (icon, TRUE); -} - -#endif - -static void -egg_tray_icon_realize (GtkWidget *widget) -{ -#ifdef GDK_WINDOWING_X11 - EggTrayIcon *icon = EGG_TRAY_ICON (widget); - GdkScreen *screen; - Display *xdisplay; - char buffer[256]; - GdkWindow *root_window; - - if (GTK_WIDGET_CLASS (parent_class)->realize) - GTK_WIDGET_CLASS (parent_class)->realize (widget); - - make_transparent (widget, NULL); - - xdisplay = egg_tray_icon_get_x_display(icon); - - if (xdisplay == NULL) - return; - - screen = gtk_widget_get_screen (widget); - - /* Now see if there's a manager window around */ - g_snprintf (buffer, sizeof (buffer), - "_NET_SYSTEM_TRAY_S%d", - gdk_screen_get_number (screen)); - - icon->selection_atom = XInternAtom (xdisplay, buffer, False); - - icon->manager_atom = XInternAtom (xdisplay, "MANAGER", False); - - icon->system_tray_opcode_atom = XInternAtom (xdisplay, - "_NET_SYSTEM_TRAY_OPCODE", - False); - - icon->orientation_atom = XInternAtom (xdisplay, - "_NET_SYSTEM_TRAY_ORIENTATION", - False); - - egg_tray_icon_update_manager_window (icon, FALSE); - egg_tray_icon_send_dock_request (icon); - - root_window = gdk_screen_get_root_window (screen); - - /* Add a root window filter so that we get changes on MANAGER */ - gdk_window_add_filter (root_window, - egg_tray_icon_manager_filter, icon); -#endif -} - -static void -egg_tray_icon_add (GtkContainer *container, GtkWidget *widget) -{ - g_signal_connect (widget, "realize", - G_CALLBACK (make_transparent), NULL); - GTK_CONTAINER_CLASS (parent_class)->add (container, widget); -} - -EggTrayIcon * -egg_tray_icon_new_for_screen (GdkScreen *screen, const char *name) -{ - g_return_val_if_fail (GDK_IS_SCREEN (screen), NULL); - - return g_object_new (EGG_TYPE_TRAY_ICON, "screen", screen, "title", name, NULL); -} - -EggTrayIcon* -egg_tray_icon_new (const gchar *name) -{ - return g_object_new (EGG_TYPE_TRAY_ICON, "title", name, NULL); -} - -guint -egg_tray_icon_send_message (EggTrayIcon *icon, - gint timeout, - const gchar *message, - gint len) -{ - guint stamp; - - g_return_val_if_fail (EGG_IS_TRAY_ICON (icon), 0); - g_return_val_if_fail (timeout >= 0, 0); - g_return_val_if_fail (message != NULL, 0); - -#ifdef GDK_WINDOWING_X11 - if (icon->manager_window == None) - return 0; -#endif - - if (len < 0) - len = strlen (message); - - stamp = icon->stamp++; - -#ifdef GDK_WINDOWING_X11 - /* Get ready to send the message */ - egg_tray_icon_send_manager_message (icon, SYSTEM_TRAY_BEGIN_MESSAGE, - (Window)gtk_plug_get_id (GTK_PLUG (icon)), - timeout, len, stamp); - - /* Now to send the actual message */ - gdk_error_trap_push (); - while (len > 0) - { - XClientMessageEvent ev; - Display *xdisplay; - - xdisplay = egg_tray_icon_get_x_display(icon); - - if (xdisplay == NULL) - return 0; - - ev.type = ClientMessage; - ev.window = (Window)gtk_plug_get_id (GTK_PLUG (icon)); - ev.format = 8; - ev.message_type = XInternAtom (xdisplay, - "_NET_SYSTEM_TRAY_MESSAGE_DATA", False); - if (len > 20) - { - memcpy (&ev.data, message, 20); - len -= 20; - message += 20; - } - else - { - memcpy (&ev.data, message, len); - len = 0; - } - - XSendEvent (xdisplay, - icon->manager_window, False, StructureNotifyMask, (XEvent *)&ev); - XSync (xdisplay, False); - } - gdk_error_trap_pop (); -#endif - - return stamp; -} - -void -egg_tray_icon_cancel_message (EggTrayIcon *icon, - guint id) -{ - g_return_if_fail (EGG_IS_TRAY_ICON (icon)); - g_return_if_fail (id > 0); -#ifdef GDK_WINDOWING_X11 - egg_tray_icon_send_manager_message (icon, SYSTEM_TRAY_CANCEL_MESSAGE, - (Window)gtk_plug_get_id (GTK_PLUG (icon)), - id, 0, 0); -#endif -} - -GtkOrientation -egg_tray_icon_get_orientation (EggTrayIcon *icon) -{ - g_return_val_if_fail (EGG_IS_TRAY_ICON (icon), GTK_ORIENTATION_HORIZONTAL); - - return icon->orientation; -} diff --git a/src/eggtrayicon.h b/src/eggtrayicon.h deleted file mode 100644 index 557fdb20c..000000000 --- a/src/eggtrayicon.h +++ /dev/null @@ -1,80 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* eggtrayicon.h - * Copyright (C) 2002 Anders Carlsson - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library 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 - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ - -#ifndef __EGG_TRAY_ICON_H__ -#define __EGG_TRAY_ICON_H__ - -#include -#ifdef GDK_WINDOWING_X11 -#include -#endif - -G_BEGIN_DECLS - -#define EGG_TYPE_TRAY_ICON (egg_tray_icon_get_type ()) -#define EGG_TRAY_ICON(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), EGG_TYPE_TRAY_ICON, EggTrayIcon)) -#define EGG_TRAY_ICON_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), EGG_TYPE_TRAY_ICON, EggTrayIconClass)) -#define EGG_IS_TRAY_ICON(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), EGG_TYPE_TRAY_ICON)) -#define EGG_IS_TRAY_ICON_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), EGG_TYPE_TRAY_ICON)) -#define EGG_TRAY_ICON_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), EGG_TYPE_TRAY_ICON, EggTrayIconClass)) - -typedef struct _EggTrayIcon EggTrayIcon; -typedef struct _EggTrayIconClass EggTrayIconClass; - -struct _EggTrayIcon -{ - GtkPlug parent_instance; - - guint stamp; - -#ifdef GDK_WINDOWING_X11 - Atom selection_atom; - Atom manager_atom; - Atom system_tray_opcode_atom; - Atom orientation_atom; - Window manager_window; -#endif - GtkOrientation orientation; -}; - -struct _EggTrayIconClass -{ - GtkPlugClass parent_class; -}; - -GType egg_tray_icon_get_type (void); - -EggTrayIcon *egg_tray_icon_new_for_screen (GdkScreen *screen, - const gchar *name); - -EggTrayIcon *egg_tray_icon_new (const gchar *name); - -guint egg_tray_icon_send_message (EggTrayIcon *icon, - gint timeout, - const char *message, - gint len); -void egg_tray_icon_cancel_message (EggTrayIcon *icon, - guint id); - -GtkOrientation egg_tray_icon_get_orientation (EggTrayIcon *icon); - -G_END_DECLS - -#endif /* __EGG_TRAY_ICON_H__ */ diff --git a/src/features_window.py b/src/features_window.py index 609959e65..c89b597cb 100644 --- a/src/features_window.py +++ b/src/features_window.py @@ -83,10 +83,6 @@ class FeaturesWindow: _('Passive popups notifying for new events.'), _('Requires python-notify or instead python-dbus in conjunction with notification-daemon.'), _('Feature not available under Windows.')), - _('Trayicon'): (self.trayicon_available, - _('A icon in systemtray reflecting the current presence.'), - _('Requires python-gnome2-extras or compiled trayicon module from Gajim sources.'), - _('Requires PyGTK >= 2.10.')), _('Automatic status'): (self.idle_available, _('Ability to measure idle time, in order to set auto status.'), _('Requires libxss library.'), @@ -240,15 +236,6 @@ class FeaturesWindow: return False return True - def trayicon_available(self): - if os.name == 'nt': - return True - try: - import systray - except Exception: - return False - return True - def idle_available(self): from common import sleepy return sleepy.SUPPORTED diff --git a/src/gui_interface.py b/src/gui_interface.py index 98c1f3298..dc8959f91 100644 --- a/src/gui_interface.py +++ b/src/gui_interface.py @@ -3122,7 +3122,7 @@ class Interface: gajim.ipython_window = window def run(self): - if self.systray_capabilities and gajim.config.get('trayicon') != 'never': + if gajim.config.get('trayicon') != 'never': self.show_systray() self.roster = roster_window.RosterWindow() @@ -3357,21 +3357,9 @@ class Interface: gtkgui_helpers.make_jabber_state_images() self.systray_enabled = False - self.systray_capabilities = False - if (os.name == 'nt'): - import statusicon - self.systray = statusicon.StatusIcon() - self.systray_capabilities = True - else: # use ours, not GTK+ one - # [FIXME: remove this when we migrate to 2.10 and we can do - # cool tooltips somehow and (not dying to keep) animation] - import systray - self.systray_capabilities = systray.HAS_SYSTRAY_CAPABILITIES - if self.systray_capabilities: - self.systray = systray.Systray() - else: - gajim.config.set('trayicon', 'never') + import statusicon + self.systray = statusicon.StatusIcon() path_to_file = os.path.join(gajim.DATA_DIR, 'pixmaps', 'gajim.png') pix = gtk.gdk.pixbuf_new_from_file(path_to_file) diff --git a/src/statusicon.py b/src/statusicon.py index 90bdb8c91..e161d18a4 100644 --- a/src/statusicon.py +++ b/src/statusicon.py @@ -25,26 +25,62 @@ import sys import gtk -import systray +import gobject +import os + +import dialogs +import config +import tooltips +import gtkgui_helpers +import tooltips from common import gajim from common import helpers +from common import pep -class StatusIcon(systray.Systray): +class StatusIcon: '''Class for the notification area icon''' - #NOTE: gtk api does NOT allow: - # leave, enter motion notify - # and can't do cool tooltips we use def __init__(self): - systray.Systray.__init__(self) + self.single_message_handler_id = None + self.new_chat_handler_id = None + # click somewhere else does not popdown menu. workaround this. + self.added_hide_menuitem = False + self.status = 'offline' + self.xml = gtkgui_helpers.get_glade('systray_context_menu.glade') + self.systray_context_menu = self.xml.get_widget('systray_context_menu') + self.xml.signal_autoconnect(self) + self.popup_menus = [] self.status_icon = None + self.tooltip = tooltips.NotificationAreaTooltip() + + def subscribe_events(self): + '''Register listeners to the events class''' + gajim.events.event_added_subscribe(self.on_event_added) + gajim.events.event_removed_subscribe(self.on_event_removed) + + def unsubscribe_events(self): + '''Unregister listeners to the events class''' + gajim.events.event_added_unsubscribe(self.on_event_added) + gajim.events.event_removed_unsubscribe(self.on_event_removed) + + def on_event_added(self, event): + '''Called when an event is added to the event list''' + if event.show_in_systray: + self.set_img() + + def on_event_removed(self, event_list): + '''Called when one or more events are removed from the event list''' + self.set_img() def show_icon(self): if not self.status_icon: self.status_icon = gtk.StatusIcon() + self.status_icon.set_property('has-tooltip', True) self.status_icon.connect('activate', self.on_status_icon_left_clicked) self.status_icon.connect('popup-menu', self.on_status_icon_right_clicked) + self.status_icon.connect('query-tooltip', + self.on_status_icon_query_tooltip) self.set_img() self.status_icon.set_visible(True) @@ -53,6 +89,11 @@ class StatusIcon(systray.Systray): def on_status_icon_right_clicked(self, widget, event_button, event_time): self.make_menu(event_button, event_time) + def on_status_icon_query_tooltip(self, widget, x, y, keyboard_mode, tooltip): + self.tooltip.populate() + tooltip.set_custom(self.tooltip.hbox) + return True + def hide_icon(self): self.status_icon.set_visible(False) self.unsubscribe_events() @@ -64,8 +105,6 @@ class StatusIcon(systray.Systray): '''apart from image, we also update tooltip text here''' if not gajim.interface.systray_enabled: return - text = helpers.get_notification_icon_tooltip_text() - self.status_icon.set_tooltip(text) if gajim.events.get_nb_systray_events(): state = 'event' self.status_icon.set_blinking(True) @@ -79,7 +118,304 @@ class StatusIcon(systray.Systray): self.status_icon.set_from_pixbuf(image.get_pixbuf()) #FIXME: oops they forgot to support GIF animation? #or they were lazy to get it to work under Windows! WTF! - #elif image.get_storage_type() == gtk.IMAGE_ANIMATION: + elif image.get_storage_type() == gtk.IMAGE_ANIMATION: + self.status_icon.set_from_pixbuf( + image.get_animation().get_static_image()) # self.img_tray.set_from_animation(image.get_animation()) + def change_status(self, global_status): + ''' set tray image to 'global_status' ''' + # change image and status, only if it is different + if global_status is not None and self.status != global_status: + self.status = global_status + self.set_img() + + def start_chat(self, widget, account, jid): + contact = gajim.contacts.get_first_contact_from_jid(account, jid) + if gajim.interface.msg_win_mgr.has_window(jid, account): + gajim.interface.msg_win_mgr.get_window(jid, account).set_active_tab( + jid, account) + elif contact: + gajim.interface.new_chat(contact, account) + gajim.interface.msg_win_mgr.get_window(jid, account).set_active_tab( + jid, account) + + def on_single_message_menuitem_activate(self, widget, account): + dialogs.SingleMessageWindow(account, action='send') + + def on_new_chat(self, widget, account): + dialogs.NewChatDialog(account) + + def make_menu(self, event_button, event_time): + '''create chat with and new message (sub) menus/menuitems''' + for m in self.popup_menus: + m.destroy() + + chat_with_menuitem = self.xml.get_widget('chat_with_menuitem') + single_message_menuitem = self.xml.get_widget( + 'single_message_menuitem') + status_menuitem = self.xml.get_widget('status_menu') + join_gc_menuitem = self.xml.get_widget('join_gc_menuitem') + sounds_mute_menuitem = self.xml.get_widget('sounds_mute_menuitem') + + if self.single_message_handler_id: + single_message_menuitem.handler_disconnect( + self.single_message_handler_id) + self.single_message_handler_id = None + if self.new_chat_handler_id: + chat_with_menuitem.disconnect(self.new_chat_handler_id) + self.new_chat_handler_id = None + + sub_menu = gtk.Menu() + self.popup_menus.append(sub_menu) + status_menuitem.set_submenu(sub_menu) + + gc_sub_menu = gtk.Menu() # gc is always a submenu + join_gc_menuitem.set_submenu(gc_sub_menu) + + # We need our own set of status icons, let's make 'em! + iconset = gajim.config.get('iconset') + path = os.path.join(helpers.get_iconset_path(iconset), '16x16') + state_images = gtkgui_helpers.load_iconset(path) + + if 'muc_active' in state_images: + join_gc_menuitem.set_image(state_images['muc_active']) + + for show in ('online', 'chat', 'away', 'xa', 'dnd', 'invisible'): + uf_show = helpers.get_uf_show(show, use_mnemonic = True) + item = gtk.ImageMenuItem(uf_show) + item.set_image(state_images[show]) + sub_menu.append(item) + item.connect('activate', self.on_show_menuitem_activate, show) + + item = gtk.SeparatorMenuItem() + sub_menu.append(item) + + item = gtk.ImageMenuItem(_('_Change Status Message...')) + path = os.path.join(gajim.DATA_DIR, 'pixmaps', 'kbd_input.png') + img = gtk.Image() + img.set_from_file(path) + item.set_image(img) + sub_menu.append(item) + item.connect('activate', self.on_change_status_message_activate) + + connected_accounts = gajim.get_number_of_connected_accounts() + if connected_accounts < 1: + item.set_sensitive(False) + + connected_accounts_with_private_storage = 0 + + item = gtk.SeparatorMenuItem() + sub_menu.append(item) + + uf_show = helpers.get_uf_show('offline', use_mnemonic = True) + item = gtk.ImageMenuItem(uf_show) + item.set_image(state_images['offline']) + sub_menu.append(item) + item.connect('activate', self.on_show_menuitem_activate, 'offline') + + iskey = connected_accounts > 0 and not (connected_accounts == 1 and + gajim.connections[gajim.connections.keys()[0]].is_zeroconf) + chat_with_menuitem.set_sensitive(iskey) + single_message_menuitem.set_sensitive(iskey) + join_gc_menuitem.set_sensitive(iskey) + + accounts_list = sorted(gajim.contacts.get_accounts()) + # items that get shown whether an account is zeroconf or not + if connected_accounts > 1: # 2 or more connections? make submenus + account_menu_for_chat_with = gtk.Menu() + chat_with_menuitem.set_submenu(account_menu_for_chat_with) + self.popup_menus.append(account_menu_for_chat_with) + + for account in accounts_list: + if gajim.account_is_connected(account): + # for chat_with + item = gtk.MenuItem(_('using account %s') % account) + account_menu_for_chat_with.append(item) + item.connect('activate', self.on_new_chat, account) + + elif connected_accounts == 1: # one account + # one account connected, no need to show 'as jid' + for account in gajim.connections: + if gajim.connections[account].connected > 1: + # for start chat + self.new_chat_handler_id = chat_with_menuitem.connect( + 'activate', self.on_new_chat, account) + break # No other connected account + + # menu items that don't apply to zeroconf connections + if connected_accounts == 1 or (connected_accounts == 2 and \ + gajim.zeroconf_is_connected()): + # only one 'real' (non-zeroconf) account is connected, don't need + # submenus + for account in gajim.connections: + if gajim.account_is_connected(account) and \ + not gajim.config.get_per('accounts', account, 'is_zeroconf'): + if gajim.connections[account].private_storage_supported: + connected_accounts_with_private_storage += 1 + + # for single message + single_message_menuitem.remove_submenu() + self.single_message_handler_id = single_message_menuitem.\ + connect('activate', + self.on_single_message_menuitem_activate, account) + # join gc + gajim.interface.roster.add_bookmarks_list(gc_sub_menu, + account) + break # No other account connected + else: + # 2 or more 'real' accounts are connected, make submenus + account_menu_for_single_message = gtk.Menu() + single_message_menuitem.set_submenu( + account_menu_for_single_message) + self.popup_menus.append(account_menu_for_single_message) + + for account in accounts_list: + if gajim.connections[account].is_zeroconf or \ + not gajim.account_is_connected(account): + continue + if gajim.connections[account].private_storage_supported: + connected_accounts_with_private_storage += 1 + # for single message + item = gtk.MenuItem(_('using account %s') % account) + item.connect('activate', + self.on_single_message_menuitem_activate, account) + account_menu_for_single_message.append(item) + + # join gc + gc_item = gtk.MenuItem(_('using account %s') % account, False) + gc_sub_menu.append(gc_item) + gc_menuitem_menu = gtk.Menu() + gajim.interface.roster.add_bookmarks_list(gc_menuitem_menu, + account) + gc_item.set_submenu(gc_menuitem_menu) + gc_sub_menu.show_all() + + newitem = gtk.SeparatorMenuItem() # separator + gc_sub_menu.append(newitem) + newitem = gtk.ImageMenuItem(_('_Manage Bookmarks...')) + img = gtk.image_new_from_stock(gtk.STOCK_PREFERENCES, gtk.ICON_SIZE_MENU) + newitem.set_image(img) + newitem.connect('activate', + gajim.interface.roster.on_manage_bookmarks_menuitem_activate) + gc_sub_menu.append(newitem) + if connected_accounts_with_private_storage == 0: + newitem.set_sensitive(False) + + sounds_mute_menuitem.set_active(not gajim.config.get('sounds_on')) + + if os.name == 'nt': + if self.added_hide_menuitem is False: + self.systray_context_menu.prepend(gtk.SeparatorMenuItem()) + item = gtk.MenuItem(_('Hide this menu')) + self.systray_context_menu.prepend(item) + self.added_hide_menuitem = True + + self.systray_context_menu.show_all() + self.systray_context_menu.popup(None, None, None, 0, + event_time) + + def on_show_all_events_menuitem_activate(self, widget): + events = gajim.events.get_systray_events() + for account in events: + for jid in events[account]: + for event in events[account][jid]: + gajim.interface.handle_event(account, jid, event.type_) + + def on_sounds_mute_menuitem_activate(self, widget): + gajim.config.set('sounds_on', not widget.get_active()) + gajim.interface.save_config() + + def on_show_roster_menuitem_activate(self, widget): + win = gajim.interface.roster.window + win.present() + + def on_preferences_menuitem_activate(self, widget): + if 'preferences' in gajim.interface.instances: + gajim.interface.instances['preferences'].window.present() + else: + gajim.interface.instances['preferences'] = config.PreferencesWindow() + + def on_quit_menuitem_activate(self, widget): + gajim.interface.roster.on_quit_request() + + def on_left_click(self): + win = gajim.interface.roster.window + if len(gajim.events.get_systray_events()) == 0: + # No pending events, so toggle visible/hidden for roster window + if not win.iconify_initially and (win.get_property( + 'has-toplevel-focus') or os.name == 'nt'): + # visible in ANY virtual desktop? + + # we could be in another VD right now. eg vd2 + # and we want to show it in vd2 + if not gtkgui_helpers.possibly_move_window_in_current_desktop(win): + win.set_property('skip-taskbar-hint', False) + win.iconify() # else we hide it from VD that was visible in + win.set_property('skip-taskbar-hint', True) + else: + win.deiconify() + if not gajim.config.get('roster_window_skip_taskbar'): + win.set_property('skip-taskbar-hint', False) + win.present_with_time(gtk.get_current_event_time()) + else: + self.handle_first_event() + + def handle_first_event(self): + account, jid, event = gajim.events.get_first_systray_event() + if not event: + return + gajim.interface.handle_event(account, jid, event.type_) + + def on_middle_click(self): + '''middle click raises window to have complete focus (fe. get kbd events) + but if already raised, it hides it''' + win = gajim.interface.roster.window + if win.is_active(): # is it fully raised? (eg does it receive kbd events?) + win.hide() + else: + win.present() + + def on_clicked(self, widget, event): + self.on_tray_leave_notify_event(widget, None) + if event.type != gtk.gdk.BUTTON_PRESS: + return + if event.button == 1: # Left click + self.on_left_click() + elif event.button == 2: # middle click + self.on_middle_click() + elif event.button == 3: # right click + self.make_menu(event.button, event.time) + + def on_show_menuitem_activate(self, widget, show): + # we all add some fake (we cannot select those nor have them as show) + # but this helps to align with roster's status_combobox index positions + l = ['online', 'chat', 'away', 'xa', 'dnd', 'invisible', 'SEPARATOR', + 'CHANGE_STATUS_MSG_MENUITEM', 'SEPARATOR', 'offline'] + index = l.index(show) + if not helpers.statuses_unified(): + gajim.interface.roster.status_combobox.set_active(index + 2) + return + current = gajim.interface.roster.status_combobox.get_active() + if index != current: + gajim.interface.roster.status_combobox.set_active(index) + + def on_change_status_message_activate(self, widget): + model = gajim.interface.roster.status_combobox.get_model() + active = gajim.interface.roster.status_combobox.get_active() + status = model[active][2].decode('utf-8') + def on_response(message, pep_dict): + if message is None: # None if user press Cancel + return + accounts = gajim.connections.keys() + for acct in accounts: + if not gajim.config.get_per('accounts', acct, + 'sync_with_global_status'): + continue + show = gajim.SHOW_LIST[gajim.connections[acct].connected] + gajim.interface.roster.send_status(acct, show, message) + gajim.interface.roster.send_pep(acct, pep_dict) + dlg = dialogs.ChangeStatusMessageDialog(on_response, status) + dlg.dialog.present() + # vim: se ts=3: diff --git a/src/systray.py b/src/systray.py deleted file mode 100644 index e2c09331b..000000000 --- a/src/systray.py +++ /dev/null @@ -1,459 +0,0 @@ -# -*- coding:utf-8 -*- -## src/systray.py -## -## Copyright (C) 2003-2005 Vincent Hanquez -## Copyright (C) 2003-2008 Yann Leboulanger -## Copyright (C) 2005 Norman Rasmussen -## Copyright (C) 2005-2006 Dimitur Kirov -## Travis Shirk -## Copyright (C) 2005-2007 Nikos Kouremenos -## Copyright (C) 2006 Stefan Bethge -## Copyright (C) 2006-2008 Jean-Marie Traissard -## Copyright (C) 2007 Lukas Petrovicky -## Julien Pivotto -## -## This file is part of Gajim. -## -## Gajim 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; version 3 only. -## -## Gajim 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 Gajim. If not, see . -## - -import gtk -import gobject -import os - -import dialogs -import config -import tooltips -import gtkgui_helpers - -from common import gajim -from common import helpers -from common import pep - -HAS_SYSTRAY_CAPABILITIES = True - -try: - import egg.trayicon as trayicon # gnomepythonextras trayicon -except Exception: - try: - import trayicon # our trayicon - except Exception: - gajim.log.debug('No trayicon module available') - HAS_SYSTRAY_CAPABILITIES = False - - -class Systray: - '''Class for icon in the notification area - This class is both base class (for statusicon.py) and normal class - for trayicon in GNU/Linux''' - - def __init__(self): - self.single_message_handler_id = None - self.new_chat_handler_id = None - self.t = None - # click somewhere else does not popdown menu. workaround this. - self.added_hide_menuitem = False - self.img_tray = gtk.Image() - self.status = 'offline' - self.xml = gtkgui_helpers.get_glade('systray_context_menu.glade') - self.systray_context_menu = self.xml.get_widget('systray_context_menu') - self.xml.signal_autoconnect(self) - self.popup_menus = [] - - def subscribe_events(self): - '''Register listeners to the events class''' - gajim.events.event_added_subscribe(self.on_event_added) - gajim.events.event_removed_subscribe(self.on_event_removed) - - def unsubscribe_events(self): - '''Unregister listeners to the events class''' - gajim.events.event_added_unsubscribe(self.on_event_added) - gajim.events.event_removed_unsubscribe(self.on_event_removed) - - def on_event_added(self, event): - '''Called when an event is added to the event list''' - if event.show_in_systray: - self.set_img() - - def on_event_removed(self, event_list): - '''Called when one or more events are removed from the event list''' - self.set_img() - - def set_img(self): - if not gajim.interface.systray_enabled: - return - if gajim.events.get_nb_systray_events(): - state = 'event' - else: - state = self.status - if state != 'event' and gajim.config.get('trayicon') == 'on_event': - self.t.hide() - else: - self.t.show() - image = gajim.interface.jabber_state_images['16'][state] - if image.get_storage_type() == gtk.IMAGE_ANIMATION: - self.img_tray.set_from_animation(image.get_animation()) - elif image.get_storage_type() == gtk.IMAGE_PIXBUF: - self.img_tray.set_from_pixbuf(image.get_pixbuf()) - - def change_status(self, global_status): - ''' set tray image to 'global_status' ''' - # change image and status, only if it is different - if global_status is not None and self.status != global_status: - self.status = global_status - self.set_img() - - def start_chat(self, widget, account, jid): - contact = gajim.contacts.get_first_contact_from_jid(account, jid) - if gajim.interface.msg_win_mgr.has_window(jid, account): - gajim.interface.msg_win_mgr.get_window(jid, account).set_active_tab( - jid, account) - elif contact: - gajim.interface.new_chat(contact, account) - gajim.interface.msg_win_mgr.get_window(jid, account).set_active_tab( - jid, account) - - def on_single_message_menuitem_activate(self, widget, account): - dialogs.SingleMessageWindow(account, action = 'send') - - def on_new_chat(self, widget, account): - dialogs.NewChatDialog(account) - - def make_menu(self, event_button, event_time): - '''create chat with and new message (sub) menus/menuitems''' - for m in self.popup_menus: - m.destroy() - - chat_with_menuitem = self.xml.get_widget('chat_with_menuitem') - single_message_menuitem = self.xml.get_widget( - 'single_message_menuitem') - status_menuitem = self.xml.get_widget('status_menu') - join_gc_menuitem = self.xml.get_widget('join_gc_menuitem') - sounds_mute_menuitem = self.xml.get_widget('sounds_mute_menuitem') - - if self.single_message_handler_id: - single_message_menuitem.handler_disconnect( - self.single_message_handler_id) - self.single_message_handler_id = None - if self.new_chat_handler_id: - chat_with_menuitem.disconnect(self.new_chat_handler_id) - self.new_chat_handler_id = None - - sub_menu = gtk.Menu() - self.popup_menus.append(sub_menu) - status_menuitem.set_submenu(sub_menu) - - gc_sub_menu = gtk.Menu() # gc is always a submenu - join_gc_menuitem.set_submenu(gc_sub_menu) - - # We need our own set of status icons, let's make 'em! - iconset = gajim.config.get('iconset') - path = os.path.join(helpers.get_iconset_path(iconset), '16x16') - state_images = gtkgui_helpers.load_iconset(path) - - if 'muc_active' in state_images: - join_gc_menuitem.set_image(state_images['muc_active']) - - for show in ('online', 'chat', 'away', 'xa', 'dnd', 'invisible'): - uf_show = helpers.get_uf_show(show, use_mnemonic = True) - item = gtk.ImageMenuItem(uf_show) - item.set_image(state_images[show]) - sub_menu.append(item) - item.connect('activate', self.on_show_menuitem_activate, show) - - item = gtk.SeparatorMenuItem() - sub_menu.append(item) - - item = gtk.ImageMenuItem(_('_Change Status Message...')) - path = os.path.join(gajim.DATA_DIR, 'pixmaps', 'kbd_input.png') - img = gtk.Image() - img.set_from_file(path) - item.set_image(img) - sub_menu.append(item) - item.connect('activate', self.on_change_status_message_activate) - - connected_accounts = gajim.get_number_of_connected_accounts() - if connected_accounts < 1: - item.set_sensitive(False) - - connected_accounts_with_private_storage = 0 - - item = gtk.SeparatorMenuItem() - sub_menu.append(item) - - uf_show = helpers.get_uf_show('offline', use_mnemonic = True) - item = gtk.ImageMenuItem(uf_show) - item.set_image(state_images['offline']) - sub_menu.append(item) - item.connect('activate', self.on_show_menuitem_activate, 'offline') - - iskey = connected_accounts > 0 and not (connected_accounts == 1 and - gajim.connections[gajim.connections.keys()[0]].is_zeroconf) - chat_with_menuitem.set_sensitive(iskey) - single_message_menuitem.set_sensitive(iskey) - join_gc_menuitem.set_sensitive(iskey) - - accounts_list = sorted(gajim.contacts.get_accounts()) - # items that get shown whether an account is zeroconf or not - if connected_accounts > 1: # 2 or more connections? make submenus - account_menu_for_chat_with = gtk.Menu() - chat_with_menuitem.set_submenu(account_menu_for_chat_with) - self.popup_menus.append(account_menu_for_chat_with) - - for account in accounts_list: - if gajim.account_is_connected(account): - # for chat_with - item = gtk.MenuItem(_('using account %s') % account) - account_menu_for_chat_with.append(item) - item.connect('activate', self.on_new_chat, account) - - elif connected_accounts == 1: # one account - # one account connected, no need to show 'as jid' - for account in gajim.connections: - if gajim.connections[account].connected > 1: - # for start chat - self.new_chat_handler_id = chat_with_menuitem.connect( - 'activate', self.on_new_chat, account) - break # No other connected account - - # menu items that don't apply to zeroconf connections - if connected_accounts == 1 or (connected_accounts == 2 and \ - gajim.zeroconf_is_connected()): - # only one 'real' (non-zeroconf) account is connected, don't need - # submenus - for account in gajim.connections: - if gajim.account_is_connected(account) and \ - not gajim.config.get_per('accounts', account, 'is_zeroconf'): - if gajim.connections[account].private_storage_supported: - connected_accounts_with_private_storage += 1 - - # for single message - single_message_menuitem.remove_submenu() - self.single_message_handler_id = single_message_menuitem.\ - connect('activate', - self.on_single_message_menuitem_activate, account) - # join gc - gajim.interface.roster.add_bookmarks_list(gc_sub_menu, - account) - break # No other account connected - else: - # 2 or more 'real' accounts are connected, make submenus - account_menu_for_single_message = gtk.Menu() - single_message_menuitem.set_submenu( - account_menu_for_single_message) - self.popup_menus.append(account_menu_for_single_message) - - for account in accounts_list: - if gajim.connections[account].is_zeroconf or \ - not gajim.account_is_connected(account): - continue - if gajim.connections[account].private_storage_supported: - connected_accounts_with_private_storage += 1 - # for single message - item = gtk.MenuItem(_('using account %s') % account) - item.connect('activate', - self.on_single_message_menuitem_activate, account) - account_menu_for_single_message.append(item) - - # join gc - gc_item = gtk.MenuItem(_('using account %s') % account, False) - gc_sub_menu.append(gc_item) - gc_menuitem_menu = gtk.Menu() - gajim.interface.roster.add_bookmarks_list(gc_menuitem_menu, - account) - gc_item.set_submenu(gc_menuitem_menu) - gc_sub_menu.show_all() - - newitem = gtk.SeparatorMenuItem() # separator - gc_sub_menu.append(newitem) - newitem = gtk.ImageMenuItem(_('_Manage Bookmarks...')) - img = gtk.image_new_from_stock(gtk.STOCK_PREFERENCES, gtk.ICON_SIZE_MENU) - newitem.set_image(img) - newitem.connect('activate', - gajim.interface.roster.on_manage_bookmarks_menuitem_activate) - gc_sub_menu.append(newitem) - if connected_accounts_with_private_storage == 0: - newitem.set_sensitive(False) - - sounds_mute_menuitem.set_active(not gajim.config.get('sounds_on')) - - if os.name == 'nt': - if self.added_hide_menuitem is False: - self.systray_context_menu.prepend(gtk.SeparatorMenuItem()) - item = gtk.MenuItem(_('Hide this menu')) - self.systray_context_menu.prepend(item) - self.added_hide_menuitem = True - - self.systray_context_menu.show_all() - self.systray_context_menu.popup(None, None, None, 0, - event_time) - - def on_show_all_events_menuitem_activate(self, widget): - events = gajim.events.get_systray_events() - for account in events: - for jid in events[account]: - for event in events[account][jid]: - gajim.interface.handle_event(account, jid, event.type_) - - def on_sounds_mute_menuitem_activate(self, widget): - gajim.config.set('sounds_on', not widget.get_active()) - gajim.interface.save_config() - - def on_show_roster_menuitem_activate(self, widget): - win = gajim.interface.roster.window - win.present() - - def on_preferences_menuitem_activate(self, widget): - if 'preferences' in gajim.interface.instances: - gajim.interface.instances['preferences'].window.present() - else: - gajim.interface.instances['preferences'] = config.PreferencesWindow() - - def on_quit_menuitem_activate(self, widget): - gajim.interface.roster.on_quit_request() - - def on_left_click(self): - win = gajim.interface.roster.window - if len(gajim.events.get_systray_events()) == 0: - # No pending events, so toggle visible/hidden for roster window - if not win.iconify_initially and (win.get_property( - 'has-toplevel-focus') or os.name == 'nt'): - # visible in ANY virtual desktop? - - # we could be in another VD right now. eg vd2 - # and we want to show it in vd2 - if not gtkgui_helpers.possibly_move_window_in_current_desktop(win): - win.set_property('skip-taskbar-hint', False) - win.iconify() # else we hide it from VD that was visible in - win.set_property('skip-taskbar-hint', True) - else: - win.deiconify() - if not gajim.config.get('roster_window_skip_taskbar'): - win.set_property('skip-taskbar-hint', False) - win.present_with_time(gtk.get_current_event_time()) - else: - self.handle_first_event() - - def handle_first_event(self): - account, jid, event = gajim.events.get_first_systray_event() - if not event: - return - gajim.interface.handle_event(account, jid, event.type_) - - def on_middle_click(self): - '''middle click raises window to have complete focus (fe. get kbd events) - but if already raised, it hides it''' - win = gajim.interface.roster.window - if win.is_active(): # is it fully raised? (eg does it receive kbd events?) - win.hide() - else: - win.present() - - def on_clicked(self, widget, event): - self.on_tray_leave_notify_event(widget, None) - if event.type != gtk.gdk.BUTTON_PRESS: - return - if event.button == 1: # Left click - self.on_left_click() - elif event.button == 2: # middle click - self.on_middle_click() - elif event.button == 3: # right click - self.make_menu(event.button, event.time) - - def on_show_menuitem_activate(self, widget, show): - # we all add some fake (we cannot select those nor have them as show) - # but this helps to align with roster's status_combobox index positions - l = ['online', 'chat', 'away', 'xa', 'dnd', 'invisible', 'SEPARATOR', - 'CHANGE_STATUS_MSG_MENUITEM', 'SEPARATOR', 'offline'] - index = l.index(show) - if not helpers.statuses_unified(): - gajim.interface.roster.status_combobox.set_active(index + 2) - return - current = gajim.interface.roster.status_combobox.get_active() - if index != current: - gajim.interface.roster.status_combobox.set_active(index) - - def on_change_status_message_activate(self, widget): - model = gajim.interface.roster.status_combobox.get_model() - active = gajim.interface.roster.status_combobox.get_active() - status = model[active][2].decode('utf-8') - def on_response(message, pep_dict): - if message is None: # None if user press Cancel - return - accounts = gajim.connections.keys() - for acct in accounts: - if not gajim.config.get_per('accounts', acct, - 'sync_with_global_status'): - continue - show = gajim.SHOW_LIST[gajim.connections[acct].connected] - gajim.interface.roster.send_status(acct, show, message) - gajim.interface.roster.send_pep(acct, pep_dict) - dlg = dialogs.ChangeStatusMessageDialog(on_response, status) - dlg.dialog.present() - - def show_tooltip(self, widget): - position = widget.window.get_origin() - if self.tooltip.id == position: - size = widget.window.get_size() - self.tooltip.show_tooltip('', size[1], position[1]) - - def on_tray_motion_notify_event(self, widget, event): - position = widget.window.get_origin() - if self.tooltip.timeout > 0: - if self.tooltip.id != position: - self.tooltip.hide_tooltip() - if self.tooltip.timeout == 0 and \ - self.tooltip.id != position: - self.tooltip.id = position - self.tooltip.timeout = gobject.timeout_add(500, - self.show_tooltip, widget) - - def on_tray_leave_notify_event(self, widget, event): - position = widget.window.get_origin() - if self.tooltip.timeout > 0 and \ - self.tooltip.id == position: - self.tooltip.hide_tooltip() - - def on_tray_destroyed(self, widget): - '''re-add trayicon when systray is destroyed''' - self.t = None - if gajim.interface.systray_enabled: - self.show_icon() - - def show_icon(self): - if not self.t: - self.t = trayicon.TrayIcon('Gajim') - self.t.connect('destroy', self.on_tray_destroyed) - eb = gtk.EventBox() - # avoid draw seperate bg color in some gtk themes - eb.set_visible_window(False) - eb.set_events(gtk.gdk.POINTER_MOTION_MASK) - eb.connect('button-press-event', self.on_clicked) - eb.connect('motion-notify-event', self.on_tray_motion_notify_event) - eb.connect('leave-notify-event', self.on_tray_leave_notify_event) - self.tooltip = tooltips.NotificationAreaTooltip() - - self.img_tray = gtk.Image() - eb.add(self.img_tray) - self.t.add(eb) - self.set_img() - self.subscribe_events() - self.t.show_all() - - def hide_icon(self): - if self.t: - self.t.destroy() - self.t = None - self.unsubscribe_events() - -# vim: se ts=3: diff --git a/src/tooltips.py b/src/tooltips.py index 847e6a17a..5e55166c0 100644 --- a/src/tooltips.py +++ b/src/tooltips.py @@ -269,7 +269,7 @@ class NotificationAreaTooltip(BaseTooltip, StatusTable): for line in acct['event_lines']: self.add_text_row(' ' + line, 1) - def populate(self, data): + def populate(self, data=''): self.create_window() self.create_table() @@ -280,7 +280,7 @@ class NotificationAreaTooltip(BaseTooltip, StatusTable): self.table.set_property('column-spacing', 1) self.hbox.add(self.table) - self.win.add(self.hbox) + self.hbox.show_all() class GCTooltip(BaseTooltip): ''' Tooltip that is shown in the GC treeview ''' diff --git a/src/trayicon.defs b/src/trayicon.defs deleted file mode 100644 index 6d253cf83..000000000 --- a/src/trayicon.defs +++ /dev/null @@ -1,59 +0,0 @@ -;; -*- scheme -*- - -; object definitions ... -(define-object TrayIcon - (in-module "Egg") - (parent "GtkPlug") - (c-name "EggTrayIcon") - (gtype-id "EGG_TYPE_TRAY_ICON") -) - -;; Enumerations and flags ... - - -;; From eggtrayicon.h - -(define-function egg_tray_icon_get_type - (c-name "egg_tray_icon_get_type") - (return-type "GType") -) - -(define-function egg_tray_icon_new_for_screen - (c-name "egg_tray_icon_new_for_screen") - (return-type "EggTrayIcon*") - (parameters - '("GdkScreen*" "screen") - '("const-gchar*" "name") - ) -) - -(define-function egg_tray_icon_new - (c-name "egg_tray_icon_new") - (is-constructor-of "EggTrayIcon") - (return-type "EggTrayIcon*") - (parameters - '("const-gchar*" "name") - ) -) - -(define-method send_message - (of-object "EggTrayIcon") - (c-name "egg_tray_icon_send_message") - (return-type "guint") - (parameters - '("gint" "timeout") - '("const-char*" "message") - '("gint" "len") - ) -) - -(define-method cancel_message - (of-object "EggTrayIcon") - (c-name "egg_tray_icon_cancel_message") - (return-type "none") - (parameters - '("guint" "id") - ) -) - - diff --git a/src/trayicon.override b/src/trayicon.override deleted file mode 100644 index 75bd7ed8f..000000000 --- a/src/trayicon.override +++ /dev/null @@ -1,47 +0,0 @@ -/* -*- Mode: C; c-basic-offset: 4 -*- - * src/trayicon.override - * - * Copyright (C) 2004-2005 Yann Leboulanger - * - * This file is part of Gajim. - * - * Gajim 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; version 3 only. - * - * Gajim 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 Gajim. If not, see . - */ -%% -headers -#include - -#include "pygobject.h" -#include "eggtrayicon.h" -%% -modulename trayicon -%% -import gtk.Plug as PyGtkPlug_Type -import gtk.gdk.Screen as PyGdkScreen_Type -%% -ignore-glob - *_get_type -%% -override egg_tray_icon_send_message kwargs -static PyObject* -_wrap_egg_tray_icon_send_message(PyGObject *self, PyObject *args, PyObject *kwargs) -{ - static char *kwlist[] = {"timeout", "message", NULL}; - int timeout, len, ret; - char *message; - - if (!PyArg_ParseTupleAndKeywords(args, kwargs, "is#:TrayIcon.send_message", kwlist, &timeout, &message, &len)) - return NULL; - ret = egg_tray_icon_send_message(EGG_TRAY_ICON(self->obj), timeout, message, len); - return PyInt_FromLong(ret); -} diff --git a/src/trayiconmodule.c b/src/trayiconmodule.c deleted file mode 100644 index 7a2b1206f..000000000 --- a/src/trayiconmodule.c +++ /dev/null @@ -1,43 +0,0 @@ -/* -*- Mode: C; c-basic-offset: 4 -*- - * src/trayiconmodule.c - * - * Copyright (C) 2004-2005 Yann Leboulanger - * - * This file is part of Gajim. - * - * Gajim 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; version 3 only. - * - * Gajim 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 Gajim. If not, see . - */ - -/* include this first, before NO_IMPORT_PYGOBJECT is defined */ -#include - -void trayicon_register_classes (PyObject *d); - -extern PyMethodDef trayicon_functions[]; - -DL_EXPORT(void) -inittrayicon(void) -{ - PyObject *m, *d; - - init_pygobject (); - - m = Py_InitModule ("trayicon", trayicon_functions); - d = PyModule_GetDict (m); - - trayicon_register_classes (d); - - if (PyErr_Occurred ()) { - Py_FatalError ("can't initialise module trayicon :("); - } -} From e3dbbed2dd95da39cf0651ae4ddb1bff73db73dc Mon Sep 17 00:00:00 2001 From: Yann Leboulanger Date: Tue, 24 Nov 2009 15:06:04 +0100 Subject: [PATCH 050/259] auto-increment order value in privacy list entries. Fixes #5441 --- src/dialogs.py | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/dialogs.py b/src/dialogs.py index 4d197a896..4f2802e75 100644 --- a/src/dialogs.py +++ b/src/dialogs.py @@ -3080,6 +3080,8 @@ class PrivacyListWindow: self.global_rules = {} self.list_of_groups = {} + self.max_order = 0 + # Default Edit Values self.edit_rule_type = 'jid' self.allow_deny = 'allow' @@ -3175,6 +3177,8 @@ class PrivacyListWindow: else: text_item = _('Order: %(order)s, action: %(action)s') % \ {'order': rule['order'], 'action': rule['action']} + if int(rule['order']) > self.max_order: + self.max_order = int(rule['order']) self.global_rules[text_item] = rule self.list_of_rules_combobox.append_text(text_item) if len(rules) == 0: @@ -3322,7 +3326,7 @@ class PrivacyListWindow: self.edit_view_status_checkbutton.set_active(False) self.edit_send_status_checkbutton.set_active(False) self.edit_all_checkbutton.set_active(False) - self.edit_order_spinbutton.set_value(1) + self.edit_order_spinbutton.set_value(self.max_order + 1) self.edit_type_group_combobox.set_active(0) self.edit_type_subscription_combobox.set_active(0) self.add_edit_rule_label.set_label( @@ -3365,6 +3369,8 @@ class PrivacyListWindow: def on_save_rule_button_clicked(self, widget): tags=[] current_tags = self.get_current_tags() + if int(current_tags['order']) > self.max_order: + self.max_order = int(current_tags['order']) if self.active_rule == '': tags.append(current_tags) From 478454985b72464d7bccf2916a142823e714cddc Mon Sep 17 00:00:00 2001 From: Yann Leboulanger Date: Tue, 24 Nov 2009 15:41:16 +0100 Subject: [PATCH 051/259] fix strimg comparison according to locales. Fixes #4201 --- src/groupchat_control.py | 11 +++-------- src/roster_window.py | 20 +++++++++++--------- 2 files changed, 14 insertions(+), 17 deletions(-) diff --git a/src/groupchat_control.py b/src/groupchat_control.py index e4db34610..4653d0d76 100644 --- a/src/groupchat_control.py +++ b/src/groupchat_control.py @@ -29,6 +29,7 @@ import os import time +import locale import gtk import pango import gobject @@ -394,9 +395,7 @@ class GroupchatControl(ChatControlBase): nick1 = nick1.decode('utf-8') nick2 = nick2.decode('utf-8') if type1 == 'role': - if nick1 < nick2: - return -1 - return 1 + return locale.strcoll(nick1, nick2) if type1 == 'contact': gc_contact1 = gajim.contacts.get_gc_contact(self.account, self.room_jid, nick1) @@ -420,11 +419,7 @@ class GroupchatControl(ChatControlBase): # We compare names name1 = gc_contact1.get_shown_name() name2 = gc_contact2.get_shown_name() - if name1.lower() < name2.lower(): - return -1 - if name2.lower() < name1.lower(): - return 1 - return 0 + return locale.strcoll(name1.lower(), name2.lower()) def on_msg_textview_populate_popup(self, textview, menu): '''we override the default context menu and we prepend Clear diff --git a/src/roster_window.py b/src/roster_window.py index 6e3bcdc2d..900d973c4 100644 --- a/src/roster_window.py +++ b/src/roster_window.py @@ -38,6 +38,7 @@ import gobject import os import sys import time +import locale import common.sleepy import history_window @@ -1558,9 +1559,7 @@ class RosterWindow: account1 = account1.decode('utf-8') account2 = account2.decode('utf-8') if type1 == 'account': - if account1 < account2: - return -1 - return 1 + return locale.strcoll(account1, account2) jid1 = model[iter1][C_JID].decode('utf-8') jid2 = model[iter2][C_JID].decode('utf-8') if type1 == 'contact': @@ -1607,20 +1606,23 @@ class RosterWindow: elif show1 > show2: return 1 # We compare names - if name1.lower() < name2.lower(): + cmp_result = locale.strcoll(name1.lower(), name2.lower()) + if cmp_result < 0: return -1 - if name2.lower() < name1.lower(): + if cmp_result > 0: return 1 if type1 == 'contact' and type2 == 'contact': # We compare account names - if account1.lower() < account2.lower(): + cmp_result = locale.strcoll(account1.lower(), account2.lower()) + if cmp_result < 0: return -1 - if account2.lower() < account1.lower(): + if cmp_result > 0: return 1 # We compare jids - if jid1.lower() < jid2.lower(): + cmp_result = locale.strcoll(jid1.lower(), jid2.lower()) + if cmp_result < 0: return -1 - if jid2.lower() < jid1.lower(): + if cmp_result > 0: return 1 return 0 From 39dc648ec81933867520d2584c6174b1b0f209aa Mon Sep 17 00:00:00 2001 From: Yann Leboulanger Date: Tue, 24 Nov 2009 15:42:31 +0100 Subject: [PATCH 052/259] don't use removed variables --- src/config.py | 2 -- src/roster_window.py | 6 ++---- 2 files changed, 2 insertions(+), 6 deletions(-) diff --git a/src/config.py b/src/config.py index a8e3b0902..d8ad836f7 100644 --- a/src/config.py +++ b/src/config.py @@ -297,8 +297,6 @@ class PreferencesWindow: systray_combobox.set_active(1) else: systray_combobox.set_active(2) - if not gajim.interface.systray_capabilities: - systray_combobox.set_sensitive(False) # sounds if gajim.config.get('sounds_on'): diff --git a/src/roster_window.py b/src/roster_window.py index 900d973c4..344c4574a 100644 --- a/src/roster_window.py +++ b/src/roster_window.py @@ -5809,10 +5809,8 @@ class RosterWindow: if gajim.config.get('show_roster_on_startup'): self.window.show_all() else: - if not gajim.config.get('trayicon') or not \ - gajim.interface.systray_capabilities: - # cannot happen via GUI, but I put this incase user touches - # config. without trayicon, he or she should see the roster! + if gajim.config.get('trayicon') != 'always': + # Without trayicon, user should see the roster! self.window.show_all() gajim.config.set('show_roster_on_startup', True) From 5ce4d52dc3d30684964ea8cc8a406cbc27a719fc Mon Sep 17 00:00:00 2001 From: Yann Leboulanger Date: Tue, 24 Nov 2009 19:41:29 +0100 Subject: [PATCH 053/259] Don't clean dict twice, Fixes #5419 --- src/gui_interface.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/gui_interface.py b/src/gui_interface.py index dc8959f91..7c7825100 100644 --- a/src/gui_interface.py +++ b/src/gui_interface.py @@ -1945,10 +1945,10 @@ class Interface: # ('INSECURE_SSL_CONNECTION', account, (connection, connection_type)) server = gajim.config.get_per('accounts', account, 'hostname') def on_ok(is_checked): - del self.instances[account]['online_dialog']['insecure_ssl'] if not is_checked[0]: on_cancel() return + del self.instances[account]['online_dialog']['insecure_ssl'] if is_checked[1]: gajim.config.set_per('accounts', account, 'warn_when_insecure_ssl_connection', False) From bbf12be6f223c1c46514c00ff434b2fd039dc517 Mon Sep 17 00:00:00 2001 From: Yann Leboulanger Date: Tue, 24 Nov 2009 20:07:05 +0100 Subject: [PATCH 054/259] set AccountCreationWizardWindow transient for RosterWindow. Fixes #5444 --- src/config.py | 1 + 1 file changed, 1 insertion(+) diff --git a/src/config.py b/src/config.py index d8ad836f7..727744a04 100644 --- a/src/config.py +++ b/src/config.py @@ -3146,6 +3146,7 @@ class AccountCreationWizardWindow: self.xml = gtkgui_helpers.get_glade( 'account_creation_wizard_window.glade') self.window = self.xml.get_widget('account_creation_wizard_window') + self.window.set_transient_for(gajim.interface.roster.window) completion = gtk.EntryCompletion() # Connect events from comboboxentry.child From d66dd14950dbbcfec06747c142bad906ed12605b Mon Sep 17 00:00:00 2001 From: Yann Leboulanger Date: Tue, 24 Nov 2009 20:50:02 +0100 Subject: [PATCH 055/259] update .hgignore --- .hgignore | 6 ------ 1 file changed, 6 deletions(-) diff --git a/.hgignore b/.hgignore index 1f56821c2..962a2aafb 100644 --- a/.hgignore +++ b/.hgignore @@ -2,13 +2,9 @@ syntax: glob *.orig *.gmo *.in -*.la -*.lo *.m4 *.pyc *.pyo -*.o -*.Plo *~ autom4te.cache data/defs.py @@ -23,6 +19,4 @@ Makefile syntax: regexp ^config\.* ^config\/ -^src\/\.libs -^src\/trayicon.c ^scripts\/gajim.* From c5843e8878591452f7a51ea6ba6a37a80c4c163c Mon Sep 17 00:00:00 2001 From: Alexander Cherniuk Date: Wed, 25 Nov 2009 09:10:30 +0200 Subject: [PATCH 056/259] Fixes #5447 --- src/common/passwords.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/common/passwords.py b/src/common/passwords.py index 98a7f61d9..9000085c4 100644 --- a/src/common/passwords.py +++ b/src/common/passwords.py @@ -122,6 +122,8 @@ class GnomePasswordStorage(PasswordStorage): user = gajim.config.get_per('accounts', account_name, 'name') display_name = _('XMPP account %s@%s') % (user, server) attributes1 = dict(server=str(server), user=str(user), protocol='xmpp') + if password is None: + password = str() try: auth_token = gnomekeyring.item_create_sync( self.keyring, gnomekeyring.ITEM_NETWORK_PASSWORD, From ddb493c87d505071bab147a479d1fc1075239715 Mon Sep 17 00:00:00 2001 From: Yann Leboulanger Date: Wed, 25 Nov 2009 08:27:06 +0100 Subject: [PATCH 057/259] always use statusicon in systray, not event icon, we already blink. --- src/statusicon.py | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/src/statusicon.py b/src/statusicon.py index e161d18a4..e28b67cfd 100644 --- a/src/statusicon.py +++ b/src/statusicon.py @@ -106,18 +106,16 @@ class StatusIcon: if not gajim.interface.systray_enabled: return if gajim.events.get_nb_systray_events(): - state = 'event' self.status_icon.set_blinking(True) else: - state = self.status self.status_icon.set_blinking(False) - #FIXME: do not always use 16x16 (ask actually used size and use that) - image = gajim.interface.jabber_state_images['16'][state] + # FIXME: do not always use 16x16 (ask actually used size and use that) + image = gajim.interface.jabber_state_images['16'][self.status] if image.get_storage_type() == gtk.IMAGE_PIXBUF: self.status_icon.set_from_pixbuf(image.get_pixbuf()) - #FIXME: oops they forgot to support GIF animation? - #or they were lazy to get it to work under Windows! WTF! + # FIXME: oops they forgot to support GIF animation? + # or they were lazy to get it to work under Windows! WTF! elif image.get_storage_type() == gtk.IMAGE_ANIMATION: self.status_icon.set_from_pixbuf( image.get_animation().get_static_image()) From 7eb24c3c53bbcb9c0517933982c673d40518204f Mon Sep 17 00:00:00 2001 From: Yann Leboulanger Date: Wed, 25 Nov 2009 12:25:28 +0100 Subject: [PATCH 058/259] fix traceback when using a non-BOSH proxy. Fixes #5449 --- src/common/xmpp/transports_nb.py | 2 +- src/profile_window.py | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/common/xmpp/transports_nb.py b/src/common/xmpp/transports_nb.py index 1aac5b52d..e6d63bcb3 100644 --- a/src/common/xmpp/transports_nb.py +++ b/src/common/xmpp/transports_nb.py @@ -72,7 +72,7 @@ def get_proxy_data_from_dict(proxy): # with proxy!=bosh or with bosh over HTTP proxy we're connecting to proxy # machine tcp_host, tcp_port = proxy['host'], proxy['port'] - if proxy['useauth']: + if proxy.get('useauth', False): proxy_user, proxy_pass = proxy['user'], proxy['pass'] return tcp_host, tcp_port, proxy_user, proxy_pass diff --git a/src/profile_window.py b/src/profile_window.py index 132357b0b..d00bfc335 100644 --- a/src/profile_window.py +++ b/src/profile_window.py @@ -68,7 +68,7 @@ class ProfileWindow: return True # loop forever def remove_statusbar(self, message_id): - self.statusbar.remove(self.context_id, message_id) + self.statusbar.remove_message(self.context_id, message_id) self.remove_statusbar_timeout_id = None def on_profile_window_destroy(self, widget): @@ -246,7 +246,7 @@ class ProfileWindow: self.set_value(i + '_entry', vcard_[i]) if self.update_progressbar_timeout_id is not None: if self.message_id: - self.statusbar.remove(self.context_id, self.message_id) + self.statusbar.remove_message(self.context_id, self.message_id) self.message_id = self.statusbar.push(self.context_id, _('Information received')) self.remove_statusbar_timeout_id = gobject.timeout_add_seconds(3, @@ -341,7 +341,7 @@ class ProfileWindow: def vcard_not_published(self): if self.message_id: - self.statusbar.remove(self.context_id, self.message_id) + self.statusbar.remove_message(self.context_id, self.message_id) self.message_id = self.statusbar.push(self.context_id, _('Information NOT published')) self.remove_statusbar_timeout_id = gobject.timeout_add_seconds(3, From 6c4724f53fe25cc8a74fe5a0313c1a52ff50f962 Mon Sep 17 00:00:00 2001 From: Yann Leboulanger Date: Wed, 25 Nov 2009 12:31:40 +0100 Subject: [PATCH 059/259] fix attribute name. Fixes #5448 --- src/common/connection_handlers.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/common/connection_handlers.py b/src/common/connection_handlers.py index fb2425192..8bcf9b51c 100644 --- a/src/common/connection_handlers.py +++ b/src/common/connection_handlers.py @@ -1877,7 +1877,7 @@ class ConnectionHandlers(ConnectionVcard, ConnectionBytestream, ConnectionDisco, for group in contact.groups: if group not in groups: same_groups = False - if contact.subscription in ('both', 'to') and same_groups: + if contact.sub in ('both', 'to') and same_groups: continue exchange_items_list[jid] = [] exchange_items_list[jid].append(name) From 2325791eeb34209e877b4eeda2bc756aa702f97d Mon Sep 17 00:00:00 2001 From: Alexander Cherniuk Date: Wed, 25 Nov 2009 13:39:05 +0200 Subject: [PATCH 060/259] Minor refactoring --- src/message_textview.py | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/src/message_textview.py b/src/message_textview.py index 40ba81067..236ad1cb0 100644 --- a/src/message_textview.py +++ b/src/message_textview.py @@ -21,15 +21,20 @@ ## along with Gajim. If not, see . ## +import gc + import gtk import gobject import pango + import gtkgui_helpers from common import gajim class MessageTextView(gtk.TextView): - '''Class for the message textview (where user writes new messages) - for chat/groupchat windows''' + """ + Class for the message textview (where user writes new messages) for + chat/groupchat windows + """ __gsignals__ = dict( mykeypress = (gobject.SIGNAL_RUN_LAST | gobject.SIGNAL_ACTION, None, # return value @@ -272,13 +277,13 @@ class MessageTextView(gtk.TextView): else: return None - def destroy(self): - import gc - gobject.idle_add(lambda:gc.collect()) + gobject.idle_add(gc.collect) def clear(self, widget = None): - '''clear text in the textview''' + """ + Clear text in the textview + """ buffer_ = self.get_buffer() start, end = buffer_.get_bounds() buffer_.delete(start, end) From a6d2c4f2862e8fb80bdf495808a813fc21c1ff3c Mon Sep 17 00:00:00 2001 From: Yann Leboulanger Date: Wed, 25 Nov 2009 13:29:57 +0100 Subject: [PATCH 061/259] fix typo in a variable name --- src/gui_menu_builder.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/gui_menu_builder.py b/src/gui_menu_builder.py index 0c975d5b6..80575d1ad 100644 --- a/src/gui_menu_builder.py +++ b/src/gui_menu_builder.py @@ -320,7 +320,7 @@ control=None): for item in (send_custom_status_menuitem, send_single_message_menuitem, invite_menuitem, block_menuitem, unblock_menuitem, ignore_menuitem, unignore_menuitem, set_custom_avatar_menuitem, subscription_menuitem, - manage_contact_menuitem, convert_to_gc_menuitems): + manage_contact_menuitem, convert_to_gc_menuitem): item.set_no_show_all(True) item.hide() From b6c4aaba6feffee3549cf0e52bc80027195fcd61 Mon Sep 17 00:00:00 2001 From: Alexander Cherniuk Date: Wed, 25 Nov 2009 15:01:40 +0200 Subject: [PATCH 062/259] Refactored doc-strings --- src/chat_control.py | 305 +++++++++++++++++++++++++++++--------------- 1 file changed, 199 insertions(+), 106 deletions(-) diff --git a/src/chat_control.py b/src/chat_control.py index 9c491b9e1..554ac1b02 100644 --- a/src/chat_control.py +++ b/src/chat_control.py @@ -90,8 +90,9 @@ if gajim.config.get('use_speller') and HAS_GTK_SPELL: ################################################################################ class ChatControlBase(MessageControl, ChatCommandProcessor, CommandTools): - '''A base class containing a banner, ConversationTextview, MessageTextView - ''' + """ + A base class containing a banner, ConversationTextview, MessageTextView + """ def make_href(self, match): url_color = gajim.config.get('urlmsgcolor') @@ -99,7 +100,9 @@ class ChatControlBase(MessageControl, ChatCommandProcessor, CommandTools): url_color, match.group()) def get_font_attrs(self): - ''' get pango font attributes for banner from theme settings ''' + """ + Get pango font attributes for banner from theme settings + """ theme = gajim.config.get('roster_theme') bannerfont = gajim.config.get_per('themes', theme, 'bannerfont') bannerfontattrs = gajim.config.get_per('themes', theme, 'bannerfontattrs') @@ -133,33 +136,45 @@ class ChatControlBase(MessageControl, ChatCommandProcessor, CommandTools): type_])) def draw_banner(self): - '''Draw the fat line at the top of the window that - houses the icon, jid, ... - ''' + """ + Draw the fat line at the top of the window that houses the icon, jid, etc + + Derived types MAY implement this. + """ self.draw_banner_text() self._update_banner_state_image() - # Derived types MAY implement this def draw_banner_text(self): - pass # Derived types SHOULD implement this + """ + Derived types SHOULD implement this + """ + pass def update_ui(self): + """ + Derived types SHOULD implement this + """ self.draw_banner() - # Derived types SHOULD implement this def repaint_themed_widgets(self): + """ + Derived types MAY implement this + """ self._paint_banner() self.draw_banner() - # Derived classes MAY implement this def _update_banner_state_image(self): - pass # Derived types MAY implement this + """ + Derived types MAY implement this + """ + pass def handle_message_textview_mykey_press(self, widget, event_keyval, - event_keymod): - # Derived should implement this rather than connecting to the event - # itself. - + event_keymod): + """ + Derives types SHOULD implement this, rather than connection to the even + itself + """ event = gtk.gdk.Event(gtk.gdk.KEY_PRESS) event.keyval = event_keyval event.state = event_keymod @@ -212,7 +227,7 @@ class ChatControlBase(MessageControl, ChatCommandProcessor, CommandTools): helpers.launch_browser_mailer('url', url) def __init__(self, type_id, parent_win, widget_name, contact, acct, - resource = None): + resource = None): if resource is None: # We very likely got a contact with a random resource. # This is bad, we need the highest for caps etc. @@ -386,7 +401,9 @@ class ChatControlBase(MessageControl, ChatCommandProcessor, CommandTools): dialogs.AspellDictError(lang) def on_banner_label_populate_popup(self, label, menu): - '''We override the default context menu and add our own menutiems''' + """ + Override the default context menu and add our own menutiems + """ item = gtk.SeparatorMenuItem() menu.prepend(item) @@ -400,8 +417,10 @@ class ChatControlBase(MessageControl, ChatCommandProcessor, CommandTools): menu.show_all() def on_msg_textview_populate_popup(self, textview, menu): - '''we override the default context menu and we prepend an option to switch - languages''' + """ + Override the default context menu and we prepend an option to switch + languages + """ def _on_select_dictionary(widget, lang): per_type = 'contacts' if self.type_id == message_control.TYPE_GC: @@ -445,12 +464,16 @@ class ChatControlBase(MessageControl, ChatCommandProcessor, CommandTools): # moved from ChatControl def _on_banner_eventbox_button_press_event(self, widget, event): - '''If right-clicked, show popup''' + """ + If right-clicked, show popup + """ if event.button == 3: # right click self.parent_win.popup_menu(event) def _on_send_button_clicked(self, widget): - '''When send button is pressed: send the current message''' + """ + When send button is pressed: send the current message + """ if gajim.connections[self.account].connected < 2: # we are not connected dialogs.ErrorDialog(_('A connection is not available'), _('Your message can not be sent until you are connected.')) @@ -465,7 +488,9 @@ class ChatControlBase(MessageControl, ChatCommandProcessor, CommandTools): self.send_message(message, xhtml=xhtml) def _paint_banner(self): - '''Repaint banner with theme color''' + """ + Repaint banner with theme color + """ theme = gajim.config.get('roster_theme') bgcolor = gajim.config.get_per('themes', theme, 'bannerbgcolor') textcolor = gajim.config.get_per('themes', theme, 'bannertextcolor') @@ -512,9 +537,11 @@ class ChatControlBase(MessageControl, ChatCommandProcessor, CommandTools): self.handlers[id_] = widget def _on_style_set_event(self, widget, style, *opts): - '''set style of widget from style class *.Frame.Eventbox + """ + Set style of widget from style class *.Frame.Eventbox opts[0] == True -> set fg color - opts[1] == True -> set bg color''' + opts[1] == True -> set bg color + """ banner_eventbox = self.xml.get_widget('banner_eventbox') self.disconnect_style_event(widget) if opts[1]: @@ -589,11 +616,11 @@ class ChatControlBase(MessageControl, ChatCommandProcessor, CommandTools): return False def _on_message_textview_mykeypress_event(self, widget, event_keyval, - event_keymod): - '''When a key is pressed: - if enter is pressed without the shift key, message (if not empty) is sent - and printed in the conversation''' - + event_keymod): + """ + When a key is pressed: if enter is pressed without the shift key, message + (if not empty) is sent and printed in the conversation + """ # NOTE: handles mykeypress which is custom signal connected to this # CB in new_tab(). for this singal see message_textview.py message_textview = widget @@ -652,8 +679,11 @@ class ChatControlBase(MessageControl, ChatCommandProcessor, CommandTools): event_keymod) def _on_drag_data_received(self, widget, context, x, y, selection, - target_type, timestamp): - pass # Derived classes SHOULD implement this method + target_type, timestamp): + """ + Derived types SHOULD implement this + """ + pass def _on_drag_leave(self, widget, context, time): # FIXME: DND on non editable TextView, find a better way @@ -668,10 +698,11 @@ class ChatControlBase(MessageControl, ChatCommandProcessor, CommandTools): self.conv_textview.tv.set_editable(True) def send_message(self, message, keyID='', type_='chat', chatstate=None, - msg_id=None, composing_xep=None, resource=None, - xhtml=None, callback=None, callback_args=[], process_commands=True): - '''Send the given message to the active tab. Doesn't return None if error - ''' + msg_id=None, composing_xep=None, resource=None, xhtml=None, + callback=None, callback_args=[], process_commands=True): + """ + Send the given message to the active tab. Doesn't return None if error + """ if not message or message == '\n': return None @@ -711,10 +742,13 @@ class ChatControlBase(MessageControl, ChatCommandProcessor, CommandTools): self.orig_msg = None def print_conversation_line(self, text, kind, name, tim, - other_tags_for_name=[], other_tags_for_time=[], other_tags_for_text=[], - count_as_new=True, subject=None, old_kind=None, xhtml=None, simple=False, - xep0184_id=None, graphics=True): - '''prints 'chat' type messages''' + other_tags_for_name=[], other_tags_for_time=[], + other_tags_for_text=[], count_as_new=True, subject=None, + old_kind=None, xhtml=None, simple=False, xep0184_id=None, + graphics=True): + """ + Print 'chat' type messages + """ jid = self.contact.jid full_jid = self.get_full_jid() textview = self.conv_textview @@ -789,8 +823,10 @@ class ChatControlBase(MessageControl, ChatCommandProcessor, CommandTools): self.parent_win.show_title(False, self) # Disabled Urgent hint def toggle_emoticons(self): - '''hide show emoticons_button and make sure emoticons_menu is always there - when needed''' + """ + Hide show emoticons_button and make sure emoticons_menu is always there + when needed + """ emoticons_button = self.xml.get_widget('emoticons_button') if gajim.config.get('emoticons_theme'): emoticons_button.show() @@ -808,12 +844,16 @@ class ChatControlBase(MessageControl, ChatCommandProcessor, CommandTools): self.msg_textview.grab_focus() def on_emoticons_button_clicked(self, widget): - '''popup emoticons menu''' + """ + Popup emoticons menu + """ gajim.interface.emoticon_menuitem_clicked = self.append_emoticon gajim.interface.popup_emoticons_under_button(widget, self.parent_win) def on_formattings_button_clicked(self, widget): - '''popup formattings menu''' + """ + Popup formattings menu + """ menu = gtk.Menu() menuitems = ((_('Bold'), 'bold'), @@ -875,7 +915,9 @@ class ChatControlBase(MessageControl, ChatCommandProcessor, CommandTools): def on_actions_button_clicked(self, widget): - '''popup action menu''' + """ + Popup action menu + """ menu = self.prepare_context_menu(hide_buttonbar_items=True) menu.show_all() gtkgui_helpers.popup_emoticons_under_button(menu, widget, @@ -895,7 +937,9 @@ class ChatControlBase(MessageControl, ChatCommandProcessor, CommandTools): buffer_.delete(start, end) def _on_history_menuitem_activate(self, widget = None, jid = None): - '''When history menuitem is pressed: call history window''' + """ + When history menuitem is pressed: call history window + """ if not jid: jid = self.contact.jid @@ -907,7 +951,9 @@ class ChatControlBase(MessageControl, ChatCommandProcessor, CommandTools): history_window.HistoryWindow(jid, self.account) def _on_send_file(self, gc_contact=None): - '''gc_contact can be set when we are in a groupchat control''' + """ + gc_contact can be set when we are in a groupchat control + """ def _on_ok(c): gajim.interface.instances['file_transfers'].show_file_send_request( self.account, c) @@ -935,7 +981,9 @@ class ChatControlBase(MessageControl, ChatCommandProcessor, CommandTools): _on_ok(self.contact) def on_minimize_menuitem_toggled(self, widget): - '''When a grouchat is minimized, unparent the tab, put it in roster etc''' + """ + When a grouchat is minimized, unparent the tab, put it in roster etc + """ old_value = False minimized_gc = gajim.config.get_per('accounts', self.account, 'minimized_gc').split() @@ -965,7 +1013,9 @@ class ChatControlBase(MessageControl, ChatCommandProcessor, CommandTools): def bring_scroll_to_end(self, textview, diff_y = 0): - ''' scrolls to the end of textview if end is not visible ''' + """ + Scroll to the end of textview if end is not visible + """ if self.scroll_to_end_id: # a scroll is already planned return @@ -986,10 +1036,12 @@ class ChatControlBase(MessageControl, ChatCommandProcessor, CommandTools): return False def size_request(self, msg_textview , requisition): - ''' When message_textview changes its size. If the new height - will enlarge the window, enable the scrollbar automatic policy - Also enable scrollbar automatic policy for horizontal scrollbar - if message we have in message_textview is too big''' + """ + When message_textview changes its size: if the new height will enlarge + the window, enable the scrollbar automatic policy. Also enable scrollbar + automatic policy for horizontal scrollbar if message we have in + message_textview is too big + """ if msg_textview.window is None: return @@ -1082,8 +1134,10 @@ class ChatControlBase(MessageControl, ChatCommandProcessor, CommandTools): self.redraw_after_event_removed(jid) def redraw_after_event_removed(self, jid): - ''' We just removed a 'printed_*' event, redraw contact in roster or - gc_roster and titles in roster and msg_win ''' + """ + We just removed a 'printed_*' event, redraw contact in roster or + gc_roster and titles in roster and msg_win + """ self.parent_win.redraw_tab(self) self.parent_win.show_title() # TODO : get the contact and check notify.get_show_in_roster() @@ -1142,7 +1196,9 @@ class ChatControlBase(MessageControl, ChatCommandProcessor, CommandTools): return color def widget_set_visible(self, widget, state): - '''Show or hide a widget. state is bool''' + """ + Show or hide a widget + """ # make the last message visible, when changing to "full view" if not state: gobject.idle_add(self.conv_textview.scroll_to_end_iter) @@ -1154,7 +1210,9 @@ class ChatControlBase(MessageControl, ChatCommandProcessor, CommandTools): widget.show_all() def chat_buttons_set_visible(self, state): - '''Toggle chat buttons. state is bool''' + """ + Toggle chat buttons + """ MessageControl.chat_buttons_set_visible(self, state) self.widget_set_visible(self.xml.get_widget('actions_hbox'), state) @@ -1173,7 +1231,9 @@ class ChatControlBase(MessageControl, ChatCommandProcessor, CommandTools): ################################################################################ class ChatControl(ChatControlBase): - '''A control for standard 1-1 chat''' + """ + A control for standard 1-1 chat + """ ( JINGLE_STATE_NOT_AVAILABLE, JINGLE_STATE_AVAILABLE, @@ -1535,10 +1595,10 @@ class ChatControl(ChatControlBase): self._set_jingle_state('video', state, sid=sid, reason=reason) def on_avatar_eventbox_enter_notify_event(self, widget, event): - ''' - we enter the eventbox area so we under conditions add a timeout - to show a bigger avatar after 0.5 sec - ''' + """ + Enter the eventbox area so we under conditions add a timeout to show a + bigger avatar after 0.5 sec + """ jid = self.contact.jid is_fake = False if self.type_id == message_control.TYPE_PM: @@ -1561,13 +1621,17 @@ class ChatControl(ChatControlBase): self.show_bigger_avatar, widget) def on_avatar_eventbox_leave_notify_event(self, widget, event): - '''we left the eventbox area that holds the avatar img''' + """ + Left the eventbox area that holds the avatar img + """ # did we add a timeout? if yes remove it if self.show_bigger_avatar_timeout_id is not None: gobject.source_remove(self.show_bigger_avatar_timeout_id) def on_avatar_eventbox_button_press_event(self, widget, event): - '''If right-clicked, show popup''' + """ + If right-clicked, show popup + """ if event.button == 3: # right click menu = gtk.Menu() menuitem = gtk.ImageMenuItem(gtk.STOCK_SAVE_AS) @@ -1585,7 +1649,9 @@ class ChatControl(ChatControlBase): return True def _on_window_motion_notify(self, widget, event): - '''it gets called no matter if it is the active window or not''' + """ + It gets called no matter if it is the active window or not + """ if self.parent_win.get_active_jid() == self.contact.jid: # if window is the active one, change vars assisting chatstate self.mouse_over_in_last_5_secs = True @@ -1638,9 +1704,10 @@ class ChatControl(ChatControlBase): banner_status_img.set_from_pixbuf(scaled_pix) def draw_banner_text(self): - '''Draw the text in the fat line at the top of the window that - houses the name, jid. - ''' + """ + Draw the text in the fat line at the top of the window that houses the + name, jid + """ contact = self.contact jid = contact.jid @@ -1823,8 +1890,11 @@ class ChatControl(ChatControlBase): self._show_lock_image(self.gpg_is_active, 'GPG', self.gpg_is_active, loggable, True) - def _show_lock_image(self, visible, enc_type = '', enc_enabled = False, chat_logged = False, authenticated = False): - '''Set lock icon visibility and create tooltip''' + def _show_lock_image(self, visible, enc_type = '', enc_enabled = False, + chat_logged = False, authenticated = False): + """ + Set lock icon visibility and create tooltip + """ #encryption %s active status_string = enc_enabled and _('is') or _('is NOT') #chat session %s be logged @@ -1859,7 +1929,9 @@ class ChatControl(ChatControlBase): def send_message(self, message, keyID='', chatstate=None, xhtml=None, process_commands=True): - '''Send a message to contact''' + """ + Send a message to contact + """ if message in ('', None, '\n'): return None @@ -1923,10 +1995,11 @@ class ChatControl(ChatControlBase): process_commands=process_commands) def check_for_possible_paused_chatstate(self, arg): - ''' did we move mouse of that window or write something in message - textview in the last 5 seconds? - if yes we go active for mouse, composing for kbd - if no we go paused if we were previously composing ''' + """ + Did we move mouse of that window or write something in message textview + in the last 5 seconds? If yes - we go active for mouse, composing for + kbd. If not - we go paused if we were previously composing + """ contact = self.contact jid = contact.jid current_state = contact.our_chatstate @@ -1950,10 +2023,10 @@ class ChatControl(ChatControlBase): return True # loop forever def check_for_possible_inactive_chatstate(self, arg): - ''' did we move mouse over that window or wrote something in message - textview in the last 30 seconds? - if yes we go active - if no we go inactive ''' + """ + Did we move mouse over that window or wrote something in message textview + in the last 30 seconds? if yes - we go active. If no - we go inactive + """ contact = self.contact current_state = contact.our_chatstate @@ -1983,7 +2056,9 @@ class ChatControl(ChatControlBase): ChatControlBase.print_conversation_line(self, msg, 'status', '', None) def print_esession_details(self): - '''print esession settings to textview''' + """ + Print esession settings to textview + """ e2e_is_active = bool(self.session) and self.session.enable_encryption if e2e_is_active: msg = _('This session is encrypted') @@ -2005,16 +2080,19 @@ class ChatControl(ChatControlBase): self.session.is_loggable(), self.session and self.session.verified_identity) def print_conversation(self, text, frm='', tim=None, encrypted=False, - subject=None, xhtml=None, simple=False, xep0184_id=None): - '''Print a line in the conversation: - if frm is set to status: it's a status message - if frm is set to error: it's an error message - The difference between status and error is mainly that with error, msg - count as a new message (in systray and in control). - if frm is set to info: it's a information message - if frm is set to print_queue: it is incomming from queue - if frm is set to another value: it's an outgoing message - if frm is not set: it's an incomming message''' + subject=None, xhtml=None, simple=False, xep0184_id=None): + """ + Print a line in the conversation + + If frm is set to status: it's a status message. + if frm is set to error: it's an error message. The difference between + status and error is mainly that with error, msg count as a new message + (in systray and in control). + If frm is set to info: it's a information message. + If frm is set to print_queue: it is incomming from queue. + If frm is set to another value: it's an outgoing message. + If frm is not set: it's an incomming message. + """ contact = self.contact if frm == 'status': @@ -2152,12 +2230,12 @@ class ChatControl(ChatControlBase): return tab_img def prepare_context_menu(self, hide_buttonbar_items=False): - '''sets compact view menuitem active state - sets active and sensitivity state for toggle_gpg_menuitem - sets sensitivity for history_menuitem (False for tranasports) - and file_transfer_menuitem - and hide()/show() for add_to_roster_menuitem - ''' + """ + Set compact view menuitem active state sets active and sensitivity state + for toggle_gpg_menuitem sets sensitivity for history_menuitem (False for + tranasports) and file_transfer_menuitem and hide()/show() for + add_to_roster_menuitem + """ menu = gui_menu_builder.get_contact_menu(self.contact, self.account, use_multiple_contacts=False, show_start_chat=False, show_encryption=True, control=self, @@ -2165,9 +2243,11 @@ class ChatControl(ChatControlBase): return menu def send_chatstate(self, state, contact = None): - ''' sends OUR chatstate as STANDLONE chat state message (eg. no body) + """ + Send OUR chatstate as STANDLONE chat state message (eg. no body) to contact only if new chatstate is different from the previous one - if jid is not specified, send to active tab''' + if jid is not specified, send to active tab + """ # JEP 85 does not allow resending the same chatstate # this function checks for that and just returns so it's safe to call it # with same state. @@ -2313,7 +2393,9 @@ class ChatControl(ChatControlBase): on_yes(self) def handle_incoming_chatstate(self): - ''' handle incoming chatstate that jid SENT TO us ''' + """ + Handle incoming chatstate that jid SENT TO us + """ self.draw_banner_text() # update chatstate in tab for this chat self.parent_win.redraw_tab(self, self.contact.chatstate) @@ -2495,8 +2577,9 @@ class ChatControl(ChatControlBase): self.conv_textview.print_empty_line() def read_queue(self): - '''read queue and print messages containted in it''' - + """ + Read queue and print messages containted in it + """ jid = self.contact.jid jid_with_resource = jid if self.resource: @@ -2551,8 +2634,10 @@ class ChatControl(ChatControlBase): control.remove_contact(nick) def show_bigger_avatar(self, small_avatar): - '''resizes the avatar, if needed, so it has at max half the screen size - and shows it''' + """ + Resize the avatar, if needed, so it has at max half the screen size and + shows it + """ if not small_avatar.window: # Tab has been closed since we hovered the avatar return @@ -2619,14 +2704,18 @@ class ChatControl(ChatControlBase): window.show_all() def _on_window_avatar_leave_notify_event(self, widget, event): - '''we just left the popup window that holds avatar''' + """ + Just left the popup window that holds avatar + """ self.bigger_avatar_window.destroy() self.bigger_avatar_window = None # Re-show the small avatar self.show_avatar() def _on_window_motion_notify_event(self, widget, event): - '''we just moved the mouse so show the cursor''' + """ + Just moved the mouse so show the cursor + """ cursor = gtk.gdk.Cursor(gtk.gdk.LEFT_PTR) self.bigger_avatar_window.window.set_cursor(cursor) @@ -2643,7 +2732,9 @@ class ChatControl(ChatControlBase): self._toggle_gpg() def _on_convert_to_gc_menuitem_activate(self, widget): - '''user want to invite some friends to chat''' + """ + User wants to invite some friends to chat + """ dialogs.TransformChatToMUC(self.account, [self.contact.jid]) def _on_toggle_e2e_menuitem_activate(self, widget): @@ -2684,7 +2775,9 @@ class ChatControl(ChatControlBase): self.draw_banner() def update_status_display(self, name, uf_show, status): - '''print the contact's status and update the status/GPG image''' + """ + Print the contact's status and update the status/GPG image + """ self.update_ui() self.parent_win.redraw_tab(self) From 8c82c35654381e042edc9886dbaf7308ab90071c Mon Sep 17 00:00:00 2001 From: Alexander Cherniuk Date: Wed, 25 Nov 2009 15:24:48 +0200 Subject: [PATCH 063/259] More doc-string refactoring --- src/groupchat_control.py | 212 ++++++++++++++++++++++++++------------- 1 file changed, 142 insertions(+), 70 deletions(-) diff --git a/src/groupchat_control.py b/src/groupchat_control.py index 4653d0d76..6db3398f5 100644 --- a/src/groupchat_control.py +++ b/src/groupchat_control.py @@ -64,7 +64,9 @@ C_AVATAR, # avatar of the contact ) = range(5) def set_renderer_color(treeview, renderer, set_background=True): - '''set style for group row, using PRELIGHT system color''' + """ + Set style for group row, using PRELIGHT system color + """ if set_background: bgcolor = treeview.style.bg[gtk.STATE_PRELIGHT] renderer.set_property('cell-background-gdk', bgcolor) @@ -141,7 +143,9 @@ class PrivateChatControl(ChatControl): self.TYPE_ID = 'pm' def send_message(self, message, xhtml=None, process_commands=True): - '''call this function to send our message''' + """ + Call this method to send the message + """ if not message: return @@ -383,7 +387,9 @@ class GroupchatControl(ChatControlBase): self.widget.show_all() def tree_compare_iters(self, model, iter1, iter2): - '''Compare two iters to sort them''' + """ + Compare two iters to sort them + """ type1 = model[iter1][C_TYPE] type2 = model[iter2][C_TYPE] if not type1 or not type2: @@ -422,8 +428,10 @@ class GroupchatControl(ChatControlBase): return locale.strcoll(name1.lower(), name2.lower()) def on_msg_textview_populate_popup(self, textview, menu): - '''we override the default context menu and we prepend Clear - and the ability to insert a nick''' + """ + Override the default context menu and we prepend Clear + and the ability to insert a nick + """ ChatControlBase.on_msg_textview_populate_popup(self, textview, menu) item = gtk.SeparatorMenuItem() menu.prepend(item) @@ -452,7 +460,9 @@ class GroupchatControl(ChatControlBase): gobject.idle_add(reset_flag) def on_treeview_size_allocate(self, widget, allocation): - '''The MUC treeview has resized. Move the hpaned in all tabs to match''' + """ + The MUC treeview has resized. Move the hpaned in all tabs to match + """ if self.resize_from_another_muc: # Don't send the event to other MUC return @@ -467,7 +477,9 @@ class GroupchatControl(ChatControlBase): ctrl.resize_occupant_treeview(hpaned_position) def iter_contact_rows(self): - '''iterate over all contact rows in the tree model''' + """ + Iterate over all contact rows in the tree model + """ model = self.list_treeview.get_model() role_iter = model.get_iter_root() while role_iter: @@ -478,7 +490,9 @@ class GroupchatControl(ChatControlBase): role_iter = model.iter_next(role_iter) def on_list_treeview_style_set(self, treeview, style): - '''When style (theme) changes, redraw all contacts''' + """ + When style (theme) changes, redraw all contacts + """ # Get the room_jid from treeview for contact in self.iter_contact_rows(): nick = contact[C_NICK].decode('utf-8') @@ -500,10 +514,11 @@ class GroupchatControl(ChatControlBase): self.draw_contact(nick, selected=True, focus=True) def get_tab_label(self, chatstate): - '''Markup the label if necessary. Returns a tuple such as: - (new_label_str, color) - either of which can be None - if chatstate is given that means we have HE SENT US a chatstate''' + """ + Markup the label if necessary. Returns a tuple such as: (new_label_str, + color) either of which can be None if chatstate is given that means we + have HE SENT US a chatstate + """ has_focus = self.parent_win.window.get_property('has-toplevel-focus') current_tab = self.parent_win.get_active_control() == self @@ -588,10 +603,10 @@ class GroupchatControl(ChatControlBase): banner_status_img.set_from_pixbuf(scaled_pix) def get_continued_conversation_name(self): - '''Get the name of a continued conversation. - Will return Continued Conversation if there isn't any other - contact in the room - ''' + """ + Get the name of a continued conversation. Will return Continued + Conversation if there isn't any other contact in the room + """ nicks = [] for nick in gajim.contacts.get_nick_list(self.account, self.room_jid): @@ -605,9 +620,10 @@ class GroupchatControl(ChatControlBase): return title def draw_banner_text(self): - '''Draw the text in the fat line at the top of the window that - houses the room jid, subject. - ''' + """ + Draw the text in the fat line at the top of the window that houses the + room jid, subject + """ self.name_label.set_ellipsize(pango.ELLIPSIZE_END) self.banner_status_label.set_ellipsize(pango.ELLIPSIZE_END) font_attrs, font_attrs_small = self.get_font_attrs() @@ -641,7 +657,9 @@ class GroupchatControl(ChatControlBase): self.banner_status_label.set_markup(subject_text) def prepare_context_menu(self, hide_buttonbar_items=False): - '''sets sensitivity state for configure_room''' + """ + Set sensitivity state for configure_room + """ xml = gtkgui_helpers.get_glade('gc_control_popup_menu.glade') menu = xml.get_widget('gc_control_popup_menu') @@ -745,7 +763,7 @@ class GroupchatControl(ChatControlBase): return menu def destroy_menu(self, menu, change_nick_menuitem, change_subject_menuitem, - bookmark_room_menuitem, history_menuitem): + bookmark_room_menuitem, history_menuitem): # destroy accelerators ag = gtk.accel_groups_from_object(self.parent_win.window)[0] change_nick_menuitem.remove_accelerator(ag, gtk.keysyms.n, @@ -760,7 +778,7 @@ class GroupchatControl(ChatControlBase): menu.destroy() def on_message(self, nick, msg, tim, has_timestamp=False, xhtml=None, - status_code=[]): + status_code=[]): if '100' in status_code: # Room is not anonymous self.is_anonymous = False @@ -776,8 +794,8 @@ class GroupchatControl(ChatControlBase): else: self.print_conversation(msg, nick, tim, xhtml) - def on_private_message(self, nick, msg, tim, xhtml, session, - msg_id=None, encrypted=False): + def on_private_message(self, nick, msg, tim, xhtml, session, msg_id=None, + encrypted=False): # Do we have a queue? fjid = self.room_jid + '/' + nick no_queue = len(gajim.events.get_events(self.account, fjid)) == 0 @@ -835,8 +853,7 @@ class GroupchatControl(ChatControlBase): fin = True return None - def print_old_conversation(self, text, contact='', tim=None, - xhtml = None): + def print_old_conversation(self, text, contact='', tim=None, xhtml = None): if isinstance(text, str): text = unicode(text, 'utf-8') if contact: @@ -855,11 +872,14 @@ class GroupchatControl(ChatControlBase): small_attr + ['restored_message'], count_as_new=False, xhtml=xhtml) def print_conversation(self, text, contact='', tim=None, xhtml=None, - graphics=True): - '''Print a line in the conversation: - if contact is set: it's a message from someone or an info message (contact - = 'info' in such a case) - if contact is not set: it's a message from the server or help''' + graphics=True): + """ + Print a line in the conversation + + If contact is set: it's a message from someone or an info message + (contact = 'info' in such a case). + If contact is not set: it's a message from the server or help. + """ if isinstance(text, str): text = unicode(text, 'utf-8') other_tags_for_name = [] @@ -938,8 +958,10 @@ class GroupchatControl(ChatControlBase): return nb def highlighting_for_message(self, text, tim): - '''Returns a 2-Tuple. The first says whether or not to highlight the - text, the second, what sound to play.''' + """ + Returns a 2-Tuple. The first says whether or not to highlight the text, + the second, what sound to play + """ highlight, sound = (None, None) # Are any of the defined highlighting words in the text? @@ -961,10 +983,11 @@ class GroupchatControl(ChatControlBase): return (highlight, sound) def check_and_possibly_add_focus_out_line(self): - '''checks and possibly adds focus out line for room_jid if it needs it - and does not already have it as last event. If it goes to add this line - it removes previous line first''' - + """ + Check and possibly add focus out line for room_jid if it needs it and + does not already have it as last event. If it goes to add this line + - remove previous line first + """ win = gajim.interface.msg_win_mgr.get_window(self.room_jid, self.account) if win and self.room_jid == win.get_active_jid() and\ win.window.get_property('has-toplevel-focus') and\ @@ -976,9 +999,10 @@ class GroupchatControl(ChatControlBase): self.conv_textview.show_focus_out_line() def needs_visual_notification(self, text): - '''checks text to see whether any of the words in (muc_highlight_words - and nick) appear.''' - + """ + Check text to see whether any of the words in (muc_highlight_words and + nick) appear + """ special_words = gajim.config.get('muc_highlight_words').split(';') special_words.append(self.nick) # Strip empties: ''.split(';') == [''] and would highlight everything. @@ -1072,9 +1096,11 @@ class GroupchatControl(ChatControlBase): self.list_treeview.columns_autosize() def on_send_pm(self, widget=None, model=None, iter_=None, nick=None, - msg=None): - '''opens a chat window and if msg is not None sends private message to a - contact in a room''' + msg=None): + """ + Open a chat window and if msg is not None - send private message to a + contact in a room + """ if nick is None: nick = model[iter_][C_NICK].decode('utf-8') @@ -1083,7 +1109,9 @@ class GroupchatControl(ChatControlBase): ctrl.send_message(msg) def on_send_file(self, widget, gc_contact): - '''sends a file to a contact in the room''' + """ + Send a file to a contact in the room + """ self._on_send_file(gc_contact) def draw_contact(self, nick, selected=False, focus=False): @@ -1168,8 +1196,10 @@ class GroupchatControl(ChatControlBase): self.draw_role(role) def chg_contact_status(self, nick, show, status, role, affiliation, jid, - reason, actor, statusCode, new_nick, avatar_sha, tim=None): - '''When an occupant changes his or her status''' + reason, actor, statusCode, new_nick, avatar_sha, tim=None): + """ + When an occupant changes his or her status + """ if show == 'invisible': return @@ -1448,7 +1478,7 @@ class GroupchatControl(ChatControlBase): self.print_conversation(st, tim=tim, graphics=False) def add_contact_to_roster(self, nick, show, role, affiliation, status, - jid=''): + jid=''): model = self.list_treeview.get_model() role_name = helpers.get_uf_role(role, plural=True) @@ -1514,7 +1544,9 @@ class GroupchatControl(ChatControlBase): return None def remove_contact(self, nick): - '''Remove a user from the contacts_list''' + """ + Remove a user from the contacts_list + """ model = self.list_treeview.get_model() iter_ = self.get_contact_iter(nick) if not iter_: @@ -1529,7 +1561,9 @@ class GroupchatControl(ChatControlBase): model.remove(parent_iter) def send_message(self, message, xhtml=None, process_commands=True): - '''call this function to send our message''' + """ + Call this function to send our message + """ if not message: return @@ -1752,7 +1786,9 @@ class GroupchatControl(ChatControlBase): _('You may also enter an alternate venue:'), ok_handler=on_ok) def _on_bookmark_room_menuitem_activate(self, widget): - '''bookmark the room, without autojoin and not minimized''' + """ + Bookmark the room, without autojoin and not minimized + """ password = gajim.gc_passwords.get(self.room_jid, '') gajim.interface.add_gc_bookmark(self.account, self.name, self.room_jid, \ '0', '0', password, self.nick) @@ -1775,7 +1811,7 @@ class GroupchatControl(ChatControlBase): gajim.connections[self.account].send_invite(self.room_jid, contact_jid) def handle_message_textview_mykey_press(self, widget, event_keyval, - event_keymod): + event_keymod): # NOTE: handles mykeypress which is custom signal connected to this # CB in new_room(). for this singal see message_textview.py @@ -1904,19 +1940,25 @@ class GroupchatControl(ChatControlBase): return True def on_list_treeview_row_expanded(self, widget, iter_, path): - '''When a row is expanded: change the icon of the arrow''' + """ + When a row is expanded: change the icon of the arrow + """ model = widget.get_model() image = gajim.interface.jabber_state_images['16']['opened'] model[iter_][C_IMG] = image def on_list_treeview_row_collapsed(self, widget, iter_, path): - '''When a row is collapsed: change the icon of the arrow''' + """ + When a row is collapsed: change the icon of the arrow + """ model = widget.get_model() image = gajim.interface.jabber_state_images['16']['closed'] model[iter_][C_IMG] = image def kick(self, widget, nick): - '''kick a user''' + """ + Kick a user + """ def on_ok(reason): gajim.connections[self.account].gc_set_role(self.room_jid, nick, 'none', reason) @@ -1926,7 +1968,9 @@ class GroupchatControl(ChatControlBase): _('You may specify a reason below:'), ok_handler=on_ok) def mk_menu(self, event, iter_): - '''Make contact's popup menu''' + """ + Make contact's popup menu + """ model = self.list_treeview.get_model() nick = model[iter_][C_NICK].decode('utf-8') c = gajim.contacts.get_gc_contact(self.account, self.room_jid, nick) @@ -2070,8 +2114,10 @@ class GroupchatControl(ChatControlBase): return ctrl def on_row_activated(self, widget, path): - '''When an iter is activated (dubblick or single click if gnome is set - this way''' + """ + When an iter is activated (dubblick or single click if gnome is set this + way + """ model = widget.get_model() if len(path) == 1: # It's a group if (widget.row_expanded(path)): @@ -2083,12 +2129,16 @@ class GroupchatControl(ChatControlBase): self._start_private_message(nick) def on_list_treeview_row_activated(self, widget, path, col=0): - '''When an iter is double clicked: open the chat window''' + """ + When an iter is double clicked: open the chat window + """ if not gajim.single_click: self.on_row_activated(widget, path) def on_list_treeview_button_press_event(self, widget, event): - '''popup user's group's or agent menu''' + """ + Popup user's group's or agent menu + """ # hide tooltip, no matter the button is pressed self.tooltip.hide_tooltip() try: @@ -2199,27 +2249,37 @@ class GroupchatControl(ChatControlBase): self.tooltip.hide_tooltip() def grant_voice(self, widget, nick): - '''grant voice privilege to a user''' + """ + Grant voice privilege to a user + """ gajim.connections[self.account].gc_set_role(self.room_jid, nick, 'participant') def revoke_voice(self, widget, nick): - '''revoke voice privilege to a user''' + """ + Revoke voice privilege to a user + """ gajim.connections[self.account].gc_set_role(self.room_jid, nick, 'visitor') def grant_moderator(self, widget, nick): - '''grant moderator privilege to a user''' + """ + Grant moderator privilege to a user + """ gajim.connections[self.account].gc_set_role(self.room_jid, nick, 'moderator') def revoke_moderator(self, widget, nick): - '''revoke moderator privilege to a user''' + """ + Revoke moderator privilege to a user + """ gajim.connections[self.account].gc_set_role(self.room_jid, nick, 'participant') def ban(self, widget, jid): - '''ban a user''' + """ + Ban a user + """ def on_ok(reason): gajim.connections[self.account].gc_set_affiliation(self.room_jid, jid, 'outcast', reason) @@ -2231,32 +2291,44 @@ class GroupchatControl(ChatControlBase): _('You may specify a reason below:'), ok_handler=on_ok) def grant_membership(self, widget, jid): - '''grant membership privilege to a user''' + """ + Grant membership privilege to a user + """ gajim.connections[self.account].gc_set_affiliation(self.room_jid, jid, 'member') def revoke_membership(self, widget, jid): - '''revoke membership privilege to a user''' + """ + Revoke membership privilege to a user + """ gajim.connections[self.account].gc_set_affiliation(self.room_jid, jid, 'none') def grant_admin(self, widget, jid): - '''grant administrative privilege to a user''' + """ + Grant administrative privilege to a user + """ gajim.connections[self.account].gc_set_affiliation(self.room_jid, jid, 'admin') def revoke_admin(self, widget, jid): - '''revoke administrative privilege to a user''' + """ + Revoke administrative privilege to a user + """ gajim.connections[self.account].gc_set_affiliation(self.room_jid, jid, 'member') def grant_owner(self, widget, jid): - '''grant owner privilege to a user''' + """ + Grant owner privilege to a user + """ gajim.connections[self.account].gc_set_affiliation(self.room_jid, jid, 'owner') def revoke_owner(self, widget, jid): - '''revoke owner privilege to a user''' + """ + Revoke owner privilege to a user + """ gajim.connections[self.account].gc_set_affiliation(self.room_jid, jid, 'admin') From 0ee0ade03a46dffa368e2551d510d59faba09f55 Mon Sep 17 00:00:00 2001 From: Alexander Cherniuk Date: Wed, 25 Nov 2009 15:52:32 +0200 Subject: [PATCH 064/259] More doc-string refactoring --- src/adhoc_commands.py | 105 +++++++++++++++++++++++++++++------------- 1 file changed, 73 insertions(+), 32 deletions(-) diff --git a/src/adhoc_commands.py b/src/adhoc_commands.py index 9b96f0fee..01d34eee6 100644 --- a/src/adhoc_commands.py +++ b/src/adhoc_commands.py @@ -35,17 +35,22 @@ import dialogs import dataforms_widget class CommandWindow: - '''Class for a window for single ad-hoc commands session. Note, that - there might be more than one for one account/jid pair in one moment. + """ + Class for a window for single ad-hoc commands session - TODO: maybe put this window into MessageWindow? consider this when - TODO: it will be possible to manage more than one window of one - TODO: account/jid pair in MessageWindowMgr. + Note, that there might be more than one for one account/jid pair in one + moment. - TODO: gtk 2.10 has a special wizard-widget, consider using it...''' + TODO: Maybe put this window into MessageWindow? consider this when it will + be possible to manage more than one window of one. + TODO: Account/jid pair in MessageWindowMgr. + TODO: GTK 2.10 has a special wizard-widget, consider using it... + """ def __init__(self, account, jid, commandnode=None): - '''Create new window.''' + """ + Create new window + """ # an account object self.account = gajim.connections[account] @@ -89,16 +94,29 @@ class CommandWindow: self.xml.signal_autoconnect(self) self.window.show_all() -# these functions are set up by appropriate stageX methods - def stage_finish(self, *anything): pass - def stage_back_button_clicked(self, *anything): assert False - def stage_forward_button_clicked(self, *anything): assert False - def stage_execute_button_clicked(self, *anything): assert False - def stage_close_button_clicked(self, *anything): assert False - def stage_adhoc_commands_window_delete_event(self, *anything): assert False - def do_nothing(self, *anything): return False + # These functions are set up by appropriate stageX methods. + def stage_finish(self, *anything): + pass -# widget callbacks + def stage_back_button_clicked(self, *anything): + assert False + + def stage_forward_button_clicked(self, *anything): + assert False + + def stage_execute_button_clicked(self, *anything): + assert False + + def stage_close_button_clicked(self, *anything): + assert False + + def stage_adhoc_commands_window_delete_event(self, *anything): + assert False + + def do_nothing(self, *anything): + return False + + # Widget callbacks... def on_back_button_clicked(self, *anything): return self.stage_back_button_clicked(*anything) @@ -123,8 +141,10 @@ class CommandWindow: # stage 1: waiting for command list def stage1(self): - '''Prepare the first stage. Request command list, - set appropriate state of widgets.''' + """ + Prepare the first stage. Request command list, set appropriate state of + widgets + """ # close old stage... self.stage_finish() @@ -164,9 +184,12 @@ class CommandWindow: # stage 2: choosing the command to execute def stage2(self): - '''Populate the command list vbox with radiobuttons - (FIXME: if there is more commands, maybe some kind of list?), - set widgets' state.''' + """ + Populate the command list vbox with radiobuttons + + FIXME: If there is more commands, maybe some kind of list, set widgets + state + """ # close old stage self.stage_finish() @@ -198,7 +221,9 @@ class CommandWindow: self.stage_adhoc_commands_window_delete_event = self.do_nothing def stage2_finish(self): - '''Remove widgets we created. Not needed when the window is destroyed.''' + """ + Remove widgets we created. Not needed when the window is destroyed + """ def remove_widget(widget): self.command_list_vbox.remove(widget) self.command_list_vbox.foreach(remove_widget) @@ -247,8 +272,10 @@ class CommandWindow: pass def stage3_close_button_clicked(self, widget): - ''' We are in the middle of executing command. Ask user if he really want to cancel - the process, then... cancel it. ''' + """ + We are in the middle of executing command. Ask user if he really want to + cancel the process, then cancel it + """ # this works also as a handler for window_delete_event, so we have to return appropriate # values if self.form_status == 'completed': @@ -362,7 +389,9 @@ class CommandWindow: # stage 4: no commands are exposed def stage4(self): - '''Display the message. Wait for user to close the window''' + """ + Display the message. Wait for user to close the window + """ # close old stage self.stage_finish() @@ -387,7 +416,9 @@ class CommandWindow: # stage 5: an error has occured def stage5(self, error=None, errorid=None, senderror=False): - '''Display the error message. Wait for user to close the window''' + """ + Display the error message. Wait for user to close the window + """ # FIXME: sending error to responder # close old stage self.stage_finish() @@ -430,8 +461,10 @@ class CommandWindow: # helpers to handle pulsing in progressbar def setup_pulsing(self, progressbar): - '''Set the progressbar to pulse. Makes a custom - function to repeatedly call progressbar.pulse() method.''' + """ + Set the progressbar to pulse. Makes a custom function to repeatedly call + progressbar.pulse() method + """ assert not self.pulse_id assert isinstance(progressbar, gtk.ProgressBar) @@ -443,14 +476,18 @@ class CommandWindow: self.pulse_id = gobject.timeout_add(80, callback) def remove_pulsing(self): - '''Stop pulsing, useful when especially when removing widget.''' + """ + Stop pulsing, useful when especially when removing widget + """ if self.pulse_id: gobject.source_remove(self.pulse_id) self.pulse_id=None # handling xml stanzas def request_command_list(self): - '''Request the command list. Change stage on delivery.''' + """ + Request the command list. Change stage on delivery + """ query = xmpp.Iq(typ='get', to=xmpp.JID(self.jid), queryNS=xmpp.NS_DISCO_ITEMS) query.setQuerynode(xmpp.NS_COMMANDS) @@ -481,7 +518,9 @@ class CommandWindow: self.account.connection.SendAndCallForResponse(query, callback) def send_command(self, action='execute'): - '''Send the command with data form. Wait for reply.''' + """ + Send the command with data form. Wait for reply + """ # create the stanza assert isinstance(self.commandnode, unicode) assert action in ('execute', 'prev', 'next', 'complete') @@ -510,7 +549,9 @@ class CommandWindow: self.account.connection.SendAndCallForResponse(stanza, callback) def send_cancel(self): - '''Send the command with action='cancel'. ''' + """ + Send the command with action='cancel' + """ assert self.commandnode if self.sessionid and self.account.connection: # we already have sessionid, so the service sent at least one reply. From f7b7e59935105c1fe394dd9e36c89a405cec95ad Mon Sep 17 00:00:00 2001 From: Alexander Cherniuk Date: Wed, 25 Nov 2009 16:41:44 +0200 Subject: [PATCH 065/259] More doc-string refactoring --- src/advanced_configuration_window.py | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/src/advanced_configuration_window.py b/src/advanced_configuration_window.py index c56ee27ad..b35461287 100644 --- a/src/advanced_configuration_window.py +++ b/src/advanced_configuration_window.py @@ -43,7 +43,9 @@ C_TYPE GTKGUI_GLADE = 'manage_accounts_window.glade' def rate_limit(rate): - ''' call func at most *rate* times per second ''' + """ + Call func at most *rate* times per second + """ def decorator(func): timeout = [None] def f(*args, **kwargs): @@ -131,8 +133,10 @@ class AdvancedConfigurationWindow(object): gajim.interface.instances['advanced_config'] = self def cb_value_column_data(self, col, cell, model, iter_): - '''check if it's boolen or holds password stuff and if yes - make the cellrenderertext not editable else it's editable''' + """ + Check if it's boolen or holds password stuff and if yes make the + cellrenderertext not editable, else - it's editable + """ optname = model[iter_][C_PREFNAME] opttype = model[iter_][C_TYPE] if opttype == self.types['boolean'] or optname == 'password': From 3aa07f485eb032d4498d62345546e056400b9b2f Mon Sep 17 00:00:00 2001 From: Yann Leboulanger Date: Wed, 25 Nov 2009 16:29:33 +0100 Subject: [PATCH 066/259] refactor connection_handlers_zeroconf.py --- src/common/connection_handlers.py | 39 ++- src/common/zeroconf/client_zeroconf.py | 3 + .../zeroconf/connection_handlers_zeroconf.py | 309 +----------------- src/common/zeroconf/connection_zeroconf.py | 2 + src/gui_interface.py | 2 + 5 files changed, 40 insertions(+), 315 deletions(-) diff --git a/src/common/connection_handlers.py b/src/common/connection_handlers.py index 8bcf9b51c..089fbd69b 100644 --- a/src/common/connection_handlers.py +++ b/src/common/connection_handlers.py @@ -317,15 +317,20 @@ class ConnectionBytestream: field.setValue(common.xmpp.NS_BYTESTREAM) self.connection.send(iq) + def _ft_get_our_jid(self): + our_jid = gajim.get_jid_from_account(self.name) + resource = self.server_resource + return our_jid + '/' + resource + + def _ft_get_receiver_jid(self, file_props): + return file_props['receiver'].jid + '/' + file_props['receiver'].resource + def send_file_request(self, file_props): ''' send iq for new FT request ''' if not self.connection or self.connected < 2: return - our_jid = gajim.get_jid_from_account(self.name) - resource = self.server_resource - frm = our_jid + '/' + resource - file_props['sender'] = frm - fjid = file_props['receiver'].jid + '/' + file_props['receiver'].resource + file_props['sender'] = self._ft_get_our_jid() + fjid = self._ft_get_receiver_jid(file_props) iq = common.xmpp.Protocol(name = 'iq', to = fjid, typ = 'set') iq.setID(file_props['sid']) @@ -418,6 +423,9 @@ class ConnectionBytestream: self.dispatch('FILE_REQUEST_ERROR', (jid, file_props, '')) raise common.xmpp.NodeProcessed + def _ft_get_from(self, iq_obj): + return helpers.get_full_jid_from_iq(iq_obj) + def _bytestreamSetCB(self, con, iq_obj): log.debug('_bytestreamSetCB') target = unicode(iq_obj.getAttr('to')) @@ -434,7 +442,7 @@ class ConnectionBytestream: 'target': target, 'id': id_, 'sid': sid, - 'initiator': helpers.get_full_jid_from_iq(iq_obj) + 'initiator': self._ft_get_from(iq_obj) } for attr in item.getAttrs(): host_dict[attr] = item.getAttr(attr) @@ -472,7 +480,7 @@ class ConnectionBytestream: return if not real_id.startswith('au_'): return - frm = helpers.get_full_jid_from_iq(iq_obj) + frm = self._ft_get_from(iq_obj) id_ = real_id[3:] if id_ in self.files_props: file_props = self.files_props[id_] @@ -482,9 +490,12 @@ class ConnectionBytestream: gajim.socks5queue.activate_proxy(host['idx']) raise common.xmpp.NodeProcessed + def _ft_get_streamhost_jid_attr(self, streamhost): + return helpers.parse_jid(streamhost.getAttr('jid')) + def _bytestreamResultCB(self, con, iq_obj): log.debug('_bytestreamResultCB') - frm = helpers.get_full_jid_from_iq(iq_obj) + frm = self._ft_get_from(iq_obj) real_id = unicode(iq_obj.getAttr('id')) query = iq_obj.getTag('query') gajim.proxy65_manager.resolve_result(frm, query) @@ -512,7 +523,7 @@ class ConnectionBytestream: gajim.socks5queue.activate_proxy(host['idx']) break raise common.xmpp.NodeProcessed - jid = helpers.parse_jid(streamhost.getAttr('jid')) + jid = self._ft_get_streamhost_jid_attr(streamhost) if 'streamhost-used' in file_props and \ file_props['streamhost-used'] is True: raise common.xmpp.NodeProcessed @@ -569,7 +580,7 @@ class ConnectionBytestream: if 'request-id' in file_props: # we have already sent streamhosts info return - file_props['receiver'] = helpers.get_full_jid_from_iq(iq_obj) + file_props['receiver'] = self._ft_get_from(iq_obj) si = iq_obj.getTag('si') file_tag = si.getTag('file') range_tag = None @@ -595,9 +606,9 @@ class ConnectionBytestream: def _siSetCB(self, con, iq_obj): log.debug('_siSetCB') - jid = helpers.get_jid_from_iq(iq_obj) + jid = self._ft_get_from(iq_obj) file_props = {'type': 'r'} - file_props['sender'] = helpers.get_full_jid_from_iq(iq_obj) + file_props['sender'] = jid file_props['request-id'] = unicode(iq_obj.getAttr('id')) si = iq_obj.getTag('si') profile = si.getAttr('profile') @@ -635,7 +646,7 @@ class ConnectionBytestream: file_props['mime-type'] = mime_type our_jid = gajim.get_jid_from_account(self.name) resource = self.server_resource - file_props['receiver'] = our_jid + '/' + resource + file_props['receiver'] = self._ft_get_our_jid() file_props['sid'] = unicode(si.getAttr('id')) file_props['transfered_size'] = [] gajim.socks5queue.add_file_props(self.name, file_props) @@ -656,7 +667,7 @@ class ConnectionBytestream: if file_props is None: # file properties for jid is none return - jid = helpers.get_jid_from_iq(iq_obj) + jid = self._ft_get_from(iq_obj) file_props['error'] = -3 self.dispatch('FILE_REQUEST_ERROR', (jid, file_props, '')) raise common.xmpp.NodeProcessed diff --git a/src/common/zeroconf/client_zeroconf.py b/src/common/zeroconf/client_zeroconf.py index 6b50a9fea..23834be28 100644 --- a/src/common/zeroconf/client_zeroconf.py +++ b/src/common/zeroconf/client_zeroconf.py @@ -288,6 +288,7 @@ class P2PClient(IdleObject): pass def _register_handlers(self): + self._caller.peerhost = self.Connection._sock.getsockname() self.RegisterHandler('message', lambda conn, data:self._caller._messageCB( self.Server, conn, data)) self.RegisterHandler('iq', self._caller._siSetCB, 'set', @@ -709,6 +710,8 @@ class ClientZeroconf: try: item = self.roster[to] except KeyError: + raise KeyError + print 'ret', to, self.roster.keys() # Contact offline return -1 diff --git a/src/common/zeroconf/connection_handlers_zeroconf.py b/src/common/zeroconf/connection_handlers_zeroconf.py index 4ea0e65bb..60dbb0c1b 100644 --- a/src/common/zeroconf/connection_handlers_zeroconf.py +++ b/src/common/zeroconf/connection_handlers_zeroconf.py @@ -70,311 +70,18 @@ class ConnectionVcard(connection_handlers.ConnectionVcard): pass class ConnectionBytestream(connection_handlers.ConnectionBytestream): - def send_socks5_info(self, file_props, fast = True, receiver = None, - sender = None): - ''' send iq for the present streamhosts and proxies ''' - if not isinstance(self.peerhost, tuple): - return - port = gajim.config.get('file_transfers_port') - ft_add_hosts_to_send = gajim.config.get('ft_add_hosts_to_send') - if receiver is None: - receiver = file_props['receiver'] - if sender is None: - sender = file_props['sender'] - sha_str = helpers.get_auth_sha(file_props['sid'], sender, - receiver) - file_props['sha_str'] = sha_str - ft_add_hosts = [] - if ft_add_hosts_to_send: - ft_add_hosts_to_send = [e.strip() for e in ft_add_hosts_to_send.split(',')] - for ft_host in ft_add_hosts_to_send: - try: - ft_host = socket.gethostbyname(ft_host) - ft_add_hosts.append(ft_host) - except socket.gaierror: - self.dispatch('ERROR', (_('Wrong host'), _('The host %s you configured as the ft_add_hosts_to_send advanced option is not valid, so ignored.') % ft_host)) - listener = gajim.socks5queue.start_listener(port, - sha_str, self._result_socks5_sid, file_props['sid']) - if listener is None: - file_props['error'] = -5 - self.dispatch('FILE_REQUEST_ERROR', (unicode(receiver), file_props, - '')) - self._connect_error(unicode(receiver), file_props['sid'], - file_props['sid'], code = 406) - return + def _ft_get_from(self, iq_obj): + return unicode(iq_obj.getFrom()) - iq = common.xmpp.Protocol(name = 'iq', to = unicode(receiver), - typ = 'set') - file_props['request-id'] = 'id_' + file_props['sid'] - iq.setID(file_props['request-id']) - query = iq.setTag('query') - query.setNamespace(common.xmpp.NS_BYTESTREAM) - query.setAttr('mode', 'tcp') - query.setAttr('sid', file_props['sid']) - for ft_host in ft_add_hosts: - # The streamhost, if set - ostreamhost = common.xmpp.Node(tag = 'streamhost') - query.addChild(node = ostreamhost) - ostreamhost.setAttr('port', unicode(port)) - ostreamhost.setAttr('host', ft_host) - ostreamhost.setAttr('jid', sender) - for thehost in self.peerhost: - thehost = self.peerhost[0] - streamhost = common.xmpp.Node(tag = 'streamhost') # My IP - query.addChild(node = streamhost) - streamhost.setAttr('port', unicode(port)) - streamhost.setAttr('host', thehost) - streamhost.setAttr('jid', sender) - self.connection.send(iq) + def _ft_get_our_jid(self): + return gajim.get_jid_from_account(self.name) - def send_file_request(self, file_props): - ''' send iq for new FT request ''' - if not self.connection or self.connected < 2: - return - our_jid = gajim.get_jid_from_account(self.name) - frm = our_jid - file_props['sender'] = frm - fjid = file_props['receiver'].jid - iq = common.xmpp.Protocol(name = 'iq', to = fjid, - typ = 'set') - iq.setID(file_props['sid']) - self.files_props[file_props['sid']] = file_props - si = iq.setTag('si') - si.setNamespace(common.xmpp.NS_SI) - si.setAttr('profile', common.xmpp.NS_FILE) - si.setAttr('id', file_props['sid']) - file_tag = si.setTag('file') - file_tag.setNamespace(common.xmpp.NS_FILE) - file_tag.setAttr('name', file_props['name']) - file_tag.setAttr('size', file_props['size']) - desc = file_tag.setTag('desc') - if 'desc' in file_props: - desc.setData(file_props['desc']) - file_tag.setTag('range') - feature = si.setTag('feature') - feature.setNamespace(common.xmpp.NS_FEATURE) - _feature = common.xmpp.DataForm(typ='form') - feature.addChild(node=_feature) - field = _feature.setField('stream-method') - field.setAttr('type', 'list-single') - field.addOption(common.xmpp.NS_BYTESTREAM) - self.connection.send(iq) + def _ft_get_receiver_jid(self, file_props): + return file_props['receiver'].jid - def _bytestreamSetCB(self, con, iq_obj): - log.debug('_bytestreamSetCB') - target = unicode(iq_obj.getAttr('to')) - id_ = unicode(iq_obj.getAttr('id')) - query = iq_obj.getTag('query') - sid = unicode(query.getAttr('sid')) - file_props = gajim.socks5queue.get_file_props( - self.name, sid) - streamhosts=[] - for item in query.getChildren(): - if item.getName() == 'streamhost': - host_dict={ - 'state': 0, - 'target': target, - 'id': id_, - 'sid': sid, - 'initiator': unicode(iq_obj.getFrom()) - } - for attr in item.getAttrs(): - host_dict[attr] = item.getAttr(attr) - streamhosts.append(host_dict) - if file_props is None: - if sid in self.files_props: - file_props = self.files_props[sid] - file_props['fast'] = streamhosts - if file_props['type'] == 's': - if 'streamhosts' in file_props: - file_props['streamhosts'].extend(streamhosts) - else: - file_props['streamhosts'] = streamhosts - if not gajim.socks5queue.get_file_props(self.name, sid): - gajim.socks5queue.add_file_props(self.name, file_props) - gajim.socks5queue.connect_to_hosts(self.name, sid, - self.send_success_connect_reply, None) - raise common.xmpp.NodeProcessed + def _ft_get_streamhost_jid_attr(self, streamhost): + return streamhost.getAttr('jid') - file_props['streamhosts'] = streamhosts - if file_props['type'] == 'r': - gajim.socks5queue.connect_to_hosts(self.name, sid, - self.send_success_connect_reply, self._connect_error) - raise common.xmpp.NodeProcessed - - def _ResultCB(self, con, iq_obj): - log.debug('_ResultCB') - # if we want to respect jep-0065 we have to check for proxy - # activation result in any result iq - real_id = unicode(iq_obj.getAttr('id')) - if not real_id.startswith('au_'): - return - frm = unicode(iq_obj.getFrom()) - id_ = real_id[3:] - if id_ in self.files_props: - file_props = self.files_props[id_] - if file_props['streamhost-used']: - for host in file_props['proxyhosts']: - if host['initiator'] == frm and 'idx' in host: - gajim.socks5queue.activate_proxy(host['idx']) - raise common.xmpp.NodeProcessed - - def _bytestreamResultCB(self, con, iq_obj): - log.debug('_bytestreamResultCB') - frm = unicode(iq_obj.getFrom()) - real_id = unicode(iq_obj.getAttr('id')) - query = iq_obj.getTag('query') - gajim.proxy65_manager.resolve_result(frm, query) - - try: - streamhost = query.getTag('streamhost-used') - except Exception: # this bytestream result is not what we need - pass - id_ = real_id[3:] - if id_ in self.files_props: - file_props = self.files_props[id_] - else: - raise common.xmpp.NodeProcessed - if streamhost is None: - # proxy approves the activate query - if real_id.startswith('au_'): - id_ = real_id[3:] - if 'streamhost-used' not in file_props or \ - file_props['streamhost-used'] is False: - raise common.xmpp.NodeProcessed - if 'proxyhosts' not in file_props: - raise common.xmpp.NodeProcessed - for host in file_props['proxyhosts']: - if host['initiator'] == frm and \ - unicode(query.getAttr('sid')) == file_props['sid']: - gajim.socks5queue.activate_proxy(host['idx']) - break - raise common.xmpp.NodeProcessed - jid = streamhost.getAttr('jid') - if 'streamhost-used' in file_props and \ - file_props['streamhost-used'] is True: - raise common.xmpp.NodeProcessed - - if real_id.startswith('au_'): - gajim.socks5queue.send_file(file_props, self.name) - raise common.xmpp.NodeProcessed - - proxy = None - if 'proxyhosts' in file_props: - for proxyhost in file_props['proxyhosts']: - if proxyhost['jid'] == jid: - proxy = proxyhost - - if proxy is not None: - file_props['streamhost-used'] = True - if 'streamhosts' not in file_props: - file_props['streamhosts'] = [] - file_props['streamhosts'].append(proxy) - file_props['is_a_proxy'] = True - receiver = socks5.Socks5Receiver(gajim.idlequeue, proxy, file_props['sid'], file_props) - gajim.socks5queue.add_receiver(self.name, receiver) - proxy['idx'] = receiver.queue_idx - gajim.socks5queue.on_success = self._proxy_auth_ok - raise common.xmpp.NodeProcessed - - else: - gajim.socks5queue.send_file(file_props, self.name) - if 'fast' in file_props: - fasts = file_props['fast'] - if len(fasts) > 0: - self._connect_error(frm, fasts[0]['id'], file_props['sid'], - code = 406) - - raise common.xmpp.NodeProcessed - - def _siResultCB(self, con, iq_obj): - log.debug('_siResultCB') - self.peerhost = con._owner.Connection._sock.getsockname() - id_ = iq_obj.getAttr('id') - if id_ not in self.files_props: - # no such jid - return - file_props = self.files_props[id_] - if file_props is None: - # file properties for jid is none - return - if 'request-id' in file_props: - # we have already sent streamhosts info - return - file_props['receiver'] = unicode(iq_obj.getFrom()) - si = iq_obj.getTag('si') - file_tag = si.getTag('file') - range_tag = None - if file_tag: - range_tag = file_tag.getTag('range') - if range_tag: - offset = range_tag.getAttr('offset') - if offset: - file_props['offset'] = int(offset) - length = range_tag.getAttr('length') - if length: - file_props['length'] = int(length) - feature = si.setTag('feature') - if feature.getNamespace() != common.xmpp.NS_FEATURE: - return - form_tag = feature.getTag('x') - form = common.xmpp.DataForm(node=form_tag) - field = form.getField('stream-method') - if field.getValue() != common.xmpp.NS_BYTESTREAM: - return - self.send_socks5_info(file_props, fast = True) - raise common.xmpp.NodeProcessed - - def _siSetCB(self, con, iq_obj): - log.debug('_siSetCB') - jid = unicode(iq_obj.getFrom()) - si = iq_obj.getTag('si') - profile = si.getAttr('profile') - mime_type = si.getAttr('mime-type') - if profile != common.xmpp.NS_FILE: - return - file_tag = si.getTag('file') - file_props = {'type': 'r'} - for attribute in file_tag.getAttrs(): - if attribute in ('name', 'size', 'hash', 'date'): - val = file_tag.getAttr(attribute) - if val is None: - continue - file_props[attribute] = val - file_desc_tag = file_tag.getTag('desc') - if file_desc_tag is not None: - file_props['desc'] = file_desc_tag.getData() - - if mime_type is not None: - file_props['mime-type'] = mime_type - our_jid = gajim.get_jid_from_account(self.name) - file_props['receiver'] = our_jid - file_props['sender'] = unicode(iq_obj.getFrom()) - file_props['request-id'] = unicode(iq_obj.getAttr('id')) - file_props['sid'] = unicode(si.getAttr('id')) - file_props['transfered_size'] = [] - gajim.socks5queue.add_file_props(self.name, file_props) - self.dispatch('FILE_REQUEST', (jid, file_props)) - raise common.xmpp.NodeProcessed - - def _siErrorCB(self, con, iq_obj): - log.debug('_siErrorCB') - si = iq_obj.getTag('si') - profile = si.getAttr('profile') - if profile != common.xmpp.NS_FILE: - return - id_ = iq_obj.getAttr('id') - if id_ not in self.files_props: - # no such jid - return - file_props = self.files_props[id_] - if file_props is None: - # file properties for jid is none - return - jid = unicode(iq_obj.getFrom()) - file_props['error'] = -3 - self.dispatch('FILE_REQUEST_ERROR', (jid, file_props, '')) - raise common.xmpp.NodeProcessed class ConnectionHandlersZeroconf(ConnectionVcard, ConnectionBytestream, ConnectionCommands, ConnectionPEP, connection_handlers.ConnectionHandlersBase): diff --git a/src/common/zeroconf/connection_zeroconf.py b/src/common/zeroconf/connection_zeroconf.py index e1cc30971..dff41e39b 100644 --- a/src/common/zeroconf/connection_zeroconf.py +++ b/src/common/zeroconf/connection_zeroconf.py @@ -85,6 +85,8 @@ class ConnectionZeroconf(CommonConnection, ConnectionHandlersZeroconf): 'custom_port', 5298) gajim.config.set_per('accounts', gajim.ZEROCONF_ACC_NAME, 'is_zeroconf', True) + gajim.config.set_per('accounts', gajim.ZEROCONF_ACC_NAME, + 'use_ft_proxies', False) #XXX make sure host is US-ASCII self.host = unicode(socket.gethostname()) gajim.config.set_per('accounts', gajim.ZEROCONF_ACC_NAME, 'hostname', diff --git a/src/gui_interface.py b/src/gui_interface.py index 7c7825100..7a948d5c1 100644 --- a/src/gui_interface.py +++ b/src/gui_interface.py @@ -1324,6 +1324,7 @@ class Interface: def handle_event_file_request_error(self, account, array): # ('FILE_REQUEST_ERROR', account, (jid, file_props, error_msg)) jid, file_props, errmsg = array + jid = gajim.get_jid_without_resource(jid) ft = self.instances['file_transfers'] ft.set_status(file_props['type'], file_props['sid'], 'stop') errno = file_props['error'] @@ -1353,6 +1354,7 @@ class Interface: def handle_event_file_request(self, account, array): jid = array[0] + jid = gajim.get_jid_without_resource(jid) if jid not in gajim.contacts.get_jid_list(account): keyID = '' attached_keys = gajim.config.get_per('accounts', account, From 31f5e22f6278b95c44cedcb24a762d5ff8fb5a15 Mon Sep 17 00:00:00 2001 From: Alexander Cherniuk Date: Wed, 25 Nov 2009 17:45:05 +0200 Subject: [PATCH 067/259] One more portion of doc-strings refactoring --- src/atom_window.py | 18 ++- src/config.py | 138 +++++++++++----- src/conversation_textview.py | 75 +++++---- src/dataforms_widget.py | 64 +++++--- src/dialogs.py | 304 +++++++++++++++++++++++++---------- 5 files changed, 417 insertions(+), 182 deletions(-) diff --git a/src/atom_window.py b/src/atom_window.py index 56449846f..4712dfc41 100644 --- a/src/atom_window.py +++ b/src/atom_window.py @@ -35,7 +35,9 @@ class AtomWindow: @classmethod def newAtomEntry(cls, entry): - ''' Queue new entry, open window if there's no one opened. ''' + """ + Queue new entry, open window if there's no one opened + """ cls.entries.append(entry) if cls.window is None: @@ -48,7 +50,9 @@ class AtomWindow: cls.window = None def __init__(self): - ''' Create new window... only if we have anything to show. ''' + """ + Create new window... only if we have anything to show + """ assert len(self.__class__.entries)>0 self.entry = None # the entry actually displayed @@ -69,7 +73,9 @@ class AtomWindow: self.feed_title_eventbox.add_events(gtk.gdk.BUTTON_PRESS_MASK) def displayNextEntry(self): - ''' Get next entry from the queue and display it in the window. ''' + """ + Get next entry from the queue and display it in the window + """ assert len(self.__class__.entries)>0 newentry = self.__class__.entries.pop(0) @@ -103,8 +109,10 @@ class AtomWindow: self.entry = newentry def updateCounter(self): - ''' We display number of events on the top of window, sometimes it needs to be - changed...''' + """ + Display number of events on the top of window, sometimes it needs to be + changed + """ count = len(self.__class__.entries) if count>0: self.new_entry_label.set_text(i18n.ngettext( diff --git a/src/config.py b/src/config.py index 727744a04..adf5078c5 100644 --- a/src/config.py +++ b/src/config.py @@ -63,17 +63,23 @@ from common.exceptions import GajimGeneralException #---------- PreferencesWindow class -------------# class PreferencesWindow: - '''Class for Preferences window''' + """ + Class for Preferences window + """ def on_preferences_window_destroy(self, widget): - '''close window''' + """ + Close window + """ del gajim.interface.instances['preferences'] def on_close_button_clicked(self, widget): self.window.destroy() def __init__(self): - '''Initialize Preferences window''' + """ + Initialize Preferences window + """ self.xml = gtkgui_helpers.get_glade('preferences_window.glade') self.window = self.xml.get_widget('preferences_window') self.window.set_transient_for(gajim.interface.roster.window) @@ -495,8 +501,10 @@ class PreferencesWindow: self.window.hide() def get_per_account_option(self, opt): - '''Return the value of the option opt if it's the same in all accounts - else returns "mixed"''' + """ + Return the value of the option opt if it's the same in all accounts else + returns "mixed" + """ if len(gajim.connections) == 0: # a non existant key return default value return gajim.config.get_per('accounts', '__default__', opt) @@ -585,7 +593,9 @@ class PreferencesWindow: self.toggle_emoticons() def toggle_emoticons(self): - '''Update emoticons state in Opened Chat Windows''' + """ + Update emoticons state in Opened Chat Windows + """ for win in gajim.interface.msg_win_mgr.windows(): win.toggle_emoticons() @@ -779,7 +789,9 @@ class PreferencesWindow: self.sounds_preferences.window.present() def update_text_tags(self): - '''Update color tags in Opened Chat Windows''' + """ + Update color tags in opened chat windows + """ for win in gajim.interface.msg_win_mgr.windows(): win.update_tags() @@ -800,7 +812,9 @@ class PreferencesWindow: gajim.interface.save_config() def update_text_font(self): - '''Update text font in Opened Chat Windows''' + """ + Update text font in opened chat windows + """ for win in gajim.interface.msg_win_mgr.windows(): win.update_font() @@ -879,7 +893,9 @@ class PreferencesWindow: gajim.interface.save_config() def _set_color(self, state, widget_name, option): - ''' set color value in prefs and update the UI ''' + """ + Set color value in prefs and update the UI + """ if state: color = self.xml.get_widget(widget_name).get_color() color_string = gtkgui_helpers.make_color_string(color) @@ -1346,7 +1362,10 @@ class ManageProxiesWindow: #---------- AccountsWindow class -------------# class AccountsWindow: - '''Class for accounts window: list of accounts''' + """ + Class for accounts window: list of accounts + """ + def on_accounts_window_destroy(self, widget): del gajim.interface.instances['accounts'] @@ -1414,7 +1433,9 @@ class AccountsWindow: iter_ = model.iter_next(iter_) def init_accounts(self): - '''initialize listStore with existing accounts''' + """ + Initialize listStore with existing accounts + """ self.remove_button.set_sensitive(False) self.rename_button.set_sensitive(False) self.current_account = None @@ -1440,7 +1461,9 @@ class AccountsWindow: elif self.need_relogin and self.current_account and \ gajim.connections[self.current_account].connected > 0: def login(account, show_before, status_before): - ''' login with previous status''' + """ + Login with previous status + """ # first make sure connection is really closed, # 0.5 may not be enough gajim.connections[account].disconnect(True) @@ -1473,7 +1496,9 @@ class AccountsWindow: self.resend_presence = False def on_accounts_treeview_cursor_changed(self, widget): - '''Activate modify buttons when a row is selected, update accounts info''' + """ + Activate modify buttons when a row is selected, update accounts info + """ sel = self.accounts_treeview.get_selection() (model, iter_) = sel.get_selected() if iter_: @@ -1739,7 +1764,9 @@ class AccountsWindow: gajim.config.get_per('accounts', account, 'use_ft_proxies')) def on_add_button_clicked(self, widget): - '''When add button is clicked: open an account information window''' + """ + When add button is clicked: open an account information window + """ if 'account_creation_wizard' in gajim.interface.instances: gajim.interface.instances['account_creation_wizard'].window.present() else: @@ -1747,8 +1774,10 @@ class AccountsWindow: AccountCreationWizardWindow() def on_remove_button_clicked(self, widget): - '''When delete button is clicked: - Remove an account from the listStore and from the config file''' + """ + When delete button is clicked: Remove an account from the listStore and + from the config file + """ if not self.current_account: return account = self.current_account @@ -2409,8 +2438,11 @@ class AccountsWindow: 'zeroconf_email', email) class FakeDataForm(gtk.Table, object): - '''Class for forms that are in XML format value1 - infos in a table {entry1: value1, }''' + """ + Class for forms that are in XML format value1 infos in a + table {entry1: value1} + """ + def __init__(self, infos): gtk.Table.__init__(self) self.infos = infos @@ -2418,7 +2450,9 @@ class FakeDataForm(gtk.Table, object): self._draw_table() def _draw_table(self): - '''Draw the table''' + """ + Draw the table + """ nbrow = 0 if 'instructions' in self.infos: nbrow = 1 @@ -2452,9 +2486,11 @@ class FakeDataForm(gtk.Table, object): return self.infos class ServiceRegistrationWindow: - '''Class for Service registration window: - Window that appears when we want to subscribe to a service - if is_form we use dataforms_widget else we use service_registarion_window''' + """ + Class for Service registration window. Window that appears when we want to + subscribe to a service if is_form we use dataforms_widget else we use + service_registarion_window + """ def __init__(self, service, infos, account, is_form): self.service = service self.account = account @@ -2501,7 +2537,7 @@ class ServiceRegistrationWindow: self.window.destroy() class GroupchatConfigWindow: - '''GroupchatConfigWindow class''' + def __init__(self, account, room_jid, form = None): self.account = account self.room_jid = room_jid @@ -2654,7 +2690,9 @@ class GroupchatConfigWindow: self.remove_button[affiliation].set_sensitive(True) def affiliation_list_received(self, users_dict): - '''Fill the affiliation treeview''' + """ + Fill the affiliation treeview + """ for jid in users_dict: affiliation = users_dict[jid]['affiliation'] if affiliation not in self.affiliation_labels.keys(): @@ -2703,8 +2741,10 @@ class GroupchatConfigWindow: #---------- RemoveAccountWindow class -------------# class RemoveAccountWindow: - '''ask for removing from gajim only or from gajim and server too - and do removing of the account given''' + """ + Ask for removing from gajim only or from gajim and server too and do + removing of the account given + """ def on_remove_account_window_destroy(self, widget): if self.account in gajim.interface.instances: @@ -2904,7 +2944,9 @@ class ManageBookmarksWindow: del gajim.interface.instances['manage_bookmarks'] def on_add_bookmark_button_clicked(self, widget): - '''Add a new bookmark.''' + """ + Add a new bookmark + """ # Get the account that is currently used # (the parent of the currently selected item) (model, iter_) = self.selection.get_selected() @@ -2929,9 +2971,9 @@ class ManageBookmarksWindow: self.view.set_cursor(model.get_path(iter_)) def on_remove_bookmark_button_clicked(self, widget): - ''' - Remove selected bookmark. - ''' + """ + Remove selected bookmark + """ (model, iter_) = self.selection.get_selected() if not iter_: # Nothing selected return @@ -2944,9 +2986,9 @@ class ManageBookmarksWindow: self.clear_fields() def check_valid_bookmark(self): - ''' - Check if all neccessary fields are entered correctly. - ''' + """ + Check if all neccessary fields are entered correctly + """ (model, iter_) = self.selection.get_selected() if not model.iter_parent(iter_): @@ -2963,10 +3005,10 @@ class ManageBookmarksWindow: return True def on_ok_button_clicked(self, widget): - ''' - Parse the treestore data into our new bookmarks array, - then send the new bookmarks to the server. - ''' + """ + Parse the treestore data into our new bookmarks array, then send the new + bookmarks to the server. + """ (model, iter_) = self.selection.get_selected() if iter_ and model.iter_parent(iter_): #bookmark selected, check it @@ -2997,9 +3039,9 @@ class ManageBookmarksWindow: self.window.destroy() def bookmark_selected(self, selection): - ''' + """ Fill in the bookmark's data into the fields. - ''' + """ (model, iter_) = selection.get_selected() if not iter_: @@ -3444,8 +3486,10 @@ class AccountCreationWizardWindow: return True # loop forever def new_acc_connected(self, form, is_form, ssl_msg, ssl_err, ssl_cert, - ssl_fingerprint): - '''connection to server succeded, present the form to the user.''' + ssl_fingerprint): + """ + Connection to server succeded, present the form to the user + """ if self.update_progressbar_timeout_id is not None: gobject.source_remove(self.update_progressbar_timeout_id) self.back_button.show() @@ -3479,7 +3523,9 @@ class AccountCreationWizardWindow: self.notebook.set_current_page(4) # show form page def new_acc_not_connected(self, reason): - '''Account creation failed: connection to server failed''' + """ + Account creation failed: connection to server failed + """ if self.account not in gajim.connections: return if self.update_progressbar_timeout_id is not None: @@ -3499,7 +3545,9 @@ class AccountCreationWizardWindow: self.notebook.set_current_page(6) # show finish page def acc_is_ok(self, config): - '''Account creation succeeded''' + """ + Account creation succeeded + """ self.create_vars(config) self.show_finish_page() @@ -3507,7 +3555,9 @@ class AccountCreationWizardWindow: gobject.source_remove(self.update_progressbar_timeout_id) def acc_is_not_ok(self, reason): - '''Account creation failed''' + """ + Account creation failed + """ self.back_button.show() self.cancel_button.show() self.go_online_checkbutton.hide() diff --git a/src/conversation_textview.py b/src/conversation_textview.py index fa5dcd25e..7744ef685 100644 --- a/src/conversation_textview.py +++ b/src/conversation_textview.py @@ -158,8 +158,10 @@ class TextViewImage(gtk.Image): class ConversationTextview(gobject.GObject): - '''Class for the conversation textview (where user reads already said - messages) for chat/groupchat windows''' + """ + Class for the conversation textview (where user reads already said messages) + for chat/groupchat windows + """ __gsignals__ = dict( quote = (gobject.SIGNAL_RUN_LAST | gobject.SIGNAL_ACTION, None, # return value @@ -177,8 +179,10 @@ class ConversationTextview(gobject.GObject): SCROLL_DELAY = 33 # milliseconds def __init__(self, account, used_in_history_window = False): - '''if used_in_history_window is True, then we do not show - Clear menuitem in context menu''' + """ + If used_in_history_window is True, then we do not show Clear menuitem in + context menu + """ gobject.GObject.__init__(self) self.used_in_history_window = used_in_history_window @@ -642,8 +646,9 @@ class ConversationTextview(gobject.GObject): return False def on_textview_motion_notify_event(self, widget, event): - '''change the cursor to a hand when we are over a mail or an - url''' + """ + Change the cursor to a hand when we are over a mail or an url + """ pointer_x, pointer_y = self.tv.window.get_pointer()[0:2] x, y = self.tv.window_to_buffer_coords(gtk.TEXT_WINDOW_TEXT, pointer_x, pointer_y) @@ -688,7 +693,9 @@ class ConversationTextview(gobject.GObject): self.change_cursor = True def clear(self, tv = None): - '''clear text in the textview''' + """ + Clear text in the textview + """ buffer_ = self.tv.get_buffer() start, end = buffer_.get_bounds() buffer_.delete(start, end) @@ -698,15 +705,18 @@ class ConversationTextview(gobject.GObject): self.focus_out_end_mark = None def visit_url_from_menuitem(self, widget, link): - '''basically it filters out the widget instance''' + """ + Basically it filters out the widget instance + """ helpers.launch_browser_mailer('url', link) def on_textview_populate_popup(self, textview, menu): - '''we override the default context menu and we prepend Clear - (only if used_in_history_window is False) - and if we have sth selected we show a submenu with actions on - the phrase (see on_conversation_textview_button_press_event)''' - + """ + Override the default context menu and we prepend Clear (only if + used_in_history_window is False) and if we have sth selected we show a + submenu with actions on the phrase (see + on_conversation_textview_button_press_event) + """ separator_menuitem_was_added = False if not self.used_in_history_window: item = gtk.SeparatorMenuItem() @@ -971,13 +981,13 @@ class ConversationTextview(gobject.GObject): def detect_and_print_special_text(self, otext, other_tags, graphics=True): - '''detects special text (emots & links & formatting) - prints normal text before any special text it founts, - then print special text (that happens many times until - last special text is printed) and then returns the index + """ + Detect special text (emots & links & formatting), print normal text + before any special text it founds, then print special text (that happens + many times until last special text is printed) and then return the index after *last* special text, so we can print it in - print_conversation_line()''' - + print_conversation_line() + """ buffer_ = self.tv.get_buffer() insert_tags_func = buffer_.insert_with_tags_by_name @@ -1023,8 +1033,10 @@ class ConversationTextview(gobject.GObject): return buffer_.get_end_iter() def print_special_text(self, special_text, other_tags, graphics=True): - '''is called by detect_and_print_special_text and prints - special text (emots, links, formatting)''' + """ + Is called by detect_and_print_special_text and prints special text + (emots, links, formatting) + """ tags = [] use_other_tags = True text_is_valid_uri = False @@ -1163,9 +1175,12 @@ class ConversationTextview(gobject.GObject): buffer_.insert_with_tags_by_name(end_iter, '\n', 'eol') def print_conversation_line(self, text, jid, kind, name, tim, - other_tags_for_name=[], other_tags_for_time=[], other_tags_for_text=[], - subject=None, old_kind=None, xhtml=None, simple=False, graphics=True): - '''prints 'chat' type messages''' + other_tags_for_name=[], other_tags_for_time=[], + other_tags_for_text=[], subject=None, old_kind=None, xhtml=None, + simple=False, graphics=True): + """ + Print 'chat' type messages + """ buffer_ = self.tv.get_buffer() buffer_.begin_user_action() if self.marks_queue.full(): @@ -1263,8 +1278,10 @@ class ConversationTextview(gobject.GObject): buffer_.end_user_action() def get_time_to_show(self, tim): - '''Get the time, with the day before if needed and return it. - It DOESN'T format a fuzzy time''' + """ + Get the time, with the day before if needed and return it. It DOESN'T + format a fuzzy time + """ format = '' # get difference in days since epoch (86400 = 24*3600) # number of days since epoch for current time (in GMT) - @@ -1317,8 +1334,10 @@ class ConversationTextview(gobject.GObject): self.print_empty_line() def print_real_text(self, text, text_tags=[], name=None, xhtml=None, - graphics=True): - '''this adds normal and special text. call this to add text''' + graphics=True): + """ + Add normal and special text. call this to add text + """ if xhtml: try: if name and (text.startswith('/me ') or text.startswith('/me\n')): diff --git a/src/dataforms_widget.py b/src/dataforms_widget.py index 18195dccd..4a9681dab 100644 --- a/src/dataforms_widget.py +++ b/src/dataforms_widget.py @@ -38,7 +38,10 @@ import itertools class DataFormWidget(gtk.Alignment, object): # "public" interface - ''' Data Form widget. Use like any other widget. ''' + """ + Data Form widget. Use like any other widget + """ + def __init__(self, dataformnode=None): ''' Create a widget. ''' gtk.Alignment.__init__(self, xscale=1.0, yscale=1.0) @@ -65,7 +68,9 @@ class DataFormWidget(gtk.Alignment, object): selection.set_mode(gtk.SELECTION_MULTIPLE) def set_data_form(self, dataform): - ''' Set the data form (xmpp.DataForm) displayed in widget. ''' + """ + Set the data form (xmpp.DataForm) displayed in widget + """ assert isinstance(dataform, dataforms.DataForm) self.del_data_form() @@ -84,7 +89,9 @@ class DataFormWidget(gtk.Alignment, object): gtkgui_helpers.label_set_autowrap(self.instructions_label) def get_data_form(self): - ''' Data form displayed in the widget or None if no form. ''' + """ + Data form displayed in the widget or None if no form + """ return self._data_form def del_data_form(self): @@ -95,8 +102,10 @@ class DataFormWidget(gtk.Alignment, object): 'Data form presented in a widget') def get_title(self): - ''' Get the title of data form, as a unicode object. If no - title or no form, returns u''. Useful for setting window title. ''' + """ + Get the title of data form, as a unicode object. If no title or no form, + returns u''. Useful for setting window title + """ if self._data_form is not None: if self._data_form.title is not None: return self._data_form.title @@ -117,9 +126,11 @@ class DataFormWidget(gtk.Alignment, object): pass def clean_data_form(self): - '''Remove data about existing form. This metod is empty, because - it is rewritten by build_*_data_form, according to type of form - which is actually displayed.''' + """ + Remove data about existing form. This metod is empty, because it is + rewritten by build_*_data_form, according to type of form which is + actually displayed + """ pass def build_single_data_form(self): @@ -138,14 +149,18 @@ class DataFormWidget(gtk.Alignment, object): self.clean_data_form = self.clean_single_data_form def clean_single_data_form(self): - '''(Called as clean_data_form, read the docs of clean_data_form()). - Remove form from widget.''' + """ + Called as clean_data_form, read the docs of clean_data_form(). Remove + form from widget + """ self.singleform.destroy() self.clean_data_form = self.empty_method # we won't call it twice del self.singleform def build_multiple_data_form(self): - '''Invoked when new multiple form is to be created.''' + """ + Invoked when new multiple form is to be created + """ assert isinstance(self._data_form, dataforms.MultipleDataForm) self.clean_data_form() @@ -196,13 +211,17 @@ class DataFormWidget(gtk.Alignment, object): self.refresh_multiple_buttons() def clean_multiple_data_form(self): - '''(Called as clean_data_form, read the docs of clean_data_form()). - Remove form from widget.''' + """ + Called as clean_data_form, read the docs of clean_data_form(). Remove + form from widget + """ self.clean_data_form = self.empty_method # we won't call it twice del self.multiplemodel def refresh_multiple_buttons(self): - ''' Checks for treeview state and makes control buttons sensitive.''' + """ + Checks for treeview state and makes control buttons sensitive + """ selection = self.records_treeview.get_selection() model = self.records_treeview.get_model() count = selection.count_selected_rows() @@ -273,9 +292,12 @@ class DataFormWidget(gtk.Alignment, object): self.refresh_multiple_buttons() class SingleForm(gtk.Table, object): - ''' Widget that represent DATAFORM_SINGLE mode form. Because this is used - not only to display single forms, but to form input windows of multiple-type - forms, it is in another class.''' + """ + Widget that represent DATAFORM_SINGLE mode form. Because this is used not + only to display single forms, but to form input windows of multiple-type + forms, it is in another class + """ + def __init__(self, dataform): assert isinstance(dataform, dataforms.SimpleDataForm) @@ -284,9 +306,11 @@ class SingleForm(gtk.Table, object): self.set_row_spacings(6) def decorate_with_tooltip(widget, field): - ''' Adds a tooltip containing field's description to a widget. - Creates EventBox if widget doesn't have its own gdk window. - Returns decorated widget. ''' + """ + Adds a tooltip containing field's description to a widget. Creates + EventBox if widget doesn't have its own gdk window. Returns decorated + widget + """ if field.description != '': if widget.flags() & gtk.NO_WINDOW: evbox = gtk.EventBox() diff --git a/src/dialogs.py b/src/dialogs.py index 4f2802e75..2ca3bbcc2 100644 --- a/src/dialogs.py +++ b/src/dialogs.py @@ -61,9 +61,14 @@ from common import dataforms from common.exceptions import GajimGeneralException class EditGroupsDialog: - '''Class for the edit group dialog window''' + """ + Class for the edit group dialog window + """ + def __init__(self, list_): - '''list_ is a list of (contact, account) tuples''' + """ + list_ is a list of (contact, account) tuples + """ self.xml = gtkgui_helpers.get_glade('edit_groups_dialog.glade') self.dialog = self.xml.get_widget('edit_groups_dialog') self.dialog.set_transient_for(gajim.interface.roster.window) @@ -96,7 +101,9 @@ class EditGroupsDialog: self.dialog.destroy() def remove_group(self, group): - '''remove group group from all contacts and all their brothers''' + """ + Remove group group from all contacts and all their brothers + """ for (contact, account) in self.list_: gajim.interface.roster.remove_contact_from_groups(contact.jid, account, [group]) @@ -104,7 +111,9 @@ class EditGroupsDialog: gajim.interface.roster.draw_group(_('General'), account) def add_group(self, group): - '''add group group to all contacts and all their brothers''' + """ + Add group group to all contacts and all their brothers + """ for (contact, account) in self.list_: gajim.interface.roster.add_contact_to_groups(contact.jid, account, [group]) @@ -199,7 +208,9 @@ class EditGroupsDialog: column.set_attributes(renderer, active=1, inconsistent=2) class PassphraseDialog: - '''Class for Passphrase dialog''' + """ + Class for Passphrase dialog + """ def __init__(self, titletext, labeltext, checkbuttontext=None, ok_handler=None, cancel_handler=None): self.xml = gtkgui_helpers.get_glade('passphrase_dialog.glade') @@ -258,7 +269,10 @@ class PassphraseDialog: self.cancel_handler() class ChooseGPGKeyDialog: - '''Class for GPG key dialog''' + """ + Class for GPG key dialog + """ + def __init__(self, title_text, prompt_text, secret_keys, on_response, selected=None): '''secret_keys : {keyID: userName, ...}''' @@ -428,9 +442,9 @@ class ChangeActivityDialog: self.subactivity = data[1] def on_ok_button_clicked(self, widget): - ''' + """ Return activity and messsage (None if no activity selected) - ''' + """ if self.checkbutton.get_active(): self.on_response(self.activity, self.subactivity, self.entry.get_text().decode('utf-8')) @@ -524,10 +538,10 @@ class ChangeMoodDialog: self.window.destroy() class TimeoutDialog: - ''' + """ Class designed to be derivated to create timeout'd dialogs (dialogs that closes automatically after a timeout) - ''' + """ def __init__(self, timeout, on_timeout): self.countdown_left = timeout self.countdown_enabled = True @@ -540,7 +554,9 @@ class TimeoutDialog: gobject.timeout_add_seconds(1, self.countdown) def on_timeout(): - '''To be implemented in derivated classes''' + """ + To be implemented in derivated classes + """ pass def countdown(self): @@ -638,7 +654,9 @@ class ChangeStatusMessageDialog(TimeoutDialog): self.dialog.show_all() def draw_activity(self): - '''Set activity button''' + """ + Set activity button + """ img = self.xml.get_widget('activity_image') label = self.xml.get_widget('activity_button_label') if 'activity' in self.pep_dict and self.pep_dict['activity'] in \ @@ -661,7 +679,9 @@ class ChangeStatusMessageDialog(TimeoutDialog): label.set_text('') def draw_mood(self): - '''Set mood button''' + """ + Set mood button + """ img = self.xml.get_widget('mood_image') label = self.xml.get_widget('mood_button_label') if self.pep_dict['mood'] in pep.MOODS: @@ -803,13 +823,17 @@ class ChangeStatusMessageDialog(TimeoutDialog): self.pep_dict['mood_text']) class AddNewContactWindow: - '''Class for AddNewContactWindow''' + """ + Class for AddNewContactWindow + """ + uid_labels = {'jabber': _('Jabber ID:'), 'aim': _('AIM Address:'), 'gadu-gadu': _('GG Number:'), 'icq': _('ICQ Number:'), 'msn': _('MSN Address:'), 'yahoo': _('Yahoo! Address:')} + def __init__(self, account=None, jid=None, user_nick=None, group=None): self.account = account if account is None: @@ -983,11 +1007,15 @@ _('Please fill in the data of the contact you want to add in account %s') %accou self.window.destroy() def on_cancel_button_clicked(self, widget): - '''When Cancel button is clicked''' + """ + When Cancel button is clicked + """ self.window.destroy() def on_add_button_clicked(self, widget): - '''When Subscribe button is clicked''' + """ + When Subscribe button is clicked + """ jid = self.uid_entry.get_text().decode('utf-8').strip() if not jid: return @@ -1111,7 +1139,10 @@ _('Please fill in the data of the contact you want to add in account %s') %accou self.add_button.set_sensitive(False) class AboutDialog: - '''Class for about dialog''' + """ + Class for about dialog + """ + def __init__(self): dlg = gtk.AboutDialog() dlg.set_transient_for(gajim.interface.roster.window) @@ -1184,7 +1215,9 @@ class AboutDialog: return str_[0:-1] # remove latest . def get_path(self, filename): - '''where can we find this Credits file ?''' + """ + Where can we find this Credits file? + """ if os.path.isfile(os.path.join(gajim.defs.docdir, filename)): return os.path.join(gajim.defs.docdir, filename) elif os.path.isfile('../' + filename): @@ -1273,14 +1306,18 @@ class HigDialog(gtk.MessageDialog): self.destroy() def popup(self): - '''show dialog''' + """ + Show dialog + """ vb = self.get_children()[0].get_children()[0] # Give focus to top vbox vb.set_flags(gtk.CAN_FOCUS) vb.grab_focus() self.show_all() class FileChooserDialog(gtk.FileChooserDialog): - '''Non-blocking FileChooser Dialog around gtk.FileChooserDialog''' + """ + Non-blocking FileChooser Dialog around gtk.FileChooserDialog + """ def __init__(self, title_text, action, buttons, default_response, select_multiple = False, current_folder = None, on_response_ok = None, on_response_cancel = None): @@ -1332,7 +1369,10 @@ class AspellDictError: gajim.config.set('use_speller', False) class ConfirmationDialog(HigDialog): - '''HIG compliant confirmation dialog.''' + """ + HIG compliant confirmation dialog + """ + def __init__(self, pritext, sectext='', on_response_ok=None, on_response_cancel=None): self.user_response_ok = on_response_ok @@ -1359,7 +1399,10 @@ class ConfirmationDialog(HigDialog): self.destroy() class NonModalConfirmationDialog(HigDialog): - '''HIG compliant non modal confirmation dialog.''' + """ + HIG compliant non modal confirmation dialog + """ + def __init__(self, pritext, sectext='', on_response_ok=None, on_response_cancel=None): self.user_response_ok = on_response_ok @@ -1386,8 +1429,11 @@ class NonModalConfirmationDialog(HigDialog): self.destroy() class WarningDialog(HigDialog): + """ + HIG compliant warning dialog + """ + def __init__(self, pritext, sectext=''): - '''HIG compliant warning dialog.''' HigDialog.__init__( self, None, gtk.MESSAGE_WARNING, gtk.BUTTONS_OK, pritext, sectext) self.set_modal(False) @@ -1396,8 +1442,11 @@ class WarningDialog(HigDialog): self.popup() class InformationDialog(HigDialog): + """ + HIG compliant info dialog + """ + def __init__(self, pritext, sectext=''): - '''HIG compliant info dialog.''' HigDialog.__init__(self, None, gtk.MESSAGE_INFO, gtk.BUTTONS_OK, pritext, sectext) self.set_modal(False) @@ -1405,16 +1454,22 @@ class InformationDialog(HigDialog): self.popup() class ErrorDialog(HigDialog): + """ + HIG compliant error dialog + """ + def __init__(self, pritext, sectext=''): - '''HIG compliant error dialog.''' HigDialog.__init__( self, None, gtk.MESSAGE_ERROR, gtk.BUTTONS_OK, pritext, sectext) self.popup() class YesNoDialog(HigDialog): + """ + HIG compliant YesNo dialog + """ + def __init__(self, pritext, sectext='', checktext='', on_response_yes=None, - on_response_no=None): - '''HIG compliant YesNo dialog.''' + on_response_no=None): self.user_response_yes = on_response_yes self.user_response_no = on_response_no HigDialog.__init__( self, None, @@ -1448,15 +1503,20 @@ class YesNoDialog(HigDialog): self.destroy() def is_checked(self): - ''' Get active state of the checkbutton ''' + """ + Get active state of the checkbutton + """ if not self.checkbutton: return False return self.checkbutton.get_active() class ConfirmationDialogCheck(ConfirmationDialog): - '''HIG compliant confirmation dialog with checkbutton.''' - def __init__(self, pritext, sectext='', checktext='', - on_response_ok=None, on_response_cancel=None, is_modal=True): + """ + HIG compliant confirmation dialog with checkbutton + """ + + def __init__(self, pritext, sectext='', checktext='', on_response_ok=None, + on_response_cancel=None, is_modal=True): self.user_response_ok = on_response_ok self.user_response_cancel = on_response_cancel @@ -1495,11 +1555,16 @@ class ConfirmationDialogCheck(ConfirmationDialog): self.destroy() def is_checked(self): - ''' Get active state of the checkbutton ''' + """ + Get active state of the checkbutton + """ return self.checkbutton.get_active() class ConfirmationDialogDubbleCheck(ConfirmationDialog): - '''HIG compliant confirmation dialog with 2 checkbuttons.''' + """ + HIG compliant confirmation dialog with 2 checkbuttons + """ + def __init__(self, pritext, sectext='', checktext1='', checktext2='', on_response_ok=None, on_response_cancel=None, is_modal=True): self.user_response_ok = on_response_ok @@ -1560,7 +1625,10 @@ class ConfirmationDialogDubbleCheck(ConfirmationDialog): return [is_checked_1, is_checked_2] class FTOverwriteConfirmationDialog(ConfirmationDialog): - '''HIG compliant confirmation dialog to overwrite or resume a file transfert''' + """ + HIG compliant confirmation dialog to overwrite or resume a file transfert + """ + def __init__(self, pritext, sectext='', propose_resume=True, on_response=None): HigDialog.__init__(self, None, gtk.MESSAGE_QUESTION, gtk.BUTTONS_CANCEL, @@ -1597,7 +1665,10 @@ class FTOverwriteConfirmationDialog(ConfirmationDialog): self.destroy() class CommonInputDialog: - '''Common Class for Input dialogs''' + """ + Common Class for Input dialogs + """ + def __init__(self, title, label_str, is_modal, ok_handler, cancel_handler): self.dialog = self.xml.get_widget('input_dialog') label = self.xml.get_widget('label') @@ -1633,9 +1704,12 @@ class CommonInputDialog: self.dialog.destroy() class InputDialog(CommonInputDialog): - '''Class for Input dialog''' + """ + Class for Input dialog + """ + def __init__(self, title, label_str, input_str=None, is_modal=True, - ok_handler=None, cancel_handler=None): + ok_handler=None, cancel_handler=None): self.xml = gtkgui_helpers.get_glade('input_dialog.glade') CommonInputDialog.__init__(self, title, label_str, is_modal, ok_handler, cancel_handler) @@ -1651,9 +1725,12 @@ class InputDialog(CommonInputDialog): return self.input_entry.get_text().decode('utf-8') class InputDialogCheck(InputDialog): - '''Class for Input dialog''' + """ + Class for Input dialog + """ + def __init__(self, title, label_str, checktext='', input_str=None, - is_modal=True, ok_handler=None, cancel_handler=None): + is_modal=True, ok_handler=None, cancel_handler=None): self.xml = gtkgui_helpers.get_glade('input_dialog.glade') InputDialog.__init__(self, title, label_str, input_str=input_str, is_modal=is_modal, ok_handler=ok_handler, @@ -1683,7 +1760,9 @@ class InputDialogCheck(InputDialog): return self.input_entry.get_text().decode('utf-8') def is_checked(self): - ''' Get active state of the checkbutton ''' + """ + Get active state of the checkbutton + """ try: return self.checkbutton.get_active() except Exception: @@ -1691,7 +1770,10 @@ class InputDialogCheck(InputDialog): return False class ChangeNickDialog(InputDialogCheck): - '''Class for changing room nickname in case of conflict''' + """ + Class for changing room nickname in case of conflict + """ + def __init__(self, account, room_jid, title, prompt, check_text=None): InputDialogCheck.__init__(self, title, '', checktext=check_text, input_str='', is_modal=True, ok_handler=None, cancel_handler=None) @@ -1773,7 +1855,10 @@ class ChangeNickDialog(InputDialogCheck): self.room_queue.append((account, room_jid, prompt)) class InputTextDialog(CommonInputDialog): - '''Class for multilines Input dialog (more place than InputDialog)''' + """ + Class for multilines Input dialog (more place than InputDialog) + """ + def __init__(self, title, label_str, input_str=None, is_modal=True, ok_handler=None, cancel_handler=None): self.xml = gtkgui_helpers.get_glade('input_text_dialog.glade') @@ -1790,7 +1875,10 @@ class InputTextDialog(CommonInputDialog): return self.input_buffer.get_text(start_iter, end_iter).decode('utf-8') class DubbleInputDialog: - '''Class for Dubble Input dialog''' + """ + Class for Dubble Input dialog + """ + def __init__(self, title, label_str1, label_str2, input_str1=None, input_str2=None, is_modal=True, ok_handler=None, cancel_handler=None): self.xml = gtkgui_helpers.get_glade('dubbleinput_dialog.glade') @@ -1876,7 +1964,9 @@ class SubscriptionRequestWindow: self.window.destroy() def on_authorize_button_clicked(self, widget): - '''accept the request''' + """ + Accept the request + """ gajim.connections[self.account].send_authorization(self.jid) self.window.destroy() contact = gajim.contacts.get_contact(self.account, self.jid) @@ -1884,7 +1974,9 @@ class SubscriptionRequestWindow: AddNewContactWindow(self.account, self.jid, self.user_nick) def on_contact_info_activate(self, widget): - '''ask vcard''' + """ + Ask vcard + """ if self.jid in gajim.interface.instances[self.account]['infos']: gajim.interface.instances[self.account]['infos'][self.jid].window.present() else: @@ -1896,11 +1988,15 @@ class SubscriptionRequestWindow: get_widget('information_notebook').remove_page(0) def on_start_chat_activate(self, widget): - '''open chat''' + """ + Open chat + """ gajim.interface.new_chat_from_jid(self.account, self.jid) def on_deny_button_clicked(self, widget): - '''refuse the request''' + """ + Refuse the request + """ gajim.connections[self.account].refuse_authorization(self.jid) contact = gajim.contacts.get_contact(self.account, self.jid) if contact and _('Not in Roster') in contact.get_shown_groups(): @@ -1908,7 +2004,9 @@ class SubscriptionRequestWindow: self.window.destroy() def on_actions_button_clicked(self, widget): - '''popup action menu''' + """ + Popup action menu + """ menu = self.prepare_popup_menu() menu.show_all() gtkgui_helpers.popup_emoticons_under_button(menu, widget, self.window.window) @@ -1916,11 +2014,12 @@ class SubscriptionRequestWindow: class JoinGroupchatWindow: def __init__(self, account=None, room_jid='', nick='', password='', - automatic=False): - '''automatic is a dict like {'invities': []} - If automatic is not empty, this means room must be automaticaly configured - and when done, invities must be automatically invited''' - + automatic=False): + """ + Automatic is a dict like {'invities': []}. If automatic is not empty, + this means room must be automaticaly configured and when done, invities + must be automatically invited + """ if account: if room_jid != '' and room_jid in gajim.gc_connected[account] and\ gajim.gc_connected[account][room_jid]: @@ -2007,7 +2106,9 @@ class JoinGroupchatWindow: self.window.show_all() def on_join_groupchat_window_destroy(self, widget): - '''close window''' + """ + Close window + """ if self.account and 'join_gc' in gajim.interface.instances[self.account]: # remove us from open windows del gajim.interface.instances[self.account]['join_gc'] @@ -2039,7 +2140,9 @@ class JoinGroupchatWindow: self._room_jid_entry.set_text(room_jid) def on_cancel_button_clicked(self, widget): - '''When Cancel button is clicked''' + """ + When Cancel button is clicked + """ self.window.destroy() def on_bookmark_checkbutton_toggled(self, widget): @@ -2050,7 +2153,9 @@ class JoinGroupchatWindow: auto_join_checkbutton.set_sensitive(False) def on_join_button_clicked(self, widget): - '''When Join button is clicked''' + """ + When Join button is clicked + """ if not self.account: ErrorDialog(_('Invalid Account'), _('You have to choose an account from which you want to join the ' @@ -2138,7 +2243,9 @@ class SynchroniseSelectAccountDialog: self.window.destroy() def init_accounts(self): - '''initialize listStore with existing accounts''' + """ + Initialize listStore with existing accounts + """ model = self.accounts_treeview.get_model() model.clear() for remote_account in gajim.connections: @@ -2204,7 +2311,9 @@ class SynchroniseSelectContactsDialog: self.window.destroy() def init_contacts(self): - '''initialize listStore with existing accounts''' + """ + Initialize listStore with existing accounts + """ model = self.contacts_treeview.get_model() model.clear() @@ -2267,7 +2376,9 @@ class NewChatDialog(InputDialog): self.dialog.show_all() def new_chat_response(self, jid): - ''' called when ok button is clicked ''' + """ + Called when ok button is clicked + """ if gajim.connections[self.account].connected <= 1: #if offline or connecting ErrorDialog(_('Connection not available'), @@ -2433,10 +2544,10 @@ class PopupNotificationWindow: self.adjust_height_and_move_popup_notification_windows() class SingleMessageWindow: - '''SingleMessageWindow can send or show a received - singled message depending on action argument which can be 'send' - or 'receive'. - ''' + """ + SingleMessageWindow can send or show a received singled message depending on + action argument which can be 'send' or 'receive' + """ # Keep a reference on windows so garbage collector don't restroy them instances = [] def __init__(self, account, to='', action='', from_whom='', subject='', @@ -2847,9 +2958,12 @@ class XMLConsoleWindow: TRANSLATED_ACTION = {'add': _('add'), 'modify': _('modify'), 'remove': _('remove')} class RosterItemExchangeWindow: - ''' Windows used when someone send you a exchange contact suggestion ''' + """ + Windows used when someone send you a exchange contact suggestion + """ + def __init__(self, account, action, exchange_list, jid_from, - message_body=None): + message_body=None): self.account = account self.action = action self.exchange_list = exchange_list @@ -3067,8 +3181,10 @@ class RosterItemExchangeWindow: class PrivacyListWindow: - '''Window that is used for creating NEW or EDITING already there privacy - lists''' + """ + Window that is used for creating NEW or EDITING already there privacy lists + """ + def __init__(self, account, privacy_list_name, action): '''action is 'EDIT' or 'NEW' depending on if we create a new priv list or edit an already existing one''' @@ -3406,9 +3522,10 @@ class PrivacyListWindow: self.window.destroy() class PrivacyListsWindow: - '''Window that is the main window for Privacy Lists; - we can list there the privacy lists and ask to create a new one - or edit an already there one''' + """ + Window that is the main window for Privacy Lists; we can list there the + privacy lists and ask to create a new one or edit an already there one + """ def __init__(self, account): self.account = account self.privacy_lists_save = [] @@ -3565,9 +3682,10 @@ class InvitationReceivedDialog: class ProgressDialog: def __init__(self, title_text, during_text, messages_queue): - '''during text is what to show during the procedure, - messages_queue has the message to show - in the textview''' + """ + During text is what to show during the procedure, messages_queue has the + message to show in the textview + """ self.xml = gtkgui_helpers.get_glade('progress_dialog.glade') self.dialog = self.xml.get_widget('progress_dialog') self.label = self.xml.get_widget('label') @@ -3594,10 +3712,14 @@ class ProgressDialog: class SoundChooserDialog(FileChooserDialog): def __init__(self, path_to_snd_file='', on_response_ok=None, - on_response_cancel=None): - '''optionally accepts path_to_snd_file so it has that as selected''' + on_response_cancel=None): + """ + Optionally accepts path_to_snd_file so it has that as selected + """ def on_ok(widget, callback): - '''check if file exists and call callback''' + """ + Check if file exists and call callback + """ path_to_snd_file = self.get_filename() path_to_snd_file = gtkgui_helpers.decode_filechooser_file_paths( (path_to_snd_file,))[0] @@ -3633,8 +3755,10 @@ class SoundChooserDialog(FileChooserDialog): class ImageChooserDialog(FileChooserDialog): def __init__(self, path_to_file='', on_response_ok=None, - on_response_cancel=None): - '''optionally accepts path_to_snd_file so it has that as selected''' + on_response_cancel=None): + """ + Optionally accepts path_to_snd_file so it has that as selected + """ def on_ok(widget, callback): '''check if file exists and call callback''' path_to_file = self.get_filename() @@ -3725,8 +3849,10 @@ class AvatarChooserDialog(ImageChooserDialog): class AddSpecialNotificationDialog: def __init__(self, jid): - '''jid is the jid for which we want to add special notification - (sound and notification popups)''' + """ + jid is the jid for which we want to add special notification (sound and + notification popups) + """ self.xml = gtkgui_helpers.get_glade('add_special_notification_window.glade') self.window = self.xml.get_widget('add_special_notification_window') self.condition_combobox = self.xml.get_widget('condition_combobox') @@ -3846,7 +3972,9 @@ class AdvancedNotificationsWindow: self.window.show_all() def initiate_rule_state(self): - '''Set values for all widgets''' + """ + Set values for all widgets + """ if self.active_num < 0: return # event @@ -4237,8 +4365,10 @@ class TransformChatToMUC: # Keep a reference on windows so garbage collector don't restroy them instances = [] def __init__(self, account, jids, preselected=None): - '''This window is used to trasform a one-to-one chat to a MUC. - We do 2 things: first select the server and then make a guests list.''' + """ + This window is used to trasform a one-to-one chat to a MUC. We do 2 + things: first select the server and then make a guests list + """ self.instances.append(self) self.account = account @@ -4389,7 +4519,9 @@ class DataFormWindow(Dialog): self.destroy() class ESessionInfoWindow: - '''Class for displaying information about a XEP-0116 encrypted session''' + """ + Class for displaying information about a XEP-0116 encrypted session + """ def __init__(self, session): self.session = session @@ -4468,7 +4600,9 @@ class ESessionInfoWindow: YesNoDialog(pritext, sectext, on_response_yes=on_yes, on_response_no=on_no) class GPGInfoWindow: - '''Class for displaying information about a XEP-0116 encrypted session''' + """ + Class for displaying information about a XEP-0116 encrypted session + """ def __init__(self, control): xml = gtkgui_helpers.get_glade('esession_info_window.glade') security_image = xml.get_widget('security_image') From 1c137dd6c4253947ac50cc73c6370877c2877b25 Mon Sep 17 00:00:00 2001 From: Yann Leboulanger Date: Wed, 25 Nov 2009 16:49:13 +0100 Subject: [PATCH 068/259] remove debug print --- src/common/zeroconf/client_zeroconf.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/common/zeroconf/client_zeroconf.py b/src/common/zeroconf/client_zeroconf.py index 23834be28..ab863709d 100644 --- a/src/common/zeroconf/client_zeroconf.py +++ b/src/common/zeroconf/client_zeroconf.py @@ -710,8 +710,6 @@ class ClientZeroconf: try: item = self.roster[to] except KeyError: - raise KeyError - print 'ret', to, self.roster.keys() # Contact offline return -1 From 351ddb471814eedf3756f645f1e76cb08dacca1d Mon Sep 17 00:00:00 2001 From: Yann Leboulanger Date: Wed, 25 Nov 2009 16:50:15 +0100 Subject: [PATCH 069/259] allow space in profile name when running with launch.sh. Fixes #5453 --- launch.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/launch.sh b/launch.sh index bcb968553..0c73c667c 100755 --- a/launch.sh +++ b/launch.sh @@ -1,3 +1,3 @@ #!/bin/sh cd "$(dirname $0)/src" -exec python -OOt gajim.py $@ +exec python -OOt gajim.py "$@" From 98e27253b63cd04acbbefbe30ee02df98135950a Mon Sep 17 00:00:00 2001 From: Yann Leboulanger Date: Wed, 25 Nov 2009 16:50:49 +0100 Subject: [PATCH 070/259] prevent showing error message when we receive a PEP error message and really ignore it --- src/common/connection_handlers.py | 7 +++++-- src/common/pep.py | 2 ++ 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/src/common/connection_handlers.py b/src/common/connection_handlers.py index 089fbd69b..2dbff985b 100644 --- a/src/common/connection_handlers.py +++ b/src/common/connection_handlers.py @@ -2733,8 +2733,11 @@ class ConnectionHandlers(ConnectionVcard, ConnectionBytestream, ConnectionDisco, con.RegisterHandler('message', self._messageCB) con.RegisterHandler('presence', self._presenceCB) con.RegisterHandler('presence', self._capsPresenceCB) - con.RegisterHandler('message', self._pubsubEventCB, - ns=common.xmpp.NS_PUBSUB_EVENT) + # We use makefirst so that this handler is called before _messageCB, and + # can prevent calling it when it's not needed. + # We also don't check for namespace, else it cannot stop _messageCB to be + # called + con.RegisterHandler('message', self._pubsubEventCB, makefirst=True) con.RegisterHandler('iq', self._vCardCB, 'result', common.xmpp.NS_VCARD) con.RegisterHandler('iq', self._rosterSetCB, 'set', diff --git a/src/common/pep.py b/src/common/pep.py index 34f3bda46..5ba476c0c 100644 --- a/src/common/pep.py +++ b/src/common/pep.py @@ -454,6 +454,8 @@ class ConnectionPEP(object): def _pubsubEventCB(self, xmpp_dispatcher, msg): ''' Called when we receive with pubsub event. ''' + if not msg.getTag('event'): + return if msg.getTag('error'): log.debug('PubsubEventCB received error stanza. Ignoring') raise xmpp.NodeProcessed From 7316d0076667bf0b8c20f97be46e2fe815632683 Mon Sep 17 00:00:00 2001 From: Alexander Cherniuk Date: Wed, 25 Nov 2009 19:52:56 +0200 Subject: [PATCH 071/259] New portion of doc-string refactoring --- src/disco.py | 388 +++++++++++++++++++++++++----------- src/features_window.py | 4 +- src/filetransfers_window.py | 85 +++++--- src/gajim-remote.py | 36 +++- src/gajim_themes_window.py | 31 ++- src/groups.py | 13 +- src/gtkgui_helpers.py | 196 ++++++++++++------ src/gui_interface.py | 83 +++++--- src/gui_menu_builder.py | 22 +- src/history_manager.py | 49 +++-- 10 files changed, 614 insertions(+), 293 deletions(-) diff --git a/src/disco.py b/src/disco.py index 0d3621f13..c38c7ae7f 100644 --- a/src/disco.py +++ b/src/disco.py @@ -124,16 +124,21 @@ _cat_to_descr = { class CacheDictionary: - '''A dictionary that keeps items around for only a specific time. - Lifetime is in minutes. Getrefresh specifies whether to refresh when - an item is merely accessed instead of set aswell.''' + """ + A dictionary that keeps items around for only a specific time. Lifetime is + in minutes. Getrefresh specifies whether to refresh when an item is merely + accessed instead of set aswell + """ + def __init__(self, lifetime, getrefresh = True): self.lifetime = lifetime * 1000 * 60 self.getrefresh = getrefresh self.cache = {} class CacheItem: - '''An object to store cache items and their timeouts.''' + """ + An object to store cache items and their timeouts + """ def __init__(self, value): self.value = value self.source = None @@ -149,13 +154,17 @@ class CacheDictionary: del self.cache[key] def _expire_timeout(self, key): - '''The timeout has expired, remove the object.''' + """ + The timeout has expired, remove the object + """ if key in self.cache: del self.cache[key] return False def _refresh_timeout(self, key): - '''The object was accessed, refresh the timeout.''' + """ + The object was accessed, refresh the timeout + """ item = self.cache[key] if item.source: gobject.source_remove(item.source) @@ -187,20 +196,25 @@ class CacheDictionary: _icon_cache = CacheDictionary(15) def get_agent_address(jid, node = None): - '''Returns an agent's address for displaying in the GUI.''' + """ + Get an agent's address for displaying in the GUI + """ if node: return '%s@%s' % (node, str(jid)) else: return str(jid) class Closure(object): - '''A weak reference to a callback with arguments as an object. + """ + A weak reference to a callback with arguments as an object Weak references to methods immediatly die, even if the object is still alive. Besides a handy way to store a callback, this provides a workaround that keeps a reference to the object instead. - Userargs and removeargs must be tuples.''' + Userargs and removeargs must be tuples. + """ + def __init__(self, cb, userargs = (), remove = None, removeargs = ()): self.userargs = userargs self.remove = remove @@ -229,8 +243,11 @@ class Closure(object): class ServicesCache: - '''Class that caches our query results. Each connection will have it's own - ServiceCache instance.''' + """ + Class that caches our query results. Each connection will have it's own + ServiceCache instance + """ + def __init__(self, account): self.account = account self._items = CacheDictionary(0, getrefresh = False) @@ -256,7 +273,9 @@ class ServicesCache: del self._cbs[cbkey] def get_icon(self, identities = []): - '''Return the icon for an agent.''' + """ + Return the icon for an agent + """ # Grab the first identity with an icon for identity in identities: try: @@ -284,7 +303,9 @@ class ServicesCache: return pix def get_browser(self, identities=[], features=[]): - '''Return the browser class for an agent.''' + """ + Return the browser class for an agent + """ # First pass, we try to find a ToplevelAgentBrowser for identity in identities: try: @@ -316,7 +337,9 @@ class ServicesCache: return None def get_info(self, jid, node, cb, force = False, nofetch = False, args = ()): - '''Get info for an agent.''' + """ + Get info for an agent + """ addr = get_agent_address(jid, node) # Check the cache if addr in self._info: @@ -338,7 +361,9 @@ class ServicesCache: gajim.connections[self.account].discoverInfo(jid, node) def get_items(self, jid, node, cb, force = False, nofetch = False, args = ()): - '''Get a list of items in an agent.''' + """ + Get a list of items in an agent + """ addr = get_agent_address(jid, node) # Check the cache if addr in self._items: @@ -360,7 +385,9 @@ class ServicesCache: gajim.connections[self.account].discoverItems(jid, node) def agent_info(self, jid, node, identities, features, data): - '''Callback for when we receive an agent's info.''' + """ + Callback for when we receive an agent's info + """ addr = get_agent_address(jid, node) # Store in cache @@ -376,7 +403,9 @@ class ServicesCache: del self._cbs[cbkey] def agent_items(self, jid, node, items): - '''Callback for when we receive an agent's items.''' + """ + Callback for when we receive an agent's items + """ addr = get_agent_address(jid, node) # Store in cache @@ -392,8 +421,10 @@ class ServicesCache: del self._cbs[cbkey] def agent_info_error(self, jid): - '''Callback for when a query fails. (even after the browse and agents - namespaces)''' + """ + Callback for when a query fails. Even after the browse and agents + namespaces + """ addr = get_agent_address(jid) # Call callbacks @@ -406,8 +437,10 @@ class ServicesCache: del self._cbs[cbkey] def agent_items_error(self, jid): - '''Callback for when a query fails. (even after the browse and agents - namespaces)''' + """ + Callback for when a query fails. Even after the browse and agents + namespaces + """ addr = get_agent_address(jid) # Call callbacks @@ -421,7 +454,10 @@ class ServicesCache: # object is needed so that @property works class ServiceDiscoveryWindow(object): - '''Class that represents the Services Discovery window.''' + """ + Class that represents the Services Discovery window + """ + def __init__(self, account, jid = '', node = '', address_entry = False, parent = None): self.account = account @@ -510,8 +546,10 @@ _('Without a connection, you can not browse available services')) self.browser.account = value def _initial_state(self): - '''Set some initial state on the window. Separated in a method because - it's handy to use within browser's cleanup method.''' + """ + Set some initial state on the window. Separated in a method because it's + handy to use within browser's cleanup method + """ self.progressbar.hide() title_text = _('Service Discovery using account %s') % self.account self.window.set_title(title_text) @@ -550,7 +588,9 @@ _('Without a connection, you can not browse available services')) self.banner.set_markup(markup) def paint_banner(self): - '''Repaint the banner with theme color''' + """ + Repaint the banner with theme color + """ theme = gajim.config.get('roster_theme') bgcolor = gajim.config.get_per('themes', theme, 'bannerbgcolor') textcolor = gajim.config.get_per('themes', theme, 'bannertextcolor') @@ -584,10 +624,11 @@ _('Without a connection, you can not browse available services')) self._on_style_set_event, set_fg, set_bg) def _on_style_set_event(self, widget, style, *opts): - ''' set style of widget from style class *.Frame.Eventbox + """ + Set style of widget from style class *.Frame.Eventbox opts[0] == True -> set fg color - opts[1] == True -> set bg color ''' - + opts[1] == True -> set bg color + """ self.disconnect_style_event() if opts[1]: bg_color = widget.style.bg[gtk.STATE_SELECTED] @@ -599,9 +640,11 @@ _('Without a connection, you can not browse available services')) self.connect_style_event(opts[0], opts[1]) def destroy(self, chain = False): - '''Close the browser. This can optionally close its children and - propagate to the parent. This should happen on actions like register, - or join to kill off the entire browser chain.''' + """ + Close the browser. This can optionally close its children and propagate + to the parent. This should happen on actions like register, or join to + kill off the entire browser chain + """ if self.dying: return self.dying = True @@ -632,7 +675,9 @@ _('Without a connection, you can not browse available services')) self.cache.cleanup() def travel(self, jid, node): - '''Travel to an agent within the current services window.''' + """ + Travel to an agent within the current services window + """ if self.browser: self.browser.cleanup() self.browser = None @@ -649,7 +694,9 @@ _('Without a connection, you can not browse available services')) self.cache.get_info(jid, node, self._travel) def _travel(self, jid, node, identities, features, data): - '''Continuation of travel.''' + """ + Continuation of travel + """ if self.dying or jid != self.jid or node != self.node: return if not identities: @@ -671,7 +718,9 @@ _('This type of service does not contain any items to browse.')) self.browser.browse() def open(self, jid, node): - '''Open an agent. By default, this happens in a new window.''' + """ + Open an agent. By default, this happens in a new window + """ try: win = gajim.interface.instances[self.account]['disco']\ [get_agent_address(jid, node)] @@ -737,10 +786,13 @@ _('This type of service does not contain any items to browse.')) class AgentBrowser: - '''Class that deals with browsing agents and appearance of the browser - window. This class and subclasses should basically be treated as "part" - of the ServiceDiscoveryWindow class, but had to be separated because this part - is dynamic.''' + """ + Class that deals with browsing agents and appearance of the browser window. + This class and subclasses should basically be treated as "part" of the + ServiceDiscoveryWindow class, but had to be separated because this part is + dynamic + """ + def __init__(self, account, jid, node): self.account = account self.jid = jid @@ -751,20 +803,26 @@ class AgentBrowser: self.active = False def _get_agent_address(self): - '''Returns the agent's address for displaying in the GUI.''' + """ + Get the agent's address for displaying in the GUI + """ return get_agent_address(self.jid, self.node) def _set_initial_title(self): - '''Set the initial window title based on agent address.''' + """ + Set the initial window title based on agent address + """ self.window.window.set_title(_('Browsing %(address)s using account ' '%(account)s') % {'address': self._get_agent_address(), 'account': self.account}) self.window._set_window_banner_text(self._get_agent_address()) def _create_treemodel(self): - '''Create the treemodel for the services treeview. When subclassing, - note that the first two columns should ALWAYS be of type string and - contain the JID and node of the item respectively.''' + """ + Create the treemodel for the services treeview. When subclassing, note + that the first two columns should ALWAYS be of type string and contain + the JID and node of the item respectively + """ # JID, node, name, address self.model = gtk.ListStore(str, str, str, str) self.model.set_sort_column_id(3, gtk.SORT_ASCENDING) @@ -792,8 +850,10 @@ class AgentBrowser: self.window.services_treeview.set_headers_visible(False) def _add_actions(self): - '''Add the action buttons to the buttonbox for actions the browser can - perform.''' + """ + Add the action buttons to the buttonbox for actions the browser can + perform + """ self.browse_button = gtk.Button() image = gtk.image_new_from_stock(gtk.STOCK_OPEN, gtk.ICON_SIZE_BUTTON) label = gtk.Label(_('_Browse')) @@ -807,13 +867,17 @@ class AgentBrowser: self.browse_button.show_all() def _clean_actions(self): - '''Remove the action buttons specific to this browser.''' + """ + Remove the action buttons specific to this browser + """ if self.browse_button: self.browse_button.destroy() self.browse_button = None def _set_title(self, jid, node, identities, features, data): - '''Set the window title based on agent info.''' + """ + Set the window title based on agent info + """ # Set the banner and window title if 'name' in identities[0]: name = identities[0]['name'] @@ -830,8 +894,10 @@ class AgentBrowser: pass def prepare_window(self, window): - '''Prepare the service discovery window. Called when a browser is hooked - up with a ServiceDiscoveryWindow instance.''' + """ + Prepare the service discovery window. Called when a browser is hooked up + with a ServiceDiscoveryWindow instance + """ self.window = window self.cache = window.cache @@ -852,7 +918,9 @@ class AgentBrowser: self.cache.get_info(self.jid, self.node, self._set_title) def cleanup(self): - '''Cleanup when the window intends to switch browsers.''' + """ + Cleanup when the window intends to switch browsers + """ self.active = False self._clean_actions() @@ -862,12 +930,16 @@ class AgentBrowser: self.window._initial_state() def update_theme(self): - '''Called when the default theme is changed.''' + """ + Called when the default theme is changed + """ pass def on_browse_button_clicked(self, widget = None): - '''When we want to browse an agent: - Open a new services window with a browser for the agent type.''' + """ + When we want to browse an agent: open a new services window with a + browser for the agent type + """ model, iter_ = self.window.services_treeview.get_selection().get_selected() if not iter_: return @@ -877,8 +949,9 @@ class AgentBrowser: self.window.open(jid, node) def update_actions(self): - '''When we select a row: - activate action buttons based on the agent's info.''' + """ + When we select a row: activate action buttons based on the agent's info + """ if self.browse_button: self.browse_button.set_sensitive(False) model, iter_ = self.window.services_treeview.get_selection().get_selected() @@ -890,7 +963,9 @@ class AgentBrowser: self.cache.get_info(jid, node, self._update_actions, nofetch = True) def _update_actions(self, jid, node, identities, features, data): - '''Continuation of update_actions.''' + """ + Continuation of update_actions + """ if not identities or not self.browse_button: return klass = self.cache.get_browser(identities, features) @@ -898,8 +973,10 @@ class AgentBrowser: self.browse_button.set_sensitive(True) def default_action(self): - '''When we double-click a row: - perform the default action on the selected item.''' + """ + When we double-click a row: perform the default action on the selected + item + """ model, iter_ = self.window.services_treeview.get_selection().get_selected() if not iter_: return @@ -909,7 +986,9 @@ class AgentBrowser: self.cache.get_info(jid, node, self._default_action, nofetch = True) def _default_action(self, jid, node, identities, features, data): - '''Continuation of default_action.''' + """ + Continuation of default_action + """ if self.cache.get_browser(identities, features): # Browse if we can self.on_browse_button_clicked() @@ -917,7 +996,9 @@ class AgentBrowser: return False def browse(self, force = False): - '''Fill the treeview with agents, fetching the info if necessary.''' + """ + Fill the treeview with agents, fetching the info if necessary + """ self.model.clear() self._total_items = self._progress = 0 self.window.progressbar.show() @@ -926,15 +1007,19 @@ class AgentBrowser: force = force, args = (force,)) def _pulse_timeout_cb(self, *args): - '''Simple callback to keep the progressbar pulsing.''' + """ + Simple callback to keep the progressbar pulsing + """ if not self.active: return False self.window.progressbar.pulse() return True def _find_item(self, jid, node): - '''Check if an item is already in the treeview. Return an iter to it - if so, None otherwise.''' + """ + Check if an item is already in the treeview. Return an iter to it if so, + None otherwise + """ iter_ = self.model.get_iter_root() while iter_: cjid = self.model.get_value(iter_, 0).decode('utf-8') @@ -947,7 +1032,9 @@ class AgentBrowser: return None def _agent_items(self, jid, node, items, force): - '''Callback for when we receive a list of agent items.''' + """ + Callback for when we receive a list of agent items + """ self.model.clear() self._total_items = 0 gobject.source_remove(self._pulse_timeout) @@ -973,7 +1060,9 @@ _('This service does not contain any items to browse.')) self.window.services_treeview.set_model(self.model) def _agent_info(self, jid, node, identities, features, data): - '''Callback for when we receive info about an agent's item.''' + """ + Callback for when we receive info about an agent's item + """ iter_ = self._find_item(jid, node) if not iter_: # Not in the treeview, stop @@ -987,21 +1076,27 @@ _('This service does not contain any items to browse.')) self.update_actions() def _add_item(self, jid, node, parent_node, item, force): - '''Called when an item should be added to the model. The result of a - disco#items query.''' + """ + Called when an item should be added to the model. The result of a + disco#items query + """ self.model.append((jid, node, item.get('name', ''), get_agent_address(jid, node))) self.cache.get_info(jid, node, self._agent_info, force = force) def _update_item(self, iter_, jid, node, item): - '''Called when an item should be updated in the model. The result of a - disco#items query. (seldom)''' + """ + Called when an item should be updated in the model. The result of a + disco#items query + """ if 'name' in item: self.model[iter_][2] = item['name'] def _update_info(self, iter_, jid, node, identities, features, data): - '''Called when an item should be updated in the model with further info. - The result of a disco#info query.''' + """ + Called when an item should be updated in the model with further info. + The result of a disco#info query + """ name = identities[0].get('name', '') if name: self.model[iter_][2] = name @@ -1012,8 +1107,11 @@ _('This service does not contain any items to browse.')) class ToplevelAgentBrowser(AgentBrowser): - '''This browser is used at the top level of a jabber server to browse - services such as transports, conference servers, etc.''' + """ + This browser is used at the top level of a jabber server to browse services + such as transports, conference servers, etc + """ + def __init__(self, *args): AgentBrowser.__init__(self, *args) self._progressbar_sourceid = None @@ -1029,7 +1127,9 @@ class ToplevelAgentBrowser(AgentBrowser): self._scroll_signal = None def _pixbuf_renderer_data_func(self, col, cell, model, iter_): - '''Callback for setting the pixbuf renderer's properties.''' + """ + Callback for setting the pixbuf renderer's properties + """ jid = model.get_value(iter_, 0) if jid: pix = model.get_value(iter_, 2) @@ -1039,7 +1139,9 @@ class ToplevelAgentBrowser(AgentBrowser): cell.set_property('visible', False) def _text_renderer_data_func(self, col, cell, model, iter_): - '''Callback for setting the text renderer's properties.''' + """ + Callback for setting the text renderer's properties + """ jid = model.get_value(iter_, 0) markup = model.get_value(iter_, 3) state = model.get_value(iter_, 4) @@ -1060,7 +1162,9 @@ class ToplevelAgentBrowser(AgentBrowser): cell.set_property('foreground_set', False) def _treemodel_sort_func(self, model, iter1, iter2): - '''Sort function for our treemodel.''' + """ + Sort function for our treemode + """ # Compare state statecmp = cmp(model.get_value(iter1, 4), model.get_value(iter2, 4)) if statecmp == 0: @@ -1120,8 +1224,9 @@ class ToplevelAgentBrowser(AgentBrowser): self._show_tooltip, state) def on_treeview_event_hide_tooltip(self, widget, event): - ''' This happens on scroll_event, key_press_event - and button_press_event ''' + """ + This happens on scroll_event, key_press_event and button_press_event + """ self.tooltip.hide_tooltip() def _create_treemodel(self): @@ -1236,8 +1341,9 @@ class ToplevelAgentBrowser(AgentBrowser): AgentBrowser._clean_actions(self) def on_search_button_clicked(self, widget = None): - '''When we want to search something: - open search window''' + """ + When we want to search something: open search window + """ model, iter_ = self.window.services_treeview.get_selection().get_selected() if not iter_: return @@ -1261,8 +1367,9 @@ class ToplevelAgentBrowser(AgentBrowser): self.window.services_treeview.queue_draw() def on_execute_button_clicked(self, widget=None): - '''When we want to execute a command: - open adhoc command window''' + """ + When we want to execute a command: open adhoc command window + """ model, iter_ = self.window.services_treeview.get_selection().get_selected() if not iter_: return @@ -1271,9 +1378,10 @@ class ToplevelAgentBrowser(AgentBrowser): adhoc_commands.CommandWindow(self.account, service, commandnode=node) def on_register_button_clicked(self, widget = None): - '''When we want to register an agent: - request information about registering with the agent and close the - window.''' + """ + When we want to register an agent: request information about registering + with the agent and close the window + """ model, iter_ = self.window.services_treeview.get_selection().get_selected() if not iter_: return @@ -1283,8 +1391,10 @@ class ToplevelAgentBrowser(AgentBrowser): self.window.destroy(chain = True) def on_join_button_clicked(self, widget): - '''When we want to join an IRC room or create a new MUC room: - Opens the join_groupchat_window.''' + """ + When we want to join an IRC room or create a new MUC room: Opens the + join_groupchat_window + """ model, iter_ = self.window.services_treeview.get_selection().get_selected() if not iter_: return @@ -1375,7 +1485,9 @@ class ToplevelAgentBrowser(AgentBrowser): AgentBrowser.browse(self, force = force) def _expand_all(self): - '''Expand all items in the treeview''' + """ + Expand all items in the treeview + """ # GTK apparently screws up here occasionally. :/ #def expand_all(*args): # self.window.services_treeview.expand_all() @@ -1386,7 +1498,9 @@ class ToplevelAgentBrowser(AgentBrowser): self.window.services_treeview.expand_all() def _update_progressbar(self): - '''Update the progressbar.''' + """ + Update the progressbar + """ # Refresh this every update if self._progressbar_sourceid: gobject.source_remove(self._progressbar_sourceid) @@ -1408,13 +1522,17 @@ class ToplevelAgentBrowser(AgentBrowser): self.window.progressbar.set_fraction(fraction) def _hide_progressbar_cb(self, *args): - '''Simple callback to hide the progressbar a second after we finish.''' + """ + Simple callback to hide the progressbar a second after we finish + """ if self.active: self.window.progressbar.hide() return False def _friendly_category(self, category, type_=None): - '''Get the friendly category name and priority.''' + """ + Get the friendly category name and priority + """ cat = None if type_: # Try type-specific override @@ -1430,12 +1548,16 @@ class ToplevelAgentBrowser(AgentBrowser): return cat, prio def _create_category(self, cat, type_=None): - '''Creates a category row.''' + """ + Creates a category row + """ cat, prio = self._friendly_category(cat, type_) return self.model.append(None, ('', '', None, cat, prio)) def _find_category(self, cat, type_=None): - '''Looks up a category row and returns the iterator to it, or None.''' + """ + Looks up a category row and returns the iterator to it, or None + """ cat = self._friendly_category(cat, type_)[0] iter_ = self.model.get_iter_root() while iter_: @@ -1670,8 +1792,10 @@ class MucBrowser(AgentBrowser): _('You can manage your bookmarks via Actions menu in your roster.')) def on_join_button_clicked(self, *args): - '''When we want to join a conference: - Ask specific informations about the selected agent and close the window''' + """ + When we want to join a conference: ask specific informations about the + selected agent and close the window + """ model, iter_ = self.window.services_treeview.get_selection().get_selected() if not iter_: return @@ -1697,18 +1821,24 @@ class MucBrowser(AgentBrowser): self.on_join_button_clicked() def _start_info_query(self): - '''Idle callback to start checking for visible rows.''' + """ + Idle callback to start checking for visible rows + """ self._fetch_source = None self._query_visible() return False def on_scroll(self, *args): - '''Scrollwindow callback to trigger new queries on scolling.''' + """ + Scrollwindow callback to trigger new queries on scolling + """ # This apparently happens when inactive sometimes self._query_visible() def _query_visible(self): - '''Query the next visible row for info.''' + """ + Query the next visible row for info + """ if self._fetch_source: # We're already fetching return @@ -1751,9 +1881,10 @@ class MucBrowser(AgentBrowser): self._fetch_source = None def _channel_altinfo(self, jid, node, items, name = None): - '''Callback for the alternate disco#items query. We try to atleast get - the amount of users in the room if the service does not support MUC - dataforms.''' + """ + Callback for the alternate disco#items query. We try to atleast get the + amount of users in the room if the service does not support MUC dataforms + """ if items == 0: # The server returned an error self._broken += 1 @@ -1816,15 +1947,20 @@ class MucBrowser(AgentBrowser): self.cache.get_items(jid, node, self._channel_altinfo) def PubSubBrowser(account, jid, node): - ''' Returns an AgentBrowser subclass that will display service discovery - for particular pubsub service. Different pubsub services may need to - present different data during browsing. ''' + """ + Return an AgentBrowser subclass that will display service discovery for + particular pubsub service. Different pubsub services may need to present + different data during browsing + """ # for now, only discussion groups are supported... # TODO: check if it has appropriate features to be such kind of service return DiscussionGroupsBrowser(account, jid, node) class DiscussionGroupsBrowser(AgentBrowser): - ''' For browsing pubsub-based discussion groups service. ''' + """ + For browsing pubsub-based discussion groups service + """ + def __init__(self, account, jid, node): AgentBrowser.__init__(self, account, jid, node) @@ -1840,7 +1976,9 @@ class DiscussionGroupsBrowser(AgentBrowser): gajim.connections[account].send_pb_subscription_query(jid, self._subscriptionsCB) def _create_treemodel(self): - ''' Create treemodel for the window. ''' + """ + Create treemodel for the window + """ # JID, node, name (with description) - pango markup, dont have info?, subscribed? self.model = gtk.TreeStore(str, str, str, bool, bool) # sort by name @@ -1891,8 +2029,10 @@ class DiscussionGroupsBrowser(AgentBrowser): return self.in_list def _add_item(self, jid, node, parent_node, item, force): - ''' Called when we got basic information about new node from query. - Show the item. ''' + """ + Called when we got basic information about new node from query. Show the + item + """ name = item.get('name', '') if self.subscriptions is not None: @@ -1962,8 +2102,10 @@ class DiscussionGroupsBrowser(AgentBrowser): self.unsubscribe_button = None def update_actions(self): - '''Called when user selected a row. Make subscribe/unsubscribe buttons - sensitive appropriatelly.''' + """ + Called when user selected a row. Make subscribe/unsubscribe buttons + sensitive appropriatelly + """ # we have nothing to do if we don't have buttons... if self.subscribe_button is None: return @@ -1980,7 +2122,9 @@ class DiscussionGroupsBrowser(AgentBrowser): self.unsubscribe_button.set_sensitive(subscribed) def on_post_button_clicked(self, widget): - '''Called when 'post' button is pressed. Open window to create post''' + """ + Called when 'post' button is pressed. Open window to create post + """ model, iter_ = self.window.services_treeview.get_selection().get_selected() if iter_ is None: return @@ -1989,7 +2133,9 @@ class DiscussionGroupsBrowser(AgentBrowser): groups.GroupsPostWindow(self.account, self.jid, groupnode) def on_subscribe_button_clicked(self, widget): - '''Called when 'subscribe' button is pressed. Send subscribtion request.''' + """ + Called when 'subscribe' button is pressed. Send subscribtion request + """ model, iter_ = self.window.services_treeview.get_selection().get_selected() if iter_ is None: return @@ -1998,7 +2144,9 @@ class DiscussionGroupsBrowser(AgentBrowser): gajim.connections[self.account].send_pb_subscribe(self.jid, groupnode, self._subscribeCB, groupnode) def on_unsubscribe_button_clicked(self, widget): - '''Called when 'unsubscribe' button is pressed. Send unsubscription request.''' + """ + Called when 'unsubscribe' button is pressed. Send unsubscription request + """ model, iter_ = self.window.services_treeview.get_selection().get_selected() if iter_ is None: return @@ -2007,8 +2155,10 @@ class DiscussionGroupsBrowser(AgentBrowser): gajim.connections[self.account].send_pb_unsubscribe(self.jid, groupnode, self._unsubscribeCB, groupnode) def _subscriptionsCB(self, conn, request): - ''' We got the subscribed groups list stanza. Now, if we already - have items on the list, we should actualize them. ''' + """ + We got the subscribed groups list stanza. Now, if we already have items + on the list, we should actualize them + """ try: subscriptions = request.getTag('pubsub').getTag('subscriptions') except Exception: @@ -2036,7 +2186,9 @@ class DiscussionGroupsBrowser(AgentBrowser): raise xmpp.NodeProcessed def _subscribeCB(self, conn, request, groupnode): - '''We have just subscribed to a node. Update UI''' + """ + We have just subscribed to a node. Update UI + """ self.subscriptions.add(groupnode) model = self.window.services_treeview.get_model() @@ -2050,7 +2202,9 @@ class DiscussionGroupsBrowser(AgentBrowser): raise xmpp.NodeProcessed def _unsubscribeCB(self, conn, request, groupnode): - '''We have just unsubscribed from a node. Update UI''' + """ + We have just unsubscribed from a node. Update UI + """ self.subscriptions.remove(groupnode) model = self.window.services_treeview.get_model() diff --git a/src/features_window.py b/src/features_window.py index c89b597cb..d784fc50a 100644 --- a/src/features_window.py +++ b/src/features_window.py @@ -33,7 +33,9 @@ from common import helpers from common import kwalletbinding class FeaturesWindow: - '''Class for features window''' + """ + Class for features window + """ def __init__(self): self.xml = gtkgui_helpers.get_glade('features_window.glade') diff --git a/src/filetransfers_window.py b/src/filetransfers_window.py index cae4549e6..d3d23a156 100644 --- a/src/filetransfers_window.py +++ b/src/filetransfers_window.py @@ -134,7 +134,9 @@ class FileTransfersWindow: self.xml.signal_autoconnect(self) def find_transfer_by_jid(self, account, jid): - ''' find all transfers with peer 'jid' that belong to 'account' ''' + """ + Find all transfers with peer 'jid' that belong to 'account' + """ active_transfers = [[],[]] # ['senders', 'receivers'] # 'account' is the sender @@ -155,7 +157,9 @@ class FileTransfersWindow: return active_transfers def show_completed(self, jid, file_props): - ''' show a dialog saying that file (file_props) has been transferred''' + """ + Show a dialog saying that file (file_props) has been transferred + """ def on_open(widget, file_props): dialog.destroy() if 'file-name' not in file_props: @@ -207,14 +211,16 @@ class FileTransfersWindow: dialog.show_all() def show_request_error(self, file_props): - ''' show error dialog to the recipient saying that transfer - has been canceled''' + """ + Show error dialog to the recipient saying that transfer has been canceled + """ dialogs.InformationDialog(_('File transfer cancelled'), _('Connection with peer cannot be established.')) self.tree.get_selection().unselect_all() def show_send_error(self, file_props): - ''' show error dialog to the sender saying that transfer - has been canceled''' + """ + Show error dialog to the sender saying that transfer has been canceled + """ dialogs.InformationDialog(_('File transfer cancelled'), _('Connection with peer cannot be established.')) self.tree.get_selection().unselect_all() @@ -273,7 +279,9 @@ _('Connection with peer cannot be established.')) desc_hbox.show_all() def send_file(self, account, contact, file_path, file_desc=''): - ''' start the real transfer(upload) of the file ''' + """ + Start the real transfer(upload) of the file + """ if gtkgui_helpers.file_is_locked(file_path): pritext = _('Gajim cannot access this file') sextext = _('This file is being used by another process.') @@ -303,8 +311,10 @@ _('Connection with peer cannot be established.')) gajim.connections[account].send_file_approval(file_props) def show_file_request(self, account, contact, file_props): - ''' show dialog asking for comfirmation and store location of new - file requested by a contact''' + """ + Show dialog asking for comfirmation and store location of new file + requested by a contact + """ if file_props is None or 'name' not in file_props: return sec_text = '\t' + _('File: %s') % gobject.markup_escape_text( @@ -394,7 +404,9 @@ _('Connection with peer cannot be established.')) self.window.render_icon(self.icons[ident], gtk.ICON_SIZE_MENU)) def set_status(self, typ, sid, status): - ''' change the status of a transfer to state 'status' ''' + """ + Change the status of a transfer to state 'status' + """ iter_ = self.get_iter_by_sid(typ, sid) if iter_ is None: return @@ -409,8 +421,10 @@ _('Connection with peer cannot be established.')) self.select_func(path) def _format_percent(self, percent): - ''' add extra spaces from both sides of the percent, so that - progress string has always a fixed size''' + """ + Add extra spaces from both sides of the percent, so that progress string + has always a fixed size + """ _str = ' ' if percent != 100.: _str += ' ' @@ -481,7 +495,9 @@ _('Connection with peer cannot be established.')) del(file_props) def set_progress(self, typ, sid, transfered_size, iter_ = None): - ''' change the progress of a transfer with new transfered size''' + """ + Change the progress of a transfer with new transfered size + """ if sid not in self.files_props[typ]: return file_props = self.files_props[typ][sid] @@ -546,8 +562,10 @@ _('Connection with peer cannot be established.')) self.select_func(path) def get_iter_by_sid(self, typ, sid): - '''returns iter to the row, which holds file transfer, identified by the - session id''' + """ + Return iter to the row, which holds file transfer, identified by the + session id + """ iter_ = self.model.get_iter_root() while iter_: if typ + sid == self.model[iter_][C_SID].decode('utf-8'): @@ -555,9 +573,10 @@ _('Connection with peer cannot be established.')) iter_ = self.model.iter_next(iter_) def get_send_file_props(self, account, contact, file_path, file_name, - file_desc=''): - ''' create new file_props dict and set initial file transfer - properties in it''' + file_desc=''): + """ + Create new file_props dict and set initial file transfer properties in it + """ file_props = {'file-name' : file_path, 'name' : file_name, 'type' : 's', 'desc' : file_desc} if os.path.isfile(file_path): @@ -582,7 +601,9 @@ _('Connection with peer cannot be established.')) return file_props def add_transfer(self, account, contact, file_props): - ''' add new transfer to FT window and show the FT window ''' + """ + Add new transfer to FT window and show the FT window + """ self.on_transfers_list_leave_notify_event(None) if file_props is None: return @@ -686,15 +707,19 @@ _('Connection with peer cannot be established.')) return True def set_cleanup_sensitivity(self): - ''' check if there are transfer rows and set cleanup_button - sensitive, or insensitive if model is empty''' + """ + Check if there are transfer rows and set cleanup_button sensitive, or + insensitive if model is empty + """ if len(self.model) == 0: self.cleanup_button.set_sensitive(False) else: self.cleanup_button.set_sensitive(True) def set_all_insensitive(self): - ''' make all buttons/menuitems insensitive ''' + """ + Make all buttons/menuitems insensitive + """ self.pause_button.set_sensitive(False) self.pause_menuitem.set_sensitive(False) self.continue_menuitem.set_sensitive(False) @@ -705,8 +730,10 @@ _('Connection with peer cannot be established.')) self.set_cleanup_sensitivity() def set_buttons_sensitive(self, path, is_row_selected): - ''' make buttons/menuitems sensitive as appropriate to - the state of file transfer located at path 'path' ''' + """ + Make buttons/menuitems sensitive as appropriate to the state of file + transfer located at path 'path' + """ if path is None: self.set_all_insensitive() return @@ -743,8 +770,9 @@ _('Connection with peer cannot be established.')) return True def selection_changed(self, args): - ''' selection has changed - change the sensitivity of the - buttons/menuitems''' + """ + Selection has changed - change the sensitivity of the buttons/menuitems + """ selection = args selected = selection.get_selected_rows() if selected[1] != []: @@ -881,7 +909,9 @@ _('Connection with peer cannot be established.')) event_button, event.time) def on_transfers_list_key_press_event(self, widget, event): - '''when a key is pressed in the treeviews''' + """ + When a key is pressed in the treeviews + """ self.tooltip.hide_tooltip() iter_ = None try: @@ -963,5 +993,4 @@ _('Connection with peer cannot be established.')) if event.keyval == gtk.keysyms.Escape: # ESCAPE self.window.hide() - # vim: se ts=3: diff --git a/src/gajim-remote.py b/src/gajim-remote.py index 8926cf341..09db604d0 100644 --- a/src/gajim-remote.py +++ b/src/gajim-remote.py @@ -60,7 +60,6 @@ INTERFACE = 'org.gajim.dbus.RemoteInterface' SERVICE = 'org.gajim.dbus' BASENAME = 'gajim-remote' - class GajimRemote: def __init__(self): @@ -327,7 +326,9 @@ class GajimRemote: self.print_result(res) def print_result(self, res): - ''' Print retrieved result to the output ''' + """ + Print retrieved result to the output + """ if res is not None: if self.command in ('open_chat', 'send_chat_message', 'send_single_message', 'start_chat'): if self.command in ('send_message', 'send_single_message'): @@ -382,8 +383,9 @@ class GajimRemote: return test def init_connection(self): - ''' create the onnection to the session dbus, - or exit if it is not possible ''' + """ + Create the onnection to the session dbus, or exit if it is not possible + """ try: self.sbus = dbus.SessionBus() except Exception: @@ -398,8 +400,10 @@ class GajimRemote: self.method = interface.__getattr__(self.command) def make_arguments_row(self, args): - ''' return arguments list. Mandatory arguments are enclosed with: - '<', '>', optional arguments - with '[', ']' ''' + """ + Return arguments list. Mandatory arguments are enclosed with: + '<', '>', optional arguments - with '[', ']' + """ s = '' for arg in args: if arg[2]: @@ -409,7 +413,9 @@ class GajimRemote: return s def help_on_command(self, command): - ''' return help message for a given command ''' + """ + Return help message for a given command + """ if command in self.commands: command_props = self.commands[command] arguments_str = self.make_arguments_row(command_props[1]) @@ -424,7 +430,9 @@ class GajimRemote: send_error(_('%s not found') % command) def compose_help(self): - ''' print usage, and list available commands ''' + """ + Print usage, and list available commands + """ s = _('Usage: %s command [arguments]\nCommand is one of:\n' ) % BASENAME for command in sorted(self.commands): s += ' ' + command @@ -437,7 +445,9 @@ class GajimRemote: return s def print_info(self, level, prop_dict, encode_return = False): - ''' return formated string from data structure ''' + """ + Return formated string from data structure + """ if prop_dict is None or not isinstance(prop_dict, (dict, list, tuple)): return '' ret_str = '' @@ -486,7 +496,9 @@ class GajimRemote: return ret_str def check_arguments(self): - ''' Make check if all necessary arguments are given ''' + """ + Make check if all necessary arguments are given + """ argv_len = self.argv_len - 2 args = self.commands[self.command][1] if len(args) < argv_len: @@ -559,7 +571,9 @@ class GajimRemote: sys.exit(0) def call_remote_method(self): - ''' calls self.method with arguments from sys.argv[2:] ''' + """ + Calls self.method with arguments from sys.argv[2:] + """ args = [i.decode(PREFERRED_ENCODING) for i in self.arguments] args = [dbus.String(i) for i in args] try: diff --git a/src/gajim_themes_window.py b/src/gajim_themes_window.py index ebaebc8d6..e6c23929a 100644 --- a/src/gajim_themes_window.py +++ b/src/gajim_themes_window.py @@ -275,7 +275,9 @@ class GajimThemesWindow: self._set_font() def _set_color(self, state, widget, option): - ''' set color value in prefs and update the UI ''' + """ + Set color value in prefs and update the UI + """ if state: color = widget.get_color() color_string = gtkgui_helpers.make_color_string(color) @@ -297,7 +299,9 @@ class GajimThemesWindow: gajim.interface.save_config() def _set_font(self): - ''' set font value in prefs and update the UI ''' + """ + Set font value in prefs and update the UI + """ state = self.textfont_checkbutton.get_active() if state: font_string = self.text_fontbutton.get_font_name() @@ -317,13 +321,16 @@ class GajimThemesWindow: gajim.interface.save_config() def _toggle_font_widgets(self, font_props): - ''' toggle font buttons with the bool values of font_props tuple''' + """ + Toggle font buttons with the bool values of font_props tuple + """ self.bold_togglebutton.set_active(font_props[0]) self.italic_togglebutton.set_active(font_props[1]) def _get_font_description(self): - ''' return a FontDescription from togglebuttons - states''' + """ + Return a FontDescription from togglebuttons states + """ fd = pango.FontDescription() if self.bold_togglebutton.get_active(): fd.set_weight(pango.WEIGHT_BOLD) @@ -332,8 +339,10 @@ class GajimThemesWindow: return fd def _set_font_widgets(self, font_attrs): - ''' set the correct toggle state of font style buttons by - a font string of type 'BI' ''' + """ + Set the correct toggle state of font style buttons by a font string of + type 'BI' + """ font_props = [False, False, False] if font_attrs: if font_attrs.find('B') != -1: @@ -343,7 +352,9 @@ class GajimThemesWindow: self._toggle_font_widgets(font_props) def _get_font_attrs(self): - ''' get a string with letters of font attribures: 'BI' ''' + """ + Get a string with letters of font attribures: 'BI' + """ attrs = '' if self.bold_togglebutton.get_active(): attrs += 'B' @@ -353,7 +364,9 @@ class GajimThemesWindow: def _get_font_props(self, font_name): - ''' get tuple of font properties: Weight, Style ''' + """ + Get tuple of font properties: weight, style + """ font_props = [False, False, False] font_description = pango.FontDescription(font_name) if font_description.get_weight() != pango.WEIGHT_NORMAL: diff --git a/src/groups.py b/src/groups.py index 1b78f5708..2588b11a4 100644 --- a/src/groups.py +++ b/src/groups.py @@ -26,7 +26,10 @@ import gtkgui_helpers class GroupsPostWindow: def __init__(self, account, servicejid, groupid): - '''Open new 'create post' window to create message for groupid on servicejid service.''' + """ + Open new 'create post' window to create message for groupid on servicejid + service + """ assert isinstance(servicejid, basestring) assert isinstance(groupid, basestring) @@ -43,11 +46,15 @@ class GroupsPostWindow: self.window.show_all() def on_cancel_button_clicked(self, w): - '''Close window.''' + """ + Close window + """ self.window.destroy() def on_send_button_clicked(self, w): - '''Gather info from widgets and send it as a message.''' + """ + Gather info from widgets and send it as a message + """ # constructing item to publish... that's atom:entry element item = xmpp.Node('entry', {'xmlns':'http://www.w3.org/2005/Atom'}) author = item.addChild('author') diff --git a/src/gtkgui_helpers.py b/src/gtkgui_helpers.py index 6a8b1b1cf..273dc65b7 100644 --- a/src/gtkgui_helpers.py +++ b/src/gtkgui_helpers.py @@ -67,8 +67,10 @@ def get_glade(file_name, root = None): return gtk.glade.XML(file_path, root=root, domain=i18n.APP) def get_completion_liststore(entry): - ''' create a completion model for entry widget - completion list consists of (Pixbuf, Text) rows''' + """ + Create a completion model for entry widget completion list consists of + (Pixbuf, Text) rows + """ completion = gtk.EntryCompletion() liststore = gtk.ListStore(gtk.gdk.Pixbuf, str) @@ -86,7 +88,9 @@ def get_completion_liststore(entry): def popup_emoticons_under_button(menu, button, parent_win): - ''' pops emoticons menu under button, which is in parent_win''' + """ + Popup the emoticons menu under button, which is in parent_win + """ window_x1, window_y1 = parent_win.get_origin() def position_menu_under_button(menu): # inline function, which will not keep refs, when used as CB @@ -115,8 +119,9 @@ def popup_emoticons_under_button(menu, button, parent_win): menu.popup(None, None, position_menu_under_button, 1, 0) def get_theme_font_for_option(theme, option): - '''return string description of the font, stored in - theme preferences''' + """ + Return string description of the font, stored in theme preferences + """ font_name = gajim.config.get_per('themes', theme, option) font_desc = pango.FontDescription() font_prop_str = gajim.config.get_per('themes', theme, option + 'attrs') @@ -130,10 +135,10 @@ def get_theme_font_for_option(theme, option): return fd.to_string() def get_default_font(): - '''Get the desktop setting for application font - first check for GNOME, then Xfce and last KDE - it returns None on failure or else a string 'Font Size' ''' - + """ + Get the desktop setting for application font first check for GNOME, then + Xfce and last KDE it returns None on failure or else a string 'Font Size' + """ try: import gconf # in try because daemon may not be there @@ -206,7 +211,9 @@ def user_runs_xfce(): return False def get_running_processes(): - '''returns running processes or None (if not /proc exists)''' + """ + Return running processes or None (if /proc does not exist) + """ if os.path.isdir('/proc'): # under Linux: checking if 'gnome-session' or # 'startkde' programs were run before gajim, by @@ -241,7 +248,9 @@ def get_running_processes(): return [] def move_window(window, x, y): - '''moves the window but also checks if out of screen''' + """ + Move the window, but also check if out of screen + """ if x < 0: x = 0 if y < 0: @@ -254,7 +263,9 @@ def move_window(window, x, y): window.move(x, y) def resize_window(window, w, h): - '''resizes window but also checks if huge window or negative values''' + """ + Resize window, but also checks if huge window or negative values + """ if not w or not h: return if w > screen_w: @@ -354,8 +365,10 @@ def parse_server_xml(path_to_file): print >> sys.stderr, _('Error parsing file:'), message def set_unset_urgency_hint(window, unread_messages_no): - '''sets/unsets urgency hint in window argument - depending if we have unread messages or not''' + """ + Sets/unset urgency hint in window argument depending if we have unread + messages or not + """ if gajim.config.get('use_urgency_hint'): if unread_messages_no > 0: window.props.urgency_hint = True @@ -363,8 +376,10 @@ def set_unset_urgency_hint(window, unread_messages_no): window.props.urgency_hint = False def get_abspath_for_script(scriptname, want_type = False): - '''checks if we are svn or normal user and returns abspath to asked script - if want_type is True we return 'svn' or 'install' ''' + """ + Check if we are svn or normal user and return abspath to asked script if + want_type is True we return 'svn' or 'install' + """ if os.path.isdir('.svn'): # we are svn user type_ = 'svn' cwd = os.getcwd() # it's always ending with src @@ -403,8 +418,10 @@ def get_abspath_for_script(scriptname, want_type = False): return path_to_script def get_pixbuf_from_data(file_data, want_type = False): - '''Gets image data and returns gtk.gdk.Pixbuf - if want_type is True it also returns 'jpeg', 'png' etc''' + """ + Get image data and returns gtk.gdk.Pixbuf if want_type is True it also + returns 'jpeg', 'png' etc + """ pixbufloader = gtk.gdk.PixbufLoader() try: pixbufloader.write(file_data) @@ -431,8 +448,11 @@ def get_invisible_cursor(): return cursor def get_current_desktop(window): - '''returns the current virtual desktop for given window - NOTE: window is GDK window''' + """ + Return the current virtual desktop for given window + + NOTE: Window is a GDK window. + """ prop = window.property_get('_NET_CURRENT_DESKTOP') if prop is None: # it means it's normal window (not root window) # so we look for it's current virtual desktop in another property @@ -444,9 +464,12 @@ def get_current_desktop(window): return current_virtual_desktop_no def possibly_move_window_in_current_desktop(window): - '''moves GTK window to current virtual desktop if it is not in the - current virtual desktop - window is GTK window''' + """ + Moves GTK window to current virtual desktop if it is not in the current + virtual desktop + + NOTE: Window is a GDK window. + """ if os.name == 'nt': return False @@ -468,7 +491,11 @@ def possibly_move_window_in_current_desktop(window): return False def file_is_locked(path_to_file): - '''returns True if file is locked (WINDOWS ONLY)''' + """ + Return True if file is locked + + NOTE: Windows only. + """ if os.name != 'nt': # just in case return @@ -496,8 +523,10 @@ def file_is_locked(path_to_file): return False def _get_fade_color(treeview, selected, focused): - '''get a gdk color that is between foreground and background in 0.3 - 0.7 respectively colors of the cell for the given treeview''' + """ + Get a gdk color that is between foreground and background in 0.3 + 0.7 respectively colors of the cell for the given treeview + """ style = treeview.style if selected: if focused: # is the window focused? @@ -516,9 +545,10 @@ def _get_fade_color(treeview, selected, focused): int(bg.blue*p + fg.blue*q)) def get_scaled_pixbuf(pixbuf, kind): - '''returns scaled pixbuf, keeping ratio etc or None - kind is either "chat", "roster", "notification", "tooltip", "vcard"''' - + """ + Return scaled pixbuf, keeping ratio etc or None kind is either "chat", + "roster", "notification", "tooltip", "vcard" + """ # resize to a width / height for the avatar not to have distortion # (keep aspect ratio) width = gajim.config.get(kind + '_avatar_width') @@ -544,12 +574,14 @@ def get_scaled_pixbuf(pixbuf, kind): return scaled_buf def get_avatar_pixbuf_from_cache(fjid, is_fake_jid = False, use_local = True): - '''checks if jid has cached avatar and if that avatar is valid image - (can be shown) - returns None if there is no image in vcard - returns 'ask' if cached vcard should not be used (user changed his vcard, - so we have new sha) or if we don't have the vcard''' + """ + Check if jid has cached avatar and if that avatar is valid image (can be + shown) + Returns None if there is no image in vcard/ + Returns 'ask' if cached vcard should not be used (user changed his vcard, so + we have new sha) or if we don't have the vcard + """ jid, nick = gajim.get_room_and_nick_from_fjid(fjid) if gajim.config.get('hide_avatar_of_transport') and\ gajim.jid_is_transport(jid): @@ -588,16 +620,21 @@ def get_avatar_pixbuf_from_cache(fjid, is_fake_jid = False, use_local = True): return pixbuf def make_gtk_month_python_month(month): - '''gtk start counting months from 0, so January is 0 - but python's time start from 1, so align to python - month MUST be integer''' + """ + GTK starts counting months from 0, so January is 0 but Python's time start + from 1, so align to Python + + NOTE: Month MUST be an integer. + """ return month + 1 def make_python_month_gtk_month(month): return month - 1 def make_color_string(color): - '''create #aabbcc color string from gtk color''' + """ + Create #aabbcc color string from gtk color + """ col = '#' for i in ('red', 'green', 'blue'): h = hex(getattr(color, i) / (16*16)).split('x')[1] @@ -612,10 +649,12 @@ def make_pixbuf_grayscale(pixbuf): return pixbuf2 def get_path_to_generic_or_avatar(generic, jid = None, suffix = None): - '''Chooses between avatar image and default image. - Returns full path to the avatar image if it exists, - otherwise returns full path to the image. - generic must be with extension and suffix without''' + """ + Choose between avatar image and default image + + Returns full path to the avatar image if it exists, otherwise returns full + path to the image. generic must be with extension and suffix without + """ if jid: # we want an avatar puny_jid = helpers.sanitize_filename(jid) @@ -632,9 +671,10 @@ def get_path_to_generic_or_avatar(generic, jid = None, suffix = None): return os.path.abspath(generic) def decode_filechooser_file_paths(file_paths): - '''decode as UTF-8 under Windows and - ask sys.getfilesystemencoding() in POSIX - file_paths MUST be LIST''' + """ + Decode as UTF-8 under Windows and ask sys.getfilesystemencoding() in POSIX + file_paths MUST be LIST + """ file_paths_list = list() if os.name == 'nt': # decode as UTF-8 under Windows @@ -655,7 +695,9 @@ def decode_filechooser_file_paths(file_paths): return file_paths_list def possibly_set_gajim_as_xmpp_handler(): - '''registers (by default only the first time) xmmp: to Gajim.''' + """ + Register (by default only the first time) 'xmmp:' to Gajim + """ path_to_dot_kde = os.path.expanduser('~/.kde') if os.path.exists(path_to_dot_kde): path_to_kde_file = os.path.join(path_to_dot_kde, @@ -737,8 +779,10 @@ Description=xmpp dlg.checkbutton.set_active(True) def escape_underscore(s): - '''Escape underlines to prevent them from being interpreted - as keyboard accelerators''' + """ + Escape underlines to prevent them from being interpreted as keyboard + accelerators + """ return s.replace('_', '__') def get_state_image_from_file_path_show(file_path, show): @@ -756,7 +800,9 @@ def get_state_image_from_file_path_show(file_path, show): return image def get_possible_button_event(event): - '''mouse or keyboard caused the event?''' + """ + Mouse or keyboard caused the event? + """ if event.type == gtk.gdk.KEY_PRESS: return 0 # no event.button so pass 0 # BUTTON_PRESS event, so pass event.button @@ -847,7 +893,9 @@ def on_bm_header_changed_state(widget, event): widget.set_state(gtk.STATE_NORMAL) #do not allow selected_state def create_combobox(value_list, selected_value = None): - '''Value_list is [(label1, value1), ]''' + """ + Value_list is [(label1, value1)] + """ liststore = gtk.ListStore(str, str) combobox = gtk.ComboBox(liststore) cell = gtk.CellRendererText() @@ -864,7 +912,9 @@ def create_combobox(value_list, selected_value = None): return combobox def create_list_multi(value_list, selected_values=None): - '''Value_list is [(label1, value1), ]''' + """ + Value_list is [(label1, value1)] + """ liststore = gtk.ListStore(str, str) treeview = gtk.TreeView(liststore) treeview.get_selection().set_mode(gtk.SELECTION_MULTIPLE) @@ -882,8 +932,10 @@ def create_list_multi(value_list, selected_values=None): return treeview def load_iconset(path, pixbuf2=None, transport=False): - '''load full iconset from the given path, and add - pixbuf2 on top left of each static images''' + """ + Load full iconset from the given path, and add pixbuf2 on top left of each + static images + """ path += '/' if transport: list_ = ('online', 'chat', 'away', 'xa', 'dnd', 'offline', @@ -898,21 +950,27 @@ def load_iconset(path, pixbuf2=None, transport=False): return _load_icon_list(list_, path, pixbuf2) def load_icon(icon_name): - '''load an icon from the iconset in 16x16''' + """ + Load an icon from the iconset in 16x16 + """ iconset = gajim.config.get('iconset') path = os.path.join(helpers.get_iconset_path(iconset), '16x16', '') icon_list = _load_icon_list([icon_name], path) return icon_list[icon_name] def load_mood_icon(icon_name): - '''load an icon from the mood iconset in 16x16''' + """ + Load an icon from the mood iconset in 16x16 + """ iconset = gajim.config.get('mood_iconset') path = os.path.join(helpers.get_mood_iconset_path(iconset), '') icon_list = _load_icon_list([icon_name], path) return icon_list[icon_name] def load_activity_icon(category, activity = None): - '''load an icon from the activity iconset in 16x16''' + """ + Load an icon from the activity iconset in 16x16 + """ iconset = gajim.config.get('activity_iconset') path = os.path.join(helpers.get_activity_iconset_path(iconset), category, '') @@ -922,8 +980,10 @@ def load_activity_icon(category, activity = None): return icon_list[activity] def load_icons_meta(): - '''load and return - AND + small icons to put on top left of an icon - for meta contacts.''' + """ + Load and return - AND + small icons to put on top left of an icon for meta + contacts + """ iconset = gajim.config.get('iconset') path = os.path.join(helpers.get_iconset_path(iconset), '16x16') # try to find opened_meta.png file, else opened.png else nopixbuf merge @@ -945,8 +1005,10 @@ def load_icons_meta(): return pixo, pixc def _load_icon_list(icons_list, path, pixbuf2 = None): - '''load icons in icons_list from the given path, - and add pixbuf2 on top left of each static images''' + """ + Load icons in icons_list from the given path, and add pixbuf2 on top left of + each static images + """ imgs = {} for icon in icons_list: # try to open a pixfile with the correct method @@ -972,7 +1034,9 @@ def _load_icon_list(icons_list, path, pixbuf2 = None): return imgs def make_jabber_state_images(): - '''initialise jabber_state_images dict''' + """ + Initialize jabber_state_images dictionary + """ iconset = gajim.config.get('iconset') if iconset: if helpers.get_iconset_path(iconset): @@ -1002,8 +1066,10 @@ def reload_jabber_state_images(): gajim.interface.roster.update_jabber_state_images() def label_set_autowrap(widget): - '''Make labels automatically re-wrap if their containers are resized. - Accepts label or container widgets.''' + """ + Make labels automatically re-wrap if their containers are resized. + Accepts label or container widgets + """ if isinstance (widget, gtk.Container): children = widget.get_children() for i in xrange (len (children)): @@ -1013,7 +1079,9 @@ def label_set_autowrap(widget): widget.connect_after('size-allocate', __label_size_allocate) def __label_size_allocate(widget, allocation): - '''Callback which re-allocates the size of a label.''' + """ + Callback which re-allocates the size of a label + """ layout = widget.get_layout() lw_old, lh_old = layout.get_size() diff --git a/src/gui_interface.py b/src/gui_interface.py index 7a948d5c1..6f5f06e4f 100644 --- a/src/gui_interface.py +++ b/src/gui_interface.py @@ -54,7 +54,6 @@ if dbus_support.supported: import gtkgui_helpers - import dialogs import notify import message_control @@ -92,7 +91,6 @@ config_filename = gajimpaths['CONFIG_FILE'] from common import optparser parser = optparser.OptionsParser(config_filename) - import logging log = logging.getLogger('gajim.interface') @@ -265,10 +263,10 @@ class Interface: def handle_event_new_jid(self, account, data): #('NEW_JID', account, (old_jid, new_jid)) - ''' + """ This event is raised when our JID changed (most probably because we use - anonymous account. We update contact and roster entry in this case. - ''' + anonymous account. We update contact and roster entry in this case + """ self.roster.rename_self_contact(data[0], data[1], account) def edit_own_details(self, account): @@ -1521,7 +1519,9 @@ class Interface: contact.resource) def handle_event_signed_in(self, account, empty): - '''SIGNED_IN event is emitted when we sign in, so handle it''' + """ + SIGNED_IN event is emitted when we sign in, so handle it + """ # ('SIGNED_IN', account, ()) # block signed in notifications for 30 seconds gajim.block_signed_in_notifications[account] = True @@ -1828,7 +1828,9 @@ class Interface: dialogs.RosterItemExchangeWindow(account, data[0], data[1], data[2]) def handle_event_unique_room_id_supported(self, account, data): - '''Receive confirmation that unique_room_id are supported''' + """ + Receive confirmation that unique_room_id are supported + """ # ('UNIQUE_ROOM_ID_SUPPORTED', server, instance, room_id) instance = data[1] instance.unique_room_id_supported(data[0], data[2]) @@ -2114,12 +2116,11 @@ class Interface: 'PEP_RECEIVED': [self.handle_event_pep_received] } - def dispatch(self, event, account, data): - ''' - Dispatches an network event to the event handlers of this class. - - Return true if it could be dispatched to alteast one handler. - ''' + def dispatch(self, event, account, data): + """ + Dispatch an network event to the event handlers of this class. Return + true if it could be dispatched to alteast one handler + """ if event not in self.handlers: log.warning('Unknown event %s dispatched to GUI: %s' % (event, data)) return False @@ -2135,7 +2136,9 @@ class Interface: ################################################################################ def add_event(self, account, jid, type_, event_args): - '''add an event to the gajim.events var''' + """ + Add an event to the gajim.events var + """ # We add it to the gajim.events queue # Do we have a queue? jid = gajim.get_jid_without_resource(jid) @@ -2464,7 +2467,9 @@ class Interface: self.invalid_XML_chars = u'[\x00-\x08]|[\x0b-\x0c]|[\x0e-\x19]|[\ud800-\udfff]|[\ufffe-\uffff]' def popup_emoticons_under_button(self, button, parent_win): - ''' pops emoticons menu under button, located in parent_win''' + """ + Popup the emoticons menu under button, located in parent_win + """ gtkgui_helpers.popup_emoticons_under_button(self.emoticons_menu, button, parent_win) @@ -2572,8 +2577,10 @@ class Interface: ################################################################################ def join_gc_room(self, account, room_jid, nick, password, minimize=False, - is_continued=False): - '''joins the room immediately''' + is_continued=False): + """ + Join the room immediately + """ if not nick: nick = gajim.nicks[account] @@ -2841,7 +2848,9 @@ class Interface: return (bg_str, fg_str) def read_sleepy(self): - '''Check idle status and change that status if needed''' + """ + Check idle status and change that status if needed + """ if not self.sleeper.poll(): # idle detection is not supported in that OS return False # stop looping in vain @@ -2895,7 +2904,9 @@ class Interface: return True # renew timeout (loop for ever) def autoconnect(self): - '''auto connect at startup''' + """ + Auto connect at startup + """ # dict of account that want to connect sorted by status shows = {} for a in gajim.connections: @@ -2934,7 +2945,9 @@ class Interface: helpers.launch_browser_mailer(kind, url) def process_connections(self): - ''' Called each foo (200) miliseconds. Check for idlequeue timeouts. ''' + """ + Called each foo (200) miliseconds. Check for idlequeue timeouts + """ try: gajim.idlequeue.process() except Exception: @@ -2958,7 +2971,11 @@ class Interface: sys.exit() def save_avatar_files(self, jid, photo, puny_nick = None, local = False): - '''Saves an avatar to a separate file, and generate files for dbus notifications. An avatar can be given as a pixmap directly or as an decoded image.''' + """ + Save an avatar to a separate file, and generate files for dbus + notifications. An avatar can be given as a pixmap directly or as an + decoded image + """ puny_jid = helpers.sanitize_filename(jid) path_to_file = os.path.join(gajim.AVATAR_PATH, puny_jid) if puny_nick: @@ -3011,7 +3028,9 @@ class Interface: (path_to_original_file, str(e))) def remove_avatar_files(self, jid, puny_nick = None, local = False): - '''remove avatar files of a jid''' + """ + Remove avatar files of a jid + """ puny_jid = helpers.sanitize_filename(jid) path_to_file = os.path.join(gajim.AVATAR_PATH, puny_jid) if puny_nick: @@ -3028,7 +3047,9 @@ class Interface: os.remove(path_to_file + '_notif_size_bw' + ext) def auto_join_bookmarks(self, account): - '''autojoin bookmarked GCs that have 'auto join' on for this account''' + """ + Autojoin bookmarked GCs that have 'auto join' on for this account + """ for bm in gajim.connections[account].bookmarks: if bm['autojoin'] in ('1', 'true'): jid = bm['jid'] @@ -3046,8 +3067,10 @@ class Interface: self.roster.add_groupchat(jid, account) def add_gc_bookmark(self, account, name, jid, autojoin, minimize, password, - nick): - '''add a bookmark for this account, sorted in bookmark list''' + nick): + """ + Add a bookmark for this account, sorted in bookmark list + """ bm = { 'name': name, 'jid': jid, @@ -3475,13 +3498,9 @@ class PassphraseRequest: class ThreadInterface: def __init__(self, func, func_args, callback, callback_args): - '''Call a function in a thread - - :param func: the function to call in the thread - :param func_args: list or arguments for this function - :param callback: callback to call once function is finished - :param callback_args: list of arguments for this callback - ''' + """ + Call a function in a thread + """ def thread_function(func, func_args, callback, callback_args): output = func(*func_args) gobject.idle_add(callback, output, *callback_args) diff --git a/src/gui_menu_builder.py b/src/gui_menu_builder.py index 80575d1ad..453677aa2 100644 --- a/src/gui_menu_builder.py +++ b/src/gui_menu_builder.py @@ -28,9 +28,11 @@ from common import helpers from common.xmpp.protocol import NS_COMMANDS, NS_FILE, NS_MUC, NS_ESESSION def build_resources_submenu(contacts, account, action, room_jid=None, -room_account=None, cap=None): - ''' Build a submenu with contact's resources. - room_jid and room_account are for action self.on_invite_to_room ''' + room_account=None, cap=None): + """ + Build a submenu with contact's resources. room_jid and room_account are for + action self.on_invite_to_room + """ roster = gajim.interface.roster sub_menu = gtk.Menu() @@ -61,7 +63,9 @@ room_account=None, cap=None): return sub_menu def build_invite_submenu(invite_menuitem, list_): - '''list_ in a list of (contact, account)''' + """ + list_ in a list of (contact, account) + """ roster = gajim.interface.roster # used if we invite only one contact with several resources contact_list = [] @@ -145,10 +149,12 @@ def build_invite_submenu(invite_menuitem, list_): invite_to_submenu.append(menuitem) def get_contact_menu(contact, account, use_multiple_contacts=True, -show_start_chat=True, show_encryption=False, show_buttonbar_items=True, -control=None): - ''' Build contact popup menu for roster and chat window. - If control is not set, we hide invite_contacts_menuitem''' + show_start_chat=True, show_encryption=False, show_buttonbar_items=True, + control=None): + """ + Build contact popup menu for roster and chat window. If control is not set, + we hide invite_contacts_menuitem + """ if not contact: return diff --git a/src/history_manager.py b/src/history_manager.py index 5cdac0369..5d171b75c 100644 --- a/src/history_manager.py +++ b/src/history_manager.py @@ -290,11 +290,13 @@ class HistoryManager: self._fill_logs_listview(jid) def _get_jid_id(self, jid): - '''jids table has jid and jid_id + """ + jids table has jid and jid_id logs table has log_id, jid_id, contact_name, time, kind, show, message - so to ask logs we need jid_id that matches our jid in jids table - this method wants jid and returns the jid_id for later sql-ing on logs - ''' + + So to ask logs we need jid_id that matches our jid in jids table this + method wants jid and returns the jid_id for later sql-ing on logs + """ if jid.find('/') != -1: # if it has a / jid_is_from_pm = self._jid_is_from_pm(jid) if not jid_is_from_pm: # it's normal jid with resource @@ -304,22 +306,24 @@ class HistoryManager: return str(jid_id) def _get_jid_from_jid_id(self, jid_id): - '''jids table has jid and jid_id - this method accepts jid_id and returns the jid for later sql-ing on logs - ''' + """ + jids table has jid and jid_id + + This method accepts jid_id and returns the jid for later sql-ing on logs + """ self.cur.execute('SELECT jid FROM jids WHERE jid_id = ?', (jid_id,)) jid = self.cur.fetchone()[0] return jid def _jid_is_from_pm(self, jid): - '''if jid is gajim@conf/nkour it's likely a pm one, how we know - gajim@conf is not a normal guy and nkour is not his resource? - we ask if gajim@conf is already in jids (with type room jid) - this fails if user disables logging for room and only enables for - pm (so higly unlikely) and if we fail we do not go chaos - (user will see the first pm as if it was message in room's public chat) - and after that all okay''' - + """ + If jid is gajim@conf/nkour it's likely a pm one, how we know gajim@conf + is not a normal guy and nkour is not his resource? We ask if gajim@conf + is already in jids (with type room jid). This fails if user disables + logging for room and only enables for pm (so higly unlikely) and if we + fail we do not go chaos (user will see the first pm as if it was message + in room's public chat) and after that everything is ok + """ possible_room_jid = jid.split('/', 1)[0] self.cur.execute('SELECT jid_id FROM jids WHERE jid = ? AND type = ?', @@ -331,8 +335,9 @@ class HistoryManager: return True def _jid_is_room_type(self, jid): - '''returns True/False if given id is room type or not - eg. if it is room''' + """ + Return True/False if given id is room type or not eg. if it is room + """ self.cur.execute('SELECT type FROM jids WHERE jid = ?', (jid,)) row = self.cur.fetchone() if row is None: @@ -343,8 +348,10 @@ class HistoryManager: return False def _fill_logs_listview(self, jid): - '''fill the listview with all messages that user sent to or - received from JID''' + """ + Fill the listview with all messages that user sent to or received from + JID + """ # no need to lower jid in this context as jid is already lowered # as we use those jids from db jid_id = self._get_jid_id(jid) @@ -403,7 +410,9 @@ class HistoryManager: subject, nickname)) def _fill_search_results_listview(self, text): - '''ask db and fill listview with results that match text''' + """ + Ask db and fill listview with results that match text + """ self.search_results_liststore.clear() like_sql = '%' + text + '%' self.cur.execute(''' From a23961fbf64557c86bf023c441184944bf77a2d9 Mon Sep 17 00:00:00 2001 From: Alexander Cherniuk Date: Wed, 25 Nov 2009 22:59:43 +0200 Subject: [PATCH 072/259] Big portion of doc-string refactoring --- src/history_window.py | 73 +++-- src/htmltextview.py | 33 +- src/ipython_view.py | 147 ++++----- src/message_control.py | 93 ++++-- src/message_window.py | 96 ++++-- src/negotiation.py | 5 +- src/network_manager_listener.py | 12 +- src/notify.py | 49 +-- src/profile_window.py | 16 +- src/remote_control.py | 132 +++++--- src/roster_window.py | 535 ++++++++++++++++++++------------ src/search_window.py | 6 +- src/session.py | 16 +- src/statusicon.py | 39 ++- src/tooltips.py | 81 +++-- src/vcard.py | 19 +- 16 files changed, 856 insertions(+), 496 deletions(-) diff --git a/src/history_window.py b/src/history_window.py index 2ad639fb7..1478720be 100644 --- a/src/history_window.py +++ b/src/history_window.py @@ -43,23 +43,25 @@ constants = Constants() # Completion dict ( -C_INFO_JID, -C_INFO_ACCOUNT, -C_INFO_NAME, -C_INFO_COMPLETION + C_INFO_JID, + C_INFO_ACCOUNT, + C_INFO_NAME, + C_INFO_COMPLETION ) = range(4) # contact_name, date, message, time ( -C_LOG_JID, -C_CONTACT_NAME, -C_UNIXTIME, -C_MESSAGE, -C_TIME + C_LOG_JID, + C_CONTACT_NAME, + C_UNIXTIME, + C_MESSAGE, + C_TIME ) = range(5) class HistoryWindow: - '''Class for browsing logs of conversations with contacts''' + """ + Class for browsing logs of conversations with contacts + """ def __init__(self, jid = None, account = None): xml = gtkgui_helpers.get_glade('history_window.glade') @@ -132,15 +134,16 @@ class HistoryWindow: self.window.show_all() def _fill_completion_dict(self): - '''Fill completion_dict for key auto completion. Then load history for - current jid (by calling another function). + """ + Fill completion_dict for key auto completion. Then load history for + current jid (by calling another function) - Key will be either jid or full_completion_name - (contact name or long description like "pm-contact from groupchat....") + Key will be either jid or full_completion_name (contact name or long + description like "pm-contact from groupchat...."). {key : (jid, account, nick_name, full_completion_name} - this is a generator and does pseudo-threading via idle_add() - ''' + This is a generator and does pseudo-threading via idle_add(). + """ liststore = gtkgui_helpers.get_completion_liststore(self.jid_entry) # Add all jids in logs.db: @@ -208,8 +211,10 @@ class HistoryWindow: yield False def _get_account_for_jid(self, jid): - '''Return the corresponding account of the jid. - May be None if an account could not be found''' + """ + Return the corresponding account of the jid. May be None if an account + could not be found + """ accounts = gajim.contacts.get_accounts() account = None for acc in accounts: @@ -247,7 +252,9 @@ class HistoryWindow: widget.select_region(0, -1) # select text def _load_history(self, jid_or_name, account = None): - '''Load history for the given jid/name and show it''' + """ + Load history for the given jid/name and show it + """ if jid_or_name and jid_or_name in self.completion_dict: # a full qualified jid or a contact name was entered info_jid, info_account, info_name, info_completion = self.completion_dict[jid_or_name] @@ -324,9 +331,9 @@ class HistoryWindow: self._add_lines_for_date(year, month, day) def on_calendar_month_changed(self, widget): - '''asks for days in this month if they have logs it bolds them (marks - them) - ''' + """ + Ask for days in this month, if they have logs it bolds them (marks them) + """ if not self.jid: return year, month, day = widget.get_date() # integers @@ -362,7 +369,9 @@ class HistoryWindow: return show def _add_lines_for_date(self, year, month, day): - '''adds all the lines for given date in textbuffer''' + """ + Add all the lines for given date in textbuffer + """ self.history_buffer.set_text('') # clear the buffer first self.last_time_printout = 0 @@ -376,7 +385,9 @@ class HistoryWindow: line[5]) def _add_new_line(self, contact_name, tim, kind, show, message, subject): - '''add a new line in textbuffer''' + """ + Add a new line in textbuffer + """ if not message and kind not in (constants.KIND_STATUS, constants.KIND_GCSTATUS): return @@ -538,8 +549,10 @@ class HistoryWindow: self.jids_to_search = gajim.logger.get_jids_in_db() def on_results_treeview_row_activated(self, widget, path, column): - '''a row was double clicked, get date from row, and select it in calendar - which results to showing conversation logs for that date''' + """ + A row was double clicked, get date from row, and select it in calendar + which results to showing conversation logs for that date + """ # get currently selected date cur_year, cur_month = self.calendar.get_date()[0:2] cur_month = gtkgui_helpers.make_gtk_month_python_month(cur_month) @@ -568,7 +581,9 @@ class HistoryWindow: # and highlight all that def _scroll_to_result(self, unix_time): - '''scrolls to the result using unix_time and highlight line''' + """ + Scroll to the result using unix_time and highlight line + """ start_iter = self.history_buffer.get_start_iter() local_time = time.localtime(float(unix_time)) tim = time.strftime('%X', local_time) @@ -602,7 +617,9 @@ class HistoryWindow: ' '.join(no_log_for)) def open_history(self, jid, account): - '''Load chat history of the specified jid''' + """ + Load chat history of the specified jid + """ self.jid_entry.set_text(jid) if account and account not in self.accounts_seen_online: # Update dict to not only show bare jid diff --git a/src/htmltextview.py b/src/htmltextview.py index 5c12a049c..8b65d8f87 100644 --- a/src/htmltextview.py +++ b/src/htmltextview.py @@ -25,7 +25,7 @@ ## along with Gajim. If not, see . ## -''' +""" A gtk.TextView-based renderer for XHTML-IM, as described in: http://www.jabber.org/jeps/jep-0071.html @@ -33,8 +33,7 @@ Starting with the version posted by Gustavo Carneiro, I (Santiago Gala) am trying to make it more compatible with the markup that docutils generate, and also more modular. - -''' +""" import gobject import pango @@ -187,7 +186,6 @@ for name in BLOCK_HEAD: ) def _parse_css_color(color): - '''_parse_css_color(css_color) -> gtk.gdk.Color''' if color.startswith('rgb(') and color.endswith(')'): r, g, b = [int(c)*257 for c in color[4:-1].split(',')] return gtk.gdk.Color(r, g, b) @@ -200,10 +198,11 @@ def style_iter(style): class HtmlHandler(xml.sax.handler.ContentHandler): - """A handler to display html to a gtk textview. + """ + A handler to display html to a gtk textview - It keeps a stack of "style spans" (start/end element pairs) - and a stack of list counters, for nested lists. + It keeps a stack of "style spans" (start/end element pairs) and a stack of + list counters, for nested lists. """ def __init__(self, conv_textview, startiter): xml.sax.handler.ContentHandler.__init__(self) @@ -240,8 +239,10 @@ class HtmlHandler(xml.sax.handler.ContentHandler): callback(allocation.width*frac, *args) def _parse_length(self, value, font_relative, block_relative, minl, maxl, callback, *args): - '''Parse/calc length, converting to pixels, calls callback(length, *args) - when the length is first computed or changes''' + """ + Parse/calc length, converting to pixels, calls callback(length, *args) + when the length is first computed or changes + """ if value.endswith('%'): val = float(value[:-1]) sign = cmp(val,0) @@ -556,11 +557,11 @@ class HtmlHandler(xml.sax.handler.ContentHandler): if h: self._parse_length(h, False, False, 1, 1000, height_cb) def set_size(pixbuf, w, h, dims): - '''FIXME: floats should be relative to the whole - textview, and resize with it. This needs new - pifbufs for every resize, gtk.gdk.Pixbuf.scale_simple - or similar. - ''' + """ + FIXME: Floats should be relative to the whole textview, and + resize with it. This needs new pifbufs for every resize, + gtk.gdk.Pixbuf.scale_simple or similar. + """ if isinstance(dims[0], float): dims[0] = int(dims[0]*w) elif not dims[0]: @@ -945,7 +946,9 @@ if __name__ == '__main__': tooltip = tooltips.BaseTooltip() def on_textview_motion_notify_event(widget, event): - '''change the cursor to a hand when we are over a mail or an url''' + """ + Change the cursor to a hand when we are over a mail or an url + """ global change_cursor pointer_x, pointer_y = htmlview.tv.window.get_pointer()[0:2] x, y = htmlview.tv.window_to_buffer_coords(gtk.TEXT_WINDOW_TEXT, pointer_x, diff --git a/src/ipython_view.py b/src/ipython_view.py index 4bc8a9564..a901643f6 100644 --- a/src/ipython_view.py +++ b/src/ipython_view.py @@ -29,8 +29,8 @@ ## THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -''' -Provides IPython console widget. +""" +Provides IPython console widget @author: Eitan Isaacson @organization: IBM Corporation @@ -40,7 +40,7 @@ Provides IPython console widget. All rights reserved. This program and the accompanying materials are made available under the terms of the BSD which accompanies this distribution, and is available at U{http://www.opensource.org/licenses/bsd-license.php} -''' +""" import gtk, gobject import re @@ -55,10 +55,10 @@ except ImportError: IPython = None class IterableIPShell: - ''' + """ Create an IPython instance. Does not start a blocking event loop, instead allow single iterations. This allows embedding in GTK+ - without blockage. + without blockage @ivar IP: IPython instance. @type IP: IPython.iplib.InteractiveShell @@ -70,12 +70,10 @@ class IterableIPShell: @type history_level: integer @ivar complete_sep: Seperation delimeters for completion function. @type complete_sep: _sre.SRE_Pattern - ''' - def __init__(self,argv=[],user_ns=None,user_global_ns=None, - cin=None, cout=None,cerr=None, input_func=None): - ''' - - + """ + def __init__(self,argv=[],user_ns=None,user_global_ns=None, cin=None, + cout=None,cerr=None, input_func=None): + """ @param argv: Command line options for IPython @type argv: list @param user_ns: User namespace. @@ -90,7 +88,7 @@ class IterableIPShell: @type cerr: IO stream @param input_func: Replacement for builtin raw_input() @type input_func: function - ''' + """ if input_func: IPython.iplib.raw_input_original = input_func if cin: @@ -121,9 +119,9 @@ class IterableIPShell: self.complete_sep = re.compile('[\s\{\}\[\]\(\)]') def execute(self): - ''' - Executes the current line provided by the shell object. - ''' + """ + Execute the current line provided by the shell object + """ self.history_level = 0 orig_stdout = sys.stdout sys.stdout = IPython.Shell.Term.cout @@ -156,32 +154,32 @@ class IterableIPShell: sys.stdout = orig_stdout def historyBack(self): - ''' - Provides one history command back. + """ + Provide one history command back @return: The command string. @rtype: string - ''' + """ self.history_level -= 1 return self._getHistory() def historyForward(self): - ''' - Provides one history command forward. + """ + Provide one history command forward @return: The command string. @rtype: string - ''' + """ self.history_level += 1 return self._getHistory() def _getHistory(self): - ''' - Get's the command string of the current history level. + """ + Get the command string of the current history level @return: Historic command string. @rtype: string - ''' + """ try: rv = self.IP.user_ns['In'][self.history_level].strip('\n') except IndexError: @@ -190,17 +188,17 @@ class IterableIPShell: return rv def updateNamespace(self, ns_dict): - ''' - Add the current dictionary to the shell namespace. + """ + Add the current dictionary to the shell namespace @param ns_dict: A dictionary of symbol-values. @type ns_dict: dictionary - ''' + """ self.IP.user_ns.update(ns_dict) def complete(self, line): - ''' - Returns an auto completed line and/or posibilities for completion. + """ + Returns an auto completed line and/or posibilities for completion @param line: Given line so far. @type line: string @@ -208,7 +206,7 @@ class IterableIPShell: @return: Line completed as for as possible, and possible further completions. @rtype: tuple - ''' + """ split_line = self.complete_sep.split(line) possibilities = self.IP.complete(split_line[-1]) @@ -222,7 +220,9 @@ class IterableIPShell: return True def common_prefix(seq): - """Returns the common prefix of a sequence of strings""" + """ + Return the common prefix of a sequence of strings + """ return "".join(c for i, c in enumerate(seq[0]) if all(s.startswith(c, i) for s in seq)) if possibilities: @@ -233,8 +233,8 @@ class IterableIPShell: def shell(self, cmd,verbose=0,debug=0,header=''): - ''' - Replacement method to allow shell commands without them blocking. + """ + Replacement method to allow shell commands without them blocking @param cmd: Shell command to execute. @type cmd: string @@ -244,7 +244,7 @@ class IterableIPShell: @type debug: integer @param header: Header to be printed before output @type header: string - ''' + """ if verbose or debug: print header+cmd # flush stdout so we don't mangle python's buffering if not debug: @@ -254,8 +254,8 @@ class IterableIPShell: input_.close() class ConsoleView(gtk.TextView): - ''' - Specialized text view for console-like workflow. + """ + Specialized text view for console-like workflow @cvar ANSI_COLORS: Mapping of terminal colors to X11 names. @type ANSI_COLORS: dictionary @@ -268,7 +268,8 @@ class ConsoleView(gtk.TextView): @type mark: gtk.TextMark @ivar line_start: Start of command line mark. @type line_start: gtk.TextMark - ''' + """ + ANSI_COLORS = {'0;30': 'Black', '0;31': 'Red', '0;32': 'Green', '0;33': 'Brown', '0;34': 'Blue', '0;35': 'Purple', @@ -279,9 +280,9 @@ class ConsoleView(gtk.TextView): '1;36': 'LightCyan', '1;37': 'White'} def __init__(self): - ''' - Initialize console view. - ''' + """ + Initialize console view + """ gtk.TextView.__init__(self) self.modify_font(pango.FontDescription('Mono')) self.set_cursor_visible(True) @@ -305,14 +306,14 @@ class ConsoleView(gtk.TextView): gobject.idle_add(self._write, text, editable) def _write(self, text, editable=False): - ''' - Write given text to buffer. + """ + Write given text to buffer @param text: Text to append. @type text: string @param editable: If true, added text is editable. @type editable: boolean - ''' + """ segments = self.color_pat.split(text) segment = segments.pop(0) start_mark = self.text_buffer.create_mark(None, @@ -339,12 +340,12 @@ class ConsoleView(gtk.TextView): gobject.idle_add(self._showPrompt, prompt) def _showPrompt(self, prompt): - ''' - Prints prompt at start of line. + """ + Print prompt at start of line @param prompt: Prompt to print. @type prompt: string - ''' + """ self._write(prompt) self.text_buffer.move_mark(self.line_start, self.text_buffer.get_end_iter()) @@ -353,24 +354,24 @@ class ConsoleView(gtk.TextView): gobject.idle_add(self._changeLine, text) def _changeLine(self, text): - ''' - Replace currently entered command line with given text. + """ + Replace currently entered command line with given text @param text: Text to use as replacement. @type text: string - ''' + """ iter_ = self.text_buffer.get_iter_at_mark(self.line_start) iter_.forward_to_line_end() self.text_buffer.delete(self.text_buffer.get_iter_at_mark(self.line_start), iter_) self._write(text, True) def getCurrentLine(self): - ''' - Get text in current command line. + """ + Get text in current command line @return: Text of current command line. @rtype: string - ''' + """ rv = self.text_buffer.get_slice( self.text_buffer.get_iter_at_mark(self.line_start), self.text_buffer.get_end_iter(), False) @@ -380,12 +381,12 @@ class ConsoleView(gtk.TextView): gobject.idle_add(self._showReturned, text) def _showReturned(self, text): - ''' - Show returned text from last command and print new prompt. + """ + Show returned text from last command and print new prompt @param text: Text to show. @type text: string - ''' + """ iter_ = self.text_buffer.get_iter_at_mark(self.line_start) iter_.forward_to_line_end() self.text_buffer.apply_tag_by_name( @@ -400,10 +401,10 @@ class ConsoleView(gtk.TextView): self.text_buffer.place_cursor(self.text_buffer.get_end_iter()) def onKeyPress(self, widget, event): - ''' + """ Key press callback used for correcting behavior for console-like interfaces. For example 'home' should go to prompt, not to begining of - line. + line @param widget: Widget that key press accored in. @type widget: gtk.Widget @@ -412,7 +413,7 @@ class ConsoleView(gtk.TextView): @return: Return True if event should not trickle. @rtype: boolean - ''' + """ insert_mark = self.text_buffer.get_insert() insert_iter = self.text_buffer.get_iter_at_mark(insert_mark) selection_mark = self.text_buffer.get_selection_bound() @@ -445,9 +446,9 @@ class ConsoleView(gtk.TextView): return self.onKeyPressExtend(event) def onKeyPressExtend(self, event): - ''' - For some reason we can't extend onKeyPress directly (bug #500900). - ''' + """ + For some reason we can't extend onKeyPress directly (bug #500900) + """ pass class IPythonView(ConsoleView, IterableIPShell): @@ -456,9 +457,9 @@ class IPythonView(ConsoleView, IterableIPShell): a GTK+ IPython console. ''' def __init__(self): - ''' - Initialize. Redirect I/O to console. - ''' + """ + Initialize. Redirect I/O to console + """ ConsoleView.__init__(self) self.cout = StringIO() IterableIPShell.__init__(self, cout=self.cout,cerr=self.cout, @@ -470,24 +471,24 @@ class IPythonView(ConsoleView, IterableIPShell): self.interrupt = False def raw_input(self, prompt=''): - ''' - Custom raw_input() replacement. Get's current line from console buffer. + """ + Custom raw_input() replacement. Get's current line from console buffer @param prompt: Prompt to print. Here for compatability as replacement. @type prompt: string @return: The current command line text. @rtype: string - ''' + """ if self.interrupt: self.interrupt = False raise KeyboardInterrupt return self.getCurrentLine() def onKeyPressExtend(self, event): - ''' + """ Key press callback with plenty of shell goodness, like history, - autocompletions, etc. + autocompletions, etc @param widget: Widget that key press occured in. @type widget: gtk.Widget @@ -496,7 +497,7 @@ class IPythonView(ConsoleView, IterableIPShell): @return: True if event should not trickle. @rtype: boolean - ''' + """ if event.state & gtk.gdk.CONTROL_MASK and event.keyval == 99: self.interrupt = True self._processLine() @@ -524,9 +525,9 @@ class IPythonView(ConsoleView, IterableIPShell): return True def _processLine(self): - ''' - Process current command line. - ''' + """ + Process current command line + """ self.history_pos = 0 self.execute() rv = self.cout.getvalue() diff --git a/src/message_control.py b/src/message_control.py index 7ee724554..40d4beb07 100644 --- a/src/message_control.py +++ b/src/message_control.py @@ -39,7 +39,10 @@ TYPE_PM = 'pm' #################### class MessageControl: - '''An abstract base widget that can embed in the gtk.Notebook of a MessageWindow''' + """ + An abstract base widget that can embed in the gtk.Notebook of a + MessageWindow + """ def __init__(self, type_id, parent_win, widget_name, contact, account, resource = None): # dict { cb id : widget} @@ -67,57 +70,87 @@ class MessageControl: return fjid def set_control_active(self, state): - '''Called when the control becomes active (state is True) - or inactive (state is False)''' + """ + Called when the control becomes active (state is True) or inactive (state + is False) + """ pass # Derived classes MUST implement this method def minimizable(self): - '''Called to check if control can be minimized''' - # NOTE: Derived classes MAY implement this + """ + Called to check if control can be minimized + + Derived classes MAY implement this. + """ return False def safe_shutdown(self): - '''Called to check if control can be closed without loosing data. - returns True if control can be closed safely else False''' - # NOTE: Derived classes MAY implement this + """ + Called to check if control can be closed without loosing data. + returns True if control can be closed safely else False + + Derived classes MAY implement this. + """ return True def allow_shutdown(self, method, on_response_yes, on_response_no, - on_response_minimize): - '''Called to check is a control is allowed to shutdown. + on_response_minimize): + """ + Called to check is a control is allowed to shutdown. If a control is not in a suitable shutdown state this method should call on_response_no, else on_response_yes or - on_response_minimize ''' - # NOTE: Derived classes MAY implement this + on_response_minimize + + Derived classes MAY implement this. + """ on_response_yes(self) def shutdown(self): - # NOTE: Derived classes MUST implement this + """ + Derived classes MUST implement this + """ pass def repaint_themed_widgets(self): - pass # NOTE: Derived classes SHOULD implement this + """ + Derived classes SHOULD implement this + """ + pass def update_ui(self): - pass # NOTE: Derived classes SHOULD implement this + """ + Derived classes SHOULD implement this + """ + pass def toggle_emoticons(self): - pass # NOTE: Derived classes MAY implement this + """ + Derived classes MAY implement this + """ + pass def update_font(self): - pass # NOTE: Derived classes SHOULD implement this + """ + Derived classes SHOULD implement this + """ + pass def update_tags(self): - pass # NOTE: Derived classes SHOULD implement this + """ + Derived classes SHOULD implement this + """ + pass def get_tab_label(self, chatstate): - '''Return a suitable tab label string. Returns a tuple such as: - (label_str, color) either of which can be None - if chatstate is given that means we have HE SENT US a chatstate and - we want it displayed''' - # NOTE: Derived classes MUST implement this + """ + Return a suitable tab label string. Returns a tuple such as: (label_str, + color) either of which can be None if chatstate is given that means we + have HE SENT US a chatstate and we want it displayed + + Derivded classes MUST implement this. + """ # Return a markup'd label and optional gtk.Color in a tupple like: - #return (label_str, None) + # return (label_str, None) pass def get_tab_image(self, count_unread=True): @@ -126,11 +159,15 @@ class MessageControl: return None def prepare_context_menu(self): - # NOTE: Derived classes SHOULD implement this + """ + Derived classes SHOULD implement this + """ return None def chat_buttons_set_visible(self, state): - # NOTE: Derived classes MAY implement this + """ + Derived classes MAY implement this + """ self.hide_chat_buttons = state def got_connected(self): @@ -170,8 +207,8 @@ class MessageControl: self.print_esession_details() def send_message(self, message, keyID='', type_='chat', chatstate=None, - msg_id=None, composing_xep=None, resource=None, user_nick=None, xhtml=None, - callback=None, callback_args=[]): + msg_id=None, composing_xep=None, resource=None, user_nick=None, + xhtml=None, callback=None, callback_args=[]): # Send the given message to the active tab. # Doesn't return None if error jid = self.contact.jid diff --git a/src/message_window.py b/src/message_window.py index 8adb580d6..5e6fe5596 100644 --- a/src/message_window.py +++ b/src/message_window.py @@ -42,8 +42,9 @@ from common import gajim #################### class MessageWindow(object): - '''Class for windows which contain message like things; chats, - groupchats, etc.''' + """ + Class for windows which contain message like things; chats, groupchats, etc + """ # DND_TARGETS is the targets needed by drag_source_set and drag_dest_set DND_TARGETS = [('GAJIM_TAB', 0, 81)] @@ -160,7 +161,9 @@ class MessageWindow(object): self.account = new_name def change_jid(self, account, old_jid, new_jid): - ''' call then when the full jid of a contral change''' + """ + Called when the full jid of the control is changed + """ if account not in self._controls: return if old_jid not in self._controls[account]: @@ -417,7 +420,9 @@ class MessageWindow(object): return True def _on_close_button_clicked(self, button, control): - '''When close button is pressed: close a tab''' + """ + When close button is pressed: close a tab + """ self.remove_tab(control, self.CLOSE_CLOSE_BUTTON) def show_icon(self): @@ -444,7 +449,9 @@ class MessageWindow(object): self.window.set_icon(icon.get_pixbuf()) def show_title(self, urgent=True, control=None): - '''redraw the window's title''' + """ + Redraw the window's title + """ if not control: control = self.get_active_control() if not control: @@ -512,8 +519,10 @@ class MessageWindow(object): self.window.present() def remove_tab(self, ctrl, method, reason = None, force = False): - '''reason is only for gc (offline status message) - if force is True, do not ask any confirmation''' + """ + Reason is only for gc (offline status message) if force is True, do not + ask any confirmation + """ def close(ctrl): if reason is not None: # We are leaving gc with a status message ctrl.shutdown(reason) @@ -616,7 +625,9 @@ class MessageWindow(object): self.show_icon() def repaint_themed_widgets(self): - '''Repaint controls in the window with theme color''' + """ + Repaint controls in the window with theme color + """ # iterate through controls and repaint for ctrl in self.controls(): ctrl.repaint_themed_widgets() @@ -663,8 +674,10 @@ class MessageWindow(object): ctrl.update_tags() def get_control(self, key, acct): - '''Return the MessageControl for jid or n, where n is a notebook page index. - When key is an int index acct may be None''' + """ + Return the MessageControl for jid or n, where n is a notebook page index. + When key is an int index acct may be None + """ if isinstance(key, str): key = unicode(key, 'utf-8') @@ -686,7 +699,9 @@ class MessageWindow(object): return (acct in self._controls and jid in self._controls[acct]) def change_key(self, old_jid, new_jid, acct): - '''Change the JID key of a control''' + """ + Change the JID key of a control + """ try: # Check if controls exists ctrl = self._controls[acct][old_jid] @@ -814,10 +829,10 @@ class MessageWindow(object): control.msg_textview.grab_focus() def get_tab_at_xy(self, x, y): - '''Thanks to Gaim - Return the tab under xy and - if its nearer from left or right side of the tab - ''' + """ + Return the tab under xy and if its nearer from left or right side of the + tab + """ page_num = -1 to_right = False horiz = self.notebook.get_tab_pos() == gtk.POS_TOP or \ @@ -844,7 +859,9 @@ class MessageWindow(object): return (page_num, to_right) def find_page_num_according_to_tab_label(self, tab_label): - '''Find the page num of the tab label''' + """ + Find the page num of the tab label + """ page_num = -1 for i in xrange(self.notebook.get_n_pages()): page = self.notebook.get_nth_page(i) @@ -856,18 +873,21 @@ class MessageWindow(object): ################################################################################ class MessageWindowMgr(gobject.GObject): - '''A manager and factory for MessageWindow objects''' + """ + A manager and factory for MessageWindow objects + """ + __gsignals__ = { 'window-delete': (gobject.SIGNAL_RUN_LAST, None, (object,)), } # These constants map to common.config.opt_one_window_types indices ( - ONE_MSG_WINDOW_NEVER, - ONE_MSG_WINDOW_ALWAYS, - ONE_MSG_WINDOW_ALWAYS_WITH_ROSTER, - ONE_MSG_WINDOW_PERACCT, - ONE_MSG_WINDOW_PERTYPE, + ONE_MSG_WINDOW_NEVER, + ONE_MSG_WINDOW_ALWAYS, + ONE_MSG_WINDOW_ALWAYS_WITH_ROSTER, + ONE_MSG_WINDOW_PERACCT, + ONE_MSG_WINDOW_PERTYPE, ) = range(5) # A key constant for the main window in ONE_MSG_WINDOW_ALWAYS mode MAIN_WIN = 'main' @@ -875,12 +895,14 @@ class MessageWindowMgr(gobject.GObject): ROSTER_MAIN_WIN = 'roster' def __init__(self, parent_window, parent_paned): - ''' A dictionary of windows; the key depends on the config: - ONE_MSG_WINDOW_NEVER: The key is the contact JID - ONE_MSG_WINDOW_ALWAYS: The key is MessageWindowMgr.MAIN_WIN - ONE_MSG_WINDOW_ALWAYS_WITH_ROSTER: The key is MessageWindowMgr.MAIN_WIN - ONE_MSG_WINDOW_PERACCT: The key is the account name - ONE_MSG_WINDOW_PERTYPE: The key is a message type constant''' + """ + A dictionary of windows; the key depends on the config: + ONE_MSG_WINDOW_NEVER: The key is the contact JID + ONE_MSG_WINDOW_ALWAYS: The key is MessageWindowMgr.MAIN_WIN + ONE_MSG_WINDOW_ALWAYS_WITH_ROSTER: The key is MessageWindowMgr.MAIN_WIN + ONE_MSG_WINDOW_PERACCT: The key is the account name + ONE_MSG_WINDOW_PERTYPE: The key is a message type constant + """ gobject.GObject.__init__(self) self._windows = {} @@ -931,7 +953,9 @@ class MessageWindowMgr(gobject.GObject): return False def _resize_window(self, win, acct, type_): - '''Resizes window according to config settings''' + """ + Resizes window according to config settings + """ if self.mode in (self.ONE_MSG_WINDOW_ALWAYS, self.ONE_MSG_WINDOW_ALWAYS_WITH_ROSTER): size = (gajim.config.get('msgwin-width'), @@ -958,7 +982,9 @@ class MessageWindowMgr(gobject.GObject): win.parent_paned.set_position(parent_size[0]) def _position_window(self, win, acct, type_): - '''Moves window according to config settings''' + """ + Moves window according to config settings + """ if (self.mode in [self.ONE_MSG_WINDOW_NEVER, self.ONE_MSG_WINDOW_ALWAYS_WITH_ROSTER]): return @@ -1054,15 +1080,19 @@ class MessageWindowMgr(gobject.GObject): return def get_control(self, jid, acct): - '''Amongst all windows, return the MessageControl for jid''' + """ + Amongst all windows, return the MessageControl for jid + """ win = self.get_window(jid, acct) if win: return win.get_control(jid, acct) return None def get_gc_control(self, jid, acct): - '''Same as get_control. Was briefly required, is not any more. -May be useful some day in the future?''' + """ + Same as get_control. Was briefly required, is not any more. May be useful + some day in the future? + """ ctrl = self.get_control(jid, acct) if ctrl and ctrl.type_id == message_control.TYPE_GC: return ctrl diff --git a/src/negotiation.py b/src/negotiation.py index bd5a32123..a7cf5c043 100644 --- a/src/negotiation.py +++ b/src/negotiation.py @@ -27,14 +27,15 @@ from common import gajim from common import xmpp def describe_features(features): - '''a human-readable description of the features that have been negotiated''' + """ + A human-readable description of the features that have been negotiated + """ if features['logging'] == 'may': return _('- messages will be logged') elif features['logging'] == 'mustnot': return _('- messages will not be logged') class FeatureNegotiationWindow: - '''FeatureNegotiotionWindow class''' def __init__(self, account, jid, session, form): self.account = account self.jid = jid diff --git a/src/network_manager_listener.py b/src/network_manager_listener.py index 15a40bbf6..3f1f774ca 100644 --- a/src/network_manager_listener.py +++ b/src/network_manager_listener.py @@ -26,21 +26,27 @@ from common import gajim def device_now_active(self, *args): - '''For Network Manager 0.6''' + """ + For Network Manager 0.6 + """ for connection in gajim.connections.itervalues(): if gajim.config.get_per('accounts', connection.name, 'listen_to_network_manager') and connection.time_to_reconnect: connection._reconnect() def device_no_longer_active(self, *args): - '''For Network Manager 0.6''' + """ + For Network Manager 0.6 + """ for connection in gajim.connections.itervalues(): if gajim.config.get_per('accounts', connection.name, 'listen_to_network_manager') and connection.connected > 1: connection._disconnectedReconnCB() def state_changed(state): - '''For Network Manager 0.7''' + """ + For Network Manager 0.7 + """ if props.Get("org.freedesktop.NetworkManager", "State") == 3: for connection in gajim.connections.itervalues(): if gajim.config.get_per('accounts', connection.name, diff --git a/src/notify.py b/src/notify.py index 3d9eb6051..c155de29e 100644 --- a/src/notify.py +++ b/src/notify.py @@ -69,7 +69,9 @@ def server_display(server): win.present() def get_show_in_roster(event, account, contact, session=None): - '''Return True if this event must be shown in roster, else False''' + """ + Return True if this event must be shown in roster, else False + """ if event == 'gc_message_received': return True num = get_advanced_notification(event, account, contact) @@ -84,7 +86,9 @@ def get_show_in_roster(event, account, contact, session=None): return True def get_show_in_systray(event, account, contact, type_=None): - '''Return True if this event must be shown in systray, else False''' + """ + Return True if this event must be shown in systray, else False + """ num = get_advanced_notification(event, account, contact) if num is not None: if gajim.config.get_per('notifications', str(num), 'systray') == 'yes': @@ -98,8 +102,9 @@ def get_show_in_systray(event, account, contact, type_=None): return gajim.config.get('trayicon_notification_on_events') def get_advanced_notification(event, account, contact): - '''Returns the number of the first (top most) - advanced notification else None''' + """ + Returns the number of the first (top most) advanced notification else None + """ num = 0 notif = gajim.config.get_per('notifications', str(num)) while notif: @@ -146,10 +151,11 @@ def get_advanced_notification(event, account, contact): notif = gajim.config.get_per('notifications', str(num)) def notify(event, jid, account, parameters, advanced_notif_num=None): - '''Check what type of notifications we want, depending on basic - and the advanced configuration of notifications and do these notifications; - advanced_notif_num holds the number of the first (top most) advanced - notification''' + """ + Check what type of notifications we want, depending on basic and the advanced + configuration of notifications and do these notifications; advanced_notif_num + holds the number of the first (top most) advanced notification + """ # First, find what notifications we want do_popup = False do_sound = False @@ -327,12 +333,13 @@ def notify(event, jid, account, parameters, advanced_notif_num=None): except Exception: pass -def popup(event_type, jid, account, msg_type='', path_to_image=None, - title=None, text=None): - '''Notifies a user of an event. It first tries to a valid implementation of +def popup(event_type, jid, account, msg_type='', path_to_image=None, title=None, + text=None): + """ + Notify a user of an event. It first tries to a valid implementation of the Desktop Notification Specification. If that fails, then we fall back to - the older style PopupNotificationWindow method.''' - + the older style PopupNotificationWindow method + """ # default image if not path_to_image: path_to_image = os.path.abspath( @@ -414,9 +421,12 @@ def on_pynotify_notification_clicked(notification, action): gajim.interface.handle_event(account, jid, msg_type) class NotificationResponseManager: - '''Collects references to pending DesktopNotifications and manages there - signalling. This is necessary due to a bug in DBus where you can't remove - a signal from an interface once it's connected.''' + """ + Collect references to pending DesktopNotifications and manages there + signalling. This is necessary due to a bug in DBus where you can't remove a + signal from an interface once it's connected + """ + def __init__(self): self.pending = {} self.received = [] @@ -464,8 +474,11 @@ class NotificationResponseManager: notification_response_manager = NotificationResponseManager() class DesktopNotification: - '''A DesktopNotification that interfaces with D-Bus via the Desktop - Notification specification''' + """ + A DesktopNotification that interfaces with D-Bus via the Desktop Notification + specification + """ + def __init__(self, event_type, jid, account, msg_type='', path_to_image=None, title=None, text=None): self.path_to_image = path_to_image diff --git a/src/profile_window.py b/src/profile_window.py index d00bfc335..a19623397 100644 --- a/src/profile_window.py +++ b/src/profile_window.py @@ -36,7 +36,9 @@ from common import gajim class ProfileWindow: - '''Class for our information window''' + """ + Class for our information window + """ def __init__(self, account): self.xml = gtkgui_helpers.get_glade('profile_window.glade') @@ -173,7 +175,9 @@ class ProfileWindow: on_response_cancel = on_cancel, on_response_clear = on_clear) def on_PHOTO_button_press_event(self, widget, event): - '''If right-clicked, show popup''' + """ + If right-clicked, show popup + """ if event.button == 3 and self.avatar_encoded: # right click menu = gtk.Menu() @@ -257,7 +261,9 @@ class ProfileWindow: self.update_progressbar_timeout_id = None def add_to_vcard(self, vcard_, entry, txt): - '''Add an information to the vCard dictionary''' + """ + Add an information to the vCard dictionary + """ entries = entry.split('_') loc = vcard_ if len(entries) == 3: # We need to use lists @@ -280,7 +286,9 @@ class ProfileWindow: return vcard_ def make_vcard(self): - '''make the vCard dictionary''' + """ + Make the vCard dictionary + """ entries = ['FN', 'NICKNAME', 'BDAY', 'EMAIL_HOME_USERID', 'URL', 'TEL_HOME_NUMBER', 'N_FAMILY', 'N_GIVEN', 'N_MIDDLE', 'N_PREFIX', 'N_SUFFIX', 'ADR_HOME_STREET', 'ADR_HOME_EXTADR', 'ADR_HOME_LOCALITY', diff --git a/src/remote_control.py b/src/remote_control.py index f50370708..87107cc0b 100644 --- a/src/remote_control.py +++ b/src/remote_control.py @@ -64,9 +64,10 @@ DBUS_DICT_SS = lambda : dbus.Dictionary({}, signature="ss") DBUS_NONE = lambda : dbus.Int32(0) def get_dbus_struct(obj): - ''' recursively go through all the items and replace - them with their casted dbus equivalents - ''' + """ + Recursively go through all the items and replace them with their casted dbus + equivalents + """ if obj is None: return DBUS_NONE() if isinstance(obj, (unicode, str)): @@ -110,8 +111,12 @@ class Remote: class SignalObject(dbus.service.Object): - ''' Local object definition for /org/gajim/dbus/RemoteObject. - (This docstring is not be visible, because the clients can access only the remote object.)''' + """ + Local object definition for /org/gajim/dbus/RemoteObject + + This docstring is not be visible, because the clients can access only the + remote object. + """ def __init__(self, bus_name): self.first_show = True @@ -193,14 +198,18 @@ class SignalObject(dbus.service.Object): pass def raise_signal(self, signal, arg): - '''raise a signal, with a single argument of unspecified type - Instead of obj.raise_signal("Foo", bar), use obj.Foo(bar).''' + """ + Raise a signal, with a single argument of unspecified type Instead of + obj.raise_signal("Foo", bar), use obj.Foo(bar) + """ getattr(self, signal)(arg) @dbus.service.method(INTERFACE, in_signature='s', out_signature='s') def get_status(self, account): - '''Returns status (show to be exact) which is the global one - unless account is given''' + """ + Return status (show to be exact) which is the global one unless account is + given + """ if not account: # If user did not ask for account, returns the global status return DBUS_STRING(helpers.get_global_show()) @@ -210,8 +219,9 @@ class SignalObject(dbus.service.Object): @dbus.service.method(INTERFACE, in_signature='s', out_signature='s') def get_status_message(self, account): - '''Returns status which is the global one - unless account is given''' + """ + Return status which is the global one unless account is given + """ if not account: # If user did not ask for account, returns the global status return DBUS_STRING(str(helpers.get_global_status())) @@ -220,7 +230,9 @@ class SignalObject(dbus.service.Object): return DBUS_STRING(status) def _get_account_and_contact(self, account, jid): - '''get the account (if not given) and contact instance from jid''' + """ + Get the account (if not given) and contact instance from jid + """ connected_account = None contact = None accounts = gajim.contacts.get_accounts() @@ -247,8 +259,10 @@ class SignalObject(dbus.service.Object): return connected_account, contact def _get_account_for_groupchat(self, account, room_jid): - '''get the account which is connected to groupchat (if not given) - or check if the given account is connected to the groupchat''' + """ + Get the account which is connected to groupchat (if not given) + or check if the given account is connected to the groupchat + """ connected_account = None accounts = gajim.contacts.get_accounts() # if there is only one account in roster, take it as default @@ -273,8 +287,10 @@ class SignalObject(dbus.service.Object): @dbus.service.method(INTERFACE, in_signature='sss', out_signature='b') def send_file(self, file_path, jid, account): - '''send file, located at 'file_path' to 'jid', using account - (optional) 'account' ''' + """ + Send file, located at 'file_path' to 'jid', using account (optional) + 'account' + """ jid = self._get_real_jid(jid, account) connected_account, contact = self._get_account_and_contact(account, jid) @@ -289,8 +305,10 @@ class SignalObject(dbus.service.Object): def _send_message(self, jid, message, keyID, account, type_ = 'chat', subject = None): - '''can be called from send_chat_message (default when send_message) - or send_single_message''' + """ + Can be called from send_chat_message (default when send_message) or + send_single_message + """ if not jid or not message: return DBUS_BOOLEAN(False) if not keyID: @@ -305,22 +323,27 @@ class SignalObject(dbus.service.Object): @dbus.service.method(INTERFACE, in_signature='ssss', out_signature='b') def send_chat_message(self, jid, message, keyID, account): - '''Send chat 'message' to 'jid', using account (optional) 'account'. - if keyID is specified, encrypt the message with the pgp key ''' + """ + Send chat 'message' to 'jid', using account (optional) 'account'. If keyID + is specified, encrypt the message with the pgp key + """ jid = self._get_real_jid(jid, account) return self._send_message(jid, message, keyID, account) @dbus.service.method(INTERFACE, in_signature='sssss', out_signature='b') def send_single_message(self, jid, subject, message, keyID, account): - '''Send single 'message' to 'jid', using account (optional) 'account'. - if keyID is specified, encrypt the message with the pgp key ''' + """ + Send single 'message' to 'jid', using account (optional) 'account'. If + keyID is specified, encrypt the message with the pgp key + """ jid = self._get_real_jid(jid, account) return self._send_message(jid, message, keyID, account, type, subject) @dbus.service.method(INTERFACE, in_signature='sss', out_signature='b') def send_groupchat_message(self, room_jid, message, account): - '''Send 'message' to groupchat 'room_jid', - using account (optional) 'account'.''' + """ + Send 'message' to groupchat 'room_jid', using account (optional) 'account' + """ if not room_jid or not message: return DBUS_BOOLEAN(False) connected_account = self._get_account_for_groupchat(account, room_jid) @@ -332,8 +355,10 @@ class SignalObject(dbus.service.Object): @dbus.service.method(INTERFACE, in_signature='sss', out_signature='b') def open_chat(self, jid, account, message): - '''Shows the tabbed window for new message to 'jid', using account - (optional) 'account' ''' + """ + Shows the tabbed window for new message to 'jid', using account (optional) + 'account' + """ if not jid: raise dbus_support.MissingArgument() jid = self._get_real_jid(jid, account) @@ -384,8 +409,10 @@ class SignalObject(dbus.service.Object): @dbus.service.method(INTERFACE, in_signature='sss', out_signature='b') def change_status(self, status, message, account): - ''' change_status(status, message, account). account is optional - - if not specified status is changed for all accounts. ''' + """ + change_status(status, message, account). Account is optional - if not + specified status is changed for all accounts + """ if status not in ('offline', 'online', 'chat', 'away', 'xa', 'dnd', 'invisible'): return DBUS_BOOLEAN(False) @@ -404,9 +431,10 @@ class SignalObject(dbus.service.Object): @dbus.service.method(INTERFACE, in_signature='ss', out_signature='') def set_priority(self, prio, account): - ''' set_priority(prio, account). account is optional - - if not specified priority is changed for all accounts. that are synced - with global status''' + """ + set_priority(prio, account). Account is optional - if not specified + priority is changed for all accounts. That are synced with global status + """ if account: gajim.config.set_per('accounts', account, 'priority', prio) show = gajim.SHOW_LIST[gajim.connections[account].connected] @@ -429,14 +457,17 @@ class SignalObject(dbus.service.Object): @dbus.service.method(INTERFACE, in_signature='', out_signature='') def show_next_pending_event(self): - '''Show the window(s) with next pending event in tabbed/group chats.''' + """ + Show the window(s) with next pending event in tabbed/group chats + """ if gajim.events.get_nb_events(): gajim.interface.systray.handle_first_event() @dbus.service.method(INTERFACE, in_signature='s', out_signature='a{sv}') def contact_info(self, jid): - '''get vcard info for a contact. Return cached value of the vcard. - ''' + """ + Get vcard info for a contact. Return cached value of the vcard + """ if not isinstance(jid, unicode): jid = unicode(jid) if not jid: @@ -452,7 +483,9 @@ class SignalObject(dbus.service.Object): @dbus.service.method(INTERFACE, in_signature='', out_signature='as') def list_accounts(self): - '''list register accounts''' + """ + List register accounts + """ result = gajim.contacts.get_accounts() result_array = dbus.Array([], signature='s') if result and len(result) > 0: @@ -462,7 +495,9 @@ class SignalObject(dbus.service.Object): @dbus.service.method(INTERFACE, in_signature='s', out_signature='a{ss}') def account_info(self, account): - '''show info on account: resource, jid, nick, prio, message''' + """ + Show info on account: resource, jid, nick, prio, message + """ result = DBUS_DICT_SS() if account in gajim.connections: # account is valid @@ -479,8 +514,10 @@ class SignalObject(dbus.service.Object): @dbus.service.method(INTERFACE, in_signature='s', out_signature='aa{sv}') def list_contacts(self, account): - '''list all contacts in the roster. If the first argument is specified, - then return the contacts for the specified account''' + """ + List all contacts in the roster. If the first argument is specified, then + return the contacts for the specified account + """ result = dbus.Array([], signature='aa{sv}') accounts = gajim.contacts.get_accounts() if len(accounts) == 0: @@ -500,7 +537,9 @@ class SignalObject(dbus.service.Object): @dbus.service.method(INTERFACE, in_signature='', out_signature='') def toggle_roster_appearance(self): - ''' shows/hides the roster window ''' + """ + Show/hide the roster window + """ win = gajim.interface.roster.window if win.get_property('visible'): gobject.idle_add(win.hide) @@ -514,7 +553,9 @@ class SignalObject(dbus.service.Object): @dbus.service.method(INTERFACE, in_signature='', out_signature='') def toggle_ipython(self): - ''' shows/hides the ipython window ''' + """ + Show/hide the ipython window + """ win = gajim.ipython_window if win: if win.window.is_visible(): @@ -615,9 +656,10 @@ class SignalObject(dbus.service.Object): return False def _get_real_jid(self, jid, account = None): - '''get the real jid from the given one: removes xmpp: or get jid from nick - if account is specified, search only in this account - ''' + """ + Get the real jid from the given one: removes xmpp: or get jid from nick if + account is specified, search only in this account + """ if account: accounts = [account] else: @@ -643,7 +685,9 @@ class SignalObject(dbus.service.Object): return jid def _contacts_as_dbus_structure(self, contacts): - ''' get info from list of Contact objects and create dbus dict ''' + """ + Get info from list of Contact objects and create dbus dict + """ if not contacts: return None prim_contact = None # primary contact diff --git a/src/roster_window.py b/src/roster_window.py index 344c4574a..7d84ace55 100644 --- a/src/roster_window.py +++ b/src/roster_window.py @@ -71,30 +71,31 @@ from common.pep import MOODS, ACTIVITIES #(icon, name, type, jid, account, editable, second pixbuf) ( -C_IMG, # image to show state (online, new message etc) -C_NAME, # cellrenderer text that holds contact nickame -C_TYPE, # account, group or contact? -C_JID, # the jid of the row -C_ACCOUNT, # cellrenderer text that holds account name -C_MOOD_PIXBUF, -C_ACTIVITY_PIXBUF, -C_TUNE_PIXBUF, -C_AVATAR_PIXBUF, # avatar_pixbuf -C_PADLOCK_PIXBUF, # use for account row only + C_IMG, # image to show state (online, new message etc) + C_NAME, # cellrenderer text that holds contact nickame + C_TYPE, # account, group or contact? + C_JID, # the jid of the row + C_ACCOUNT, # cellrenderer text that holds account name + C_MOOD_PIXBUF, + C_ACTIVITY_PIXBUF, + C_TUNE_PIXBUF, + C_AVATAR_PIXBUF, # avatar_pixbuf + C_PADLOCK_PIXBUF, # use for account row only ) = range(10) class RosterWindow: - '''Class for main window of the GTK+ interface''' + """ + Class for main window of the GTK+ interface + """ def _get_account_iter(self, name, model=None): - ''' - Return the gtk.TreeIter of the given account or None - if not found. + """ + Return the gtk.TreeIter of the given account or None if not found Keyword arguments: name -- the account name model -- the data model (default TreeFilterModel) - ''' + """ if not model: model = self.modelfilter if model is None: @@ -111,16 +112,15 @@ class RosterWindow: def _get_group_iter(self, name, account, account_iter=None, model=None): - ''' - Return the gtk.TreeIter of the given group or None if not found. + """ + Return the gtk.TreeIter of the given group or None if not found Keyword arguments: name -- the group name account -- the account name account_iter -- the iter of the account the model (default None) model -- the data model (default TreeFilterModel) - - ''' + """ if not model: model = self.modelfilter if not account_iter: @@ -136,14 +136,13 @@ class RosterWindow: def _get_self_contact_iter(self, account, model=None): - ''' Return the gtk.TreeIter of SelfContact or None if not found. + """ + Return the gtk.TreeIter of SelfContact or None if not found Keyword arguments: account -- the account of SelfContact model -- the data model (default TreeFilterModel) - - ''' - + """ if not model: model = self.modelfilter iterAcct = self._get_account_iter(account, model) @@ -161,15 +160,15 @@ class RosterWindow: def _get_contact_iter(self, jid, account, contact=None, model=None): - ''' Return a list of gtk.TreeIter of the given contact. + """ + Return a list of gtk.TreeIter of the given contact Keyword arguments: jid -- the jid without resource account -- the account contact -- the contact (default None) model -- the data model (default TreeFilterModel) - - ''' + """ if not model: model = self.modelfilter # when closing Gajim model can be none (async pbs?) @@ -227,23 +226,25 @@ class RosterWindow: def _iter_is_separator(self, model, titer): - ''' Return True if the given iter is a separator. + """ + Return True if the given iter is a separator Keyword arguments: model -- the data model iter -- the gtk.TreeIter to test - ''' + """ if model[titer][0] == 'SEPARATOR': return True return False def _iter_contact_rows(self, model=None): - '''Iterate over all contact rows in given model. + """ + Iterate over all contact rows in given model Keyword argument model -- the data model (default TreeFilterModel) - ''' + """ if not model: model = self.modelfilter account_iter = model.get_iter_root() @@ -264,10 +265,9 @@ class RosterWindow: ############################################################################# def add_account(self, account): - ''' - Add account to roster and draw it. Do nothing if it is - already in. - ''' + """ + Add account to roster and draw it. Do nothing if it is already in + """ if self._get_account_iter(account): # Will happen on reconnect or for merged accounts return @@ -300,9 +300,10 @@ class RosterWindow: def add_account_contacts(self, account): - '''Add all contacts and groups of the given account to roster, - draw them and account. - ''' + """ + Add all contacts and groups of the given account to roster, draw them and + account + """ self.starting = True jids = gajim.contacts.get_jid_list(account) @@ -324,11 +325,12 @@ class RosterWindow: def _add_entity(self, contact, account, groups=None, - big_brother_contact=None, big_brother_account=None): - '''Add the given contact to roster data model. + big_brother_contact=None, big_brother_account=None): + """ + Add the given contact to roster data model - Contact is added regardless if he is already in roster or not. - Return list of newly added iters. + Contact is added regardless if he is already in roster or not. Return + list of newly added iters. Keyword arguments: contact -- the contact to add @@ -338,7 +340,7 @@ class RosterWindow: Parameter ignored when big_brother_contact is specified. big_brother_contact -- if specified contact is added as child big_brother_contact. (default None) - ''' + """ added_iters = [] if big_brother_contact: # Add contact under big brother @@ -398,7 +400,8 @@ class RosterWindow: return added_iters def _remove_entity(self, contact, account, groups=None): - '''Remove the given contact from roster data model. + """ + Remove the given contact from roster data model Empty groups after contact removal are removed too. Return False if contact still has children and deletion was @@ -409,7 +412,7 @@ class RosterWindow: contact -- the contact to add account -- the contacts account groups -- list of groups to remove the contact from. - ''' + """ iters = self._get_contact_iter(contact.jid, account, contact, self.model) assert iters, '%s shall be removed but is not in roster' % contact.jid @@ -449,8 +452,8 @@ class RosterWindow: return True def _add_metacontact_family(self, family, account): - ''' - Add the give Metacontact family to roster data model. + """ + Add the give Metacontact family to roster data model Add Big Brother to his groups and all others under him. Return list of all added (contact, account) tuples with @@ -458,7 +461,7 @@ class RosterWindow: Keyword arguments: family -- the family, see Contacts.get_metacontacts_family() - ''' + """ nearby_family, big_brother_jid, big_brother_account = \ self._get_nearby_family_and_big_brother(family, account) @@ -496,12 +499,12 @@ class RosterWindow: return brothers def _remove_metacontact_family(self, family, account): - ''' - Remove the given Metacontact family from roster data model. + """ + Remove the given Metacontact family from roster data model See Contacts.get_metacontacts_family() and RosterWindow._remove_entity() - ''' + """ nearby_family = self._get_nearby_family_and_big_brother( family, account)[0] @@ -560,7 +563,9 @@ class RosterWindow: def _recalibrate_metacontact_family(self, family, account): - '''Regroup metacontact family if necessary.''' + """ + Regroup metacontact family if necessary + """ brothers = [] nearby_family, big_brother_jid, big_brother_account = \ @@ -608,10 +613,11 @@ class RosterWindow: return gajim.contacts.get_nearby_family_and_big_brother(family, account) def _add_self_contact(self, account): - '''Add account's SelfContact to roster and draw it and the account. + """ + Add account's SelfContact to roster and draw it and the account Return the SelfContact contact instance - ''' + """ jid = gajim.get_jid_from_account(account) contact = gajim.contacts.get_first_contact_from_jid(account, jid) @@ -633,7 +639,8 @@ class RosterWindow: self._recalibrate_metacontact_family(family, account) def add_contact(self, jid, account): - '''Add contact to roster and draw him. + """ + Add contact to roster and draw him Add contact to all its group and redraw the groups, the contact and the account. If it's a Metacontact, add and draw the whole family. @@ -645,8 +652,7 @@ class RosterWindow: Keyword arguments: jid -- the contact's jid or SelfJid to add SelfContact account -- the corresponding account. - - ''' + """ contact = gajim.contacts.get_contact_with_highest_priority(account, jid) if len(self._get_contact_iter(jid, account, contact, self.model)): # If contact already in roster, do nothing @@ -694,7 +700,8 @@ class RosterWindow: return contacts[0][0] # it's contact/big brother with highest priority def remove_contact(self, jid, account, force=False, backend=False): - '''Remove contact from roster. + """ + Remove contact from roster Remove contact from all its group. Remove empty groups or redraw otherwise. @@ -707,8 +714,7 @@ class RosterWindow: account -- the corresponding account. force -- remove contact even it has pending evens (Default False) backend -- also remove contact instance (Default False) - - ''' + """ contact = gajim.contacts.get_contact_with_highest_priority(account, jid) if not contact: return @@ -760,13 +766,14 @@ class RosterWindow: return True def rename_self_contact(self, old_jid, new_jid, account): - '''Rename the self_contact jid + """ + Rename the self_contact jid Keyword arguments: old_jid -- our old jid new_jid -- our new jid account -- the corresponding account. - ''' + """ gajim.contacts.change_contact_jid(old_jid, new_jid, account) self_iter = self._get_self_contact_iter(account, model=self.model) if not self_iter: @@ -775,9 +782,9 @@ class RosterWindow: self.draw_contact(new_jid, account) def add_groupchat(self, jid, account, status=''): - '''Add groupchat to roster and draw it. - Return the added contact instance. - ''' + """ + Add groupchat to roster and draw it. Return the added contact instance + """ contact = gajim.contacts.get_contact_with_highest_priority(account, jid) # Do not show gc if we are disconnected and minimize it if gajim.account_is_connected(account): @@ -816,7 +823,9 @@ class RosterWindow: def remove_groupchat(self, jid, account): - '''Remove groupchat from roster and redraw account and group.''' + """ + Remove groupchat from roster and redraw account and group + """ contact = gajim.contacts.get_contact_with_highest_priority(account, jid) if contact.is_groupchat(): if jid in gajim.interface.minimized_controls[account]: @@ -829,8 +838,9 @@ class RosterWindow: # FIXME: This function is yet unused! Port to new API def add_transport(self, jid, account): - '''Add transport to roster and draw it. - Return the added contact instance.''' + """ + Add transport to roster and draw it. Return the added contact instance + """ contact = gajim.contacts.get_contact_with_highest_priority(account, jid) if contact is None: #TRANSP @@ -842,57 +852,60 @@ class RosterWindow: return contact def remove_transport(self, jid, account): - '''Remove transport from roster and redraw account and group.''' + """ + Remove transport from roster and redraw account and group + """ self.remove_contact(jid, account, force=True, backend=True) return True - + def rename_group(self, old_name, new_name, account): """ - rename a roster group + Rename a roster group """ if old_name == new_name: return - + # Groups may not change name from or to a special groups for g in helpers.special_groups: if g in (new_name, old_name): return - + # update all contacts in the given group if self.regroup: accounts = gajim.connections.keys() else: accounts = [account,] - + for acc in accounts: changed_contacts = [] for jid in gajim.contacts.get_jid_list(acc): contact = gajim.contacts.get_first_contact_from_jid(acc, jid) if old_name not in contact.groups: continue - + self.remove_contact(jid, acc, force=True) - + contact.groups.remove(old_name) if new_name not in contact.groups: contact.groups.append(new_name) - - changed_contacts.append({'jid':jid, 'name':contact.name, + + changed_contacts.append({'jid':jid, 'name':contact.name, 'groups':contact.groups}) - - gajim.connections[acc].update_contacts(changed_contacts) - + + gajim.connections[acc].update_contacts(changed_contacts) + for c in changed_contacts: self.add_contact(c['jid'], acc) - + self._adjust_group_expand_collapse_state(new_name, acc) - + self.draw_group(old_name, acc) self.draw_group(new_name, acc) - + def add_contact_to_groups(self, jid, account, groups, update=True): - '''Add contact to given groups and redraw them. + """ + Add contact to given groups and redraw them Contact on server is updated too. When the contact has a family, the action will be performed for all members. @@ -902,8 +915,7 @@ class RosterWindow: account -- the corresponding account groups -- list of Groups to add the contact to. update -- update contact on the server - - ''' + """ self.remove_contact(jid, account, force=True) for contact in gajim.contacts.get_contacts(account, jid): for group in groups: @@ -920,7 +932,8 @@ class RosterWindow: self._adjust_group_expand_collapse_state(group, account) def remove_contact_from_groups(self, jid, account, groups, update=True): - '''Remove contact from given groups and redraw them. + """ + Remove contact from given groups and redraw them Contact on server is updated too. When the contact has a family, the action will be performed for all members. @@ -930,8 +943,7 @@ class RosterWindow: account -- the corresponding account groups -- list of Groups to remove the contact from update -- update contact on the server - - ''' + """ self.remove_contact(jid, account, force=True) for contact in gajim.contacts.get_contacts(account, jid): for group in groups: @@ -968,7 +980,7 @@ class RosterWindow: self._recalibrate_metacontact_family(family, account) self.draw_contact(jid, account) - #FIXME: integrate into add_contact() + # FIXME: integrate into add_contact() def add_to_not_in_the_roster(self, account, jid, nick='', resource=''): keyID = '' attached_keys = gajim.config.get_per('accounts', account, @@ -1075,7 +1087,9 @@ class RosterWindow: return False def draw_contact(self, jid, account, selected=False, focus=False): - '''draw the correct state image, name BUT not avatar''' + """ + Draw the correct state image, name BUT not avatar + """ # focus is about if the roster window has toplevel-focus or not # FIXME: We really need a custom cell_renderer @@ -1252,17 +1266,17 @@ class RosterWindow: return gajim.config.get('show_tunes_in_roster') else: return False - + def draw_all_pep_types(self, jid, account): for pep_type in self._pep_type_to_model_column: self.draw_pep(jid, account, pep_type) - + def draw_pep(self, jid, account, pep_type): if pep_type not in self._pep_type_to_model_column: return if not self._is_pep_shown_in_roster(pep_type): return - + model_column = self._pep_type_to_model_column[pep_type] iters = self._get_contact_iter(jid, account, model=self.model) if not iters: @@ -1298,9 +1312,10 @@ class RosterWindow: self.draw_avatar(jid, account) def adjust_and_draw_contact_context(self, jid, account): - '''Draw contact, account and groups of given jid - Show contact if it has pending events - ''' + """ + Draw contact, account and groups of given jid Show contact if it has + pending events + """ contact = gajim.contacts.get_first_contact_from_jid(account, jid) if not contact: # idle draw or just removed SelfContact @@ -1318,12 +1333,13 @@ class RosterWindow: self._adjust_group_expand_collapse_state(group, account) def _idle_draw_jids_of_account(self, jids, account): - '''Draw given contacts and their avatars in a lazy fashion. + """ + Draw given contacts and their avatars in a lazy fashion Keyword arguments: jids -- a list of jids to draw account -- the corresponding account - ''' + """ def _draw_all_contacts(jids, account): for jid in jids: family = gajim.contacts.get_metacontacts_family(account, jid) @@ -1342,7 +1358,9 @@ class RosterWindow: gobject.idle_add(task.next) def setup_and_draw_roster(self): - '''create new empty model and draw roster''' + """ + Create new empty model and draw roster + """ self.modelfilter = None # (icon, name, type, jid, account, editable, mood_pixbuf, # activity_pixbuf, tune_pixbuf avatar_pixbuf, padlock_pixbuf) @@ -1366,8 +1384,9 @@ class RosterWindow: def select_contact(self, jid, account): - '''Select contact in roster. If contact is hidden but has events, - show him.''' + """ + Select contact in roster. If contact is hidden but has events, show him + """ # Refiltering SHOULD NOT be needed: # When a contact gets a new event he will be redrawn and his # icon changes, so _visible_func WILL be called on him anyway @@ -1386,7 +1405,9 @@ class RosterWindow: def _adjust_account_expand_collapse_state(self, account): - '''Expand/collapse account row based on self.collapsed_rows''' + """ + Expand/collapse account row based on self.collapsed_rows + """ iterA = self._get_account_iter(account) if not iterA: # thank you modelfilter @@ -1400,7 +1421,9 @@ class RosterWindow: def _adjust_group_expand_collapse_state(self, group, account): - '''Expand/collapse group row based on self.collapsed_rows''' + """ + Expand/collapse group row based on self.collapsed_rows + """ iterG = self._get_group_iter(group, account) if not iterG: # Group not visible @@ -1427,7 +1450,9 @@ class RosterWindow: self.filtering = False def contact_has_pending_roster_events(self, contact, account): - '''Return True if the contact or one if it resources has pending events''' + """ + Return True if the contact or one if it resources has pending events + """ # jid has pending events if gajim.events.get_nb_roster_events(account, contact.jid) > 0: return True @@ -1452,7 +1477,9 @@ class RosterWindow: return True def _visible_func(self, model, titer): - '''Determine whether iter should be visible in the treeview''' + """ + Determine whether iter should be visible in the treeview + """ type_ = model[titer][C_TYPE] if not type_: return False @@ -1524,7 +1551,9 @@ class RosterWindow: return True def _compareIters(self, model, iter1, iter2, data=None): - '''Compare two iters to sort them''' + """ + Compare two iters to sort them + """ name1 = model[iter1][C_NAME] name2 = model[iter2][C_NAME] if not name1 or not name2: @@ -1632,8 +1661,10 @@ class RosterWindow: ################################################################################ def fire_up_unread_messages_events(self, account): - '''reads from db the unread messages, and fire them up, and - if we find very old unread messages, delete them from unread table''' + """ + Read from db the unread messages, and fire them up, and if we find very + old unread messages, delete them from unread table + """ results = gajim.logger.get_unread_msgs() for result in results: jid = result[4] @@ -1658,7 +1689,9 @@ class RosterWindow: gajim.logger.set_read_messages([result[0]]) def fill_contacts_and_groups_dicts(self, array, account): - '''fill gajim.contacts and gajim.groups''' + """ + Fill gajim.contacts and gajim.groups + """ # FIXME: This function needs to be splitted # Most of the logic SHOULD NOT be done at GUI level if account not in gajim.contacts.get_accounts(): @@ -1732,11 +1765,12 @@ class RosterWindow: return False def on_event_removed(self, event_list): - '''Remove contacts on last events removed. + """ + Remove contacts on last events removed - Only performed if removal was requested before but the contact - still had pending events - ''' + Only performed if removal was requested before but the contact still had + pending events + """ contact_list = ((event.jid.split('/')[0], event.account) for event in \ event_list) @@ -1752,7 +1786,9 @@ class RosterWindow: self.show_title() def open_event(self, account, jid, event): - '''If an event was handled, return True, else return False''' + """ + If an event was handled, return True, else return False + """ data = event.parameters ft = gajim.interface.instances['file_transfers'] event = gajim.events.get_first_event(account, jid, event.type_) @@ -1828,14 +1864,18 @@ class RosterWindow: def authorize(self, widget, jid, account): - '''Authorize a contact (by re-sending auth menuitem)''' + """ + Authorize a contact (by re-sending auth menuitem) + """ gajim.connections[account].send_authorization(jid) dialogs.InformationDialog(_('Authorization has been sent'), _('Now "%s" will know your status.') %jid) def req_sub(self, widget, jid, txt, account, groups=[], nickname=None, - auto_auth=False): - '''Request subscription to a contact''' + auto_auth=False): + """ + Request subscription to a contact + """ gajim.connections[account].request_subscription(jid, txt, nickname, groups, auto_auth, gajim.nicks[account]) contact = gajim.contacts.get_contact_with_highest_priority(account, jid) @@ -1862,7 +1902,9 @@ class RosterWindow: self.add_contact(jid, account) def revoke_auth(self, widget, jid, account): - '''Revoke a contact's authorization''' + """ + Revoke a contact's authorization + """ gajim.connections[account].refuse_authorization(jid) dialogs.InformationDialog(_('Authorization has been removed'), _('Now "%s" will always see you as offline.') %jid) @@ -1915,15 +1957,15 @@ class RosterWindow: connection.send_mood(mood, mood_text) else: connection.retract_mood() - + def delete_pep(self, jid, account): if jid == gajim.get_jid_from_account(account): gajim.connections[account].pep = {} self.draw_account(account) - + for contact in gajim.contacts.get_contacts(account, jid): contact.pep = {} - + self.draw_all_pep_types(jid, account) ctrl = gajim.interface.msg_win_mgr.get_control(jid, account) if ctrl: @@ -1969,7 +2011,9 @@ class RosterWindow: def chg_contact_status(self, contact, show, status, account): - '''When a contact changes his or her status''' + """ + When a contact changes his or her status + """ contact_instances = gajim.contacts.get_contacts(account, contact.jid) contact.show = show contact.status = status @@ -2027,7 +2071,9 @@ class RosterWindow: def on_status_changed(self, account, show): - '''the core tells us that our status has changed''' + """ + The core tells us that our status has changed + """ if account not in gajim.contacts.get_accounts(): return child_iterA = self._get_account_iter(account, self.model) @@ -2062,13 +2108,15 @@ class RosterWindow: self.update_status_combobox() def get_status_message(self, show, on_response, show_pep=True, - always_ask=False): - ''' get the status message by: + always_ask=False): + """ + Get the status message by: + 1/ looking in default status message 2/ asking to user if needed depending on ask_on(ff)line_status and always_ask show_pep can be False to hide pep things from status message or True - ''' + """ empty_pep = {'activity': '', 'subactivity': '', 'activity_text': '', 'mood': '', 'mood_text': ''} if show in gajim.config.get_per('defaultstatusmsg'): @@ -2150,7 +2198,9 @@ class RosterWindow: gajim.config.get('roster_height')) def close_all_from_dict(self, dic): - '''close all the windows in the given dictionary''' + """ + Close all the windows in the given dictionary + """ for w in dic.values(): if isinstance(w, dict): self.close_all_from_dict(w) @@ -2158,9 +2208,10 @@ class RosterWindow: w.window.destroy() def close_all(self, account, force=False): - '''close all the windows from an account - if force is True, do not ask confirmation before closing chat/gc windows - ''' + """ + Close all the windows from an account. If force is True, do not ask + confirmation before closing chat/gc windows + """ if account in gajim.interface.instances: self.close_all_from_dict(gajim.interface.instances[account]) for ctrl in gajim.interface.msg_win_mgr.get_controls(acct=account): @@ -2168,7 +2219,9 @@ class RosterWindow: force = force) def on_roster_window_delete_event(self, widget, event): - '''Main window X button was clicked''' + """ + Main window X button was clicked + """ if gajim.interface.systray_enabled and not gajim.config.get( 'quit_on_roster_x_button') and gajim.config.get('trayicon') != 'on_event': self.tooltip.hide_tooltip() @@ -2218,14 +2271,18 @@ class RosterWindow: gajim.interface.hide_systray() def quit_gtkgui_interface(self): - '''When we quit the gtk interface : exit gtk''' + """ + When we quit the gtk interface - exit gtk + """ self.prepare_quit() gtk.main_quit() def on_quit_request(self, widget=None): - ''' user want to quit. Check if he should be warned about messages - pending. Terminate all sessions and send offline to all connected - account. We do NOT really quit gajim here ''' + """ + User wants to quit. Check if he should be warned about messages pending. + Terminate all sessions and send offline to all connected account. We do + NOT really quit gajim here + """ accounts = gajim.connections.keys() get_msg = False for acct in accounts: @@ -2345,7 +2402,9 @@ class RosterWindow: helpers.exec_command('%s history_manager.py' % sys.executable) def on_info(self, widget, contact, account): - '''Call vcard_information_window class to display contact's information''' + """ + Call vcard_information_window class to display contact's information + """ if gajim.connections[account].is_zeroconf: self.on_info_zeroconf(widget, contact, account) return @@ -2474,16 +2533,22 @@ class RosterWindow: self.show_tooltip, contacts) def on_agent_logging(self, widget, jid, state, account): - '''When an agent is requested to log in or off''' + """ + When an agent is requested to log in or off + """ gajim.connections[account].send_agent_status(jid, state) def on_edit_agent(self, widget, contact, account): - '''When we want to modify the agent registration''' + """ + When we want to modify the agent registration + """ gajim.connections[account].request_register_agent_info(contact.jid) def on_remove_agent(self, widget, list_): - '''When an agent is requested to be removed. list_ is a list of - (contact, account) tuple''' + """ + When an agent is requested to be removed. list_ is a list of (contact, + account) tuple + """ for (contact, account) in list_: if gajim.config.get_per('accounts', account, 'hostname') == \ contact.jid: @@ -2527,8 +2592,10 @@ class RosterWindow: on_response_ok = (remove, list_)) def on_block(self, widget, list_, group=None): - ''' When clicked on the 'block' button in context menu. - list_ is a list of (contact, account)''' + """ + When clicked on the 'block' button in context menu. list_ is a list of + (contact, account) + """ def on_continue(msg, pep_dict): if msg is None: # user pressed Cancel to change status message dialog @@ -2591,7 +2658,9 @@ class RosterWindow: _('Do _not ask me again'), on_response_ok=_block_it) def on_unblock(self, widget, list_, group=None): - ''' When clicked on the 'unblock' button in context menu. ''' + """ + When clicked on the 'unblock' button in context menu. + """ accounts = [] if group is None: for (contact, account) in list_: @@ -2808,7 +2877,9 @@ class RosterWindow: dialogs.EditGroupsDialog(list_) def on_history(self, widget, contact, account): - '''When history menuitem is activated: call log window''' + """ + When history menuitem is activated: call log window + """ if 'logs' in gajim.interface.instances: gajim.interface.instances['logs'].window.present() gajim.interface.instances['logs'].open_history(contact.jid, account) @@ -2817,7 +2888,9 @@ class RosterWindow: HistoryWindow(contact.jid, account) def on_disconnect(self, widget, jid, account): - '''When disconnect menuitem is activated: disconect from room''' + """ + When disconnect menuitem is activated: disconect from room + """ if jid in gajim.interface.minimized_controls[account]: ctrl = gajim.interface.minimized_controls[account][jid] ctrl.shutdown() @@ -2825,7 +2898,9 @@ class RosterWindow: self.remove_groupchat(jid, account) def on_reconnect(self, widget, jid, account): - '''When disconnect menuitem is activated: disconect from room''' + """ + When disconnect menuitem is activated: disconect from room + """ if jid in gajim.interface.minimized_controls[account]: ctrl = gajim.interface.minimized_controls[account][jid] gajim.interface.join_gc_room(account, jid, ctrl.nick, @@ -2852,8 +2927,9 @@ class RosterWindow: dialogs.AddSpecialNotificationDialog(jid) def on_invite_to_new_room(self, widget, list_, resource=None): - ''' resource parameter MUST NOT be used if more than one contact in - list ''' + """ + Resource parameter MUST NOT be used if more than one contact in list + """ account_list = [] jid_list = [] for (contact, account) in list_: @@ -2882,9 +2958,10 @@ class RosterWindow: break def on_invite_to_room(self, widget, list_, room_jid, room_account, - resource=None): - ''' resource parameter MUST NOT be used if more than one contact in - list ''' + resource=None): + """ + Resource parameter MUST NOT be used if more than one contact in list + """ for e in list_: contact = e[0] contact_jid = contact.jid @@ -2897,7 +2974,9 @@ class RosterWindow: self.on_groupchat_maximized(widget, contact.jid, account) def on_groupchat_maximized(self, widget, jid, account): - '''When a groupchat is maximised''' + """ + When a groupchat is maximized + """ if not jid in gajim.interface.minimized_controls[account]: # Already opened? gc_control = gajim.interface.msg_win_mgr.get_gc_control(jid, account) @@ -2953,7 +3032,9 @@ class RosterWindow: self.tooltip.hide_tooltip() def on_roster_treeview_key_press_event(self, widget, event): - '''when a key is pressed in the treeviews''' + """ + When a key is pressed in the treeviews + """ self.tooltip.hide_tooltip() if event.keyval == gtk.keysyms.Escape: self.tree.get_selection().unselect_all() @@ -3100,7 +3181,9 @@ class RosterWindow: self.tree.expand_row(path, False) def on_req_usub(self, widget, list_): - '''Remove a contact. list_ is a list of (contact, account) tuples''' + """ + Remove a contact. list_ is a list of (contact, account) tuples + """ def on_ok(is_checked, list_): remove_auth = True if len(list_) == 1: @@ -3159,7 +3242,9 @@ class RosterWindow: on_response_ok = (on_ok2, list_)) def on_send_custom_status(self, widget, contact_list, show, group=None): - '''send custom status''' + """ + Send custom status + """ # contact_list has only one element except if group != None def on_response(message, pep_dict): if message is None: # None if user pressed Cancel @@ -3216,7 +3301,9 @@ class RosterWindow: _('Do _not ask me again'), on_response_ok=send_it) def on_status_combobox_changed(self, widget): - '''When we change our status via the combobox''' + """ + When we change our status via the combobox + """ model = self.status_combobox.get_model() active = self.status_combobox.get_active() if active == -1: # no active item @@ -3346,7 +3433,9 @@ class RosterWindow: dialogs.AddNewContactWindow(account) def on_join_gc_activate(self, widget, account): - '''when the join gc menuitem is clicked, show the join gc window''' + """ + When the join gc menuitem is clicked, show the join gc window + """ invisible_show = gajim.SHOW_LIST.index('invisible') if gajim.connections[account].connected == invisible_show: dialogs.ErrorDialog(_('You cannot join a group chat while you are ' @@ -3478,8 +3567,10 @@ class RosterWindow: self.show_treeview_menu(event) def on_row_activated(self, widget, path): - '''When an iter is activated (double-click or single click if gnome is - set this way)''' + """ + When an iter is activated (double-click or single click if gnome is set + this way) + """ model = self.modelfilter account = model[path][C_ACCOUNT].decode('utf-8') type_ = model[path][C_TYPE] @@ -3543,12 +3634,16 @@ class RosterWindow: resource=resource, session=session) def on_roster_treeview_row_activated(self, widget, path, col=0): - '''When an iter is double clicked: open the first event window''' + """ + When an iter is double clicked: open the first event window + """ if not gajim.single_click: self.on_row_activated(widget, path) def on_roster_treeview_row_expanded(self, widget, titer, path): - '''When a row is expanded change the icon of the arrow''' + """ + When a row is expanded change the icon of the arrow + """ self._toggeling_row = True model = widget.get_model() child_model = model.get_model() @@ -3608,7 +3703,9 @@ class RosterWindow: self._toggeling_row = False def on_roster_treeview_row_collapsed(self, widget, titer, path): - '''When a row is collapsed change the icon of the arrow''' + """ + When a row is collapsed change the icon of the arrow + """ self._toggeling_row = True model = widget.get_model() child_model = model.get_model() @@ -3652,10 +3749,11 @@ class RosterWindow: self._toggeling_row = False def on_modelfilter_row_has_child_toggled(self, model, path, titer): - '''Called when a row has gotten the first or lost its last child row. + """ + Called when a row has gotten the first or lost its last child row Expand Parent if necessary. - ''' + """ if self._toggeling_row: # Signal is emitted when we write to our model return @@ -3724,8 +3822,9 @@ class RosterWindow: pass def on_show_offline_contacts_menuitem_activate(self, widget): - '''when show offline option is changed: - redraw the treeview''' + """ + When show offline option is changed: redraw the treeview + """ gajim.config.set('showoffline', not gajim.config.get('showoffline')) self.refilter_shown_roster_items() w = self.xml.get_widget('show_only_active_contacts_menuitem') @@ -3738,8 +3837,9 @@ class RosterWindow: w.set_sensitive(True) def on_show_only_active_contacts_menuitem_activate(self, widget): - '''when show only active contact option is changed: - redraw the treeview''' + """ + When show only active contact option is changed: redraw the treeview + """ gajim.config.set('show_only_chat_and_online', not gajim.config.get( 'show_only_chat_and_online')) self.refilter_shown_roster_items() @@ -4148,10 +4248,12 @@ class RosterWindow: ################################################################################ def get_appropriate_state_images(self, jid, size='16', icon_name='online'): - '''check jid and return the appropriate state images dict for - the demanded size. icon_name is taken into account when jid is from - transport: transport iconset doesn't contain all icons, so we fall back - to jabber one''' + """ + Check jid and return the appropriate state images dict for the demanded + size. icon_name is taken into account when jid is from transport: + transport iconset doesn't contain all icons, so we fall back to jabber + one + """ transport = gajim.get_transport_name_from_jid(jid) if transport and size in self.transports_state_images: if transport not in self.transports_state_images[size]: @@ -4163,7 +4265,9 @@ class RosterWindow: return gajim.interface.jabber_state_images[size] def make_transport_state_images(self, transport): - '''initialise opened and closed 'transport' iconset dict''' + """ + Initialize opened and closed 'transport' iconset dict + """ if gajim.config.get('use_transports_iconsets'): folder = os.path.join(helpers.get_transport_path(transport), '16x16') @@ -4260,7 +4364,9 @@ class RosterWindow: win.repaint_themed_widgets() def repaint_themed_widgets(self): - '''Notify windows that contain themed widgets to repaint them''' + """ + Notify windows that contain themed widgets to repaint them + """ for win in gajim.interface.msg_win_mgr.windows(): win.repaint_themed_widgets() for account in gajim.connections: @@ -4279,13 +4385,17 @@ class RosterWindow: ctrl.show_avatar() def on_roster_treeview_style_set(self, treeview, style): - '''When style (theme) changes, redraw all contacts''' + """ + When style (theme) changes, redraw all contacts + """ for contact in self._iter_contact_rows(): self.draw_contact(contact[C_JID].decode('utf-8'), contact[C_ACCOUNT].decode('utf-8')) def set_renderer_color(self, renderer, style, set_background=True): - '''set style for treeview cell, using PRELIGHT system color''' + """ + Set style for treeview cell, using PRELIGHT system color + """ if set_background: bgcolor = self.tree.style.bg[style] renderer.set_property('cell-background-gdk', bgcolor) @@ -4294,7 +4404,9 @@ class RosterWindow: renderer.set_property('foreground-gdk', fgcolor) def _iconCellDataFunc(self, column, renderer, model, titer, data=None): - '''When a row is added, set properties for icon renderer''' + """ + When a row is added, set properties for icon renderer + """ theme = gajim.config.get('roster_theme') type_ = model[titer][C_TYPE] if type_ == 'account': @@ -4337,7 +4449,9 @@ class RosterWindow: renderer.set_property('width', 26) def _nameCellDataFunc(self, column, renderer, model, titer, data=None): - '''When a row is added, set properties for name renderer''' + """ + When a row is added, set properties for name renderer + """ theme = gajim.config.get('roster_theme') type_ = model[titer][C_TYPE] if type_ == 'account': @@ -4409,9 +4523,11 @@ class RosterWindow: renderer.set_property('xpad', 8) - def _fill_pep_pixbuf_renderer(self, column, renderer, model, titer, - data=None): - '''When a row is added, draw the respective pep icon''' + def _fill_pep_pixbuf_renderer(self, column, renderer, model, titer, + data=None): + """ + When a row is added, draw the respective pep icon + """ theme = gajim.config.get('roster_theme') type_ = model[titer][C_TYPE] if type_ == 'group': @@ -4450,9 +4566,11 @@ class RosterWindow: # align pixbuf to the right renderer.set_property('xalign', 1) - def _fill_avatar_pixbuf_renderer(self, column, renderer, model, titer, - data = None): - '''When a row is added, set properties for avatar renderer''' + def _fill_avatar_pixbuf_renderer(self, column, renderer, model, titer, data + = None): + """ + When a row is added, set properties for avatar renderer + """ theme = gajim.config.get('roster_theme') type_ = model[titer][C_TYPE] if type_ in ('group', 'account'): @@ -4489,9 +4607,11 @@ class RosterWindow: else: renderer.set_property('xalign', 1) # align pixbuf to the right - def _fill_padlock_pixbuf_renderer(self, column, renderer, model, titer, - data = None): - '''When a row is added, set properties for padlock renderer''' + def _fill_padlock_pixbuf_renderer(self, column, renderer, model, titer, data + = None): + """ + When a row is added, set properties for padlock renderer + """ theme = gajim.config.get('roster_theme') type_ = model[titer][C_TYPE] # allocate space for the icon only if needed @@ -4512,7 +4632,9 @@ class RosterWindow: ################################################################################ def make_menu(self, force=False): - '''create the main window\'s menus''' + """ + Create the main window's menus + """ if not force and not self.actions_menu_needs_rebuild: return new_chat_menuitem = self.xml.get_widget('new_chat_menuitem') @@ -4963,7 +5085,9 @@ class RosterWindow: return account_context_menu def make_account_menu(self, event, titer): - '''Make account's popup menu''' + """ + Make account's popup menu + """ model = self.modelfilter account = model[titer][C_ACCOUNT].decode('utf-8') @@ -4995,7 +5119,9 @@ class RosterWindow: menu.popup(None, None, None, event_button, event.time) def make_group_menu(self, event, titer): - '''Make group's popup menu''' + """ + Make group's popup menu + """ model = self.modelfilter path = model.get_path(titer) group = model[titer][C_JID].decode('utf-8') @@ -5152,7 +5278,9 @@ class RosterWindow: menu.popup(None, None, None, event_button, event.time) def make_contact_menu(self, event, titer): - '''Make contact\'s popup menu''' + """ + Make contact's popup menu + """ model = self.modelfilter jid = model[titer][C_JID].decode('utf-8') tree_path = model.get_path(titer) @@ -5164,7 +5292,9 @@ class RosterWindow: menu.popup(None, None, None, event_button, event.time) def make_multiple_contact_menu(self, event, iters): - '''Make group's popup menu''' + """ + Make group's popup menu + """ model = self.modelfilter list_ = [] # list of (jid, account) tuples one_account_offline = False @@ -5264,7 +5394,9 @@ class RosterWindow: menu.popup(None, None, None, event_button, event.time) def make_transport_menu(self, event, titer): - '''Make transport\'s popup menu''' + """ + Make transport's popup menu + """ model = self.modelfilter jid = model[titer][C_JID].decode('utf-8') path = model.get_path(titer) @@ -5451,7 +5583,9 @@ class RosterWindow: menu.popup(None, None, None, event_button, event.time) def get_and_connect_advanced_menuitem_menu(self, account): - '''adds FOR ACCOUNT options''' + """ + Add FOR ACCOUNT options + """ xml = gtkgui_helpers.get_glade('advanced_menuitem_menu.glade') advanced_menuitem_menu = xml.get_widget('advanced_menuitem_menu') @@ -5498,8 +5632,9 @@ class RosterWindow: return advanced_menuitem_menu def add_history_manager_menuitem(self, menu): - '''adds a seperator and History Manager menuitem BELOW for account - menuitems''' + """ + Add a seperator and History Manager menuitem BELOW for account menuitems + """ item = gtk.SeparatorMenuItem() # separator menu.append(item) @@ -5512,7 +5647,9 @@ class RosterWindow: item.connect('activate', self.on_history_manager_menuitem_activate) def add_bookmarks_list(self, gc_sub_menu, account): - '''Show join new group chat item and bookmarks list for an account''' + """ + Show join new group chat item and bookmarks list for an account + """ item = gtk.ImageMenuItem(_('_Join New Group Chat')) icon = gtk.image_new_from_stock(gtk.STOCK_NEW, gtk.ICON_SIZE_MENU) item.set_image(icon) @@ -5756,7 +5893,7 @@ class RosterWindow: col.add_attribute(render_pixbuf, 'pixbuf', C_TUNE_PIXBUF) col.set_cell_data_func(render_pixbuf, self._fill_pep_pixbuf_renderer, C_TUNE_PIXBUF) - + self._pep_type_to_model_column = {'mood': C_MOOD_PIXBUF, 'activity': C_ACTIVITY_PIXBUF, 'tune': C_TUNE_PIXBUF} diff --git a/src/search_window.py b/src/search_window.py index 3a21db543..bce009207 100644 --- a/src/search_window.py +++ b/src/search_window.py @@ -32,8 +32,9 @@ import dataforms_widget class SearchWindow: def __init__(self, account, jid): - '''Create new window.''' - + """ + Create new window + """ # an account object self.account = account self.jid = jid @@ -231,5 +232,4 @@ class SearchWindow: self.window.set_title('%s - Search - Gajim' % \ self.data_form_widget.title) - # vim: se ts=3: diff --git a/src/session.py b/src/session.py index 04f9241eb..1725cc593 100644 --- a/src/session.py +++ b/src/session.py @@ -57,7 +57,9 @@ class ChatControlSession(stanza_session.EncryptedStanzaSession): self.detach_from_control() def get_chatstate(self, msg, msgtxt): - '''extracts chatstate from a stanza''' + """ + Extract chatstate from a stanza + """ composing_xep = None chatstate = None @@ -83,7 +85,9 @@ class ChatControlSession(stanza_session.EncryptedStanzaSession): return (composing_xep, chatstate) def received(self, full_jid_with_resource, msgtxt, tim, encrypted, msg): - '''dispatch a received stanza''' + """ + Dispatch a received stanza + """ msg_type = msg.getType() subject = msg.getSubject() resource = gajim.get_resource_from_jid(full_jid_with_resource) @@ -265,9 +269,11 @@ class ChatControlSession(stanza_session.EncryptedStanzaSession): chatstate, msg_id, composing_xep, user_nick, xhtml, form_node])) def roster_message(self, jid, msg, tim, encrypted=False, msg_type='', - subject=None, resource='', msg_id=None, user_nick='', - advanced_notif_num=None, xhtml=None, form_node=None): - '''display the message or show notification in the roster''' + subject=None, resource='', msg_id=None, user_nick='', + advanced_notif_num=None, xhtml=None, form_node=None): + """ + Display the message or show notification in the roster + """ contact = None # if chat window will be for specific resource resource_for_chat = resource diff --git a/src/statusicon.py b/src/statusicon.py index e28b67cfd..556fb9fa1 100644 --- a/src/statusicon.py +++ b/src/statusicon.py @@ -39,7 +39,10 @@ from common import helpers from common import pep class StatusIcon: - '''Class for the notification area icon''' + """ + Class for the notification area icon + """ + def __init__(self): self.single_message_handler_id = None self.new_chat_handler_id = None @@ -54,22 +57,30 @@ class StatusIcon: self.tooltip = tooltips.NotificationAreaTooltip() def subscribe_events(self): - '''Register listeners to the events class''' + """ + Register listeners to the events class + """ gajim.events.event_added_subscribe(self.on_event_added) gajim.events.event_removed_subscribe(self.on_event_removed) def unsubscribe_events(self): - '''Unregister listeners to the events class''' + """ + Unregister listeners to the events class + """ gajim.events.event_added_unsubscribe(self.on_event_added) gajim.events.event_removed_unsubscribe(self.on_event_removed) def on_event_added(self, event): - '''Called when an event is added to the event list''' + """ + Called when an event is added to the event list + """ if event.show_in_systray: self.set_img() def on_event_removed(self, event_list): - '''Called when one or more events are removed from the event list''' + """ + Called when one or more events are removed from the event list + """ self.set_img() def show_icon(self): @@ -102,7 +113,9 @@ class StatusIcon: self.on_left_click() def set_img(self): - '''apart from image, we also update tooltip text here''' + """ + Apart from image, we also update tooltip text here + """ if not gajim.interface.systray_enabled: return if gajim.events.get_nb_systray_events(): @@ -122,7 +135,9 @@ class StatusIcon: # self.img_tray.set_from_animation(image.get_animation()) def change_status(self, global_status): - ''' set tray image to 'global_status' ''' + """ + Set tray image to 'global_status' + """ # change image and status, only if it is different if global_status is not None and self.status != global_status: self.status = global_status @@ -145,7 +160,9 @@ class StatusIcon: dialogs.NewChatDialog(account) def make_menu(self, event_button, event_time): - '''create chat with and new message (sub) menus/menuitems''' + """ + Create chat with and new message (sub) menus/menuitems + """ for m in self.popup_menus: m.destroy() @@ -366,8 +383,10 @@ class StatusIcon: gajim.interface.handle_event(account, jid, event.type_) def on_middle_click(self): - '''middle click raises window to have complete focus (fe. get kbd events) - but if already raised, it hides it''' + """ + Middle click raises window to have complete focus (fe. get kbd events) + but if already raised, it hides it + """ win = gajim.interface.roster.window if win.is_active(): # is it fully raised? (eg does it receive kbd events?) win.hide() diff --git a/src/tooltips.py b/src/tooltips.py index 5e55166c0..22f16874e 100644 --- a/src/tooltips.py +++ b/src/tooltips.py @@ -41,7 +41,9 @@ from common import helpers from common.pep import MOODS, ACTIVITIES class BaseTooltip: - ''' Base Tooltip class; + """ + Base Tooltip class + Usage: tooltip = BaseTooltip() .... @@ -57,7 +59,8 @@ class BaseTooltip: Tooltip is displayed aligned centered to the mouse poiner and 4px below the widget. In case tooltip goes below the visible area it is shown above the widget. - ''' + """ + def __init__(self): self.timeout = 0 self.preferred_position = [0, 0] @@ -65,14 +68,17 @@ class BaseTooltip: self.id = None def populate(self, data): - ''' this method must be overriden by all extenders - This is the most simple implementation: show data as value of a label - ''' + """ + This method must be overriden by all extenders. This is the most simple + implementation: show data as value of a label + """ self.create_window() self.win.add(gtk.Label(data)) def create_window(self): - ''' create a popup window each time tooltip is requested ''' + """ + Create a popup window each time tooltip is requested + """ self.win = gtk.Window(gtk.WINDOW_POPUP) self.win.set_border_width(3) self.win.set_resizable(False) @@ -86,10 +92,12 @@ class BaseTooltip: self.screen = self.win.get_screen() def _get_icon_name_for_tooltip(self, contact): - ''' helper function used for tooltip contacts/acounts + """ + Helper function used for tooltip contacts/acounts + Tooltip on account has fake contact with sub == '', in this case we show real status of the account - ''' + """ if contact.ask == 'subscribe': return 'requested' elif contact.sub in ('both', 'to', ''): @@ -133,11 +141,13 @@ class BaseTooltip: return True def show_tooltip(self, data, widget_height, widget_y_position): - ''' show tooltip on widget. - data contains needed data for tooltip contents - widget_height is the height of the widget on which we show the tooltip - widget_y_position is vertical position of the widget on the screen - ''' + """ + Show tooltip on widget + + Data contains needed data for tooltip contents. + widget_height is the height of the widget on which we show the tooltip. + widget_y_position is vertical position of the widget on the screen. + """ # set tooltip contents self.populate(data) @@ -163,8 +173,11 @@ class BaseTooltip: self.id = None class StatusTable: - ''' Contains methods for creating status table. This - is used in Roster and NotificationArea tooltips ''' + """ + Contains methods for creating status table. This is used in Roster and + NotificationArea tooltips + """ + def __init__(self): self.current_row = 1 self.table = None @@ -201,8 +214,10 @@ class StatusTable: return str_status def add_status_row(self, file_path, show, str_status, status_time=None, - show_lock=False, indent=True): - ''' appends a new row with status icon to the table ''' + show_lock=False, indent=True): + """ + Append a new row with status icon to the table + """ self.current_row += 1 state_file = show.replace(' ', '_') files = [] @@ -235,7 +250,10 @@ class StatusTable: self.current_row + 1, 0, 0, 0, 0) class NotificationAreaTooltip(BaseTooltip, StatusTable): - ''' Tooltip that is shown in the notification area ''' + """ + Tooltip that is shown in the notification area + """ + def __init__(self): BaseTooltip.__init__(self) StatusTable.__init__(self) @@ -283,7 +301,10 @@ class NotificationAreaTooltip(BaseTooltip, StatusTable): self.hbox.show_all() class GCTooltip(BaseTooltip): - ''' Tooltip that is shown in the GC treeview ''' + """ + Tooltip that is shown in the GC treeview + """ + def __init__(self): self.account = None self.text_label = gtk.Label() @@ -378,7 +399,10 @@ class GCTooltip(BaseTooltip): self.win.add(vcard_table) class RosterTooltip(NotificationAreaTooltip): - ''' Tooltip that is shown in the roster treeview ''' + """ + Tooltip that is shown in the roster treeview + """ + def __init__(self): self.account = None self.image = gtk.Image() @@ -561,7 +585,7 @@ class RosterTooltip(NotificationAreaTooltip): vcard_current_row + 1, gtk.EXPAND | gtk.FILL, vertical_fill, 0, 0) else: - if isinstance(property_[0], (unicode, str)): #FIXME: rm unicode? + if isinstance(property_[0], (unicode, str)): # FIXME: rm unicode? label.set_markup(property_[0]) label.set_line_wrap(True) else: @@ -575,10 +599,10 @@ class RosterTooltip(NotificationAreaTooltip): self.win.add(vcard_table) def _append_pep_info(self, contact, properties): - ''' + """ Append Tune, Mood, Activity information of the specified contact to the given property list. - ''' + """ if 'mood' in contact.pep: mood = contact.pep['mood'].asMarkupText() mood_string = _('Mood:') + ' %s' % mood @@ -586,7 +610,7 @@ class RosterTooltip(NotificationAreaTooltip): if 'activity' in contact.pep: activity = contact.pep['activity'].asMarkupText() - activity_string = _('Activity:') + ' %s' % activity + activity_string = _('Activity:') + ' %s' % activity properties.append((activity_string, None)) if 'tune' in contact.pep: @@ -596,7 +620,10 @@ class RosterTooltip(NotificationAreaTooltip): class FileTransfersTooltip(BaseTooltip): - ''' Tooltip that is shown in the notification area ''' + """ + Tooltip that is shown in the notification area + """ + def __init__(self): BaseTooltip.__init__(self) @@ -680,7 +707,9 @@ class FileTransfersTooltip(BaseTooltip): class ServiceDiscoveryTooltip(BaseTooltip): - ''' Tooltip that is shown when hovering over a service discovery row ''' + """ + Tooltip that is shown when hovering over a service discovery row + """ def populate(self, status): self.create_window() label = gtk.Label() diff --git a/src/vcard.py b/src/vcard.py index 5ee86044b..88fd6acc8 100644 --- a/src/vcard.py +++ b/src/vcard.py @@ -45,8 +45,11 @@ from common import gajim from common.i18n import Q_ def get_avatar_pixbuf_encoded_mime(photo): - '''return the pixbuf of the image - photo is a dictionary containing PHOTO information''' + """ + Return the pixbuf of the image + + Photo is a dictionary containing PHOTO information. + """ if not isinstance(photo, dict): return None, None, None img_decoded = None @@ -71,7 +74,9 @@ def get_avatar_pixbuf_encoded_mime(photo): return pixbuf, avatar_encoded, avatar_mime_type class VcardWindow: - '''Class for contact's information window''' + """ + Class for contact's information window + """ def __init__(self, contact, account, gc_contact = None): # the contact variable is the jid if vcard is true @@ -151,7 +156,9 @@ class VcardWindow: self.window.destroy() def on_PHOTO_eventbox_button_press_event(self, widget, event): - '''If right-clicked, show popup''' + """ + If right-clicked, show popup + """ if event.button == 3: # right click menu = gtk.Menu() menuitem = gtk.ImageMenuItem(gtk.STOCK_SAVE_AS) @@ -465,7 +472,9 @@ class ZeroconfVcardWindow: self.window.destroy() def on_PHOTO_eventbox_button_press_event(self, widget, event): - '''If right-clicked, show popup''' + """ + If right-clicked, show popup + """ if event.button == 3: # right click menu = gtk.Menu() menuitem = gtk.ImageMenuItem(gtk.STOCK_SAVE_AS) From a9a442c01cddc4b0c4b5fe53810f23bd3ae64936 Mon Sep 17 00:00:00 2001 From: Yann Leboulanger Date: Wed, 25 Nov 2009 22:21:03 +0100 Subject: [PATCH 073/259] merge translations from 0.13 branch to default branch --- po/be.po | 3762 ++++++++++++++++---------------- po/be@latin.po | 3759 ++++++++++++++++---------------- po/bg.po | 3847 +++++++++++++++++---------------- po/br.po | 3738 ++++++++++++++++---------------- po/cs.po | 3841 +++++++++++++++++---------------- po/da.po | 4448 +++++++++++++++++++------------------- po/de.po | 4060 ++++++++++++++++++----------------- po/el.po | 3753 ++++++++++++++++---------------- po/en_GB.po | 4370 ++++++++++++++++++------------------- po/eo.po | 3755 ++++++++++++++++---------------- po/es.po | 4188 ++++++++++++++++++------------------ po/eu.po | 3785 +++++++++++++++++---------------- po/fr.po | 4279 +++++++++++++++++++------------------ po/gl.po | 3757 ++++++++++++++++---------------- po/hr.po | 4272 +++++++++++++++++++------------------ po/it.po | 3799 +++++++++++++++++---------------- po/lt.po | 5557 ++++++++++++++++++++++-------------------------- po/nb.po | 4290 ++++++++++++++++++------------------- po/nl.po | 3751 ++++++++++++++++---------------- po/no.po | 4290 ++++++++++++++++++------------------- po/pl.po | 3850 +++++++++++++++++---------------- po/pt.po | 3751 ++++++++++++++++---------------- po/pt_BR.po | 4161 ++++++++++++++++++------------------ po/ru.po | 4077 ++++++++++++++++++----------------- po/sk.po | 3819 +++++++++++++++++---------------- po/sr.po | 4253 ++++++++++++++++++------------------ po/sr@Latn.po | 4263 +++++++++++++++++++------------------ po/sv.po | 4015 +++++++++++++++++----------------- po/uk.po | 3979 +++++++++++++++++----------------- po/zh_CN.po | 3737 ++++++++++++++++---------------- 30 files changed, 61261 insertions(+), 59945 deletions(-) diff --git a/po/be.po b/po/be.po index 417baf264..32c05edaf 100644 --- a/po/be.po +++ b/po/be.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: 0.10.1\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2009-10-28 22:17+0100\n" +"POT-Creation-Date: 2009-11-25 22:20+0100\n" "PO-Revision-Date: 2009-08-19 23:42+0200\n" "Last-Translator: Ihar Hrachyshka \n" "Language-Team: Belarusian \n" @@ -288,9 +288,9 @@ msgstr "Змяніць асабістыя звесткі..." #. No configured account #: ../data/glade/account_modification_window.glade.h:16 #: ../data/glade/accounts_window.glade.h:21 -#: ../data/glade/roster_window.glade.h:5 ../src/common/helpers.py:1217 -#: ../src/common/helpers.py:1229 ../src/notify.py:547 ../src/notify.py:568 -#: ../src/notify.py:607 ../src/notify.py:619 +#: ../data/glade/roster_window.glade.h:5 ../src/common/helpers.py:1100 +#: ../src/common/helpers.py:1112 ../src/notify.py:560 ../src/notify.py:581 +#: ../src/notify.py:620 ../src/notify.py:632 msgid "Gajim" msgstr "Gajim" @@ -299,9 +299,9 @@ msgstr "Gajim" #. General group cannot be changed #: ../data/glade/account_modification_window.glade.h:17 #: ../data/glade/accounts_window.glade.h:22 -#: ../data/glade/preferences_window.glade.h:50 ../src/common/contacts.py:98 -#: ../src/dialogs.py:103 ../src/dialogs.py:111 ../src/roster_window.py:2753 -#: ../src/roster_window.py:5351 +#: ../data/glade/preferences_window.glade.h:52 ../src/common/contacts.py:135 +#: ../src/dialogs.py:111 ../src/dialogs.py:121 ../src/roster_window.py:2746 +#: ../src/roster_window.py:5268 msgid "General" msgstr "Агульная" @@ -360,21 +360,21 @@ msgid "Information about you, as stored in the server" msgstr "Звесткі аб Вас, якія захоўваюцца на серверы" #: ../data/glade/account_modification_window.glade.h:27 -#: ../data/glade/accounts_window.glade.h:35 ../src/config.py:1585 -#: ../src/config.py:2131 +#: ../data/glade/accounts_window.glade.h:35 ../src/config.py:1646 +#: ../src/config.py:2196 msgid "No key selected" msgstr "Ключ не выбраны" #. None means no proxy profile selected #: ../data/glade/account_modification_window.glade.h:29 #: ../data/glade/accounts_window.glade.h:37 -#: ../data/glade/change_mood_dialog.glade.h:3 ../src/config.py:1106 -#: ../src/config.py:1209 ../src/config.py:1489 ../src/config.py:1494 -#: ../src/config.py:2038 ../src/config.py:2117 ../src/config.py:2130 -#: ../src/config.py:3317 ../src/config.py:3390 ../src/dialogs.py:293 -#: ../src/dialogs.py:295 ../src/dialogs.py:498 ../src/dialogs.py:511 -#: ../src/roster_window.py:2807 ../src/roster_window.py:2813 -#: ../src/roster_window.py:2818 +#: ../data/glade/change_mood_dialog.glade.h:3 ../src/config.py:1158 +#: ../src/config.py:1261 ../src/config.py:1550 ../src/config.py:1555 +#: ../src/config.py:2103 ../src/config.py:2182 ../src/config.py:2195 +#: ../src/config.py:3396 ../src/config.py:3469 ../src/dialogs.py:308 +#: ../src/dialogs.py:310 ../src/dialogs.py:513 ../src/dialogs.py:526 +#: ../src/roster_window.py:2800 ../src/roster_window.py:2806 +#: ../src/roster_window.py:2811 msgid "None" msgstr "Ніякі" @@ -530,8 +530,8 @@ msgstr "" "Вам можа спатрэбіцца таксама змяніць настаўленні фаервола." #: ../data/glade/accounts_window.glade.h:32 -#: ../data/glade/zeroconf_information_window.glade.h:4 ../src/config.py:1612 -#: ../src/dialogs.py:806 +#: ../data/glade/zeroconf_information_window.glade.h:4 ../src/config.py:1673 +#: ../src/dialogs.py:830 msgid "Jabber ID:" msgstr "Jabber ID:" @@ -545,7 +545,7 @@ msgid "Mer_ge accounts" msgstr "_Аб'яднаць рахункі" #. Rename -#: ../data/glade/accounts_window.glade.h:42 ../src/roster_window.py:5302 +#: ../data/glade/accounts_window.glade.h:42 ../src/roster_window.py:5219 msgid "Re_name" msgstr "_Змяніць імя" @@ -954,7 +954,7 @@ msgstr "Апошняя змена:" msgid "New entry received" msgstr "Атрыманае новае паведамленне" -#: ../data/glade/atom_entry_window.glade.h:5 ../src/atom_window.py:114 +#: ../data/glade/atom_entry_window.glade.h:5 ../src/atom_window.py:124 msgid "You have received new entry:" msgstr "Вы атрымалі новае паведамленне:" @@ -1002,12 +1002,12 @@ msgstr "Увядзіце новы пароль:" msgid "Type your new status message" msgstr "Увядзіце тэкст новага паведамлення аб змене стану" -#: ../data/glade/change_status_message_dialog.glade.h:2 ../src/tooltips.py:601 +#: ../data/glade/change_status_message_dialog.glade.h:2 ../src/tooltips.py:613 #, fuzzy msgid "Activity:" msgstr "Актывізаваны" -#: ../data/glade/change_status_message_dialog.glade.h:3 ../src/tooltips.py:586 +#: ../data/glade/change_status_message_dialog.glade.h:3 ../src/tooltips.py:608 #, fuzzy msgid "Mood:" msgstr "Пакой:" @@ -1102,8 +1102,8 @@ msgstr "Змяніць _групы" #. Invite to #. Invite to Groupchat -#: ../data/glade/contact_context_menu.glade.h:6 ../src/roster_window.py:5257 -#: ../src/roster_window.py:5412 +#: ../data/glade/contact_context_menu.glade.h:6 ../src/roster_window.py:5174 +#: ../src/roster_window.py:5333 msgid "In_vite to" msgstr "За_прасіць" @@ -1118,8 +1118,8 @@ msgid "Remo_ve" msgstr "Вы_даліць" #. Send Custom Status -#: ../data/glade/contact_context_menu.glade.h:9 ../src/roster_window.py:5267 -#: ../src/roster_window.py:5497 +#: ../data/glade/contact_context_menu.glade.h:9 ../src/roster_window.py:5184 +#: ../src/roster_window.py:5420 #, fuzzy msgid "Send Cus_tom Status" msgstr "Адправіць асаблівы XML" @@ -1155,8 +1155,8 @@ msgid "_Allow him/her to see my status" msgstr "Дазволіць чалавеку _бачыць змены майго стану" #: ../data/glade/contact_context_menu.glade.h:18 -#: ../data/glade/gc_occupants_menu.glade.h:7 ../src/roster_window.py:5330 -#: ../src/roster_window.py:5449 ../src/roster_window.py:5578 +#: ../data/glade/gc_occupants_menu.glade.h:7 ../src/roster_window.py:5247 +#: ../src/roster_window.py:5370 ../src/roster_window.py:5501 msgid "_Block" msgstr "" @@ -1167,7 +1167,7 @@ msgstr "_Забараніць праглядаць змены майго ста #: ../data/glade/contact_context_menu.glade.h:20 #: ../data/glade/gc_control_popup_menu.glade.h:6 #: ../data/glade/gc_occupants_menu.glade.h:8 -#: ../data/glade/roster_window.glade.h:21 ../src/roster_window.py:5647 +#: ../data/glade/roster_window.glade.h:21 ../src/roster_window.py:5570 msgid "_History" msgstr "_Журнал" @@ -1190,8 +1190,8 @@ msgid "_Subscription" msgstr "П_адпіска" #: ../data/glade/contact_context_menu.glade.h:25 -#: ../data/glade/gc_occupants_menu.glade.h:13 ../src/roster_window.py:5324 -#: ../src/roster_window.py:5443 ../src/roster_window.py:5575 +#: ../data/glade/gc_occupants_menu.glade.h:13 ../src/roster_window.py:5241 +#: ../src/roster_window.py:5364 ../src/roster_window.py:5498 msgid "_Unblock" msgstr "" @@ -1282,7 +1282,7 @@ msgstr "" msgid "When a file transfer is complete show a popup notification" msgstr "Паказаць нагадванне па сканчэнні перадачы файла" -#: ../data/glade/filetransfers.glade.h:13 ../src/filetransfers_window.py:792 +#: ../data/glade/filetransfers.glade.h:13 ../src/filetransfers_window.py:820 msgid "_Continue" msgstr "_Працягнуць" @@ -1290,7 +1290,7 @@ msgstr "_Працягнуць" msgid "_Notify me when a file transfer is complete" msgstr "_Паведамляць мне аб сканчэнні перадачы файлаў" -#: ../data/glade/filetransfers.glade.h:15 ../src/filetransfers_window.py:200 +#: ../data/glade/filetransfers.glade.h:15 ../src/filetransfers_window.py:204 msgid "_Open Containing Folder" msgstr "_Адкрыць дырэкторыю з файлам" @@ -1318,7 +1318,7 @@ msgstr "" "Шэраг людзей\n" "Банер размовы" -#: ../data/glade/gajim_themes_window.glade.h:6 ../src/chat_control.py:818 +#: ../data/glade/gajim_themes_window.glade.h:6 ../src/chat_control.py:859 msgid "Bold" msgstr "Тлусты" @@ -1338,11 +1338,11 @@ msgstr "Настаўленне тэмы Gajim" msgid "Gone" msgstr "Знік" -#: ../data/glade/gajim_themes_window.glade.h:11 ../src/common/pep.py:153 +#: ../data/glade/gajim_themes_window.glade.h:11 ../src/common/pep.py:150 msgid "Inactive" msgstr "Неактыўны" -#: ../data/glade/gajim_themes_window.glade.h:12 ../src/chat_control.py:819 +#: ../data/glade/gajim_themes_window.glade.h:12 ../src/chat_control.py:860 msgid "Italic" msgstr "Нахілены" @@ -1393,7 +1393,7 @@ msgstr "Змяніць _тэму" msgid "Configure _Room..." msgstr "Настаўленні _пакоя" -#: ../data/glade/gc_control_popup_menu.glade.h:4 ../src/disco.py:1624 +#: ../data/glade/gc_control_popup_menu.glade.h:4 ../src/disco.py:1746 #, fuzzy msgid "_Bookmark" msgstr "_Змясціць у закладках" @@ -1491,8 +1491,9 @@ msgstr "" msgid "Welcome to Gajim History Logs Manager" msgstr "Gajim - Кіраўнік журналаў размоў" -#: ../data/glade/history_manager.glade.h:4 ../src/dialogs.py:2884 -#: ../src/dialogs.py:2987 +#. Change label for accept_button to action name instead of 'OK'. +#: ../data/glade/history_manager.glade.h:4 ../src/dialogs.py:3007 +#: ../src/dialogs.py:3104 msgid "Delete" msgstr "Выдаліць" @@ -1517,7 +1518,7 @@ msgstr "" msgid "_Search Database" msgstr "_Пошук у базе дадзеных" -#: ../data/glade/history_window.glade.h:1 ../src/history_window.py:316 +#: ../data/glade/history_window.glade.h:1 ../src/history_window.py:323 msgid "Conversation History" msgstr "Журнал размоў" @@ -1543,7 +1544,7 @@ msgstr "_Весці журнал размоў" msgid "Bookmark this room" msgstr "_Змясціць у закладках" -#: ../data/glade/join_groupchat_window.glade.h:3 ../src/dialogs.py:1972 +#: ../data/glade/join_groupchat_window.glade.h:3 ../src/dialogs.py:2076 msgid "Join Group Chat" msgstr "Удзельнічаць у групавой размове" @@ -1570,8 +1571,8 @@ msgstr "Нядаўна:" msgid "Room:" msgstr "Пакой:" -#: ../data/glade/join_groupchat_window.glade.h:9 ../src/disco.py:1201 -#: ../src/disco.py:1628 +#: ../data/glade/join_groupchat_window.glade.h:9 ../src/disco.py:1306 +#: ../src/disco.py:1750 msgid "_Join" msgstr "_Далучыцца" @@ -1601,7 +1602,7 @@ msgstr "" msgid "Print status:" msgstr "Стан друку:" -#: ../data/glade/manage_bookmarks_window.glade.h:9 ../src/config.py:1602 +#: ../data/glade/manage_bookmarks_window.glade.h:9 ../src/config.py:1663 msgid "Server:" msgstr "Сервер:" @@ -1725,17 +1726,26 @@ msgid "Show a list of formattings" msgstr "Пстрыкніце, каб уставіць сымболік (Alt+M)" #: ../data/glade/message_window.glade.h:10 -msgid "Show a menu of advanced functions (Alt+A)" -msgstr "" +#, fuzzy +msgid "Show a menu of advanced functions (Alt+D)" +msgstr "Пстрыкніце, каб уставіць сымболік (Alt+M)" #: ../data/glade/message_window.glade.h:11 msgid "Show the contact's profile (Ctrl+I)" msgstr "" -#. Make sure the character after "_" is not M/m (conflicts with Alt+M that is supposed to show the Emoticon Selector) +#: ../data/glade/message_window.glade.h:12 +msgid "Toggle audio session" +msgstr "" + #: ../data/glade/message_window.glade.h:13 +msgid "Toggle video session" +msgstr "" + +#. Make sure the character after "_" is not M/m (conflicts with Alt+M that is supposed to show the Emoticon Selector) +#: ../data/glade/message_window.glade.h:15 #: ../data/glade/xml_console_window.glade.h:11 -#: ../src/filetransfers_window.py:260 +#: ../src/filetransfers_window.py:266 msgid "_Send" msgstr "Ад_правіць" @@ -1879,6 +1889,16 @@ msgid "Configure color and font of the interface" msgstr "Настаўленні колераў і шрыфтаў" #: ../data/glade/preferences_window.glade.h:36 +#, fuzzy +msgid "Contact's message:" +msgstr "П_аведамленне стану:" + +#: ../data/glade/preferences_window.glade.h:37 +#, fuzzy +msgid "Contact's nickname:" +msgstr "Імя чалавека" + +#: ../data/glade/preferences_window.glade.h:38 msgid "" "Detached roster with detached chats\n" "Detached roster with single chat\n" @@ -1887,34 +1907,34 @@ msgid "" "Detached roster with chat grouped by type" msgstr "" -#: ../data/glade/preferences_window.glade.h:41 +#: ../data/glade/preferences_window.glade.h:43 #, fuzzy msgid "Display _activity of contacts in roster" msgstr "Паказваць _малюнкі ў галоўным вакне" -#: ../data/glade/preferences_window.glade.h:42 +#: ../data/glade/preferences_window.glade.h:44 msgid "Display _extra email details" msgstr "Паказаць _падрабязнасці пошты" -#: ../data/glade/preferences_window.glade.h:43 +#: ../data/glade/preferences_window.glade.h:45 #, fuzzy msgid "Display _tunes of contacts in roster" msgstr "Паказваць _малюнкі ў галоўным вакне" -#: ../data/glade/preferences_window.glade.h:44 +#: ../data/glade/preferences_window.glade.h:46 msgid "Display a_vatars of contacts in roster" msgstr "Паказваць _малюнкі ў галоўным вакне" -#: ../data/glade/preferences_window.glade.h:45 +#: ../data/glade/preferences_window.glade.h:47 #, fuzzy msgid "Display m_ood of contacts in roster" msgstr "Паказваць _малюнкі ў галоўным вакне" -#: ../data/glade/preferences_window.glade.h:46 +#: ../data/glade/preferences_window.glade.h:48 msgid "Display status _messages of contacts in roster" msgstr "Паказваць _стан у галоўным вакне" -#: ../data/glade/preferences_window.glade.h:47 +#: ../data/glade/preferences_window.glade.h:49 msgid "" "Gajim can send and receive meta-information related to a conversation you " "may have with a contact. Here you can specify which chatstates you want to " @@ -1923,7 +1943,7 @@ msgstr "" "Gajim можа адпраўляць і атрымліваць метазвесткі размоў з пэўным чалавекам. " "Вызначце, аб якіх зменах стану Вы хочаце ведаць." -#: ../data/glade/preferences_window.glade.h:48 +#: ../data/glade/preferences_window.glade.h:50 msgid "" "Gajim can send and receive meta-information related to a conversation you " "may have with a contact. Here you can specify which chatstates you want to " @@ -1932,7 +1952,7 @@ msgstr "" "Gajim можа адпраўляць і атрымліваць метазвесткі размоў з пэўным чалавекам. " "Вызначце, аб якіх зменах стану Вы хочаце паведамляць суразмоўцу." -#: ../data/glade/preferences_window.glade.h:49 +#: ../data/glade/preferences_window.glade.h:51 msgid "" "Gajim will notify you via a popup window in the bottom right of the screen " "about contacts that just signed out" @@ -1940,12 +1960,12 @@ msgstr "" "Gajim будзе паведамляць Вам аб сышоўшых людзях у выплыўным вакне ў правым " "верхнім куце экрана" -#: ../data/glade/preferences_window.glade.h:51 +#: ../data/glade/preferences_window.glade.h:53 #, fuzzy msgid "Hide all buttons in chat windows" msgstr "Схаваць кнопкі групавой размовы." -#: ../data/glade/preferences_window.glade.h:52 +#: ../data/glade/preferences_window.glade.h:54 #, fuzzy msgid "" "If checked, Gajim will allow others to detect the operation system you are " @@ -1954,7 +1974,7 @@ msgstr "" "Калі гэтая опцыя ўключаная, Gajim далучыцца да гэтай групавой размовы пры " "запуску" -#: ../data/glade/preferences_window.glade.h:53 +#: ../data/glade/preferences_window.glade.h:55 msgid "" "If checked, Gajim will also include information about the sender of the new " "emails" @@ -1962,18 +1982,18 @@ msgstr "" "Калі гэтая опцыя ўключаная, Gajim таксама дадасць звесткі аб адпраўніку " "новых лістоў" -#: ../data/glade/preferences_window.glade.h:54 +#: ../data/glade/preferences_window.glade.h:56 msgid "" "If checked, Gajim will change status to Away when the computer is unused." msgstr "" -#: ../data/glade/preferences_window.glade.h:55 +#: ../data/glade/preferences_window.glade.h:57 msgid "" "If checked, Gajim will change status to Not Available when the computer has " "not been used even longer" msgstr "" -#: ../data/glade/preferences_window.glade.h:56 +#: ../data/glade/preferences_window.glade.h:58 msgid "" "If checked, Gajim will display avatars of contacts in roster window and in " "group chats" @@ -1981,7 +2001,7 @@ msgstr "" "Калі гэтая опцыя ўключаная, Gajim паказвае аватары ў галоўным вакне і ў " "групавых размовах" -#: ../data/glade/preferences_window.glade.h:57 +#: ../data/glade/preferences_window.glade.h:59 msgid "" "If checked, Gajim will display status messages of contacts under the contact " "name in roster window and in group chats" @@ -1989,7 +2009,7 @@ msgstr "" "Калі гэтая опцыя ўключаная, Gajim паказвае паведамленні аб зменах стану для " "кожнага чалавека ў галоўным вакне і ў групавых размовах" -#: ../data/glade/preferences_window.glade.h:58 +#: ../data/glade/preferences_window.glade.h:60 #, fuzzy msgid "" "If checked, Gajim will display the activity of contacts in the roster window" @@ -1997,7 +2017,7 @@ msgstr "" "Калі гэтая опцыя ўключаная, Gajim паказвае аватары ў галоўным вакне і ў " "групавых размовах" -#: ../data/glade/preferences_window.glade.h:59 +#: ../data/glade/preferences_window.glade.h:61 #, fuzzy msgid "" "If checked, Gajim will display the mood of contacts in the roster window" @@ -2005,7 +2025,7 @@ msgstr "" "Калі гэтая опцыя ўключаная, Gajim паказвае аватары ў галоўным вакне і ў " "групавых размовах" -#: ../data/glade/preferences_window.glade.h:60 +#: ../data/glade/preferences_window.glade.h:62 #, fuzzy msgid "" "If checked, Gajim will display the tunes of contacts in the roster window" @@ -2013,14 +2033,14 @@ msgstr "" "Калі гэтая опцыя ўключаная, Gajim паказвае аватары ў галоўным вакне і ў " "групавых размовах" -#: ../data/glade/preferences_window.glade.h:61 +#: ../data/glade/preferences_window.glade.h:63 msgid "" "If checked, Gajim will highlight spelling errors in input fields of chat " "windows. If no language is explicitly set via right click on the input " "field, the default language will be used for this contact or group chat." msgstr "" -#: ../data/glade/preferences_window.glade.h:62 +#: ../data/glade/preferences_window.glade.h:64 #, fuzzy msgid "" "If checked, Gajim will ignore incoming events from unauthorized contacts. " @@ -2032,14 +2052,14 @@ msgstr "" "зважайце, што ў такім разе ніхто з людзей, якіх няма ў Вашым спісе, не зможа " "адправіць Вам паведамленне" -#: ../data/glade/preferences_window.glade.h:63 +#: ../data/glade/preferences_window.glade.h:65 msgid "" "If checked, Gajim will keep logs for encrypted messages. Please note that " "when using E2E encryption the remote party has to agree on logging, else the " "messages will not be logged." msgstr "" -#: ../data/glade/preferences_window.glade.h:64 +#: ../data/glade/preferences_window.glade.h:66 #, fuzzy msgid "" "If checked, Gajim will show a notification when a new e-mail is received via " @@ -2048,7 +2068,7 @@ msgstr "" "Калі гэтая опцыя ўключаная, Gajim таксама дадасць звесткі аб адпраўніку " "новых лістоў" -#: ../data/glade/preferences_window.glade.h:65 +#: ../data/glade/preferences_window.glade.h:67 msgid "" "If checked, Gajim will use protocol-specific status icons. (eg. A contact " "from MSN will have the equivalent msn icon for status online, away, busy, " @@ -2058,13 +2078,13 @@ msgstr "" "пратаколаў. (напр., чалавек з MSN будзе мець адпаведныя значкі злучанасці, " "адсутнасці, занятасці і г.д. для MSN-карыстальнікаў)" -#: ../data/glade/preferences_window.glade.h:66 +#: ../data/glade/preferences_window.glade.h:68 msgid "" "If enabled, Gajim will not ask for a status message. The specified default " "message will be used instead." msgstr "" -#: ../data/glade/preferences_window.glade.h:67 +#: ../data/glade/preferences_window.glade.h:69 msgid "" "If not disabled, Gajim will replace ascii smilies like ':)' with equivalent " "animated or static graphical emoticons" @@ -2072,79 +2092,79 @@ msgstr "" "Калі гэтая опцыя ўключаная, Gajim заменіць ascii-сымболікі (напр., ':)' ) " "адпаведнай значкай" -#: ../data/glade/preferences_window.glade.h:68 +#: ../data/glade/preferences_window.glade.h:70 msgid "Log _encrypted chat session" msgstr "" -#: ../data/glade/preferences_window.glade.h:69 +#: ../data/glade/preferences_window.glade.h:71 #, fuzzy msgid "Ma_ke message windows compact" msgstr "_Вакно для аднаго паведамлення:" -#: ../data/glade/preferences_window.glade.h:70 +#: ../data/glade/preferences_window.glade.h:72 msgid "Ma_nage..." msgstr "Кі_раванне..." -#: ../data/glade/preferences_window.glade.h:71 +#: ../data/glade/preferences_window.glade.h:73 msgid "" "Never\n" "Only when pending events\n" "Always" msgstr "" -#: ../data/glade/preferences_window.glade.h:74 +#: ../data/glade/preferences_window.glade.h:76 #, fuzzy msgid "Notifications" msgstr "Змяненне рахунка" -#: ../data/glade/preferences_window.glade.h:75 +#: ../data/glade/preferences_window.glade.h:77 #, fuzzy msgid "Notify me about contacts that sign _in" msgstr "Паведамляць мне аб людзях, якія: " -#: ../data/glade/preferences_window.glade.h:76 +#: ../data/glade/preferences_window.glade.h:78 #, fuzzy msgid "Notify me about contacts that sign _out" msgstr "Паведамляць мне аб людзях, якія: " -#: ../data/glade/preferences_window.glade.h:77 +#: ../data/glade/preferences_window.glade.h:79 msgid "Notify on new _GMail email" msgstr "Паведамляць аб новай пошце на _Gmail" -#: ../data/glade/preferences_window.glade.h:78 +#: ../data/glade/preferences_window.glade.h:80 #, fuzzy msgid "Personal Events" msgstr "Асабістыя звесткі" -#: ../data/glade/preferences_window.glade.h:79 +#: ../data/glade/preferences_window.glade.h:81 msgid "Play _sounds" msgstr "Граць _гук" -#: ../data/glade/preferences_window.glade.h:80 +#: ../data/glade/preferences_window.glade.h:82 msgid "" "Pop it up\n" "Notify me about it\n" "Show only in roster" msgstr "" -#: ../data/glade/preferences_window.glade.h:83 +#: ../data/glade/preferences_window.glade.h:85 msgid "Preferences" msgstr "Уласцівасці" -#: ../data/glade/preferences_window.glade.h:84 +#: ../data/glade/preferences_window.glade.h:86 #, fuzzy msgid "Show systray:" msgstr "_Паказваць падзею ў прасторы паведамленняў" -#: ../data/glade/preferences_window.glade.h:85 +#: ../data/glade/preferences_window.glade.h:87 msgid "Sign _in" msgstr "_Злучыцца" -#: ../data/glade/preferences_window.glade.h:86 +#: ../data/glade/preferences_window.glade.h:88 msgid "Sign _out" msgstr "З_ысці" -#: ../data/glade/preferences_window.glade.h:87 +#: ../data/glade/preferences_window.glade.h:89 msgid "" "Some messages may include rich content (formatting, colors etc). If checked, " "Gajim will just display the raw message text." @@ -2152,30 +2172,30 @@ msgstr "" "Некаторыя паведамленні ўключаюць афармленне (фармат, колеры і г.д.). Калі " "гэтая опцыя ўключаная, Gajim будзе паказваць нефарматаваны тэкст." -#: ../data/glade/preferences_window.glade.h:88 +#: ../data/glade/preferences_window.glade.h:90 #, fuzzy msgid "Sort contacts by status" msgstr "_Упарадкаваць людзей па стане" -#: ../data/glade/preferences_window.glade.h:89 ../src/config.py:390 +#: ../data/glade/preferences_window.glade.h:91 ../src/config.py:377 msgid "Status" msgstr "Стан" -#: ../data/glade/preferences_window.glade.h:90 +#: ../data/glade/preferences_window.glade.h:92 #, fuzzy msgid "Status _iconset:" msgstr "Прадвызначаны набор _значак стану:" -#: ../data/glade/preferences_window.glade.h:91 +#: ../data/glade/preferences_window.glade.h:93 #, fuzzy msgid "Style" msgstr "Марнаванне часу" -#: ../data/glade/preferences_window.glade.h:92 +#: ../data/glade/preferences_window.glade.h:94 msgid "T_heme:" msgstr "Т_эма:" -#: ../data/glade/preferences_window.glade.h:93 +#: ../data/glade/preferences_window.glade.h:95 msgid "" "The auto away status message. If empty, Gajim will not change the current " "status message\n" @@ -2183,7 +2203,7 @@ msgid "" "$T will be replaced by auto-away timeout" msgstr "" -#: ../data/glade/preferences_window.glade.h:96 +#: ../data/glade/preferences_window.glade.h:98 msgid "" "The auto not available status message. If empty, Gajim will not change the " "current status message\n" @@ -2191,113 +2211,115 @@ msgid "" "$T will be replaced by auto-not-available timeout" msgstr "" -#: ../data/glade/preferences_window.glade.h:99 +#: ../data/glade/preferences_window.glade.h:101 #, fuzzy msgid "Use _transports icons" msgstr "Ужыць _значкі транспартаў" -#: ../data/glade/preferences_window.glade.h:100 +#: ../data/glade/preferences_window.glade.h:102 msgid "Use system _default" msgstr "Ужыць _сістэмны" -#: ../data/glade/preferences_window.glade.h:101 +#: ../data/glade/preferences_window.glade.h:103 #, fuzzy msgid "When new event is received:" msgstr "Па атрыманні новай падзеі" -#: ../data/glade/preferences_window.glade.h:102 +#: ../data/glade/preferences_window.glade.h:104 +#, fuzzy +msgid "Your message:" +msgstr "Памылка: %s" + +#: ../data/glade/preferences_window.glade.h:105 +#, fuzzy +msgid "Your nickname:" +msgstr "П_ерад мянушкай:" + +#: ../data/glade/preferences_window.glade.h:106 #, fuzzy msgid "_Away after:" msgstr "Аўтаматычна змяняць стан на \"_сышоў\" праз:" -#: ../data/glade/preferences_window.glade.h:103 +#: ../data/glade/preferences_window.glade.h:107 msgid "_Browser:" msgstr "_Гартач:" -#: ../data/glade/preferences_window.glade.h:104 +#: ../data/glade/preferences_window.glade.h:108 #, fuzzy msgid "_Display chat state notifications:" msgstr "_Паказваць нагадванні стану размовы:" -#: ../data/glade/preferences_window.glade.h:105 +#: ../data/glade/preferences_window.glade.h:109 #, fuzzy msgid "_Emoticons:" msgstr "Сымболікі:" -#: ../data/glade/preferences_window.glade.h:106 +#: ../data/glade/preferences_window.glade.h:110 msgid "_File manager:" msgstr "_Кіраўнік файлаў:" -#: ../data/glade/preferences_window.glade.h:107 +#: ../data/glade/preferences_window.glade.h:111 msgid "_Highlight misspelled words" msgstr "_Фарбаваць няправільна напісаныя словы" -#: ../data/glade/preferences_window.glade.h:108 +#: ../data/glade/preferences_window.glade.h:112 msgid "_Ignore events from contacts not in the roster" msgstr "_Ігнараваць падзеі ад людзей, якіх няма ў кантактным лісце" -#: ../data/glade/preferences_window.glade.h:109 +#: ../data/glade/preferences_window.glade.h:113 #, fuzzy msgid "_Ignore rich content in incoming messages" msgstr "Ігнараваць афармленне ўваходных паведамленняў" -#: ../data/glade/preferences_window.glade.h:110 -msgid "_Incoming message:" -msgstr "_Уваходнае паведамленне:" - -#: ../data/glade/preferences_window.glade.h:111 +#: ../data/glade/preferences_window.glade.h:114 msgid "_Log status changes of contacts" msgstr "_Пісаць у журнал паведамленні аб змене стану чалавека" -#: ../data/glade/preferences_window.glade.h:112 +#: ../data/glade/preferences_window.glade.h:115 msgid "_Mail client:" msgstr "_Паштовая праграма:" -#: ../data/glade/preferences_window.glade.h:113 +#: ../data/glade/preferences_window.glade.h:116 #, fuzzy msgid "_Not available after:" msgstr "Аўтаматычна змяняць стан на \"_недаступны\" праз:" -#: ../data/glade/preferences_window.glade.h:114 +#: ../data/glade/preferences_window.glade.h:117 msgid "_Open..." msgstr "_Адкрыць..." -#: ../data/glade/preferences_window.glade.h:115 -msgid "_Outgoing message:" -msgstr "_Выходнае паведамленне:" - -#: ../data/glade/preferences_window.glade.h:116 +#: ../data/glade/preferences_window.glade.h:118 msgid "_Reset to Default Colors" msgstr "_Вярнуць звычайныя колеры" -#: ../data/glade/preferences_window.glade.h:117 +#: ../data/glade/preferences_window.glade.h:119 #, fuzzy msgid "_Send chat state notifications:" msgstr "_Паказваць нагадванні стану размовы:" -#: ../data/glade/preferences_window.glade.h:118 +#: ../data/glade/preferences_window.glade.h:120 msgid "_Status message:" msgstr "П_аведамленне стану:" -#: ../data/glade/preferences_window.glade.h:119 +#: ../data/glade/preferences_window.glade.h:121 msgid "_URL highlight:" msgstr "" -#: ../data/glade/preferences_window.glade.h:120 +#: ../data/glade/preferences_window.glade.h:122 msgid "_Window behavior:" msgstr "" -#: ../data/glade/preferences_window.glade.h:121 +#: ../data/glade/preferences_window.glade.h:123 #, fuzzy msgid "in _group chats" msgstr "Удзельнічаць у _групавой размове" -#: ../data/glade/preferences_window.glade.h:122 +#: ../data/glade/preferences_window.glade.h:124 #, fuzzy msgid "in _roster" msgstr "Няма ў спісе" -#: ../data/glade/preferences_window.glade.h:123 +#: ../data/glade/preferences_window.glade.h:125 msgid "minutes" msgstr "хвіліны" @@ -2350,7 +2372,7 @@ msgstr "JabberID" msgid "Order:" msgstr "Парадак:" -#: ../data/glade/privacy_list_window.glade.h:12 ../src/dialogs.py:3114 +#: ../data/glade/privacy_list_window.glade.h:12 ../src/dialogs.py:3235 msgid "Privacy List" msgstr "Спіс прыватнасці" @@ -2514,7 +2536,7 @@ msgid "Prefix:" msgstr "Уласцівасці" #: ../data/glade/profile_window.glade.h:25 -#: ../data/glade/vcard_information_window.glade.h:30 ../src/vcard.py:327 +#: ../data/glade/vcard_information_window.glade.h:30 ../src/vcard.py:332 #, fuzzy msgid "Role:" msgstr "Гукі" @@ -2578,8 +2600,8 @@ msgstr "Выдаліць рахунак для Gajim і на _серверы" #. Remove group #. Remove -#: ../data/glade/remove_account_window.glade.h:4 ../src/roster_window.py:5339 -#: ../src/roster_window.py:5459 ../src/roster_window.py:5588 +#: ../data/glade/remove_account_window.glade.h:4 ../src/roster_window.py:5256 +#: ../src/roster_window.py:5380 ../src/roster_window.py:5511 msgid "_Remove" msgstr "Вы_даліць" @@ -2598,14 +2620,14 @@ msgid "Roster Item Exchange" msgstr "" #: ../data/glade/roster_item_exchange_window.glade.h:4 -#, fuzzy -msgid "gtk-cancel" -msgstr "Выдаліць" +#: ../data/glade/service_registration_window.glade.h:3 +msgid "_OK" +msgstr "_Добра" #: ../data/glade/roster_item_exchange_window.glade.h:5 #, fuzzy -msgid "gtk-ok" -msgstr "gtk+" +msgid "gtk-cancel" +msgstr "Выдаліць" #: ../data/glade/roster_window.glade.h:1 #, fuzzy @@ -2666,7 +2688,7 @@ msgstr "_Дзеянні" msgid "_Contents" msgstr "_Змест" -#: ../data/glade/roster_window.glade.h:18 ../src/disco.py:1357 +#: ../data/glade/roster_window.glade.h:18 ../src/disco.py:1467 msgid "_Edit" msgstr "_Змяніць" @@ -2710,12 +2732,12 @@ msgid "_Add contact" msgstr "Дадаць _чалавека" #. Information -#: ../data/glade/search_window.glade.h:4 ../src/roster_window.py:5600 +#: ../data/glade/search_window.glade.h:4 ../src/roster_window.py:5523 #, fuzzy msgid "_Information" msgstr "Асабістыя звесткі" -#: ../data/glade/search_window.glade.h:5 ../src/disco.py:1213 +#: ../data/glade/search_window.glade.h:5 ../src/disco.py:1318 msgid "_Search" msgstr "П_ошук" @@ -2735,10 +2757,6 @@ msgstr "Зарэгістравацца" msgid "_Cancel" msgstr "_Скасаваць" -#: ../data/glade/service_registration_window.glade.h:3 -msgid "_OK" -msgstr "_Добра" - #: ../data/glade/single_message_window.glade.h:1 msgid "0" msgstr "0" @@ -2954,331 +2972,319 @@ msgstr "Рэсурс:" msgid "Status:" msgstr "Стан:" -#: ../src/adhoc_commands.py:268 +#: ../src/adhoc_commands.py:295 #, fuzzy msgid "Cancel confirmation" msgstr "Асабістыя звесткі" -#: ../src/adhoc_commands.py:269 +#: ../src/adhoc_commands.py:296 msgid "" "You are in process of executing command. Do you really want to cancel it?" msgstr "" -#: ../src/adhoc_commands.py:301 ../src/adhoc_commands.py:324 +#: ../src/adhoc_commands.py:328 ../src/adhoc_commands.py:351 msgid "Service sent malformed data" msgstr "" -#: ../src/adhoc_commands.py:310 +#: ../src/adhoc_commands.py:337 msgid "Service changed the session identifier." msgstr "" #. when stanza doesn't have error description -#: ../src/adhoc_commands.py:405 +#: ../src/adhoc_commands.py:436 msgid "Service returned an error." msgstr "" #. For i18n -#: ../src/advanced_configuration_window.py:89 +#: ../src/advanced_configuration_window.py:91 msgid "Activated" msgstr "Актывізаваны" -#: ../src/advanced_configuration_window.py:89 +#: ../src/advanced_configuration_window.py:91 msgid "Deactivated" msgstr "Неактывізаваны" -#: ../src/advanced_configuration_window.py:91 +#: ../src/advanced_configuration_window.py:93 msgid "Boolean" msgstr "Лагічнае" -#: ../src/advanced_configuration_window.py:92 +#: ../src/advanced_configuration_window.py:94 msgid "Integer" msgstr "Цэлы лік" -#: ../src/advanced_configuration_window.py:93 +#: ../src/advanced_configuration_window.py:95 msgid "Text" msgstr "Тэкставае" -#: ../src/advanced_configuration_window.py:94 ../src/chat_control.py:838 +#: ../src/advanced_configuration_window.py:96 ../src/chat_control.py:879 msgid "Color" msgstr "Колер" -#: ../src/advanced_configuration_window.py:105 +#: ../src/advanced_configuration_window.py:107 msgid "Preference Name" msgstr "Назва ўласцівасці" -#: ../src/advanced_configuration_window.py:111 +#: ../src/advanced_configuration_window.py:113 msgid "Value" msgstr "Значэнне" -#: ../src/advanced_configuration_window.py:119 +#: ../src/advanced_configuration_window.py:121 msgid "Type" msgstr "Тып" #. we talk about option description in advanced configuration editor -#: ../src/advanced_configuration_window.py:172 +#: ../src/advanced_configuration_window.py:176 msgid "(None)" msgstr "(Няма)" -#: ../src/advanced_configuration_window.py:255 +#: ../src/advanced_configuration_window.py:259 msgid "Hidden" msgstr "Схаваны" -#: ../src/atom_window.py:110 +#: ../src/atom_window.py:119 #, fuzzy, python-format -msgid "You have received new entries (and %(count)d not displayed):" -msgstr "Вы атрымалі новае паведамленне:" +msgid "You have received new entries (and %d not displayed):" +msgid_plural "You have received new entries (and %d not displayed):" +msgstr[0] "Вы атрымалі новае паведамленне:" +msgstr[1] "Вы атрымалі новае паведамленне:" +msgstr[2] "Вы атрымалі новае паведамленне:" #. the next script, executed in the "po" directory, #. generates the following list. #. #!/bin/sh #. LANG=$(for i in *.po; do j=${i/.po/}; echo -n "_('"$j"')":" '"$j"', " ; done) #. echo "{_('en'):'en'",$LANG"}" -#: ../src/chat_control.py:74 +#: ../src/chat_control.py:75 msgid "English" msgstr "Ангельская" -#: ../src/chat_control.py:74 +#: ../src/chat_control.py:75 msgid "Belarusian" msgstr "Беларуская" -#: ../src/chat_control.py:74 +#: ../src/chat_control.py:75 msgid "Bulgarian" msgstr "Балгарская" -#: ../src/chat_control.py:74 +#: ../src/chat_control.py:75 #, fuzzy msgid "Breton" msgstr "Брытонская" -#: ../src/chat_control.py:74 +#: ../src/chat_control.py:75 msgid "Czech" msgstr "Чэшская" -#: ../src/chat_control.py:74 +#: ../src/chat_control.py:75 msgid "German" msgstr "Нямецкая" -#: ../src/chat_control.py:74 +#: ../src/chat_control.py:75 msgid "Greek" msgstr "Грэцкая" -#: ../src/chat_control.py:74 +#: ../src/chat_control.py:75 msgid "British" msgstr "Брытанская" -#: ../src/chat_control.py:74 +#: ../src/chat_control.py:75 msgid "Esperanto" msgstr "Эсперанта" -#: ../src/chat_control.py:74 +#: ../src/chat_control.py:75 msgid "Spanish" msgstr "Іспанская" -#: ../src/chat_control.py:74 +#: ../src/chat_control.py:75 #, fuzzy msgid "Basque" msgstr "Басцкая" -#: ../src/chat_control.py:74 +#: ../src/chat_control.py:75 msgid "French" msgstr "Французская" -#: ../src/chat_control.py:74 +#: ../src/chat_control.py:75 msgid "Croatian" msgstr "Харвацкая" -#: ../src/chat_control.py:74 +#: ../src/chat_control.py:75 msgid "Italian" msgstr "Італійская" -#: ../src/chat_control.py:74 +#: ../src/chat_control.py:75 msgid "Norwegian (b)" msgstr "Нарвежская (бокмал)" -#: ../src/chat_control.py:74 +#: ../src/chat_control.py:75 msgid "Dutch" msgstr "Галандская" -#: ../src/chat_control.py:74 +#: ../src/chat_control.py:75 msgid "Norwegian" msgstr "Нарвежская" -#: ../src/chat_control.py:74 +#: ../src/chat_control.py:75 msgid "Polish" msgstr "Польская" -#: ../src/chat_control.py:74 +#: ../src/chat_control.py:75 msgid "Portuguese" msgstr "Партугальская" -#: ../src/chat_control.py:74 +#: ../src/chat_control.py:75 msgid "Brazilian Portuguese" msgstr "Бразільская партугальская" -#: ../src/chat_control.py:74 +#: ../src/chat_control.py:75 msgid "Russian" msgstr "Расейская" -#: ../src/chat_control.py:74 +#: ../src/chat_control.py:75 #, fuzzy msgid "Serbian" msgstr "Нямецкая" -#: ../src/chat_control.py:74 +#: ../src/chat_control.py:75 msgid "Slovak" msgstr "Славацкая" -#: ../src/chat_control.py:74 +#: ../src/chat_control.py:75 msgid "Swedish" msgstr "Шведская" -#: ../src/chat_control.py:74 +#: ../src/chat_control.py:75 msgid "Chinese (Ch)" msgstr "Кітайская (Ch)" -#: ../src/chat_control.py:426 +#: ../src/chat_control.py:446 msgid "Spelling language" msgstr "Мова правапісу" #. we are not connected -#: ../src/chat_control.py:454 ../src/chat_control.py:642 +#: ../src/chat_control.py:478 ../src/chat_control.py:670 msgid "A connection is not available" msgstr "Няма злучэння" -#: ../src/chat_control.py:455 ../src/chat_control.py:643 +#: ../src/chat_control.py:479 ../src/chat_control.py:671 msgid "Your message can not be sent until you are connected." msgstr "Вы не можаце адпраўляць паведамленні без злучэння." -#: ../src/chat_control.py:820 +#: ../src/chat_control.py:861 #, fuzzy msgid "Underline" msgstr "дзевяць" -#: ../src/chat_control.py:821 +#: ../src/chat_control.py:862 #, fuzzy msgid "Strike" msgstr "Мянушка" -#: ../src/chat_control.py:844 +#: ../src/chat_control.py:885 #, fuzzy msgid "Font" msgstr "_Шрыфт:" -#: ../src/chat_control.py:853 +#: ../src/chat_control.py:894 #, fuzzy msgid "Clear formating" msgstr "Асабістыя звесткі" -#: ../src/chat_control.py:925 +#: ../src/chat_control.py:972 msgid "Really send file?" msgstr "" -#: ../src/chat_control.py:926 +#: ../src/chat_control.py:973 #, python-format msgid "If you send a file to %s, he/she will know your real Jabber ID." msgstr "" -#: ../src/chat_control.py:1317 ../src/chat_control.py:1718 +#: ../src/chat_control.py:1411 ../src/chat_control.py:1864 #, fuzzy msgid "GPG encryption enabled" msgstr "Шыфраванне дзейнічае" #. Add to roster -#: ../src/chat_control.py:1346 ../src/common/contacts.py:113 -#: ../src/common/helpers.py:55 ../src/common/helpers.py:231 -#: ../src/conversation_textview.py:903 ../src/dialogs.py:1031 -#: ../src/dialogs.py:1882 ../src/dialogs.py:1907 ../src/gajim.py:999 -#: ../src/gajim.py:1750 ../src/gui_menu_builder.py:243 -#: ../src/gui_menu_builder.py:385 ../src/roster_window.py:988 -#: ../src/roster_window.py:1622 ../src/roster_window.py:1624 -#: ../src/roster_window.py:1926 ../src/roster_window.py:3187 -#: ../src/roster_window.py:3213 +#: ../src/chat_control.py:1436 ../src/common/contacts.py:150 +#: ../src/common/contacts.py:253 ../src/common/helpers.py:55 +#: ../src/common/helpers.py:231 ../src/conversation_textview.py:916 +#: ../src/dialogs.py:1060 ../src/dialogs.py:1973 ../src/dialogs.py:2002 +#: ../src/gui_interface.py:610 ../src/gui_menu_builder.py:255 +#: ../src/gui_menu_builder.py:398 ../src/roster_window.py:1576 +#: ../src/roster_window.py:1578 ../src/roster_window.py:1893 +#: ../src/roster_window.py:3194 ../src/roster_window.py:3220 msgid "Not in Roster" msgstr "Няма ў спісе" -#: ../src/chat_control.py:1359 +#: ../src/chat_control.py:1480 #, fuzzy msgid "This contact does not support file transfer." msgstr "Спіс актыўных, скончаных і спыненых перадачаў файлаў" -#: ../src/chat_control.py:1362 +#: ../src/chat_control.py:1483 msgid "You need to know the real JID of the contact to send him or her a file." msgstr "" -#: ../src/chat_control.py:1469 ../src/tooltips.py:626 -msgid "Unknown Artist" -msgstr "" - -#: ../src/chat_control.py:1471 ../src/tooltips.py:631 -msgid "Unknown Title" -msgstr "" - -#: ../src/chat_control.py:1473 ../src/tooltips.py:636 -msgid "Unknown Source" -msgstr "" - -#: ../src/chat_control.py:1476 ../src/tooltips.py:638 +#: ../src/chat_control.py:1555 #, python-format -msgid "" -"\"%(title)s\" by %(artist)s\n" -"from %(source)s" +msgid "%(type)s state : %(state)s, reason: %(reason)s" msgstr "" -#: ../src/chat_control.py:1613 +#: ../src/chat_control.py:1720 #, python-format msgid "%(nickname)s from group chat %(room_name)s" msgstr "%(nickname)s з групавой размовы %(room_name)s" #. No key assigned nor a key is used by remote contact -#: ../src/chat_control.py:1698 ../src/dialogs.py:4484 +#: ../src/chat_control.py:1844 ../src/dialogs.py:4627 msgid "No GPG key assigned" msgstr "" -#: ../src/chat_control.py:1699 +#: ../src/chat_control.py:1845 msgid "" "No GPG key is assigned to this contact. So you cannot encrypt messages with " "GPG." msgstr "" -#: ../src/chat_control.py:1708 +#: ../src/chat_control.py:1854 #, fuzzy msgid "GPG encryption disabled" msgstr "Шыфраванне адключанае" -#: ../src/chat_control.py:1734 +#: ../src/chat_control.py:1880 msgid "Session WILL be logged" msgstr "" -#: ../src/chat_control.py:1736 +#: ../src/chat_control.py:1882 msgid "Session WILL NOT be logged" msgstr "" #. encryption %s active -#: ../src/chat_control.py:1750 +#: ../src/chat_control.py:1899 msgid "is" msgstr "" -#: ../src/chat_control.py:1750 +#: ../src/chat_control.py:1899 msgid "is NOT" msgstr "" #. chat session %s be logged -#: ../src/chat_control.py:1752 +#: ../src/chat_control.py:1901 msgid "will" msgstr "" -#: ../src/chat_control.py:1752 +#: ../src/chat_control.py:1901 msgid "will NOT" msgstr "" #. About encrypted chat session -#: ../src/chat_control.py:1756 +#: ../src/chat_control.py:1905 #, fuzzy msgid "and authenticated" msgstr "Аўтарызацыя" #. About encrypted chat session -#: ../src/chat_control.py:1760 +#: ../src/chat_control.py:1909 #, fuzzy msgid "and NOT authenticated" msgstr "Аўтарызацыя" @@ -3286,58 +3292,58 @@ msgstr "Аўтарызацыя" #. status will become 'is' or 'is not', authentificaed will become #. 'and authentificated' or 'and not authentificated', logged will become #. 'will' or 'will not' -#: ../src/chat_control.py:1766 +#: ../src/chat_control.py:1915 #, python-format msgid "" "%(type)s encryption %(status)s active %(authenticated)s.\n" "Your chat session %(logged)s be logged." msgstr "" -#: ../src/chat_control.py:1906 +#: ../src/chat_control.py:2055 msgid "Session negotiation cancelled" msgstr "" -#: ../src/chat_control.py:1913 +#: ../src/chat_control.py:2064 #, fuzzy msgid "This session is encrypted" msgstr "[Гэтае паведамленне зашыфраванае]" -#: ../src/chat_control.py:1916 +#: ../src/chat_control.py:2067 msgid " and WILL be logged" msgstr "" -#: ../src/chat_control.py:1918 +#: ../src/chat_control.py:2069 msgid " and WILL NOT be logged" msgstr "" -#: ../src/chat_control.py:1923 +#: ../src/chat_control.py:2074 msgid "" "Remote contact's identity not verified. Click the shield button for more " "details." msgstr "" -#: ../src/chat_control.py:1925 +#: ../src/chat_control.py:2076 #, fuzzy msgid "E2E encryption disabled" msgstr "Шыфраванне адключанае" -#: ../src/chat_control.py:1959 ../src/chat_control.py:1972 +#: ../src/chat_control.py:2113 ../src/chat_control.py:2126 #, fuzzy msgid "The following message was NOT encrypted" msgstr "[Гэтае паведамленне зашыфраванае]" -#: ../src/chat_control.py:1965 +#: ../src/chat_control.py:2119 #, fuzzy msgid "The following message was encrypted" msgstr "[Гэтае паведамленне зашыфраванае]" #. %s is being replaced in the code with JID -#: ../src/chat_control.py:2235 +#: ../src/chat_control.py:2388 #, python-format msgid "You just received a new message from \"%s\"" msgstr "Вам адправіў паведамленне \"%s\"" -#: ../src/chat_control.py:2236 +#: ../src/chat_control.py:2389 msgid "" "If you close this tab and you have history disabled, this message will be " "lost." @@ -3345,22 +3351,22 @@ msgstr "" "Калі Вы закрыеце гэтую картку з адключаным вядзеннем журналаў, гэтае " "паведамленне згубіцца." -#: ../src/chat_control.py:2391 ../src/common/connection_handlers.py:2073 -#: ../src/common/connection_handlers.py:2119 -#: ../src/common/connection_handlers.py:2347 -#: ../src/common/connection_handlers.py:2489 ../src/common/connection.py:1368 -#: ../src/gajim.py:154 ../src/session.py:130 +#: ../src/chat_control.py:2542 ../src/common/connection_handlers.py:2100 +#: ../src/common/connection_handlers.py:2146 +#: ../src/common/connection_handlers.py:2338 +#: ../src/common/connection_handlers.py:2483 ../src/common/connection.py:420 +#: ../src/gajim.py:154 ../src/session.py:134 msgid "Database Error" msgstr "" -#: ../src/chat_control.py:2392 +#: ../src/chat_control.py:2543 #, python-format msgid "" "The database file (%s) cannot be read. Try to repair it or remove it (all " "history will be lost)." msgstr "" -#: ../src/chat_control.py:2622 +#: ../src/chat_control.py:2784 #, fuzzy, python-format msgid "%(name)s is now %(status)s" msgstr "%(nick)s цяпер %(status)s" @@ -3369,23 +3375,23 @@ msgstr "%(nick)s цяпер %(status)s" msgid "creating logs database" msgstr "стварэнне базы журналаў" -#: ../src/common/check_paths.py:128 ../src/common/check_paths.py:139 -#: ../src/common/check_paths.py:146 +#: ../src/common/check_paths.py:129 ../src/common/check_paths.py:140 +#: ../src/common/check_paths.py:147 #, python-format msgid "%s is a file but it should be a directory" msgstr "%s з'яўляецца файлам, але павінна быць дырэкторыя" -#: ../src/common/check_paths.py:129 ../src/common/check_paths.py:140 -#: ../src/common/check_paths.py:147 ../src/common/check_paths.py:155 +#: ../src/common/check_paths.py:130 ../src/common/check_paths.py:141 +#: ../src/common/check_paths.py:148 ../src/common/check_paths.py:156 msgid "Gajim will now exit" msgstr "Gajim сканчвае работу" -#: ../src/common/check_paths.py:154 +#: ../src/common/check_paths.py:155 #, python-format msgid "%s is a directory but should be a file" msgstr "%s з'яўляецца дырэкторыяй, але павінны быць файл" -#: ../src/common/check_paths.py:170 +#: ../src/common/check_paths.py:171 #, python-format msgid "creating %s directory" msgstr "стварэнне дырэкторыі %s" @@ -3448,10 +3454,10 @@ msgid "Choose the groupchats you want to leave" msgstr "Выберыце групавыя размовы, з якіх Вы хочаце сысці" #. Make special context menu if group is Groupchats -#: ../src/common/commands.py:205 ../src/common/contacts.py:94 -#: ../src/common/helpers.py:55 ../src/roster_window.py:812 -#: ../src/roster_window.py:1626 ../src/roster_window.py:1628 -#: ../src/roster_window.py:5227 +#: ../src/common/commands.py:205 ../src/common/contacts.py:131 +#: ../src/common/helpers.py:55 ../src/roster_window.py:809 +#: ../src/roster_window.py:1580 ../src/roster_window.py:1582 +#: ../src/roster_window.py:5144 msgid "Groupchats" msgstr "Групавыя размовы" @@ -3562,9 +3568,9 @@ msgid "" msgstr "Спіс падзеленых прагаламі згорнутых рахункаў і групаў." #. sorted alphanum -#: ../src/common/config.py:106 ../src/common/config.py:483 -#: ../src/common/optparser.py:245 ../src/common/optparser.py:463 -#: ../src/common/optparser.py:497 ../src/gajim.py:3471 +#: ../src/common/config.py:106 ../src/common/config.py:482 +#: ../src/common/optparser.py:288 ../src/common/optparser.py:465 +#: ../src/common/optparser.py:499 ../src/gui_interface.py:3251 #, fuzzy msgid "default" msgstr "Прадвызначана" @@ -4201,7 +4207,7 @@ msgstr "" msgid "Jabberd2 workaround" msgstr "Выпраўленне хібы Jabberd2" -#: ../src/common/config.py:331 +#: ../src/common/config.py:330 msgid "" "If checked, Gajim will use your IP and proxies defined in " "file_transfer_proxies option for file transfer." @@ -4209,125 +4215,125 @@ msgstr "" "Калі выстаўленая гэтая опцыя, Gajim будзе ўжываць для перадачы файлаў " "выстаўленыя IP-адрас і проксі-серверы з параметра file_transfer_proxies." -#: ../src/common/config.py:345 +#: ../src/common/config.py:344 msgid "Answer to receipt requests" msgstr "" -#: ../src/common/config.py:346 +#: ../src/common/config.py:345 msgid "Sent receipt requests" msgstr "" -#: ../src/common/config.py:354 +#: ../src/common/config.py:353 msgid "" "When negotiating an encrypted session, should Gajim assume you want your " "messages to be logged?" msgstr "" -#: ../src/common/config.py:417 +#: ../src/common/config.py:416 msgid "Is OpenPGP enabled for this contact?" msgstr "Ці ўжыты OpenPGP ў размове з гэтым чалавекам?" -#: ../src/common/config.py:418 +#: ../src/common/config.py:417 msgid "" "Should Gajim automatically start an encrypted session with this contact when " "possible?" msgstr "" -#: ../src/common/config.py:419 ../src/common/config.py:422 +#: ../src/common/config.py:418 ../src/common/config.py:421 msgid "Language for which we want to check misspelled words" msgstr "Мова праверкі правапісу" -#: ../src/common/config.py:428 +#: ../src/common/config.py:427 msgid "all or space separated status" msgstr "усе ці падзеленыя прагаламі станы" -#: ../src/common/config.py:429 +#: ../src/common/config.py:428 msgid "'yes', 'no', or 'both'" msgstr "'yes', 'no' ці 'both'" -#: ../src/common/config.py:430 ../src/common/config.py:432 -#: ../src/common/config.py:433 ../src/common/config.py:436 -#: ../src/common/config.py:437 +#: ../src/common/config.py:429 ../src/common/config.py:431 +#: ../src/common/config.py:432 ../src/common/config.py:435 +#: ../src/common/config.py:436 msgid "'yes', 'no' or ''" msgstr "'yes', 'no' ці ''" -#: ../src/common/config.py:443 ../src/common/pep.py:160 +#: ../src/common/config.py:442 ../src/common/pep.py:157 msgid "Sleeping" msgstr "Сон" -#: ../src/common/config.py:444 +#: ../src/common/config.py:443 msgid "Back soon" msgstr "Хутка буду" -#: ../src/common/config.py:444 +#: ../src/common/config.py:443 msgid "Back in some minutes." msgstr "Хутка буду." -#: ../src/common/config.py:445 ../src/common/pep.py:130 +#: ../src/common/config.py:444 ../src/common/pep.py:127 msgid "Eating" msgstr "Ежа" -#: ../src/common/config.py:445 +#: ../src/common/config.py:444 msgid "I'm eating, so leave me a message." msgstr "Ямо, пакіньце мне паведамленне." -#: ../src/common/config.py:446 +#: ../src/common/config.py:445 msgid "Movie" msgstr "Фільм" -#: ../src/common/config.py:446 +#: ../src/common/config.py:445 msgid "I'm watching a movie." msgstr "Гляджу фільм." -#: ../src/common/config.py:447 ../src/common/pep.py:189 +#: ../src/common/config.py:446 ../src/common/pep.py:186 msgid "Working" msgstr "Працую" -#: ../src/common/config.py:447 +#: ../src/common/config.py:446 msgid "I'm working." msgstr "Працую." -#: ../src/common/config.py:448 +#: ../src/common/config.py:447 msgid "Phone" msgstr "Тэлефон" -#: ../src/common/config.py:448 +#: ../src/common/config.py:447 msgid "I'm on the phone." msgstr "Я на тэлефоне." -#: ../src/common/config.py:449 +#: ../src/common/config.py:448 msgid "Out" msgstr "Сышоў" -#: ../src/common/config.py:449 +#: ../src/common/config.py:448 msgid "I'm out enjoying life." msgstr "Я цешуся з жыцця." -#: ../src/common/config.py:460 +#: ../src/common/config.py:459 msgid "I'm available." msgstr "Я даступны." -#: ../src/common/config.py:461 +#: ../src/common/config.py:460 msgid "I'm free for chat." msgstr "Я магу размаўляць." -#: ../src/common/config.py:462 ../src/config.py:1419 +#: ../src/common/config.py:461 ../src/config.py:1478 msgid "Be right back." msgstr "Хутка прыйду." -#: ../src/common/config.py:463 +#: ../src/common/config.py:462 msgid "I'm not available." msgstr "Мяне няма." -#: ../src/common/config.py:464 +#: ../src/common/config.py:463 msgid "Do not disturb." msgstr "Не турбаваць." -#: ../src/common/config.py:465 ../src/common/config.py:466 +#: ../src/common/config.py:464 ../src/common/config.py:465 msgid "Bye!" msgstr "Бывай!" -#: ../src/common/config.py:476 +#: ../src/common/config.py:475 msgid "" "Sound to play when a group chat message contains one of the words in " "muc_highlight_words, or when a group chat message contains your nickname." @@ -4336,107 +4342,106 @@ msgstr "" "вызначаных у параметры muc_highlight_words, ці калі гэтае паведамленне " "ўтрымлівае Вашую мянушку." -#: ../src/common/config.py:477 +#: ../src/common/config.py:476 msgid "Sound to play when any MUC message arrives." msgstr "Прайграць гук пры атрыманні паведамлення MUC." -#: ../src/common/config.py:486 ../src/common/optparser.py:259 +#: ../src/common/config.py:485 ../src/common/optparser.py:302 msgid "green" msgstr "зялёны" -#: ../src/common/config.py:490 ../src/common/optparser.py:245 +#: ../src/common/config.py:489 ../src/common/optparser.py:288 msgid "grocery" msgstr "садавіна" -#: ../src/common/config.py:494 +#: ../src/common/config.py:493 msgid "human" msgstr "чалавек" -#: ../src/common/config.py:498 +#: ../src/common/config.py:497 msgid "marine" msgstr "мора" -#: ../src/common/connection_handlers.py:76 -#: ../src/common/zeroconf/connection_handlers_zeroconf.py:52 +#: ../src/common/connection_handlers.py:83 +#: ../src/common/zeroconf/connection_handlers_zeroconf.py:53 msgid "Unable to load idle module" msgstr "Немагчыма загрузіць модуль idle" -#: ../src/common/connection_handlers.py:244 -#: ../src/common/zeroconf/connection_handlers_zeroconf.py:94 +#: ../src/common/connection_handlers.py:251 msgid "Wrong host" msgstr "Няправільны вузел" -#: ../src/common/connection_handlers.py:245 +#: ../src/common/connection_handlers.py:252 msgid "Invalid local address? :-O" msgstr "" -#: ../src/common/connection_handlers.py:678 +#: ../src/common/connection_handlers.py:696 #, python-format msgid "Registration information for transport %s has not arrived in time" msgstr "Звесткі рэгістрацыі для транспарта %s не прыйшлі ў час" -#: ../src/common/connection_handlers.py:685 +#: ../src/common/connection_handlers.py:703 #, fuzzy msgid "Registration succeeded" msgstr "Зарэгістравацца на %s" -#: ../src/common/connection_handlers.py:686 +#: ../src/common/connection_handlers.py:704 #, python-format msgid "Registration with agent %s succeeded" msgstr "" -#: ../src/common/connection_handlers.py:688 +#: ../src/common/connection_handlers.py:706 #, fuzzy msgid "Registration failed" msgstr "Памылка злучэння" -#: ../src/common/connection_handlers.py:688 +#: ../src/common/connection_handlers.py:706 #, python-format msgid "" "Registration with agent %(agent)s failed with error %(error)s: %(error_msg)s" msgstr "" -#: ../src/common/connection_handlers.py:990 -#: ../src/common/connection_handlers.py:2071 -#: ../src/common/connection_handlers.py:2117 -#: ../src/common/connection_handlers.py:2345 -#: ../src/common/connection_handlers.py:2487 ../src/common/connection.py:1366 -#: ../src/gajim.py:380 +#: ../src/common/connection_handlers.py:1008 +#: ../src/common/connection_handlers.py:2098 +#: ../src/common/connection_handlers.py:2144 +#: ../src/common/connection_handlers.py:2336 +#: ../src/common/connection_handlers.py:2481 ../src/common/connection.py:418 +#: ../src/gajim.py:354 msgid "Disk Write Error" msgstr "" -#: ../src/common/connection_handlers.py:1207 ../src/common/connection.py:935 +#: ../src/common/connection_handlers.py:1225 ../src/common/connection.py:1373 #, fuzzy msgid "Invisibility not supported" msgstr "Пашырэнне не падтрымліваецца" -#: ../src/common/connection_handlers.py:1208 ../src/common/connection.py:936 +#: ../src/common/connection_handlers.py:1226 ../src/common/connection.py:1374 #, python-format msgid "Account %s doesn't support invisibility." msgstr "" -#: ../src/common/connection_handlers.py:1892 ../src/common/connection.py:1181 -#: ../src/config.py:1875 ../src/config.py:1884 ../src/config.py:1943 -#: ../src/config.py:3281 ../src/dataforms_widget.py:555 ../src/dialogs.py:2665 +#: ../src/common/connection_handlers.py:1919 ../src/common/connection.py:233 +#: ../src/config.py:1940 ../src/config.py:1949 ../src/config.py:2008 +#: ../src/config.py:3360 ../src/dataforms_widget.py:577 ../src/dialogs.py:2781 msgid "Invalid Jabber ID" msgstr "Няправільны Jabber ID" -#: ../src/common/connection_handlers.py:1893 +#: ../src/common/connection_handlers.py:1920 msgid "A message from a non-valid JID arrived, it has been ignored." msgstr "" -#: ../src/common/connection_handlers.py:2074 -#: ../src/common/connection_handlers.py:2120 -#: ../src/common/connection_handlers.py:2348 -#: ../src/common/connection_handlers.py:2490 ../src/common/connection.py:1369 -#: ../src/gajim.py:155 ../src/session.py:131 +#: ../src/common/connection_handlers.py:2101 +#: ../src/common/connection_handlers.py:2147 +#: ../src/common/connection_handlers.py:2339 +#: ../src/common/connection_handlers.py:2484 ../src/common/connection.py:421 +#: ../src/gajim.py:155 ../src/session.py:135 #, python-format msgid "" "The database file (%s) cannot be read. Try to repair it (see http://trac." "gajim.org/wiki/DatabaseBackup) or remove it (all history will be lost)." msgstr "" -#: ../src/common/connection_handlers.py:2200 +#: ../src/common/connection_handlers.py:2191 #, python-format msgid "Nickname not allowed: %s" msgstr "Такая мянушка не дазволеная: %s" @@ -4444,77 +4449,77 @@ msgstr "Такая мянушка не дазволеная: %s" #. maximum user number reached #. we are banned #. group chat does not exist -#: ../src/common/connection_handlers.py:2295 +#: ../src/common/connection_handlers.py:2286 +#: ../src/common/connection_handlers.py:2294 +#: ../src/common/connection_handlers.py:2300 #: ../src/common/connection_handlers.py:2303 -#: ../src/common/connection_handlers.py:2309 -#: ../src/common/connection_handlers.py:2312 -#: ../src/common/connection_handlers.py:2315 -#: ../src/common/connection_handlers.py:2319 ../src/gajim.py:523 +#: ../src/common/connection_handlers.py:2306 +#: ../src/common/connection_handlers.py:2310 ../src/gui_interface.py:128 msgid "Unable to join group chat" msgstr "Немагчыма ўвайсці ў групавую размову" -#: ../src/common/connection_handlers.py:2296 +#: ../src/common/connection_handlers.py:2287 #, python-format msgid "Maximum number of users for %s has been reached" msgstr "" -#: ../src/common/connection_handlers.py:2304 +#: ../src/common/connection_handlers.py:2295 #, fuzzy, python-format msgid "You are banned from group chat %s." msgstr "Вам забаронена казанне ў гэтай групавой размове." -#: ../src/common/connection_handlers.py:2310 +#: ../src/common/connection_handlers.py:2301 #, fuzzy, python-format msgid "Group chat %s does not exist." msgstr "Такой групавой размовы няма." -#: ../src/common/connection_handlers.py:2313 +#: ../src/common/connection_handlers.py:2304 msgid "Group chat creation is restricted." msgstr "Стварэнне групавых размоў абмежаванае." -#: ../src/common/connection_handlers.py:2316 +#: ../src/common/connection_handlers.py:2307 #, fuzzy, python-format msgid "Your registered nickname must be used in group chat %s." msgstr "Вы павінны карыстацца зарэгістраванай для Вас мянушкай." -#: ../src/common/connection_handlers.py:2320 +#: ../src/common/connection_handlers.py:2311 #, fuzzy, python-format msgid "You are not in the members list in groupchat %s." msgstr "Вас няма ў спісе ўдзельнікаў." #. Room has been destroyed. see #. http://www.xmpp.org/extensions/xep-0045.html#destroyroom -#: ../src/common/connection_handlers.py:2363 +#: ../src/common/connection_handlers.py:2354 #, fuzzy msgid "Room has been destroyed" msgstr "Аўтарызацыя забраная" -#: ../src/common/connection_handlers.py:2371 +#: ../src/common/connection_handlers.py:2362 #, python-format msgid "You can join this room instead: %s" msgstr "" -#: ../src/common/connection_handlers.py:2402 +#: ../src/common/connection_handlers.py:2393 msgid "I would like to add you to my roster." msgstr "Я хачу дадаць Вас у мой кантактны ліст." #. BE CAREFUL: no con.updateRosterItem() in a callback -#: ../src/common/connection_handlers.py:2423 +#: ../src/common/connection_handlers.py:2414 #, python-format msgid "we are now subscribed to %s" msgstr "цяпер падпісаны на %s" -#: ../src/common/connection_handlers.py:2425 +#: ../src/common/connection_handlers.py:2416 #, python-format msgid "unsubscribe request from %s" msgstr "запыт адпіскі ад %s" -#: ../src/common/connection_handlers.py:2427 +#: ../src/common/connection_handlers.py:2418 #, python-format msgid "we are now unsubscribed from %s" msgstr "цяпер адпісаны ад %s" -#: ../src/common/connection_handlers.py:2619 +#: ../src/common/connection_handlers.py:2613 #, python-format msgid "" "JID %s is not RFC compliant. It will not be added to your roster. Use roster " @@ -4654,142 +4659,28 @@ msgstr "" msgid "Application verification failure" msgstr "" -#: ../src/common/connection.py:278 -#: ../src/common/zeroconf/connection_zeroconf.py:215 -#, python-format -msgid "Connection with account \"%s\" has been lost" -msgstr "Злучэнне для рахунка \"%s\" згубленае" - -#: ../src/common/connection.py:279 -msgid "Reconnect manually." -msgstr "Перадалучыцеся самастойна." - -#: ../src/common/connection.py:290 -#, fuzzy, python-format -msgid "Server %(name)s answered wrongly to register request: %(error)s" -msgstr "Транспарт %s некарэктна адказаў, каб зарэгістраваць запыт: %s" - -#: ../src/common/connection.py:324 -#, python-format -msgid "Server %s provided a different registration form" -msgstr "" - -#: ../src/common/connection.py:337 -#, python-format -msgid "Unknown SSL error: %d" -msgstr "" - -#. wrong answer -#: ../src/common/connection.py:352 -msgid "Invalid answer" -msgstr "Няправільны адказ" - -#: ../src/common/connection.py:353 -#, fuzzy, python-format -msgid "Transport %(name)s answered wrongly to register request: %(error)s" -msgstr "Транспарт %s некарэктна адказаў, каб зарэгістраваць запыт: %s" - -#: ../src/common/connection.py:636 ../src/common/connection.py:765 -#: ../src/common/connection.py:1526 -#: ../src/common/zeroconf/connection_zeroconf.py:249 -#, python-format -msgid "Could not connect to \"%s\"" -msgstr "Немагчыма злучыцца з \"%s\"" - -#: ../src/common/connection.py:637 ../src/gajim.py:1094 -msgid "Check your connection or try again later." -msgstr "Праверце злучэнне, альбо паспрабуйце пазней." - -#: ../src/common/connection.py:642 -#, fuzzy, python-format -msgid "Server replied: %s" -msgstr "Захаваць у: %s" - -#: ../src/common/connection.py:655 -#, fuzzy -msgid "Connection to proxy failed" -msgstr "Памылка злучэння" - -#: ../src/common/connection.py:686 ../src/common/connection.py:745 -#, fuzzy, python-format -msgid "Could not connect to account %s" -msgstr "Немагчыма злучыцца з \"%s\"" - -#: ../src/common/connection.py:687 ../src/common/connection.py:746 -#, fuzzy, python-format -msgid "Connection with account %s has been lost. Retry connecting." -msgstr "Злучэнне для рахунка \"%s\" згубленае" - -#: ../src/common/connection.py:712 -#, python-format -msgid "The authenticity of the %s certificate could be invalid." -msgstr "" - -#: ../src/common/connection.py:715 -#, python-format -msgid "" -"\n" -"SSL Error: %s" -msgstr "" - -#: ../src/common/connection.py:717 -#, python-format -msgid "" -"\n" -"Unknown SSL error: %d" -msgstr "" - -#: ../src/common/connection.py:766 -msgid "Check your connection or try again later" -msgstr "Праверце злучэнне альбо паспрабуйце пазней" - -#: ../src/common/connection.py:794 -#, python-format -msgid "Authentication failed with \"%s\"" -msgstr "Памылка аўтарызацыі з \"%s\"" - -#: ../src/common/connection.py:796 -msgid "Please check your login and password for correctness." -msgstr "Праверце звесткі аўтарызацыі." - -#: ../src/common/connection.py:862 -msgid "Error while removing privacy list" -msgstr "Памылка ў часе выдалення спіса прыватнасці" - -#: ../src/common/connection.py:863 -#, fuzzy, python-format -msgid "" -"Privacy list %s has not been removed. It is maybe active in one of your " -"connected resources. Deactivate it and try again." -msgstr "" -"Спіс прыватнасці %s не выдалены. Магчыма, ён ужываецца ў адным з Вашых " -"злучаных рэсурсаў. Дэактывізуйце іх і паўтарыце свае дзеянні." - -#: ../src/common/connection.py:1182 ../src/dialogs.py:2666 +#: ../src/common/connection.py:234 ../src/dialogs.py:2782 #, fuzzy, python-format msgid "It is not possible to send a message to %s, this JID is not valid." msgstr "Немагчыма адправіць пусты файл" -#: ../src/common/connection.py:1204 -#: ../src/common/zeroconf/connection_zeroconf.py:389 +#: ../src/common/connection.py:256 msgid "Neither the remote presence is signed, nor a key was assigned." msgstr "" -#: ../src/common/connection.py:1206 -#: ../src/common/zeroconf/connection_zeroconf.py:391 +#: ../src/common/connection.py:259 #, python-format msgid "The contact's key (%s) does not match the key assigned in Gajim." msgstr "" #. we're not english #. one in locale and one en -#: ../src/common/connection.py:1254 +#: ../src/common/connection.py:307 #, fuzzy msgid "[This message is *encrypted* (See :XEP:`27`]" msgstr "[Гэтае паведамленне *зашыфраванае* (Гл.:JEP:`27`]" -#: ../src/common/connection.py:1356 -#: ../src/common/zeroconf/connection_zeroconf.py:468 +#: ../src/common/connection.py:408 #, fuzzy, python-format msgid "" "Subject: %(subject)s\n" @@ -4798,44 +4689,155 @@ msgstr "" "Тэма: %s\n" "%s" -#: ../src/common/connection.py:1383 +#: ../src/common/connection.py:721 +#, python-format +msgid "Connection with account \"%s\" has been lost" +msgstr "Злучэнне для рахунка \"%s\" згубленае" + +#: ../src/common/connection.py:722 +msgid "Reconnect manually." +msgstr "Перадалучыцеся самастойна." + +#: ../src/common/connection.py:734 +#, fuzzy, python-format +msgid "Server %(name)s answered wrongly to register request: %(error)s" +msgstr "Транспарт %s некарэктна адказаў, каб зарэгістраваць запыт: %s" + +#: ../src/common/connection.py:768 +#, python-format +msgid "Server %s provided a different registration form" +msgstr "" + +#: ../src/common/connection.py:781 +#, python-format +msgid "Unknown SSL error: %d" +msgstr "" + +#. wrong answer +#: ../src/common/connection.py:796 +msgid "Invalid answer" +msgstr "Няправільны адказ" + +#: ../src/common/connection.py:797 +#, fuzzy, python-format +msgid "Transport %(name)s answered wrongly to register request: %(error)s" +msgstr "Транспарт %s некарэктна адказаў, каб зарэгістраваць запыт: %s" + +#: ../src/common/connection.py:1075 ../src/common/connection.py:1204 +#: ../src/common/connection.py:1673 +#: ../src/common/zeroconf/connection_zeroconf.py:189 +#, python-format +msgid "Could not connect to \"%s\"" +msgstr "Немагчыма злучыцца з \"%s\"" + +#: ../src/common/connection.py:1076 ../src/gui_interface.py:705 +msgid "Check your connection or try again later." +msgstr "Праверце злучэнне, альбо паспрабуйце пазней." + +#: ../src/common/connection.py:1081 +#, fuzzy, python-format +msgid "Server replied: %s" +msgstr "Захаваць у: %s" + +#: ../src/common/connection.py:1094 +#, fuzzy +msgid "Connection to proxy failed" +msgstr "Памылка злучэння" + +#: ../src/common/connection.py:1125 ../src/common/connection.py:1184 +#, fuzzy, python-format +msgid "Could not connect to account %s" +msgstr "Немагчыма злучыцца з \"%s\"" + +#: ../src/common/connection.py:1126 ../src/common/connection.py:1185 +#, fuzzy, python-format +msgid "Connection with account %s has been lost. Retry connecting." +msgstr "Злучэнне для рахунка \"%s\" згубленае" + +#: ../src/common/connection.py:1151 +#, python-format +msgid "The authenticity of the %s certificate could be invalid." +msgstr "" + +#: ../src/common/connection.py:1154 +#, python-format +msgid "" +"\n" +"SSL Error: %s" +msgstr "" + +#: ../src/common/connection.py:1156 +#, python-format +msgid "" +"\n" +"Unknown SSL error: %d" +msgstr "" + +#: ../src/common/connection.py:1205 +msgid "Check your connection or try again later" +msgstr "Праверце злучэнне альбо паспрабуйце пазней" + +#: ../src/common/connection.py:1236 +#, python-format +msgid "Authentication failed with \"%s\"" +msgstr "Памылка аўтарызацыі з \"%s\"" + +#: ../src/common/connection.py:1238 +msgid "Please check your login and password for correctness." +msgstr "Праверце звесткі аўтарызацыі." + +#: ../src/common/connection.py:1300 +msgid "Error while removing privacy list" +msgstr "Памылка ў часе выдалення спіса прыватнасці" + +#: ../src/common/connection.py:1301 +#, fuzzy, python-format +msgid "" +"Privacy list %s has not been removed. It is maybe active in one of your " +"connected resources. Deactivate it and try again." +msgstr "" +"Спіс прыватнасці %s не выдалены. Магчыма, ён ужываецца ў адным з Вашых " +"злучаных рэсурсаў. Дэактывізуйце іх і паўтарыце свае дзеянні." + +#: ../src/common/connection.py:1541 #, python-format msgid "Sent contact: \"%s\" (%s)" msgstr "" -#: ../src/common/connection.py:1386 +#: ../src/common/connection.py:1544 #, fuzzy msgid "Sent contacts:" msgstr "Людзі" -#: ../src/common/connection.py:1559 ../src/common/connection.py:1580 +#: ../src/common/connection.py:1703 ../src/common/connection.py:1724 msgid "Not fetched because of invisible status" msgstr "Не атрымана з-за нябачнага стану" -#: ../src/common/connection.py:1982 +#: ../src/common/connection.py:2106 #, fuzzy msgid "Unregister failed" msgstr "Памылка злучэння" -#: ../src/common/connection.py:1983 +#: ../src/common/connection.py:2107 #, python-format msgid "Unregistration with server %(server)s failed: %(error)s" msgstr "" -#: ../src/common/contacts.py:92 ../src/common/helpers.py:55 -#: ../src/gajim.py:999 +#: ../src/common/contacts.py:129 ../src/common/helpers.py:55 +#: ../src/gui_interface.py:610 msgid "Observers" msgstr "Назіральнікі" -#: ../src/common/contacts.py:96 ../src/common/contacts.py:348 +#: ../src/common/contacts.py:133 ../src/common/contacts.py:335 #: ../src/common/helpers.py:55 ../src/disco.py:119 ../src/disco.py:120 -#: ../src/disco.py:1354 ../src/gajim.py:802 ../src/roster_window.py:847 -#: ../src/roster_window.py:1549 ../src/roster_window.py:1618 -#: ../src/roster_window.py:1620 ../src/roster_window.py:1773 +#: ../src/disco.py:1464 ../src/gui_interface.py:413 +#: ../src/roster_window.py:848 ../src/roster_window.py:1501 +#: ../src/roster_window.py:1572 ../src/roster_window.py:1574 +#: ../src/roster_window.py:1732 msgid "Transports" msgstr "Транспарты" -#: ../src/common/contacts.py:356 +#: ../src/common/contacts.py:343 msgid "Not in roster" msgstr "Няма ў спісе" @@ -5082,7 +5084,7 @@ msgstr "Магу размаўляць" msgid "_Available" msgstr "_Тут" -#: ../src/common/helpers.py:212 ../src/features_window.py:116 +#: ../src/common/helpers.py:212 ../src/features_window.py:118 msgid "Available" msgstr "Тут" @@ -5200,48 +5202,48 @@ msgid "has closed the chat window or tab" msgstr "закрыў вакно / картку размовы" #. GiB means gibibyte -#: ../src/common/helpers.py:658 +#: ../src/common/helpers.py:588 #, python-format msgid "%s GiB" msgstr "%s ГіБ" #. GB means gigabyte -#: ../src/common/helpers.py:661 +#: ../src/common/helpers.py:591 #, python-format msgid "%s GB" msgstr "%s ГБ" #. MiB means mibibyte -#: ../src/common/helpers.py:665 +#: ../src/common/helpers.py:595 #, python-format msgid "%s MiB" msgstr "%s МіБ" #. MB means megabyte -#: ../src/common/helpers.py:668 +#: ../src/common/helpers.py:598 #, python-format msgid "%s MB" msgstr "%s МБ" #. KiB means kibibyte -#: ../src/common/helpers.py:672 +#: ../src/common/helpers.py:602 #, python-format msgid "%s KiB" msgstr "%s кiБ" #. KB means kilo bytes -#: ../src/common/helpers.py:675 +#: ../src/common/helpers.py:605 #, python-format msgid "%s KB" msgstr "%s кБ" #. B means bytes -#: ../src/common/helpers.py:678 +#: ../src/common/helpers.py:608 #, python-format msgid "%s B" msgstr "%s Б" -#: ../src/common/helpers.py:1166 ../src/common/helpers.py:1173 +#: ../src/common/helpers.py:1049 ../src/common/helpers.py:1056 #, fuzzy, python-format msgid "%d message pending" msgid_plural "%d messages pending" @@ -5249,22 +5251,22 @@ msgstr[0] "Адправіць паведамленне" msgstr[1] "Адправіць паведамленне" msgstr[2] "Адправіць паведамленне" -#: ../src/common/helpers.py:1179 +#: ../src/common/helpers.py:1062 #, python-format msgid " from room %s" msgstr "" -#: ../src/common/helpers.py:1182 ../src/common/helpers.py:1201 +#: ../src/common/helpers.py:1065 ../src/common/helpers.py:1084 #, python-format msgid " from user %s" msgstr "" -#: ../src/common/helpers.py:1184 +#: ../src/common/helpers.py:1067 #, python-format msgid " from %s" msgstr "" -#: ../src/common/helpers.py:1191 ../src/common/helpers.py:1198 +#: ../src/common/helpers.py:1074 ../src/common/helpers.py:1081 #, python-format msgid "%d event pending" msgid_plural "%d events pending" @@ -5272,7 +5274,7 @@ msgstr[0] "" msgstr[1] "" msgstr[2] "" -#: ../src/common/helpers.py:1231 +#: ../src/common/helpers.py:1114 #, python-format msgid "Gajim - %s" msgstr "Gajim - %s" @@ -5288,16 +5290,16 @@ msgid "%s is not a valid loglevel" msgstr "" #. we talk about a file -#: ../src/common/optparser.py:57 +#: ../src/common/optparser.py:59 #, python-format msgid "error: cannot open %s for reading" msgstr "памылка: немагчыма прачытаць %s" -#: ../src/common/optparser.py:254 ../src/common/optparser.py:255 +#: ../src/common/optparser.py:297 ../src/common/optparser.py:298 msgid "cyan" msgstr "cyan" -#: ../src/common/optparser.py:371 +#: ../src/common/optparser.py:373 msgid "migrating logs database to indices" msgstr "перанос базы журналаў у індэкс" @@ -5306,705 +5308,724 @@ msgstr "перанос базы журналаў у індэкс" msgid "XMPP account %s@%s" msgstr "рахунка %s" -#: ../src/common/pep.py:30 +#: ../src/common/pep.py:27 msgid "Afraid" msgstr "" -#: ../src/common/pep.py:31 +#: ../src/common/pep.py:28 msgid "Amazed" msgstr "" -#: ../src/common/pep.py:32 +#: ../src/common/pep.py:29 msgid "Amorous" msgstr "" -#: ../src/common/pep.py:33 +#: ../src/common/pep.py:30 msgid "Angry" msgstr "" -#: ../src/common/pep.py:34 +#: ../src/common/pep.py:31 msgid "Annoyed" msgstr "" -#: ../src/common/pep.py:35 +#: ../src/common/pep.py:32 msgid "Anxious" msgstr "" -#: ../src/common/pep.py:36 +#: ../src/common/pep.py:33 #, fuzzy msgid "Aroused" msgstr "Прыпынена" -#: ../src/common/pep.py:37 +#: ../src/common/pep.py:34 msgid "Ashamed" msgstr "" -#: ../src/common/pep.py:38 +#: ../src/common/pep.py:35 #, fuzzy msgid "Bored" msgstr "Тлусты" -#: ../src/common/pep.py:39 +#: ../src/common/pep.py:36 #, fuzzy msgid "Brave" msgstr "Мае " -#: ../src/common/pep.py:40 +#: ../src/common/pep.py:37 msgid "Calm" msgstr "" -#: ../src/common/pep.py:41 +#: ../src/common/pep.py:38 #, fuzzy msgid "Cautious" msgstr "Размовы" -#: ../src/common/pep.py:42 +#: ../src/common/pep.py:39 #, fuzzy msgid "Cold" msgstr "Тлусты" -#: ../src/common/pep.py:43 +#: ../src/common/pep.py:40 #, fuzzy msgid "Confident" msgstr "_Змест" -#: ../src/common/pep.py:44 +#: ../src/common/pep.py:41 msgid "Confused" msgstr "" -#: ../src/common/pep.py:45 +#: ../src/common/pep.py:42 #, fuzzy msgid "Contemplative" msgstr "Скончаная" -#: ../src/common/pep.py:46 +#: ../src/common/pep.py:43 #, fuzzy msgid "Contented" msgstr "_Змест" -#: ../src/common/pep.py:47 +#: ../src/common/pep.py:44 msgid "Cranky" msgstr "" -#: ../src/common/pep.py:48 +#: ../src/common/pep.py:45 msgid "Crazy" msgstr "" -#: ../src/common/pep.py:49 +#: ../src/common/pep.py:46 #, fuzzy msgid "Creative" msgstr "Неактывізаваны" -#: ../src/common/pep.py:50 +#: ../src/common/pep.py:47 #, fuzzy msgid "Curious" msgstr "спасылка" -#: ../src/common/pep.py:51 +#: ../src/common/pep.py:48 #, fuzzy msgid "Dejected" msgstr "Выдаліць" -#: ../src/common/pep.py:52 +#: ../src/common/pep.py:49 msgid "Depressed" msgstr "" -#: ../src/common/pep.py:53 +#: ../src/common/pep.py:50 #, fuzzy msgid "Disappointed" msgstr "Адключана" -#: ../src/common/pep.py:54 +#: ../src/common/pep.py:51 msgid "Disgusted" msgstr "" -#: ../src/common/pep.py:55 +#: ../src/common/pep.py:52 #, fuzzy msgid "Dismayed" msgstr "Адключана" -#: ../src/common/pep.py:56 +#: ../src/common/pep.py:53 #, fuzzy msgid "Distracted" msgstr "Адключана" -#: ../src/common/pep.py:57 +#: ../src/common/pep.py:54 msgid "Embarrassed" msgstr "" -#: ../src/common/pep.py:58 +#: ../src/common/pep.py:55 msgid "Envious" msgstr "" -#: ../src/common/pep.py:59 +#: ../src/common/pep.py:56 #, fuzzy msgid "Excited" msgstr "Актывізаваны" -#: ../src/common/pep.py:60 +#: ../src/common/pep.py:57 msgid "Flirtatious" msgstr "" -#: ../src/common/pep.py:61 +#: ../src/common/pep.py:58 msgid "Frustrated" msgstr "" -#: ../src/common/pep.py:62 +#: ../src/common/pep.py:59 msgid "Grateful" msgstr "" -#: ../src/common/pep.py:63 +#: ../src/common/pep.py:60 msgid "Grieving" msgstr "" -#: ../src/common/pep.py:64 +#: ../src/common/pep.py:61 #, fuzzy msgid "Grumpy" msgstr "Група" -#: ../src/common/pep.py:65 +#: ../src/common/pep.py:62 msgid "Guilty" msgstr "" -#: ../src/common/pep.py:66 +#: ../src/common/pep.py:63 msgid "Happy" msgstr "" -#: ../src/common/pep.py:67 +#: ../src/common/pep.py:64 msgid "Hopeful" msgstr "" -#: ../src/common/pep.py:68 +#: ../src/common/pep.py:65 #, fuzzy msgid "Hot" msgstr "_Вузел:" -#: ../src/common/pep.py:69 +#: ../src/common/pep.py:66 msgid "Humbled" msgstr "" -#: ../src/common/pep.py:70 +#: ../src/common/pep.py:67 msgid "Humiliated" msgstr "" -#: ../src/common/pep.py:71 +#: ../src/common/pep.py:68 msgid "Hungry" msgstr "" -#: ../src/common/pep.py:72 +#: ../src/common/pep.py:69 msgid "Hurt" msgstr "" -#: ../src/common/pep.py:73 +#: ../src/common/pep.py:70 #, fuzzy msgid "Impressed" msgstr "паведамленне" -#: ../src/common/pep.py:74 +#: ../src/common/pep.py:71 msgid "In Awe" msgstr "" -#: ../src/common/pep.py:75 +#: ../src/common/pep.py:72 msgid "In Love" msgstr "" -#: ../src/common/pep.py:76 +#: ../src/common/pep.py:73 msgid "Indignant" msgstr "" -#: ../src/common/pep.py:77 +#: ../src/common/pep.py:74 msgid "Interested" msgstr "" -#: ../src/common/pep.py:78 +#: ../src/common/pep.py:75 #, fuzzy msgid "Intoxicated" msgstr "Актывізаваны" -#: ../src/common/pep.py:79 +#: ../src/common/pep.py:76 #, fuzzy msgid "Invincible" msgstr "Нябачны" -#: ../src/common/pep.py:80 +#: ../src/common/pep.py:77 msgid "Jealous" msgstr "" -#: ../src/common/pep.py:81 +#: ../src/common/pep.py:78 #, fuzzy msgid "Lonely" msgstr "адзін" -#: ../src/common/pep.py:82 +#: ../src/common/pep.py:79 #, fuzzy msgid "Lost" msgstr "_Вузел:" -#: ../src/common/pep.py:83 +#: ../src/common/pep.py:80 msgid "Lucky" msgstr "" -#: ../src/common/pep.py:84 +#: ../src/common/pep.py:81 #, fuzzy msgid "Mean" msgstr "Нямецкая" -#: ../src/common/pep.py:85 +#: ../src/common/pep.py:82 #, fuzzy msgid "Moody" msgstr "_Змяніць" -#: ../src/common/pep.py:86 +#: ../src/common/pep.py:83 msgid "Nervous" msgstr "" -#: ../src/common/pep.py:87 +#: ../src/common/pep.py:84 msgid "Neutral" msgstr "" -#: ../src/common/pep.py:88 +#: ../src/common/pep.py:85 #, fuzzy msgid "Offended" msgstr "Адключаны" -#: ../src/common/pep.py:89 +#: ../src/common/pep.py:86 msgid "Outraged" msgstr "" -#: ../src/common/pep.py:90 +#: ../src/common/pep.py:87 msgid "Playful" msgstr "" -#: ../src/common/pep.py:91 +#: ../src/common/pep.py:88 #, fuzzy msgid "Proud" msgstr "Група" -#: ../src/common/pep.py:92 +#: ../src/common/pep.py:89 msgid "Relaxed" msgstr "" -#: ../src/common/pep.py:93 +#: ../src/common/pep.py:90 #, fuzzy msgid "Relieved" msgstr "адзінаццаць" -#: ../src/common/pep.py:94 +#: ../src/common/pep.py:91 msgid "Remorseful" msgstr "" -#: ../src/common/pep.py:95 +#: ../src/common/pep.py:92 msgid "Restless" msgstr "" -#: ../src/common/pep.py:96 +#: ../src/common/pep.py:93 #, fuzzy msgid "Sad" msgstr "Марнаванне часу" -#: ../src/common/pep.py:97 +#: ../src/common/pep.py:94 msgid "Sarcastic" msgstr "" -#: ../src/common/pep.py:98 +#: ../src/common/pep.py:95 #, fuzzy msgid "Satisfied" msgstr "Апошняя змена:" -#: ../src/common/pep.py:99 +#: ../src/common/pep.py:96 msgid "Serious" msgstr "" -#: ../src/common/pep.py:100 +#: ../src/common/pep.py:97 msgid "Shocked" msgstr "" -#: ../src/common/pep.py:101 +#: ../src/common/pep.py:98 msgid "Shy" msgstr "" -#: ../src/common/pep.py:102 +#: ../src/common/pep.py:99 #, fuzzy msgid "Sick" msgstr "Мянушка" -#: ../src/common/pep.py:103 +#: ../src/common/pep.py:100 #, fuzzy msgid "Sleepy" msgstr "Сон" -#: ../src/common/pep.py:104 +#: ../src/common/pep.py:101 msgid "Spontaneous" msgstr "" -#: ../src/common/pep.py:105 +#: ../src/common/pep.py:102 #, fuzzy msgid "Stressed" msgstr "Вуліца:" -#: ../src/common/pep.py:106 +#: ../src/common/pep.py:103 msgid "Strong" msgstr "" -#: ../src/common/pep.py:107 +#: ../src/common/pep.py:104 #, fuzzy msgid "Surprised" msgstr "Падпісаны" -#: ../src/common/pep.py:108 +#: ../src/common/pep.py:105 msgid "Thankful" msgstr "" -#: ../src/common/pep.py:109 +#: ../src/common/pep.py:106 msgid "Thirsty" msgstr "" -#: ../src/common/pep.py:110 +#: ../src/common/pep.py:107 #, fuzzy msgid "Tired" msgstr "Час" -#: ../src/common/pep.py:111 +#: ../src/common/pep.py:108 #, fuzzy msgid "Undefined" msgstr "дзевяць" -#: ../src/common/pep.py:112 +#: ../src/common/pep.py:109 msgid "Weak" msgstr "" -#: ../src/common/pep.py:113 +#: ../src/common/pep.py:110 msgid "Worried" msgstr "" -#: ../src/common/pep.py:116 +#: ../src/common/pep.py:113 #, fuzzy msgid "Doing Chores" msgstr "Няправільны вузел" -#: ../src/common/pep.py:117 +#: ../src/common/pep.py:114 msgid "Buying Groceries" msgstr "" -#: ../src/common/pep.py:118 +#: ../src/common/pep.py:115 #, fuzzy msgid "Cleaning" msgstr "Вечар" -#: ../src/common/pep.py:119 +#: ../src/common/pep.py:116 #, fuzzy msgid "Cooking" msgstr "Піша" -#: ../src/common/pep.py:120 +#: ../src/common/pep.py:117 msgid "Doing Maintenance" msgstr "" -#: ../src/common/pep.py:121 +#: ../src/common/pep.py:118 msgid "Doing the Dishes" msgstr "" -#: ../src/common/pep.py:122 +#: ../src/common/pep.py:119 msgid "Doing the Laundry" msgstr "" -#: ../src/common/pep.py:123 +#: ../src/common/pep.py:120 #, fuzzy msgid "Gardening" msgstr "Раніца" -#: ../src/common/pep.py:124 +#: ../src/common/pep.py:121 msgid "Running an Errand" msgstr "" -#: ../src/common/pep.py:125 +#: ../src/common/pep.py:122 #, fuzzy msgid "Walking the Dog" msgstr "усе з групы" -#: ../src/common/pep.py:126 +#: ../src/common/pep.py:123 #, fuzzy msgid "Drinking" msgstr "Працую" -#: ../src/common/pep.py:127 +#: ../src/common/pep.py:124 msgid "Having a Beer" msgstr "" -#: ../src/common/pep.py:128 +#: ../src/common/pep.py:125 msgid "Having Coffee" msgstr "" -#: ../src/common/pep.py:129 +#: ../src/common/pep.py:126 msgid "Having Tea" msgstr "" -#: ../src/common/pep.py:131 +#: ../src/common/pep.py:128 msgid "Having a Snack" msgstr "" -#: ../src/common/pep.py:132 +#: ../src/common/pep.py:129 msgid "Having Breakfast" msgstr "" -#: ../src/common/pep.py:133 +#: ../src/common/pep.py:130 msgid "Having Dinner" msgstr "" -#: ../src/common/pep.py:134 +#: ../src/common/pep.py:131 msgid "Having Lunch" msgstr "" -#: ../src/common/pep.py:135 +#: ../src/common/pep.py:132 msgid "Exercising" msgstr "" -#: ../src/common/pep.py:136 ../src/common/pep.py:181 +#: ../src/common/pep.py:133 ../src/common/pep.py:178 msgid "Cycling" msgstr "" -#: ../src/common/pep.py:137 +#: ../src/common/pep.py:134 #, fuzzy msgid "Dancing" msgstr "Вечар" -#: ../src/common/pep.py:138 +#: ../src/common/pep.py:135 #, fuzzy msgid "Hiking" msgstr "Пакаранне %s" -#: ../src/common/pep.py:139 +#: ../src/common/pep.py:136 #, fuzzy msgid "Jogging" msgstr "_Далучыцца" -#: ../src/common/pep.py:140 +#: ../src/common/pep.py:137 msgid "Playing Sports" msgstr "" -#: ../src/common/pep.py:141 +#: ../src/common/pep.py:138 msgid "Running" msgstr "" -#: ../src/common/pep.py:142 +#: ../src/common/pep.py:139 #, fuzzy msgid "Skiing" msgstr "Працую" -#: ../src/common/pep.py:143 +#: ../src/common/pep.py:140 msgid "Swimming" msgstr "" -#: ../src/common/pep.py:144 +#: ../src/common/pep.py:141 #, fuzzy msgid "Working out" msgstr "Працую" -#: ../src/common/pep.py:145 +#: ../src/common/pep.py:142 #, fuzzy msgid "Grooming" msgstr "пакой" -#: ../src/common/pep.py:146 +#: ../src/common/pep.py:143 msgid "At the Spa" msgstr "" -#: ../src/common/pep.py:147 +#: ../src/common/pep.py:144 msgid "Brushing Teeth" msgstr "" -#: ../src/common/pep.py:148 +#: ../src/common/pep.py:145 msgid "Getting a Haircut" msgstr "" -#: ../src/common/pep.py:149 +#: ../src/common/pep.py:146 #, fuzzy msgid "Shaving" msgstr "Ежа" -#: ../src/common/pep.py:150 +#: ../src/common/pep.py:147 msgid "Taking a Bath" msgstr "" -#: ../src/common/pep.py:151 +#: ../src/common/pep.py:148 msgid "Taking a Shower" msgstr "" -#: ../src/common/pep.py:152 +#: ../src/common/pep.py:149 msgid "Having an Appointment" msgstr "" -#: ../src/common/pep.py:154 +#: ../src/common/pep.py:151 msgid "Day Off" msgstr "" -#: ../src/common/pep.py:155 +#: ../src/common/pep.py:152 #, fuzzy msgid "Hanging out" msgstr "Змяненне тэмы" -#: ../src/common/pep.py:156 +#: ../src/common/pep.py:153 #, fuzzy msgid "Hiding" msgstr "Пакаранне %s" -#: ../src/common/pep.py:157 +#: ../src/common/pep.py:154 msgid "On Vacation" msgstr "" -#: ../src/common/pep.py:158 +#: ../src/common/pep.py:155 #, fuzzy msgid "Praying" msgstr "Ежа" -#: ../src/common/pep.py:159 +#: ../src/common/pep.py:156 msgid "Scheduled Holiday" msgstr "" -#: ../src/common/pep.py:161 +#: ../src/common/pep.py:158 #, fuzzy msgid "Thinking" msgstr "Працую" -#: ../src/common/pep.py:162 +#: ../src/common/pep.py:159 msgid "Relaxing" msgstr "" -#: ../src/common/pep.py:163 +#: ../src/common/pep.py:160 #, fuzzy msgid "Fishing" msgstr "Пакаранне %s" -#: ../src/common/pep.py:164 +#: ../src/common/pep.py:161 #, fuzzy msgid "Gaming" msgstr "Ежа" -#: ../src/common/pep.py:165 +#: ../src/common/pep.py:162 #, fuzzy msgid "Going out" msgstr "З_ысці" -#: ../src/common/pep.py:166 +#: ../src/common/pep.py:163 #, fuzzy msgid "Partying" msgstr "Ежа" -#: ../src/common/pep.py:167 +#: ../src/common/pep.py:164 #, fuzzy msgid "Reading" msgstr "Прычына" -#: ../src/common/pep.py:168 +#: ../src/common/pep.py:165 #, fuzzy msgid "Rehearsing" msgstr "Прычына" -#: ../src/common/pep.py:169 +#: ../src/common/pep.py:166 #, fuzzy msgid "Shopping" msgstr "Сон" -#: ../src/common/pep.py:170 +#: ../src/common/pep.py:167 #, fuzzy msgid "Smoking" msgstr "Працую" -#: ../src/common/pep.py:171 +#: ../src/common/pep.py:168 msgid "Socializing" msgstr "" -#: ../src/common/pep.py:172 +#: ../src/common/pep.py:169 #, fuzzy msgid "Sunbathing" msgstr "Ежа" -#: ../src/common/pep.py:173 +#: ../src/common/pep.py:170 msgid "Watching TV" msgstr "" -#: ../src/common/pep.py:174 +#: ../src/common/pep.py:171 #, fuzzy msgid "Watching a Movie" msgstr "Гляджу фільм." -#: ../src/common/pep.py:175 +#: ../src/common/pep.py:172 #, fuzzy msgid "Talking" msgstr "Ежа" -#: ../src/common/pep.py:176 +#: ../src/common/pep.py:173 msgid "In Real Life" msgstr "" -#: ../src/common/pep.py:177 +#: ../src/common/pep.py:174 #, fuzzy msgid "On the Phone" msgstr "Я на тэлефоне." -#: ../src/common/pep.py:178 +#: ../src/common/pep.py:175 msgid "On Video Phone" msgstr "" -#: ../src/common/pep.py:179 +#: ../src/common/pep.py:176 #, fuzzy msgid "Traveling" msgstr "Перадача" -#: ../src/common/pep.py:180 +#: ../src/common/pep.py:177 #, fuzzy msgid "Commuting" msgstr "Піша" -#: ../src/common/pep.py:182 +#: ../src/common/pep.py:179 msgid "Driving" msgstr "" -#: ../src/common/pep.py:183 +#: ../src/common/pep.py:180 msgid "In a Car" msgstr "" -#: ../src/common/pep.py:184 +#: ../src/common/pep.py:181 msgid "On a Bus" msgstr "" -#: ../src/common/pep.py:185 +#: ../src/common/pep.py:182 #, fuzzy msgid "On a Plane" msgstr "У сетцы" -#: ../src/common/pep.py:186 +#: ../src/common/pep.py:183 #, fuzzy msgid "On a Train" msgstr "Адкрыць _спасылку" -#: ../src/common/pep.py:187 +#: ../src/common/pep.py:184 msgid "On a Trip" msgstr "" -#: ../src/common/pep.py:188 +#: ../src/common/pep.py:185 #, fuzzy msgid "Walking" msgstr "Працую" -#: ../src/common/pep.py:190 +#: ../src/common/pep.py:187 #, fuzzy msgid "Coding" msgstr "Піша" -#: ../src/common/pep.py:191 +#: ../src/common/pep.py:188 msgid "In a Meeting" msgstr "" -#: ../src/common/pep.py:192 +#: ../src/common/pep.py:189 msgid "Studying" msgstr "" -#: ../src/common/pep.py:193 +#: ../src/common/pep.py:190 #, fuzzy msgid "Writing" msgstr "Працую" +#: ../src/common/pep.py:335 +msgid "Unknown Artist" +msgstr "" + +#: ../src/common/pep.py:338 +msgid "Unknown Title" +msgstr "" + +#: ../src/common/pep.py:341 +msgid "Unknown Source" +msgstr "" + +#: ../src/common/pep.py:344 +#, python-format +msgid "" +"\"%(title)s\" by %(artist)s\n" +"from %(source)s" +msgstr "" + #. We cannot bind port, call error callback and fail #: ../src/common/socks5.py:86 #, python-format @@ -6024,37 +6045,11 @@ msgid "" "went wrong.]" msgstr "" -#: ../src/common/zeroconf/connection_handlers_zeroconf.py:94 -#, fuzzy, python-format -msgid "" -"The host %s you configured as the ft_add_hosts_to_send advanced option is " -"not valid, so ignored." -msgstr "" -"Вузел, вызначаны опцыяй ft_override_host_to_send, некарэктны, таму " -"ігнаруецца." - -#. We didn't set a passphrase -#: ../src/common/zeroconf/connection_zeroconf.py:173 -msgid "OpenPGP passphrase was not given" -msgstr "Пароль OpenPGP не вызначаны" - -#. %s is the account name here -#: ../src/common/zeroconf/connection_zeroconf.py:175 -#: ../src/roster_window.py:1970 -#, python-format -msgid "You will be connected to %s without OpenPGP." -msgstr "Вы злучыцеся з %s без падтрымкі OpenPGP." - -#: ../src/common/zeroconf/connection_zeroconf.py:216 -msgid "To continue sending and receiving messages, you will need to reconnect." -msgstr "" -"Каб працягваць адпраўку і атрыманне паведамленняў, трэба перадалучыцца." - -#: ../src/common/zeroconf/connection_zeroconf.py:239 +#: ../src/common/zeroconf/connection_zeroconf.py:178 msgid "Avahi error" msgstr "Памылка Avahi" -#: ../src/common/zeroconf/connection_zeroconf.py:239 +#: ../src/common/zeroconf/connection_zeroconf.py:179 #, python-format msgid "" "%s\n" @@ -6063,54 +6058,46 @@ msgstr "" "%s\n" "Мясцовыя паведамленні могуць не працаваць." -#: ../src/common/zeroconf/connection_zeroconf.py:250 +#: ../src/common/zeroconf/connection_zeroconf.py:190 #, fuzzy msgid "Please check if Avahi or Bonjour is installed." msgstr "Праверце, ці ўсталяваны Avahi." -#: ../src/common/zeroconf/connection_zeroconf.py:259 -#: ../src/common/zeroconf/connection_zeroconf.py:263 +#: ../src/common/zeroconf/connection_zeroconf.py:199 +#: ../src/common/zeroconf/connection_zeroconf.py:203 msgid "Could not start local service" msgstr "Немагчыма стартаваць мясцовы сервіс" -#: ../src/common/zeroconf/connection_zeroconf.py:260 +#: ../src/common/zeroconf/connection_zeroconf.py:200 #, python-format msgid "Unable to bind to port %d." msgstr "Немагчыма злучыцца праз порт %d." -#: ../src/common/zeroconf/connection_zeroconf.py:264 -#: ../src/common/zeroconf/connection_zeroconf.py:359 +#: ../src/common/zeroconf/connection_zeroconf.py:204 +#: ../src/common/zeroconf/connection_zeroconf.py:283 +#: ../src/common/zeroconf/connection_zeroconf.py:294 +#: ../src/common/zeroconf/connection_zeroconf.py:308 msgid "Please check if avahi-daemon is running." msgstr "Праверце, ці працуе avahi-daemon." -#: ../src/common/zeroconf/connection_zeroconf.py:358 +#: ../src/common/zeroconf/connection_zeroconf.py:282 +#: ../src/common/zeroconf/connection_zeroconf.py:293 +#: ../src/common/zeroconf/connection_zeroconf.py:307 #, python-format msgid "Could not change status of account \"%s\"" msgstr "Немагчыма змяніць стан рахунка \"%s\"" -#: ../src/common/zeroconf/connection_zeroconf.py:381 -msgid "" -"You are not connected or not visible to others. Your message could not be " -"sent." -msgstr "" -"Вы не злучаны альбо не бачны для іншых. Вы не можаце адправіць паведамленне." - -#. we're not english -#: ../src/common/zeroconf/connection_zeroconf.py:399 -msgid "[This message is encrypted]" -msgstr "[Гэтае паведамленне зашыфраванае]" - -#: ../src/common/zeroconf/connection_zeroconf.py:483 +#: ../src/common/zeroconf/connection_zeroconf.py:324 #, fuzzy msgid "Your message could not be sent." msgstr "Чалавека пакуль няма. Вы не можаце адправіць паведамленне." #. Contact Offline -#: ../src/common/zeroconf/connection_zeroconf.py:489 +#: ../src/common/zeroconf/connection_zeroconf.py:334 msgid "Contact is offline. Your message could not be sent." msgstr "Чалавека пакуль няма. Вы не можаце адправіць паведамленне." -#: ../src/common/zeroconf/connection_zeroconf.py:593 +#: ../src/common/zeroconf/connection_zeroconf.py:359 msgid "" "Connection to host could not be established: Timeout while sending data." msgstr "Немагчыма злучыцца з вузлом: скончыўся тэрмін чакання." @@ -6121,26 +6108,26 @@ msgstr "Немагчыма злучыцца з вузлом: скончыўся msgid "Error while adding service. %s" msgstr "Памылка дадання сервіса. %s" -#: ../src/config.py:151 ../src/config.py:597 +#: ../src/config.py:157 ../src/config.py:586 msgid "Disabled" msgstr "Адключана" -#: ../src/config.py:396 +#: ../src/config.py:383 #, fuzzy msgid "Default Message" msgstr "Стандартныя паведамленні стану" -#: ../src/config.py:405 +#: ../src/config.py:392 #, fuzzy msgid "Enabled" msgstr "Уключыць" -#: ../src/config.py:663 ../src/dialogs.py:1327 +#: ../src/config.py:654 ../src/dialogs.py:1365 #, python-format msgid "Dictionary for lang %s not available" msgstr "Слоўніка для мовы %s няма" -#: ../src/config.py:664 +#: ../src/config.py:655 #, python-format msgid "" "You have to install %s dictionary to use spellchecking, or choose another " @@ -6149,215 +6136,215 @@ msgstr "" "Вы павінны ўсталяваць слоўнік %s, каб спраўджваць правапіс, альбо выбраць " "іншую мову праз опцыю speller_language." -#: ../src/config.py:1040 +#: ../src/config.py:1092 msgid "status message title" msgstr "загаловак паведамлення аб змене стану" -#: ../src/config.py:1040 +#: ../src/config.py:1092 msgid "status message text" msgstr "тэкст паведамлення аб змене стану" #. Name column -#: ../src/config.py:1339 ../src/dialogs.py:2122 ../src/dialogs.py:2186 -#: ../src/dialogs.py:2891 ../src/disco.py:773 ../src/disco.py:1568 -#: ../src/disco.py:1854 ../src/history_window.py:87 +#: ../src/config.py:1394 ../src/dialogs.py:2232 ../src/dialogs.py:2298 +#: ../src/dialogs.py:3014 ../src/disco.py:831 ../src/disco.py:1690 +#: ../src/disco.py:1992 ../src/history_window.py:89 msgid "Name" msgstr "Назва" -#: ../src/config.py:1428 +#: ../src/config.py:1487 msgid "Relogin now?" msgstr "Перадалучыцца?" -#: ../src/config.py:1429 +#: ../src/config.py:1488 msgid "If you want all the changes to apply instantly, you must relogin." msgstr "Калі Вы хочаце ўжыць усе зробленыя змены, перадалучыцеся." -#: ../src/config.py:1559 ../src/config.py:1684 +#: ../src/config.py:1620 ../src/config.py:1745 #, fuzzy msgid "OpenPGP is not usable on this computer" msgstr "Немагчыма ўжыць OpenPGP на гэтым кампутары" -#: ../src/config.py:1720 ../src/config.py:1764 +#: ../src/config.py:1785 ../src/config.py:1829 msgid "Unread events" msgstr "Нягледжаныя падзеі" -#: ../src/config.py:1721 +#: ../src/config.py:1786 msgid "Read all pending events before removing this account." msgstr "Прагледзьце нягледжаныя падзеі перад выдаленнем гэтага рахунка." -#: ../src/config.py:1747 +#: ../src/config.py:1812 #, python-format msgid "You have opened chat in account %s" msgstr "Вы пачалі размову ў рахунку %s" -#: ../src/config.py:1748 +#: ../src/config.py:1813 msgid "All chat and groupchat windows will be closed. Do you want to continue?" msgstr "Усе размоўныя вокны закрыюцца. Хочаце працягнуць?" -#: ../src/config.py:1760 ../src/config.py:2283 ../src/config.py:2317 +#: ../src/config.py:1825 ../src/config.py:2348 ../src/config.py:2382 msgid "You are currently connected to the server" msgstr "Вы злучаны з серверам" -#: ../src/config.py:1761 +#: ../src/config.py:1826 msgid "To change the account name, you must be disconnected." msgstr "Каб змяніць назву рахунка, трэба папярэдне адлучыцца." -#: ../src/config.py:1765 +#: ../src/config.py:1830 msgid "To change the account name, you must read all pending events." msgstr "" "Каб змяніць назву рахунка, Вы павінны праглядзець усе нягледжаныя падзеі." -#: ../src/config.py:1771 +#: ../src/config.py:1836 msgid "Account Name Already Used" msgstr "Назва рахунка ўжо скарыстаная" -#: ../src/config.py:1772 +#: ../src/config.py:1837 msgid "" "This name is already used by another of your accounts. Please choose another " "name." msgstr "Гэтая назва ўжо скарыстаная для іншага рахунка. Выберыце іншую назву." -#: ../src/config.py:1776 ../src/config.py:1780 +#: ../src/config.py:1841 ../src/config.py:1845 msgid "Invalid account name" msgstr "Няправільная назва рахунка" -#: ../src/config.py:1777 +#: ../src/config.py:1842 msgid "Account name cannot be empty." msgstr "Назва рахунка не павінна быць пустой." -#: ../src/config.py:1781 +#: ../src/config.py:1846 msgid "Account name cannot contain spaces." msgstr "Назва рахунка не павінна ўтрымліваць прагалаў." -#: ../src/config.py:1856 +#: ../src/config.py:1921 #, fuzzy msgid "Rename Account" msgstr "Кіраванне рахункамі" -#: ../src/config.py:1857 +#: ../src/config.py:1922 #, fuzzy, python-format msgid "Enter a new name for account %s" msgstr "Вызначце новую назву групы %s" -#: ../src/config.py:1885 +#: ../src/config.py:1950 msgid "A Jabber ID must be in the form \"user@servername\"." msgstr "Jabber ID павінны мець форму \"user@servername\"." -#: ../src/config.py:2093 ../src/config.py:3327 +#: ../src/config.py:2158 ../src/config.py:3406 msgid "Invalid entry" msgstr "Няправільны элемент" -#: ../src/config.py:2094 ../src/config.py:3328 +#: ../src/config.py:2159 ../src/config.py:3407 msgid "Custom port must be a port number." msgstr "Адмысловы порт павінны быць нумарам порта." -#: ../src/config.py:2115 +#: ../src/config.py:2180 msgid "Failed to get secret keys" msgstr "Немагчыма атрымаць сакрэтныя ключы" -#: ../src/config.py:2116 +#: ../src/config.py:2181 #, fuzzy msgid "There is no OpenPGP secret key available." msgstr "Памылка пошуку Вашых сакрэтных ключоў OpenPGP." -#: ../src/config.py:2150 +#: ../src/config.py:2215 msgid "OpenPGP Key Selection" msgstr "Выбар ключоў OpenPGP" -#: ../src/config.py:2151 +#: ../src/config.py:2216 msgid "Choose your OpenPGP key" msgstr "Выберыце Ваш ключ OpenPGP" -#: ../src/config.py:2158 +#: ../src/config.py:2223 msgid "No such account available" msgstr "Такога рахунка няма" -#: ../src/config.py:2159 +#: ../src/config.py:2224 msgid "You must create your account before editing your personal information." msgstr "Вы павінны стварыць рахунак да рэдагавання асабістых звестак." -#: ../src/config.py:2166 ../src/dialogs.py:1933 ../src/dialogs.py:2110 -#: ../src/dialogs.py:2289 ../src/disco.py:441 ../src/profile_window.py:317 +#: ../src/config.py:2231 ../src/dialogs.py:2031 ../src/dialogs.py:2220 +#: ../src/dialogs.py:2405 ../src/disco.py:477 ../src/profile_window.py:325 msgid "You are not connected to the server" msgstr "Вы не злучаны з серверам" -#: ../src/config.py:2167 +#: ../src/config.py:2232 msgid "Without a connection, you can not edit your personal information." msgstr "Немагчыма рэдагаваць асабістыя звесткі ў адлучаным рэжыме." -#: ../src/config.py:2171 +#: ../src/config.py:2236 msgid "Your server doesn't support Vcard" msgstr "Ваш сервер не падтрымлівае Vcard" -#: ../src/config.py:2172 +#: ../src/config.py:2237 msgid "Your server can't save your personal information." msgstr "Сервер не можа захаваць Вашыя асабістыя звесткі." -#: ../src/config.py:2284 ../src/config.py:2318 +#: ../src/config.py:2349 ../src/config.py:2383 #, fuzzy msgid "To disable the account, you must be disconnected." msgstr "Каб змяніць назву рахунка, трэба папярэдне адлучыцца." -#: ../src/config.py:2289 +#: ../src/config.py:2354 msgid "Account Local already exists." msgstr "Мясцовы рахунак Local ужо існуе." -#: ../src/config.py:2290 +#: ../src/config.py:2355 msgid "Please rename or remove it before enabling link-local messaging." msgstr "" "Змяніце назву альбо выдаліце яго, каб скарыстаць мясцовыя паведамленні." -#: ../src/config.py:2438 +#: ../src/config.py:2510 #, python-format msgid "Edit %s" msgstr "Змяніць %s" -#: ../src/config.py:2440 +#: ../src/config.py:2512 #, python-format msgid "Register to %s" msgstr "Зарэгістравацца на %s" #. list at the beginning -#: ../src/config.py:2476 +#: ../src/config.py:2548 msgid "Ban List" msgstr "Чорны спіс" -#: ../src/config.py:2477 +#: ../src/config.py:2549 msgid "Member List" msgstr "Спіс удзельнікаў" -#: ../src/config.py:2478 +#: ../src/config.py:2550 msgid "Owner List" msgstr "Спіс уладальнікаў" -#: ../src/config.py:2479 +#: ../src/config.py:2551 msgid "Administrator List" msgstr "Спіс адміністратараў" #. Address column #. holds JID (who said this) -#: ../src/config.py:2528 ../src/disco.py:780 ../src/history_manager.py:208 +#: ../src/config.py:2600 ../src/disco.py:838 ../src/history_manager.py:208 msgid "JID" msgstr "JID" -#: ../src/config.py:2538 +#: ../src/config.py:2610 msgid "Reason" msgstr "Прычына" -#: ../src/config.py:2545 +#: ../src/config.py:2617 msgid "Nick" msgstr "Мянушка" -#: ../src/config.py:2551 +#: ../src/config.py:2623 msgid "Role" msgstr "Роля" -#: ../src/config.py:2578 +#: ../src/config.py:2650 msgid "Banning..." msgstr "Забараніць казанне..." #. You can move '\n' before user@domain if that line is TOO BIG -#: ../src/config.py:2580 +#: ../src/config.py:2652 msgid "" "Whom do you want to ban?\n" "\n" @@ -6365,11 +6352,11 @@ msgstr "" "Каму Вы хочаце забараніць казанне?\n" "\n" -#: ../src/config.py:2582 +#: ../src/config.py:2654 msgid "Adding Member..." msgstr "Дадаць ўдзельніка..." -#: ../src/config.py:2583 +#: ../src/config.py:2655 msgid "" "Whom do you want to make a member?\n" "\n" @@ -6377,11 +6364,11 @@ msgstr "" "Каго Вы хочаце зрабіць удзельнікам?\n" "\n" -#: ../src/config.py:2585 +#: ../src/config.py:2657 msgid "Adding Owner..." msgstr "Дадаць уладальніка..." -#: ../src/config.py:2586 +#: ../src/config.py:2658 msgid "" "Whom do you want to make an owner?\n" "\n" @@ -6389,11 +6376,11 @@ msgstr "" "Каго Вы хочаце зрабіць уладальнікам?\n" "\n" -#: ../src/config.py:2588 +#: ../src/config.py:2660 msgid "Adding Administrator..." msgstr "Дадаць адміністратара..." -#: ../src/config.py:2589 +#: ../src/config.py:2661 msgid "" "Whom do you want to make an administrator?\n" "\n" @@ -6401,7 +6388,7 @@ msgstr "" "Каго Вы хочаце зрабіць адміністратарам?\n" "\n" -#: ../src/config.py:2590 +#: ../src/config.py:2662 #, fuzzy msgid "" "Can be one of the following:\n" @@ -6418,88 +6405,89 @@ msgstr "" "4. domain (гэты домэн user@domain,\n" "domain/resource ці адрас паддамена)." -#: ../src/config.py:2687 +#: ../src/config.py:2763 #, python-format msgid "Removing %s account" msgstr "Выдаленне рахунка %s" -#: ../src/config.py:2709 ../src/gajim.py:1491 ../src/gajim.py:1588 +#: ../src/config.py:2785 ../src/gui_interface.py:1102 +#: ../src/gui_interface.py:1199 msgid "Password Required" msgstr "Патрабуецца пароль" -#: ../src/config.py:2710 ../src/gajim.py:1568 +#: ../src/config.py:2786 ../src/gui_interface.py:1179 #, python-format msgid "Enter your password for account %s" msgstr "Увядзіце пароль для рахунка %s" -#: ../src/config.py:2711 ../src/gajim.py:1588 +#: ../src/config.py:2787 ../src/gui_interface.py:1199 msgid "Save password" msgstr "Захаваць пароль" -#: ../src/config.py:2720 +#: ../src/config.py:2796 #, python-format msgid "Account \"%s\" is connected to the server" msgstr "Рахунак \"%s\" злучаны з серверам" -#: ../src/config.py:2721 +#: ../src/config.py:2797 msgid "If you remove it, the connection will be lost." msgstr "Калі Вы выдаліце яго, згубіцца злучэнне." -#: ../src/config.py:2819 +#: ../src/config.py:2895 msgid "Default" msgstr "Прадвызначана" -#: ../src/config.py:2819 +#: ../src/config.py:2895 msgid "?print_status:All" msgstr "?print_status:Усе" -#: ../src/config.py:2820 +#: ../src/config.py:2896 msgid "Enter and leave only" msgstr "Увайсці і выйсці" -#: ../src/config.py:2821 +#: ../src/config.py:2897 msgid "?print_status:None" msgstr "?print_status:Няма" -#: ../src/config.py:2889 +#: ../src/config.py:2967 msgid "New Group Chat" msgstr "Новая групавая размова" -#: ../src/config.py:2922 +#: ../src/config.py:3000 msgid "This bookmark has invalid data" msgstr "Гэтая закладка мае няправільныя звесткі" -#: ../src/config.py:2923 +#: ../src/config.py:3001 msgid "" "Please be sure to fill out server and room fields or remove this bookmark." msgstr "Запоўніце палі сервера і пакоя альбо выдаліце гэтую закладку." #. invalid char -#: ../src/config.py:3041 ../src/dialogs.py:1746 +#: ../src/config.py:3119 ../src/dialogs.py:1829 #, fuzzy msgid "Invalid nickname" msgstr "Няправільнае імя карыстальніка" -#: ../src/config.py:3042 ../src/config.py:3056 ../src/config.py:3070 +#: ../src/config.py:3120 ../src/config.py:3134 ../src/config.py:3148 #, fuzzy msgid "Character not allowed" msgstr "Такая мянушка не дазволеная: %s" -#: ../src/config.py:3055 ../src/config.py:3303 +#: ../src/config.py:3133 ../src/config.py:3382 #, fuzzy msgid "Invalid server" msgstr "Няправільнае імя карыстальніка" -#: ../src/config.py:3069 +#: ../src/config.py:3147 #, fuzzy msgid "Invalid room" msgstr "Няправільны элемент" -#: ../src/config.py:3220 +#: ../src/config.py:3299 msgid "Account has been added successfully" msgstr "Рахунак паспяхова дададзены" -#: ../src/config.py:3221 ../src/config.py:3227 +#: ../src/config.py:3300 ../src/config.py:3306 #, fuzzy msgid "" "You can set advanced account options by pressing the Advanced button, or " @@ -6510,36 +6498,36 @@ msgstr "" "\"Адмысловыя\", альбо пазней, выбраўшы элемент \"Рахункі\" ў меню \"Змяніць" "\" галоўнага вакна." -#: ../src/config.py:3226 +#: ../src/config.py:3305 msgid "Your new account has been created successfully" msgstr "Новы рахунак паспяхова створаны" -#: ../src/config.py:3264 +#: ../src/config.py:3343 msgid "Invalid username" msgstr "Няправільнае імя карыстальніка" -#: ../src/config.py:3266 +#: ../src/config.py:3345 msgid "You must provide a username to configure this account." msgstr "" "Вы павінны пазначыць імя карыстальніка, каб змяніць настаўленні гэтага " "рахунка." -#: ../src/config.py:3304 +#: ../src/config.py:3383 #, fuzzy msgid "Please provide a server on which you want to register." msgstr "Вызначце сваю новую мянушку:" -#: ../src/config.py:3360 ../src/gajim.py:2144 +#: ../src/config.py:3439 ../src/gui_interface.py:1857 #, fuzzy msgid "Certificate Already in File" msgstr "Чалавек ужо ёсць у кантактным лісце" -#: ../src/config.py:3361 ../src/gajim.py:2145 +#: ../src/config.py:3440 ../src/gui_interface.py:1858 #, python-format msgid "This certificate is already in file %s, so it's not added again." msgstr "" -#: ../src/config.py:3429 +#: ../src/config.py:3510 #, python-format msgid "" "Security Warning\n" @@ -6549,7 +6537,7 @@ msgid "" "Do you still want to connect to this server?" msgstr "" -#: ../src/config.py:3435 ../src/gajim.py:2169 +#: ../src/config.py:3516 ../src/gui_interface.py:1882 #, python-format msgid "" "Add this certificate to the list of trusted certificates.\n" @@ -6557,304 +6545,302 @@ msgid "" "%s" msgstr "" -#: ../src/config.py:3460 ../src/config.py:3483 +#: ../src/config.py:3543 ../src/config.py:3570 msgid "An error occurred during account creation" msgstr "Адбылася памылка ў часе стварэння рахунка" -#: ../src/config.py:3550 +#: ../src/config.py:3637 msgid "Account name is in use" msgstr "Назва рахунка ўжо скарыстаная" -#: ../src/config.py:3551 +#: ../src/config.py:3638 msgid "You already have an account using this name." msgstr "Вы ўжо маеце рахунак з такой назваю." -#: ../src/config.py:3704 +#: ../src/config.py:3791 msgid "Active" msgstr "Актыўны" -#: ../src/config.py:3712 +#: ../src/config.py:3799 msgid "Event" msgstr "Падзея" -#: ../src/config.py:3747 +#: ../src/config.py:3834 msgid "First Message Received" msgstr "Атрыманае першае паведамленне" -#: ../src/config.py:3748 +#: ../src/config.py:3835 #, fuzzy msgid "Next Message Received Focused" msgstr "Атрыманае наступнае паведамленне" -#: ../src/config.py:3750 +#: ../src/config.py:3837 #, fuzzy msgid "Next Message Received Unfocused" msgstr "Атрыманае наступнае паведамленне" -#: ../src/config.py:3751 +#: ../src/config.py:3838 msgid "Contact Connected" msgstr "Чалавек далучыўся" -#: ../src/config.py:3752 +#: ../src/config.py:3839 msgid "Contact Disconnected" msgstr "Чалавек адлучыўся" -#: ../src/config.py:3753 +#: ../src/config.py:3840 msgid "Message Sent" msgstr "Паведамленне адпраўленае" -#: ../src/config.py:3754 +#: ../src/config.py:3841 msgid "Group Chat Message Highlight" msgstr "Фарбаванае паведамленне ў групавой размове" -#: ../src/config.py:3755 +#: ../src/config.py:3842 msgid "Group Chat Message Received" msgstr "Новае паведамленне ў групавой размове" -#: ../src/config.py:3756 +#: ../src/config.py:3843 msgid "GMail Email Received" msgstr "Новы ліст GMail" -#: ../src/conversation_textview.py:592 +#: ../src/conversation_textview.py:599 msgid "" "This icon indicates that this message has not yet\n" "been received by the remote end. If this icon stays\n" "for a long time, it's likely the message got lost." msgstr "" -#: ../src/conversation_textview.py:611 +#: ../src/conversation_textview.py:618 #, fuzzy msgid "" "Text below this line is what has been said since the\n" "last time you paid attention to this group chat" msgstr "Тэкст пад гэтай рысаю ёсць тэкстам, які Вы яшчэ не бачылі" -#: ../src/conversation_textview.py:724 +#: ../src/conversation_textview.py:737 #, fuzzy msgid "_Quote" msgstr "_Выйсці" -#: ../src/conversation_textview.py:731 +#: ../src/conversation_textview.py:744 #, python-format msgid "_Actions for \"%s\"" msgstr "_Дзеянні для \"%s\"" -#: ../src/conversation_textview.py:743 +#: ../src/conversation_textview.py:756 msgid "Read _Wikipedia Article" msgstr "Прачытаць артыкул у _Вікіпедыі" -#: ../src/conversation_textview.py:748 +#: ../src/conversation_textview.py:761 msgid "Look it up in _Dictionary" msgstr "Шукаць у _слоўніку" -#: ../src/conversation_textview.py:765 +#: ../src/conversation_textview.py:778 #, python-format msgid "Dictionary URL is missing an \"%s\" and it is not WIKTIONARY" msgstr "У адрасе слоўніка не хапае \"%s\", і гэта не Вікі-слоўнік" #. we must have %s in the url -#: ../src/conversation_textview.py:778 +#: ../src/conversation_textview.py:791 #, python-format msgid "Web Search URL is missing an \"%s\"" msgstr "У адрасе пошуку ў Сеціве не хапае \"%s\"" -#: ../src/conversation_textview.py:781 +#: ../src/conversation_textview.py:794 msgid "Web _Search for it" msgstr "_Шукаць у Сеціве" -#: ../src/conversation_textview.py:787 +#: ../src/conversation_textview.py:800 msgid "Open as _Link" msgstr "Адкрыць _спасылку" -#: ../src/conversation_textview.py:1274 +#. %i is day in year (1-365) +#: ../src/conversation_textview.py:1295 +#, fuzzy, python-format msgid "Yesterday" -msgstr "Учора" - -#. the number is >= 2 -#. %i is day in year (1-365), %d (1-31) we want %i -#: ../src/conversation_textview.py:1278 -#, python-format -msgid "%i days ago" -msgstr "%i дзён таму" +msgid_plural "%i days ago" +msgstr[0] "Учора" +msgstr[1] "Учора" +msgstr[2] "Учора" #. if we have subject, show it too! -#: ../src/conversation_textview.py:1312 ../src/history_window.py:464 +#: ../src/conversation_textview.py:1330 ../src/history_window.py:475 #, python-format msgid "Subject: %s\n" msgstr "Тэма: %s\n" -#: ../src/dataforms_widget.py:559 +#: ../src/dataforms_widget.py:581 #, fuzzy msgid "Jabber ID already in list" msgstr "Jabber-праграма" -#: ../src/dataforms_widget.py:560 +#: ../src/dataforms_widget.py:582 msgid "The Jabber ID you entered is already in the list. Choose another one." msgstr "" #. Default jid -#: ../src/dataforms_widget.py:571 +#: ../src/dataforms_widget.py:593 msgid "new@jabber.id" msgstr "" -#: ../src/dataforms_widget.py:574 ../src/dataforms_widget.py:576 +#: ../src/dataforms_widget.py:596 ../src/dataforms_widget.py:598 #, python-format msgid "new%d@jabber.id" msgstr "" -#: ../src/dialogs.py:75 +#: ../src/dialogs.py:81 #, python-format msgid "Contact name: %s" msgstr "Імя чалавека: %s" -#: ../src/dialogs.py:77 +#: ../src/dialogs.py:83 #, python-format msgid "Jabber ID: %s" msgstr "Jabber ID: %s" -#: ../src/dialogs.py:184 +#: ../src/dialogs.py:194 msgid "Group" msgstr "Група" -#: ../src/dialogs.py:191 +#: ../src/dialogs.py:201 msgid "In the group" msgstr "У групе" -#: ../src/dialogs.py:277 +#: ../src/dialogs.py:292 msgid "KeyID" msgstr "KeyID" -#: ../src/dialogs.py:282 +#: ../src/dialogs.py:297 msgid "Contact name" msgstr "Імя чалавека" -#: ../src/dialogs.py:454 +#: ../src/dialogs.py:469 #, fuzzy msgid "Set Mood" msgstr "Вызначыць MOTD" -#: ../src/dialogs.py:572 +#: ../src/dialogs.py:589 #, python-format msgid "%s Status Message" msgstr "Паведамленне аб змене стану %s" -#: ../src/dialogs.py:586 +#: ../src/dialogs.py:603 msgid "Status Message" msgstr "Паведамленне аб змене стану" -#: ../src/dialogs.py:772 +#: ../src/dialogs.py:793 #, fuzzy msgid "Overwrite Status Message?" msgstr "Паведамленне аб змене стану" -#: ../src/dialogs.py:773 +#: ../src/dialogs.py:794 #, fuzzy msgid "" "This name is already used. Do you want to overwrite this status message?" msgstr "Гэтая назва ўжо скарыстаная для іншага рахунка. Выберыце іншую назву." -#: ../src/dialogs.py:781 +#: ../src/dialogs.py:802 msgid "Save as Preset Status Message" msgstr "Захаваць гэтае паведамленне аб змене стану" -#: ../src/dialogs.py:782 +#: ../src/dialogs.py:803 msgid "Please type a name for this status message" msgstr "Вызначце назву гэтага паведамлення аб змене стану" -#: ../src/dialogs.py:807 +#: ../src/dialogs.py:831 msgid "AIM Address:" msgstr "Адрас AIM:" -#: ../src/dialogs.py:808 +#: ../src/dialogs.py:832 msgid "GG Number:" msgstr "Нумар GG:" -#: ../src/dialogs.py:809 +#: ../src/dialogs.py:833 msgid "ICQ Number:" msgstr "Нумар ICQ:" -#: ../src/dialogs.py:810 +#: ../src/dialogs.py:834 msgid "MSN Address:" msgstr "Адрас MSN:" -#: ../src/dialogs.py:811 +#: ../src/dialogs.py:835 msgid "Yahoo! Address:" msgstr "Адрас Yahoo!:" -#: ../src/dialogs.py:847 +#: ../src/dialogs.py:872 #, python-format msgid "Please fill in the data of the contact you want to add in account %s" msgstr "" "Запоўніце палі звесткамі пра чалавека, якога Вы хочаце дадаць у спіс рахунка " "%s" -#: ../src/dialogs.py:849 +#: ../src/dialogs.py:874 msgid "Please fill in the data of the contact you want to add" msgstr "Запоўніце палі звесткамі, каб дадаць чалавека ў спіс" -#: ../src/dialogs.py:1006 ../src/dialogs.py:1012 ../src/dialogs.py:1017 +#: ../src/dialogs.py:1035 ../src/dialogs.py:1041 ../src/dialogs.py:1046 msgid "Invalid User ID" msgstr "Няправільны ID карыстальніка" -#: ../src/dialogs.py:1013 +#: ../src/dialogs.py:1042 msgid "The user ID must not contain a resource." msgstr "ID карыстальніка не павінны вызначаць рэсурс." -#: ../src/dialogs.py:1018 +#: ../src/dialogs.py:1047 #, fuzzy msgid "You cannot add yourself to your roster." msgstr "Я хачу дадаць Вас у мой кантактны ліст." -#: ../src/dialogs.py:1032 +#: ../src/dialogs.py:1061 msgid "Contact already in roster" msgstr "Чалавек ужо ёсць у кантактным лісце" -#: ../src/dialogs.py:1033 +#: ../src/dialogs.py:1062 msgid "This contact is already listed in your roster." msgstr "Гэты чалавек ужо ёсць у у кантактным лісце." -#: ../src/dialogs.py:1069 +#: ../src/dialogs.py:1098 msgid "User ID:" msgstr "ID карыстальніка:" -#: ../src/dialogs.py:1127 +#: ../src/dialogs.py:1159 msgid "A GTK+ jabber client" msgstr "Jabber-праграма для GTK+" -#: ../src/dialogs.py:1128 +#: ../src/dialogs.py:1160 msgid "GTK+ Version:" msgstr "Версія GTK+:" -#: ../src/dialogs.py:1129 +#: ../src/dialogs.py:1161 msgid "PyGTK Version:" msgstr "Версія PyGTK:" -#: ../src/dialogs.py:1139 +#: ../src/dialogs.py:1171 msgid "Current Developers:" msgstr "Актыўныя распрацоўнікі:" -#: ../src/dialogs.py:1141 +#: ../src/dialogs.py:1173 msgid "Past Developers:" msgstr "Былыя распрацоўнікі:" -#: ../src/dialogs.py:1147 +#: ../src/dialogs.py:1179 msgid "THANKS:" msgstr "Падзякі:" #. remove one english sentence #. and add it manually as translatable -#: ../src/dialogs.py:1153 +#: ../src/dialogs.py:1185 msgid "Last but not least, we would like to thank all the package maintainers." msgstr "" "Таксама хочам выказаць падзяку ўсім людзям, што збіраюць пакункі з праграмай " "для розных сістэмаў." #. here you write your name in the form Name FamilyName -#: ../src/dialogs.py:1166 +#: ../src/dialogs.py:1198 msgid "translator-credits" msgstr "Ihar Hrachyshka " -#: ../src/dialogs.py:1328 +#: ../src/dialogs.py:1366 #, fuzzy, python-format msgid "" "You have to install %s dictionary to use spellchecking, or choose another " @@ -6865,105 +6851,109 @@ msgstr "" "Вы павінны ўсталяваць слоўнік %s, каб спраўджваць правапіс, альбо выбраць " "іншую мову праз опцыю speller_language." -#: ../src/dialogs.py:1747 ../src/dialogs.py:2061 +#: ../src/dialogs.py:1830 ../src/dialogs.py:2171 #, fuzzy msgid "The nickname has not allowed characters." msgstr "Jabber ID групавой размовы ўтрымлівае няправільныя знакі." -#: ../src/dialogs.py:1859 +#: ../src/dialogs.py:1948 #, fuzzy, python-format msgid "Subscription request for account %(account)s from %(jid)s" msgstr "Запыт увагі на рахунак %s ад %s" -#: ../src/dialogs.py:1862 +#: ../src/dialogs.py:1951 #, python-format msgid "Subscription request from %s" msgstr "Запыт увагі ад %s" -#: ../src/dialogs.py:1928 ../src/gajim.py:2827 +#: ../src/dialogs.py:2026 ../src/gui_interface.py:2592 #, python-format msgid "You are already in group chat %s" msgstr "Вы ўжо ўдзельнічаеце ў групавой размове %s" -#: ../src/dialogs.py:1934 +#: ../src/dialogs.py:2032 msgid "You can not join a group chat unless you are connected." msgstr "" "Вы не можаце ўдзельнічаць у групавой размове, не злучыўшыся з серверам." -#: ../src/dialogs.py:1970 +#: ../src/dialogs.py:2074 #, python-format msgid "Join Group Chat with account %s" msgstr "Удзельнічаць у групавой размове праз рахунак %s" -#: ../src/dialogs.py:2050 +#: ../src/dialogs.py:2160 #, fuzzy msgid "Invalid Account" msgstr "Няправільная назва рахунка" -#: ../src/dialogs.py:2051 +#: ../src/dialogs.py:2161 #, fuzzy msgid "" "You have to choose an account from which you want to join the groupchat." msgstr "Вы павінны стварыць рахунак, каб размаўляць з іншымі людзьмі." -#: ../src/dialogs.py:2060 +#: ../src/dialogs.py:2170 #, fuzzy msgid "Invalid Nickname" msgstr "Няправільнае імя карыстальніка" -#: ../src/dialogs.py:2065 ../src/dialogs.py:2071 -#: ../src/groupchat_control.py:1738 +#: ../src/dialogs.py:2175 ../src/dialogs.py:2181 +#: ../src/groupchat_control.py:1776 msgid "Invalid group chat Jabber ID" msgstr "Няправільны Jabber ID групавой размовы" -#: ../src/dialogs.py:2066 ../src/dialogs.py:2072 -#: ../src/groupchat_control.py:1739 +#: ../src/dialogs.py:2176 +#, fuzzy +msgid "Please enter the group chat Jabber ID as room@server." +msgstr "Jabber ID групавой размовы ўтрымлівае няправільныя знакі." + +#: ../src/dialogs.py:2182 ../src/groupchat_control.py:1777 msgid "The group chat Jabber ID has not allowed characters." msgstr "Jabber ID групавой размовы ўтрымлівае няправільныя знакі." -#: ../src/dialogs.py:2079 +#: ../src/dialogs.py:2189 msgid "This is not a group chat" msgstr "Гэта не групавая размова" -#: ../src/dialogs.py:2080 +#: ../src/dialogs.py:2190 #, python-format msgid "%s is not the name of a group chat." msgstr "%s не з'яўляецца сапраўднай назвай групавой размовы." -#: ../src/dialogs.py:2111 +#: ../src/dialogs.py:2221 #, fuzzy msgid "Without a connection, you can not synchronise your contacts." msgstr "Вы не можаце змяніць пароль, не злучыўшыся з серверам." -#: ../src/dialogs.py:2125 +#: ../src/dialogs.py:2235 msgid "Server" msgstr "Сервер" -#: ../src/dialogs.py:2158 +#: ../src/dialogs.py:2270 #, fuzzy msgid "This account is not connected to the server" msgstr "Рахунак \"%s\" злучаны з серверам" -#: ../src/dialogs.py:2159 +#: ../src/dialogs.py:2271 #, fuzzy msgid "You cannot synchronize with an account unless it is connected." msgstr "" "Вы не можаце ўдзельнічаць у групавой размове, не злучыўшыся з серверам." -#: ../src/dialogs.py:2183 +#: ../src/dialogs.py:2295 msgid "Synchronise" msgstr "" -#: ../src/dialogs.py:2241 +#: ../src/dialogs.py:2355 #, python-format msgid "Start Chat with account %s" msgstr "Пачаць размову з рахунка %s" -#: ../src/dialogs.py:2243 +#: ../src/dialogs.py:2357 msgid "Start Chat" msgstr "Пачаць размову" -#: ../src/dialogs.py:2244 +#: ../src/dialogs.py:2358 msgid "" "Fill in the nickname or the Jabber ID of the contact you would like\n" "to send a chat message to:" @@ -6972,302 +6962,331 @@ msgstr "" "хочаце адправіць паведамленне:" #. if offline or connecting -#: ../src/dialogs.py:2268 ../src/dialogs.py:2651 ../src/dialogs.py:2813 +#: ../src/dialogs.py:2384 ../src/dialogs.py:2767 ../src/dialogs.py:2929 msgid "Connection not available" msgstr "Няма злучэння" -#: ../src/dialogs.py:2269 ../src/dialogs.py:2652 ../src/dialogs.py:2814 +#: ../src/dialogs.py:2385 ../src/dialogs.py:2768 ../src/dialogs.py:2930 #, python-format msgid "Please make sure you are connected with \"%s\"." msgstr "Праверце злучэнне з \"%s\"." -#: ../src/dialogs.py:2278 ../src/dialogs.py:2281 +#: ../src/dialogs.py:2394 ../src/dialogs.py:2397 msgid "Invalid JID" msgstr "Няправільны JID" -#: ../src/dialogs.py:2281 +#: ../src/dialogs.py:2397 #, python-format msgid "Unable to parse \"%s\"." msgstr "Немагчыма разабраць \"%s\"." -#: ../src/dialogs.py:2290 +#: ../src/dialogs.py:2406 msgid "Without a connection, you can not change your password." msgstr "Вы не можаце змяніць пароль, не злучыўшыся з серверам." -#: ../src/dialogs.py:2309 +#: ../src/dialogs.py:2425 msgid "Invalid password" msgstr "Няправільны пароль" -#: ../src/dialogs.py:2309 +#: ../src/dialogs.py:2425 msgid "You must enter a password." msgstr "Вы павінны ўвесці пароль." -#: ../src/dialogs.py:2313 +#: ../src/dialogs.py:2429 msgid "Passwords do not match" msgstr "Паролі розняцца" -#: ../src/dialogs.py:2314 +#: ../src/dialogs.py:2430 msgid "The passwords typed in both fields must be identical." msgstr "Паролі ў абодвух палях павінны быць аднолькавымі." #. img to display #. default value -#: ../src/dialogs.py:2353 ../src/notify.py:257 ../src/notify.py:491 +#: ../src/dialogs.py:2469 ../src/notify.py:263 ../src/notify.py:504 msgid "Contact Signed In" msgstr "Чалавек прыйшоў" -#: ../src/dialogs.py:2355 ../src/notify.py:265 ../src/notify.py:493 +#: ../src/dialogs.py:2471 ../src/notify.py:271 ../src/notify.py:506 msgid "Contact Signed Out" msgstr "Чалавек сышоў" #. chat message #. img to display -#: ../src/dialogs.py:2357 ../src/notify.py:288 ../src/notify.py:342 -#: ../src/notify.py:495 +#: ../src/dialogs.py:2473 ../src/notify.py:294 ../src/notify.py:349 +#: ../src/notify.py:508 msgid "New Message" msgstr "Новае паведамленне" #. single message -#: ../src/dialogs.py:2357 ../src/notify.py:269 ../src/notify.py:343 -#: ../src/notify.py:495 +#: ../src/dialogs.py:2473 ../src/notify.py:275 ../src/notify.py:350 +#: ../src/notify.py:508 msgid "New Single Message" msgstr "Новае асобнае паведамленне" #. private message -#: ../src/dialogs.py:2358 ../src/notify.py:276 ../src/notify.py:343 -#: ../src/notify.py:496 +#: ../src/dialogs.py:2474 ../src/notify.py:282 ../src/notify.py:350 +#: ../src/notify.py:509 msgid "New Private Message" msgstr "Новае прыватнае паведамленне" -#: ../src/dialogs.py:2358 ../src/gajim.py:1704 ../src/notify.py:505 +#: ../src/dialogs.py:2474 ../src/gui_interface.py:1315 ../src/notify.py:518 msgid "New E-mail" msgstr "Новы ліст" -#: ../src/dialogs.py:2360 ../src/gajim.py:1770 ../src/notify.py:498 +#: ../src/dialogs.py:2476 ../src/gui_interface.py:1382 ../src/notify.py:511 msgid "File Transfer Request" msgstr "Запыт на перадачу файла" -#: ../src/dialogs.py:2362 ../src/gajim.py:1670 ../src/gajim.py:1737 -#: ../src/notify.py:500 +#: ../src/dialogs.py:2478 ../src/gui_interface.py:1281 +#: ../src/gui_interface.py:1349 ../src/notify.py:513 msgid "File Transfer Error" msgstr "Памылка перадачы файла" -#: ../src/dialogs.py:2364 ../src/gajim.py:1815 ../src/gajim.py:1837 -#: ../src/gajim.py:1854 ../src/notify.py:502 +#: ../src/dialogs.py:2480 ../src/gui_interface.py:1427 +#: ../src/gui_interface.py:1449 ../src/gui_interface.py:1466 +#: ../src/notify.py:515 msgid "File Transfer Completed" msgstr "Перадача файла скончаная" -#: ../src/dialogs.py:2365 ../src/gajim.py:1818 ../src/notify.py:503 +#: ../src/dialogs.py:2481 ../src/gui_interface.py:1430 ../src/notify.py:516 msgid "File Transfer Stopped" msgstr "Перадача файла спыненая" -#: ../src/dialogs.py:2367 ../src/gajim.py:1512 ../src/notify.py:507 +#: ../src/dialogs.py:2483 ../src/gui_interface.py:1123 ../src/notify.py:520 msgid "Groupchat Invitation" msgstr "Запрашэнне ў групавую размову" -#: ../src/dialogs.py:2369 ../src/notify.py:249 ../src/notify.py:509 +#: ../src/dialogs.py:2485 ../src/notify.py:255 ../src/notify.py:522 msgid "Contact Changed Status" msgstr "Чалавек змяніў стан" -#: ../src/dialogs.py:2570 +#: ../src/dialogs.py:2686 #, python-format msgid "Single Message using account %s" msgstr "Асобнае паведамленне для рахунка %s" -#: ../src/dialogs.py:2572 +#: ../src/dialogs.py:2688 #, python-format msgid "Single Message in account %s" msgstr "Асобнае паведамленне для рахунка %s" -#: ../src/dialogs.py:2574 +#: ../src/dialogs.py:2690 msgid "Single Message" msgstr "Асобнае паведамленне" #. prepare UI for Sending -#: ../src/dialogs.py:2577 +#: ../src/dialogs.py:2693 #, python-format msgid "Send %s" msgstr "Адправіць %s" #. prepare UI for Receiving -#: ../src/dialogs.py:2600 +#: ../src/dialogs.py:2716 #, python-format msgid "Received %s" msgstr "Атрымана %s" #. prepare UI for Receiving -#: ../src/dialogs.py:2623 +#: ../src/dialogs.py:2739 #, fuzzy, python-format msgid "Form %s" msgstr "Я %s" #. we create a new blank window to send and we preset RE: and to jid -#: ../src/dialogs.py:2702 +#: ../src/dialogs.py:2818 #, python-format msgid "RE: %s" msgstr "RE: %s" -#: ../src/dialogs.py:2703 +#: ../src/dialogs.py:2819 #, python-format msgid "%s wrote:\n" msgstr "%s сказаў:\n" -#: ../src/dialogs.py:2752 +#: ../src/dialogs.py:2868 #, python-format msgid "XML Console for %s" msgstr "Кансоль XML для %s" -#: ../src/dialogs.py:2754 +#: ../src/dialogs.py:2870 msgid "XML Console" msgstr "Кансоль XML" -#. Set labels -#. self.action can be 'add', 'modify' or 'remove' -#: ../src/dialogs.py:2865 +#. Action that can be done with an incoming list of contacts +#: ../src/dialogs.py:2958 +#, fuzzy +msgid "add" +msgstr "Марнаванне часу" + +#: ../src/dialogs.py:2958 +#, fuzzy +msgid "modify" +msgstr "_Змяніць" + +#: ../src/dialogs.py:2959 +#, fuzzy +msgid "remove" +msgstr "Вы_даліць" + +#: ../src/dialogs.py:2987 #, fuzzy, python-format -msgid "%s would like you to %s some contacts in your roster." +msgid "" +"%(jid)s would like you to %(action)s some contacts in your " +"roster." msgstr "Я хачу дадаць Вас у свой кантактны ліст." -#: ../src/dialogs.py:2880 ../src/dialogs.py:2928 +#. Change label for accept_button to action name instead of 'OK'. +#: ../src/dialogs.py:3003 ../src/dialogs.py:3049 #, fuzzy msgid "Add" msgstr "Адрас" -#: ../src/dialogs.py:2882 ../src/dialogs.py:2961 +#. Change label for accept_button to action name instead of 'OK'. +#: ../src/dialogs.py:3005 ../src/dialogs.py:3080 #, fuzzy msgid "Modify" msgstr "_Змяніць" -#: ../src/dialogs.py:2888 +#: ../src/dialogs.py:3011 #, fuzzy msgid "Jabber ID" msgstr "Jabber ID:" -#: ../src/dialogs.py:2894 +#: ../src/dialogs.py:3017 #, fuzzy msgid "Groups" msgstr "Група" #. it is selected -#. remote_jid = model[iter][1].decode('utf-8') -#: ../src/dialogs.py:3008 +#. remote_jid = model[iter_][1].decode('utf-8') +#: ../src/dialogs.py:3125 #, fuzzy, python-format msgid "%s suggested me to add you in my roster." msgstr "Я хачу дадаць Вас у мой кантактны ліст." -#: ../src/dialogs.py:3108 +#: ../src/dialogs.py:3139 +#, fuzzy, python-format +msgid "Added %s contacts" +msgstr "Дадаць _чалавека" + +#: ../src/dialogs.py:3176 +#, fuzzy, python-format +msgid "Removed %s contacts" +msgstr "Выдаліць чалавека з спіса" + +#: ../src/dialogs.py:3229 #, python-format msgid "Privacy List %s" msgstr "Спіс прыватнасці %s" -#: ../src/dialogs.py:3112 +#: ../src/dialogs.py:3233 #, python-format msgid "Privacy List for %s" msgstr "Спіс прыватнасці для %s" -#: ../src/dialogs.py:3168 +#: ../src/dialogs.py:3289 #, fuzzy, python-format msgid "Order: %(order)s, action: %(action)s, type: %(type)s, value: %(value)s" msgstr "Парадак: %s, дзеянне: %s, тып: %s, значэнне: %s" -#: ../src/dialogs.py:3173 +#: ../src/dialogs.py:3294 #, fuzzy, python-format msgid "Order: %(order)s, action: %(action)s" msgstr "Парадак: %s, дзеянне: %s" -#: ../src/dialogs.py:3215 +#: ../src/dialogs.py:3338 msgid "Edit a rule" msgstr "Змяніць правіла" -#: ../src/dialogs.py:3326 +#: ../src/dialogs.py:3449 msgid "Add a rule" msgstr "Дадаць правіла" -#: ../src/dialogs.py:3423 +#: ../src/dialogs.py:3549 #, python-format msgid "Privacy Lists for %s" msgstr "Спісы прыватнасці для %s" -#: ../src/dialogs.py:3425 +#: ../src/dialogs.py:3551 msgid "Privacy Lists" msgstr "Спісы прыватнасці" -#: ../src/dialogs.py:3495 +#: ../src/dialogs.py:3621 msgid "Invalid List Name" msgstr "Няправільная назва спіса" -#: ../src/dialogs.py:3496 +#: ../src/dialogs.py:3622 msgid "You must enter a name to create a privacy list." msgstr "Вы павінны вызначыць назву для новага спіса прыватнасці." -#: ../src/dialogs.py:3528 +#: ../src/dialogs.py:3654 #, fuzzy msgid "You are invited to a groupchat" msgstr "Вы не ўвайшлі ў пакой групавой размовы." -#: ../src/dialogs.py:3531 +#: ../src/dialogs.py:3657 #, fuzzy msgid "$Contact has invited you to join a discussion" msgstr "$Contact запрасіў Вас у групавую размову %(room_jid)s" -#: ../src/dialogs.py:3533 +#: ../src/dialogs.py:3659 #, python-format msgid "$Contact has invited you to group chat %(room_jid)s" msgstr "$Contact запрасіў Вас у групавую размову %(room_jid)s" -#: ../src/dialogs.py:3541 +#: ../src/dialogs.py:3667 #, python-format msgid "Comment: %s" msgstr "Каментарый: %s" -#: ../src/dialogs.py:3543 +#: ../src/dialogs.py:3669 msgid "Do you want to accept the invitation?" msgstr "" -#: ../src/dialogs.py:3599 +#: ../src/dialogs.py:3730 msgid "Choose Sound" msgstr "Выберыце гукавы файл" -#: ../src/dialogs.py:3609 ../src/dialogs.py:3663 +#: ../src/dialogs.py:3740 ../src/dialogs.py:3796 msgid "All files" msgstr "Усе файлы" -#: ../src/dialogs.py:3614 +#: ../src/dialogs.py:3745 msgid "Wav Sounds" msgstr "Файлы Wav" -#: ../src/dialogs.py:3650 +#: ../src/dialogs.py:3783 msgid "Choose Image" msgstr "Выберыце малюнак" -#: ../src/dialogs.py:3668 +#: ../src/dialogs.py:3801 msgid "Images" msgstr "Малюнкі" -#: ../src/dialogs.py:3733 +#: ../src/dialogs.py:3868 #, python-format msgid "When %s becomes:" msgstr "Калі %s становіцца:" -#: ../src/dialogs.py:3735 +#: ../src/dialogs.py:3870 #, python-format msgid "Adding Special Notification for %s" msgstr "Дадаць асабістае нагадванне для %s" #. # means number -#: ../src/dialogs.py:3804 +#: ../src/dialogs.py:3939 msgid "#" msgstr "№" -#: ../src/dialogs.py:3810 +#: ../src/dialogs.py:3945 msgid "Condition" msgstr "Умова" -#: ../src/dialogs.py:3928 +#: ../src/dialogs.py:4065 msgid "when I am " msgstr "калі я " -#: ../src/dialogs.py:4400 +#: ../src/dialogs.py:4541 #, python-format msgid "" "Your chat session with %(jid)s is encrypted.\n" @@ -7275,38 +7294,38 @@ msgid "" "This session's Short Authentication String is %(sas)s." msgstr "" -#: ../src/dialogs.py:4404 +#: ../src/dialogs.py:4545 msgid "You have already verified this contact's identity." msgstr "" -#: ../src/dialogs.py:4410 ../src/dialogs.py:4497 +#: ../src/dialogs.py:4551 ../src/dialogs.py:4640 msgid "Contact's identity verified" msgstr "" -#: ../src/dialogs.py:4418 +#: ../src/dialogs.py:4559 msgid "Verify again..." msgstr "" -#: ../src/dialogs.py:4423 +#: ../src/dialogs.py:4564 msgid "" "To be certain that only the expected person can read your messages or " "send you messages, you need to verify their identity by clicking the button " "below." msgstr "" -#: ../src/dialogs.py:4426 ../src/dialogs.py:4478 ../src/dialogs.py:4491 +#: ../src/dialogs.py:4567 ../src/dialogs.py:4621 ../src/dialogs.py:4634 msgid "Contact's identity NOT verified" msgstr "" -#: ../src/dialogs.py:4433 +#: ../src/dialogs.py:4574 msgid "Verify..." msgstr "" -#: ../src/dialogs.py:4445 +#: ../src/dialogs.py:4586 msgid "Have you verified the contact's identity?" msgstr "" -#: ../src/dialogs.py:4446 +#: ../src/dialogs.py:4587 #, python-format msgid "" "To prevent talking to an unknown person, you should speak to %(jid)s " @@ -7316,31 +7335,50 @@ msgid "" "This session's Short Authentication String is %(sas)s." msgstr "" -#: ../src/dialogs.py:4447 +#: ../src/dialogs.py:4588 msgid "Did you talk to the remote contact and verify the SAS?" msgstr "" -#: ../src/dialogs.py:4479 +#: ../src/dialogs.py:4622 #, python-format msgid "The contact's key (%s) does not match the key assigned in Gajim." msgstr "" -#: ../src/dialogs.py:4485 +#: ../src/dialogs.py:4628 msgid "No GPG key is assigned to this contact. So you cannot encrypt messages." msgstr "" -#: ../src/dialogs.py:4492 +#: ../src/dialogs.py:4635 msgid "" "GPG key is assigned to this contact, but you do not trust his key, so " "message cannot be encrypted. Use your GPG client to trust this key." msgstr "" -#: ../src/dialogs.py:4498 +#: ../src/dialogs.py:4641 msgid "" "GPG Key is assigned to this contact, and you trust his key, so messages will " "be encrypted." msgstr "" +#: ../src/dialogs.py:4708 +msgid "an audio and video" +msgstr "" + +#: ../src/dialogs.py:4710 +msgid "an audio" +msgstr "" + +#: ../src/dialogs.py:4712 +msgid "a video" +msgstr "" + +#: ../src/dialogs.py:4716 +#, python-format +msgid "" +"%(contact)s wants to start %(type)s session with you. Do you want to answer " +"the call?" +msgstr "" + #: ../src/disco.py:118 msgid "Others" msgstr "Іншыя" @@ -7350,25 +7388,25 @@ msgstr "Іншыя" msgid "Conference" msgstr "Канферэнцыі" -#: ../src/disco.py:442 +#: ../src/disco.py:478 msgid "Without a connection, you can not browse available services" msgstr "" "Вы не можаце праглядзець спіс даступных сервісаў, не злучыўшыся з серверам." -#: ../src/disco.py:516 +#: ../src/disco.py:554 #, python-format msgid "Service Discovery using account %s" msgstr "Пошук сервісаў для рахунка %s" -#: ../src/disco.py:518 +#: ../src/disco.py:556 msgid "Service Discovery" msgstr "Пошук сервісаў" -#: ../src/disco.py:659 +#: ../src/disco.py:706 msgid "The service could not be found" msgstr "Немагчыма знайсці сервіс" -#: ../src/disco.py:660 +#: ../src/disco.py:707 msgid "" "There is no service at the address you entered, or it is not responding. " "Check the address and try again." @@ -7376,342 +7414,337 @@ msgstr "" "Па вызначаным адрасе няма сервісаў, альбо яны не адказваюць на запыты. " "Праверце адрас і паспрабуйце зноў." -#: ../src/disco.py:664 ../src/disco.py:960 +#: ../src/disco.py:711 ../src/disco.py:1047 msgid "The service is not browsable" msgstr "Немагчыма праглядзець сервіс" -#: ../src/disco.py:665 +#: ../src/disco.py:712 msgid "This type of service does not contain any items to browse." msgstr "Гэты сервіс не ўтрымлівае ў сабе элементаў." -#: ../src/disco.py:702 ../src/disco.py:712 +#: ../src/disco.py:751 ../src/disco.py:761 #, fuzzy msgid "Invalid Server Name" msgstr "Няправільнае імя карыстальніка" -#: ../src/disco.py:759 +#: ../src/disco.py:815 #, fuzzy, python-format msgid "Browsing %(address)s using account %(account)s" msgstr "Прагляд %s для рахунка %s" -#: ../src/disco.py:799 +#: ../src/disco.py:859 msgid "_Browse" msgstr "_Праглядзець" -#: ../src/disco.py:961 +#: ../src/disco.py:1048 msgid "This service does not contain any items to browse." msgstr "Гэты сервіс не ўтрымлівае ў сабе элементаў, якія можна праглядзець." -#: ../src/disco.py:1183 +#: ../src/disco.py:1288 #, fuzzy msgid "_Execute Command" msgstr "_Выканаць загад..." -#: ../src/disco.py:1193 ../src/disco.py:1359 +#: ../src/disco.py:1298 ../src/disco.py:1469 msgid "Re_gister" msgstr "Зарэ_гістравацца" -#: ../src/disco.py:1396 +#: ../src/disco.py:1510 #, fuzzy, python-format msgid "Scanning %(current)d / %(total)d.." msgstr "Пошук у %d / %d.." #. Users column -#: ../src/disco.py:1578 +#: ../src/disco.py:1700 msgid "Users" msgstr "Карыстальнікі" #. Description column -#: ../src/disco.py:1586 +#: ../src/disco.py:1708 msgid "Description" msgstr "Апісанне" #. Id column -#: ../src/disco.py:1594 +#: ../src/disco.py:1716 msgid "Id" msgstr "Id" -#: ../src/disco.py:1659 ../src/gajim.py:3311 +#: ../src/disco.py:1781 ../src/gui_interface.py:3088 msgid "Bookmark already set" msgstr "Закладка ўжо ўсталяваная" -#: ../src/disco.py:1660 ../src/gajim.py:3312 +#: ../src/disco.py:1782 ../src/gui_interface.py:3089 #, python-format msgid "Group Chat \"%s\" is already in your bookmarks." msgstr "Групавая размова \"%s\" ужо знаходзіцца ў Вашых закладках." -#: ../src/disco.py:1669 ../src/gajim.py:3325 +#: ../src/disco.py:1791 ../src/gui_interface.py:3102 msgid "Bookmark has been added successfully" msgstr "Закладка паспяхова дададзеная" -#: ../src/disco.py:1670 ../src/gajim.py:3326 +#: ../src/disco.py:1792 ../src/gui_interface.py:3103 msgid "You can manage your bookmarks via Actions menu in your roster." msgstr "" "Вы можаце рэдагаваць спіс Вашых закладак праз меню \"Дзеянні\" галоўнага " "вакна." -#: ../src/disco.py:1863 +#: ../src/disco.py:2001 msgid "Subscribed" msgstr "Падпісаны" -#: ../src/disco.py:1871 +#: ../src/disco.py:2009 #, fuzzy msgid "Node" msgstr "Ніякі" -#: ../src/disco.py:1933 +#: ../src/disco.py:2073 msgid "New post" msgstr "Новы допіс" -#: ../src/disco.py:1939 +#: ../src/disco.py:2079 msgid "_Subscribe" msgstr "Падп_ісацца" -#: ../src/disco.py:1945 +#: ../src/disco.py:2085 msgid "_Unsubscribe" msgstr "_Адпісацца" -#: ../src/features_window.py:46 +#: ../src/features_window.py:48 msgid "SSL certificat validation" msgstr "" -#: ../src/features_window.py:47 +#: ../src/features_window.py:49 msgid "" "A library used to validate server certificates to ensure a secure connection." msgstr "" -#: ../src/features_window.py:48 ../src/features_window.py:49 +#: ../src/features_window.py:50 ../src/features_window.py:51 msgid "Requires python-pyopenssl." msgstr "" -#: ../src/features_window.py:50 +#: ../src/features_window.py:52 msgid "Bonjour / Zeroconf" msgstr "" -#: ../src/features_window.py:51 +#: ../src/features_window.py:53 msgid "Serverless chatting with autodetected clients in a local network." msgstr "" -#: ../src/features_window.py:52 +#: ../src/features_window.py:54 msgid "Requires python-avahi." msgstr "" -#: ../src/features_window.py:53 +#: ../src/features_window.py:55 msgid "Requires pybonjour (http://o2s.csail.mit.edu/o2s-wiki/pybonjour)." msgstr "" -#: ../src/features_window.py:54 +#: ../src/features_window.py:56 #, fuzzy msgid "Command line" msgstr "Загады: %s" -#: ../src/features_window.py:55 +#: ../src/features_window.py:57 msgid "A script to control Gajim via commandline." msgstr "" -#: ../src/features_window.py:56 +#: ../src/features_window.py:58 msgid "Requires python-dbus." msgstr "" -#: ../src/features_window.py:57 ../src/features_window.py:61 -#: ../src/features_window.py:65 ../src/features_window.py:69 -#: ../src/features_window.py:73 ../src/features_window.py:81 -#: ../src/features_window.py:85 +#: ../src/features_window.py:59 ../src/features_window.py:63 +#: ../src/features_window.py:67 ../src/features_window.py:71 +#: ../src/features_window.py:75 ../src/features_window.py:83 +#: ../src/features_window.py:87 ../src/features_window.py:111 msgid "Feature not available under Windows." msgstr "" -#: ../src/features_window.py:58 +#: ../src/features_window.py:60 #, fuzzy msgid "OpenGPG message encryption" msgstr "Шыфраванне OpenPGP" -#: ../src/features_window.py:59 +#: ../src/features_window.py:61 #, fuzzy msgid "Encrypting chat messages with gpg keys." msgstr "_Уваходнае паведамленне:" -#: ../src/features_window.py:60 +#: ../src/features_window.py:62 msgid "Requires gpg and python-GnuPGInterface." msgstr "" -#: ../src/features_window.py:62 +#: ../src/features_window.py:64 #, fuzzy msgid "Network-manager" msgstr "Кіраўнік журналаў" -#: ../src/features_window.py:63 +#: ../src/features_window.py:65 msgid "Autodetection of network status." msgstr "" -#: ../src/features_window.py:64 +#: ../src/features_window.py:66 msgid "Requires gnome-network-manager and python-dbus." msgstr "" -#: ../src/features_window.py:66 +#: ../src/features_window.py:68 #, fuzzy msgid "Session Management" msgstr "Паведамленне адпраўленае" -#: ../src/features_window.py:67 +#: ../src/features_window.py:69 msgid "Gajim session is stored on logout and restored on login." msgstr "" -#: ../src/features_window.py:68 +#: ../src/features_window.py:70 msgid "Requires python-gnome2." msgstr "" -#: ../src/features_window.py:70 +#: ../src/features_window.py:72 #, fuzzy msgid "Password encryption" msgstr "Паролі розняцца" -#: ../src/features_window.py:71 +#: ../src/features_window.py:73 msgid "Passwords can be stored securely and not just in plaintext." msgstr "" -#: ../src/features_window.py:72 +#: ../src/features_window.py:74 msgid "Requires gnome-keyring and python-gnome2-desktop, or kwalletcli." msgstr "" -#: ../src/features_window.py:74 +#: ../src/features_window.py:76 msgid "SRV" msgstr "" -#: ../src/features_window.py:75 +#: ../src/features_window.py:77 msgid "Ability to connect to servers which are using SRV records." msgstr "" -#: ../src/features_window.py:76 +#: ../src/features_window.py:78 msgid "Requires dnsutils." msgstr "" -#: ../src/features_window.py:77 +#: ../src/features_window.py:79 msgid "Requires nslookup to use SRV records." msgstr "" -#: ../src/features_window.py:78 +#: ../src/features_window.py:80 msgid "Spell Checker" msgstr "" -#: ../src/features_window.py:79 +#: ../src/features_window.py:81 msgid "Spellchecking of composed messages." msgstr "" -#: ../src/features_window.py:80 +#: ../src/features_window.py:82 msgid "Requires libgtkspell." msgstr "" -#: ../src/features_window.py:82 +#: ../src/features_window.py:84 #, fuzzy msgid "Notification" msgstr "Змяненне рахунка" -#: ../src/features_window.py:83 +#: ../src/features_window.py:85 msgid "Passive popups notifying for new events." msgstr "" -#: ../src/features_window.py:84 +#: ../src/features_window.py:86 msgid "" "Requires python-notify or instead python-dbus in conjunction with " "notification-daemon." msgstr "" -#: ../src/features_window.py:86 -msgid "Trayicon" -msgstr "" - -#: ../src/features_window.py:87 -msgid "A icon in systemtray reflecting the current presence." -msgstr "" - #: ../src/features_window.py:88 -msgid "" -"Requires python-gnome2-extras or compiled trayicon module from Gajim sources." -msgstr "" - -#: ../src/features_window.py:89 -msgid "Requires PyGTK >= 2.10." -msgstr "" - -#: ../src/features_window.py:90 #, fuzzy msgid "Automatic status" msgstr "_Адпаведна стану" -#: ../src/features_window.py:91 +#: ../src/features_window.py:89 msgid "Ability to measure idle time, in order to set auto status." msgstr "" -#: ../src/features_window.py:92 +#: ../src/features_window.py:90 msgid "Requires libxss library." msgstr "" -#: ../src/features_window.py:93 +#: ../src/features_window.py:91 msgid "Requires python2.5." msgstr "" -#: ../src/features_window.py:94 +#: ../src/features_window.py:92 msgid "LaTeX" msgstr "" -#: ../src/features_window.py:95 +#: ../src/features_window.py:93 msgid "Transform LaTeX expressions between $$ $$." msgstr "" -#: ../src/features_window.py:96 +#: ../src/features_window.py:94 msgid "" "Requires texlive-latex-base and dvipng. You have to set 'use_latex' to True " "in the Advanced Configuration Editor." msgstr "" -#: ../src/features_window.py:97 +#: ../src/features_window.py:95 msgid "" "Requires texlive-latex-base and dvipng (All is in MikTeX). You have to set " "'use_latex' to True in the Advanced Configuration Editor." msgstr "" -#: ../src/features_window.py:98 +#: ../src/features_window.py:96 #, fuzzy msgid "End to End message encryption" msgstr "Шыфраванне OpenPGP" -#: ../src/features_window.py:99 +#: ../src/features_window.py:97 #, fuzzy msgid "Encrypting chat messages." msgstr "_Уваходнае паведамленне:" -#: ../src/features_window.py:100 ../src/features_window.py:101 +#: ../src/features_window.py:98 ../src/features_window.py:99 msgid "Requires python-crypto." msgstr "" -#: ../src/features_window.py:102 +#: ../src/features_window.py:100 #, fuzzy msgid "RST Generator" msgstr "Агульная" -#: ../src/features_window.py:103 +#: ../src/features_window.py:101 msgid "" "Generate XHTML output from RST code (see http://docutils.sourceforge.net/" "docs/ref/rst/restructuredtext.html)." msgstr "" -#: ../src/features_window.py:104 ../src/features_window.py:105 +#: ../src/features_window.py:102 ../src/features_window.py:103 msgid "Requires python-docutils." msgstr "" -#: ../src/features_window.py:106 +#: ../src/features_window.py:104 msgid "Banners and clickable links" msgstr "" -#: ../src/features_window.py:107 +#: ../src/features_window.py:105 msgid "Ability to have clickable URLs in chat and groupchat window banners." msgstr "" -#: ../src/features_window.py:108 ../src/features_window.py:109 +#: ../src/features_window.py:106 ../src/features_window.py:107 msgid "Requires python-sexy." msgstr "" -#: ../src/features_window.py:123 +#: ../src/features_window.py:108 +msgid "Audio / Video" +msgstr "" + +#: ../src/features_window.py:109 +msgid "Ability to start audio and video chat." +msgstr "" + +#: ../src/features_window.py:110 +msgid "Requires python-farsight." +msgstr "" + +#: ../src/features_window.py:125 #, fuzzy msgid "Feature" msgstr "Здольнасці сервера" @@ -7728,140 +7761,140 @@ msgstr "Час" msgid "Progress" msgstr "Ступень выкананасці" -#: ../src/filetransfers_window.py:173 ../src/filetransfers_window.py:227 +#: ../src/filetransfers_window.py:177 ../src/filetransfers_window.py:233 #, python-format msgid "Filename: %s" msgstr "Файл: %s" -#: ../src/filetransfers_window.py:174 ../src/filetransfers_window.py:313 +#: ../src/filetransfers_window.py:178 ../src/filetransfers_window.py:323 #, python-format msgid "Size: %s" msgstr "Памер: %s" #. You is a reply of who sent a file #. You is a reply of who received a file -#: ../src/filetransfers_window.py:183 ../src/filetransfers_window.py:193 -#: ../src/history_manager.py:520 +#: ../src/filetransfers_window.py:187 ../src/filetransfers_window.py:197 +#: ../src/history_manager.py:529 msgid "You" msgstr "Вы" -#: ../src/filetransfers_window.py:184 +#: ../src/filetransfers_window.py:188 #, python-format msgid "Sender: %s" msgstr "Адпраўнік: %s" -#: ../src/filetransfers_window.py:185 ../src/filetransfers_window.py:596 -#: ../src/tooltips.py:670 +#: ../src/filetransfers_window.py:189 ../src/filetransfers_window.py:617 +#: ../src/tooltips.py:651 msgid "Recipient: " msgstr "Атрымальнік: " -#: ../src/filetransfers_window.py:196 +#: ../src/filetransfers_window.py:200 #, python-format msgid "Saved in: %s" msgstr "Захаваць у: %s" -#: ../src/filetransfers_window.py:198 +#: ../src/filetransfers_window.py:202 msgid "File transfer completed" msgstr "Перадача файла скончаная" -#: ../src/filetransfers_window.py:212 ../src/filetransfers_window.py:218 +#: ../src/filetransfers_window.py:217 ../src/filetransfers_window.py:224 msgid "File transfer cancelled" msgstr "Перадача файла скасаваная" -#: ../src/filetransfers_window.py:212 ../src/filetransfers_window.py:219 +#: ../src/filetransfers_window.py:217 ../src/filetransfers_window.py:225 msgid "Connection with peer cannot be established." msgstr "Немагчыма ўсталяваць злучэнне з атрымальнікам." -#: ../src/filetransfers_window.py:228 +#: ../src/filetransfers_window.py:234 #, python-format msgid "Recipient: %s" msgstr "Атрымальнік: %s" -#: ../src/filetransfers_window.py:230 +#: ../src/filetransfers_window.py:236 #, python-format msgid "Error message: %s" msgstr "Памылка: %s" -#: ../src/filetransfers_window.py:231 +#: ../src/filetransfers_window.py:237 #, fuzzy msgid "File transfer stopped" msgstr "Перадача файла спыненая" -#: ../src/filetransfers_window.py:251 +#: ../src/filetransfers_window.py:257 msgid "Choose File to Send..." msgstr "Выберыце файл..." -#: ../src/filetransfers_window.py:267 ../src/tooltips.py:708 +#: ../src/filetransfers_window.py:273 ../src/tooltips.py:689 #, fuzzy msgid "Description: " msgstr "Апісанне: %s" -#: ../src/filetransfers_window.py:278 +#: ../src/filetransfers_window.py:286 msgid "Gajim cannot access this file" msgstr "Gajim не можа даступіцца да гэтага файла" -#: ../src/filetransfers_window.py:279 +#: ../src/filetransfers_window.py:287 msgid "This file is being used by another process." msgstr "Гэтым файлам карыстаецца іншы працэс." -#: ../src/filetransfers_window.py:310 +#: ../src/filetransfers_window.py:320 #, python-format msgid "File: %s" msgstr "Файл: %s" -#: ../src/filetransfers_window.py:316 +#: ../src/filetransfers_window.py:326 #, python-format msgid "Type: %s" msgstr "Тып: %s" -#: ../src/filetransfers_window.py:318 +#: ../src/filetransfers_window.py:328 #, python-format msgid "Description: %s" msgstr "Апісанне: %s" -#: ../src/filetransfers_window.py:319 +#: ../src/filetransfers_window.py:329 #, python-format msgid "%s wants to send you a file:" msgstr "%s хоча адправіць Вам файл:" -#: ../src/filetransfers_window.py:332 ../src/gtkgui_helpers.py:812 +#: ../src/filetransfers_window.py:342 ../src/gtkgui_helpers.py:858 #, python-format msgid "Cannot overwrite existing file \"%s\"" msgstr "Немагчыма перапісаць наяўны файл \"%s\"" -#: ../src/filetransfers_window.py:333 ../src/gtkgui_helpers.py:814 +#: ../src/filetransfers_window.py:343 ../src/gtkgui_helpers.py:860 msgid "" "A file with this name already exists and you do not have permission to " "overwrite it." msgstr "Файл з такой назвай ужо існуе, а Вы не маеце правоў на яго перазапіс." -#: ../src/filetransfers_window.py:349 ../src/gtkgui_helpers.py:818 +#: ../src/filetransfers_window.py:359 ../src/gtkgui_helpers.py:864 msgid "This file already exists" msgstr "Такі файл ужо ёсць" -#: ../src/filetransfers_window.py:349 ../src/gtkgui_helpers.py:818 +#: ../src/filetransfers_window.py:359 ../src/gtkgui_helpers.py:864 msgid "What do you want to do?" msgstr "Што Вы хочаце зрабіць?" #. read-only bit is used to mark special folder under windows, #. not to mark that a folder is read-only. See ticket #3587 -#: ../src/filetransfers_window.py:359 ../src/gtkgui_helpers.py:825 +#: ../src/filetransfers_window.py:369 ../src/gtkgui_helpers.py:871 #, python-format msgid "Directory \"%s\" is not writable" msgstr "Немагчыма запісваць файлы ў дырэкторыю \"%s\"" -#: ../src/filetransfers_window.py:359 ../src/gtkgui_helpers.py:826 +#: ../src/filetransfers_window.py:369 ../src/gtkgui_helpers.py:872 msgid "You do not have permission to create files in this directory." msgstr "Вы не маеце права ствараць файлы ў гэтай дырэкторыі." -#: ../src/filetransfers_window.py:369 +#: ../src/filetransfers_window.py:379 msgid "Save File as..." msgstr "Захаваць файл як..." #. Print remaining time in format 00:00:00 #. You can change the places of (hours), (minutes), (seconds) - #. they are not translatable. -#: ../src/filetransfers_window.py:435 +#: ../src/filetransfers_window.py:449 #, python-format msgid "%(hours)02.d:%(minutes)02.d:%(seconds)02.d" msgstr "%(hours)02.d:%(minutes)02.d:%(seconds)02.d" @@ -7869,32 +7902,32 @@ msgstr "%(hours)02.d:%(minutes)02.d:%(seconds)02.d" #. This should make the string Kb/s, #. where 'Kb' part is taken from %s. #. Only the 's' after / (which means second) should be translated. -#: ../src/filetransfers_window.py:526 +#: ../src/filetransfers_window.py:542 #, python-format msgid "(%(filesize_unit)s/s)" msgstr "(%(filesize_unit)s/с)" -#: ../src/filetransfers_window.py:566 ../src/filetransfers_window.py:569 +#: ../src/filetransfers_window.py:585 ../src/filetransfers_window.py:588 msgid "Invalid File" msgstr "Няправільны файл" -#: ../src/filetransfers_window.py:566 +#: ../src/filetransfers_window.py:585 msgid "File: " msgstr "Файл: " -#: ../src/filetransfers_window.py:570 +#: ../src/filetransfers_window.py:589 msgid "It is not possible to send empty files" msgstr "Немагчыма адправіць пусты файл" -#: ../src/filetransfers_window.py:592 ../src/tooltips.py:660 +#: ../src/filetransfers_window.py:613 ../src/tooltips.py:641 msgid "Name: " msgstr "Назва:" -#: ../src/filetransfers_window.py:594 ../src/tooltips.py:664 +#: ../src/filetransfers_window.py:615 ../src/tooltips.py:645 msgid "Sender: " msgstr "Адпраўнік:" -#: ../src/filetransfers_window.py:781 +#: ../src/filetransfers_window.py:809 msgid "Pause" msgstr "Прыпыніць" @@ -7959,11 +7992,11 @@ msgid "" msgstr "Праверце, ці ўсталяваны Pywin32. Вы можаце сцягнуць яго з %s" #. set the icon to all newly opened wind -#: ../src/gajim.py:354 +#: ../src/gajim.py:328 msgid "Gajim is already running" msgstr "Gajim ужо працуе" -#: ../src/gajim.py:355 +#: ../src/gajim.py:329 msgid "" "Another instance of Gajim seems to be running\n" "Run anyway?" @@ -7971,433 +8004,28 @@ msgstr "" "Gajim ужо працуе\n" "Усё роўна запусціць наноў?" -#: ../src/gajim.py:440 -msgid "Passphrase Required" -msgstr "Патрэбны пароль" - -#: ../src/gajim.py:441 -#, fuzzy, python-format -msgid "Enter GPG key passphrase for key %(keyid)s (account %(account)s)." -msgstr "Вызначце пароль GPG для рахунка %s." - -#: ../src/gajim.py:455 -msgid "GPG key expired" -msgstr "" - -#: ../src/gajim.py:456 -#, fuzzy, python-format -msgid "Your GPG key has expied, you will be connected to %s without OpenPGP." -msgstr "Вы злучыцеся з %s без падтрымкі OpenPGP." - -#. ask again -#: ../src/gajim.py:465 -msgid "Wrong Passphrase" -msgstr "Няправільны пароль" - -#: ../src/gajim.py:466 -msgid "Please retype your GPG passphrase or press Cancel." -msgstr "Паўтарыце ўвод пароля GPG альбо пстрыкніце Скасаваць." - -#: ../src/gajim.py:524 -#, fuzzy, python-format -msgid "" -"Your desired nickname in group chat %s is in use or registered by another " -"occupant.\n" -"Please specify another nickname below:" -msgstr "" -"Гэтая мянушка ўжо ўжытая альбо зарэгістраваная іншым чалавекам.\n" -"Выберыце іншую мянушку:" - -#: ../src/gajim.py:527 -msgid "Always use this nickname when there is a conflict" -msgstr "" - -#: ../src/gajim.py:544 -msgid "Do you accept this request?" -msgstr "Хочаце задаволіць гэты запыт?" - -#: ../src/gajim.py:546 -#, fuzzy, python-format -msgid "Do you accept this request on account %s?" -msgstr "Хочаце задаволіць гэты запыт?" - -#: ../src/gajim.py:549 -#, fuzzy, python-format -msgid "HTTP (%(method)s) Authorization for %(url)s (id: %(id)s)" -msgstr "HTTP (%s) аўтарызацыя для %s (id: %s)" - -#: ../src/gajim.py:600 ../src/notify.py:511 -msgid "Connection Failed" -msgstr "Памылка злучэння" - -#: ../src/gajim.py:933 ../src/gajim.py:937 -#, fuzzy, python-format -msgid "Error %(code)s: %(msg)s" -msgstr "%(nickname)s: %(message)s" - -#. ('MSGNOTSENT', account, (jid, ierror_msg, msg, time, session)) -#: ../src/gajim.py:947 ../src/gajim.py:961 -#, fuzzy, python-format -msgid "error while sending %(message)s ( %(error)s )" -msgstr "памылка адпраўкі %s ( %s )" - -#: ../src/gajim.py:988 ../src/notify.py:513 -#, fuzzy -msgid "Subscription request" -msgstr "Запыт падпіскі" - -#: ../src/gajim.py:1013 -msgid "Authorization accepted" -msgstr "Паспяховая аўтарызацыя" - -#: ../src/gajim.py:1014 -#, python-format -msgid "The contact \"%s\" has authorized you to see his or her status." -msgstr "Чалавек \"%s\" дазволіў Вам бачыць змены яго стану." - -#: ../src/gajim.py:1026 -#, python-format -msgid "Contact \"%s\" removed subscription from you" -msgstr "Чалавек \"%s\" забраў у Вас аўтарызацыю" - -#: ../src/gajim.py:1027 -msgid "" -"You will always see him or her as offline.\n" -"Do you want to remove him or her from your contact list?" -msgstr "" - -#: ../src/gajim.py:1052 ../src/notify.py:515 -#, fuzzy -msgid "Unsubscribed" -msgstr "_Адпісацца" - -#: ../src/gajim.py:1093 -#, python-format -msgid "Contact with \"%s\" cannot be established" -msgstr "Немагчыма злучыцца з \"%s\"" - -#: ../src/gajim.py:1283 ../src/groupchat_control.py:1251 -#, fuzzy, python-format -msgid "%(nick)s is now known as %(new_nick)s" -msgstr "%s змяніў мянушку на %s" - -#: ../src/gajim.py:1308 ../src/groupchat_control.py:1436 -#: ../src/history_window.py:431 ../src/notify.py:244 -#, python-format -msgid "%(nick)s is now %(status)s" -msgstr "%(nick)s цяпер %(status)s" - -#: ../src/gajim.py:1375 -#, python-format -msgid "%(jid)s has set the subject to %(subject)s" -msgstr "" - -#. Can be a presence (see chg_contact_status in groupchat_control.py) -#. Can be a message (see handle_event_gc_config_change in gajim.py) -#: ../src/gajim.py:1439 ../src/groupchat_control.py:1191 -msgid "Any occupant is allowed to see your full JID" -msgstr "" - -#: ../src/gajim.py:1442 -msgid "Room now shows unavailable member" -msgstr "" - -#: ../src/gajim.py:1444 -msgid "room now does not show unavailable members" -msgstr "" - -#: ../src/gajim.py:1447 -msgid "A non-privacy-related room configuration change has occurred" -msgstr "" - -#. Can be a presence (see chg_contact_status in groupchat_control.py) -#: ../src/gajim.py:1450 -msgid "Room logging is now enabled" -msgstr "" - -#: ../src/gajim.py:1452 -msgid "Room logging is now disabled" -msgstr "" - -#: ../src/gajim.py:1454 -msgid "Room is now non-anonymous" -msgstr "" - -#: ../src/gajim.py:1457 -msgid "Room is now semi-anonymous" -msgstr "" - -#: ../src/gajim.py:1460 -msgid "Room is now fully-anonymous" -msgstr "" - -#: ../src/gajim.py:1492 -#, fuzzy, python-format -msgid "A Password is required to join the room %s. Please type it." -msgstr "Каб удзельнічаць у гэтай групавой размове, трэба ведаць пароль." - -#: ../src/gajim.py:1526 -msgid "" -"You configured Gajim to use GPG agent, but there is no GPG agent running or " -"it returned a wrong passphrase.\n" -msgstr "" - -#: ../src/gajim.py:1528 ../src/gajim.py:1534 -msgid "You are currently connected without your OpenPGP key." -msgstr "Вы злучаны без выкарыстання ключа OpenPGP." - -#: ../src/gajim.py:1529 -msgid "Your passphrase is incorrect" -msgstr "Пароль няправільны" - -#: ../src/gajim.py:1533 -#, fuzzy -msgid "OpenGPG Passphrase Incorrect" -msgstr "Пароль няправільны" - -#: ../src/gajim.py:1559 -msgid "GPG key not trusted" -msgstr "" - -#: ../src/gajim.py:1559 -msgid "" -"The GPG key used to encrypt this chat is not trusted. Do you really want to " -"encrypt this message?" -msgstr "" - -#: ../src/gajim.py:1561 ../src/gajim.py:2227 ../src/gajim.py:2262 -#: ../src/groupchat_control.py:1674 ../src/message_window.py:222 -#: ../src/roster_window.py:2667 ../src/roster_window.py:3292 -#: ../src/roster_window.py:3970 -msgid "Do _not ask me again" -msgstr "_Больш не пытацца" - -#: ../src/gajim.py:1571 -#, fuzzy -msgid "" -"Gnome Keyring is installed but not \t\t\t\tcorrectly started (environment " -"variable probably not \t\t\t\tcorrectly set)" -msgstr "" -"Кіраўнік пароляў Gnomekeyring усталяваны, але няправільна выконваецца " -"(магчыма, зменная асяроддзя выстаўленая няправільна)" - -#: ../src/gajim.py:1681 -#, python-format -msgid "New mail on %(gmail_mail_address)s" -msgstr "Новая пошта на %(gmail_mail_address)s" - -#: ../src/gajim.py:1683 -#, python-format -msgid "You have %d new mail conversation" -msgid_plural "You have %d new mail conversations" -msgstr[0] "%d новы ліст" -msgstr[1] "%d новыя лісты" -msgstr[2] "%d новых лістоў" - -#: ../src/gajim.py:1696 -#, python-format -msgid "" -"\n" -"\n" -"From: %(from_address)s\n" -"Subject: %(subject)s\n" -"%(snippet)s" -msgstr "" - -#: ../src/gajim.py:1767 -#, python-format -msgid "%s wants to send you a file." -msgstr "%s хоча адправіць Вам файл." - -#: ../src/gajim.py:1805 ../src/roster_window.py:1851 -#, fuzzy -msgid "Remote contact stopped transfer" -msgstr "Выдаліць чалавека з спіса" - -#: ../src/gajim.py:1807 ../src/roster_window.py:1853 -#, fuzzy -msgid "Error opening file" -msgstr "Памылка чытання файла:" - -#: ../src/gajim.py:1838 -#, python-format -msgid "You successfully received %(filename)s from %(name)s." -msgstr "Файл %(filename)s паспяхова атрыманы ад %(name)s." - -#. ft stopped -#: ../src/gajim.py:1842 -#, python-format -msgid "File transfer of %(filename)s from %(name)s stopped." -msgstr "Перадача файла %(filename)s ад %(name)s спыненая." - -#: ../src/gajim.py:1855 -#, python-format -msgid "You successfully sent %(filename)s to %(name)s." -msgstr "Вы паспяхова адправілі файл %(filename)s для %(name)s." - -#. ft stopped -#: ../src/gajim.py:1859 -#, python-format -msgid "File transfer of %(filename)s to %(name)s stopped." -msgstr "Перадача файла %(filename)s для %(name)s спыненая." - -#: ../src/gajim.py:1961 -#, python-format -msgid "" -"Unable to decrypt message from %s\n" -"It may have been tampered with." -msgstr "" - -#: ../src/gajim.py:1968 -#, fuzzy -msgid "Unable to decrypt message" -msgstr "Для кожнага _паведамлення" - -#: ../src/gajim.py:2042 -msgid "Username Conflict" -msgstr "Канфлікт імёнаў карыстальнікаў" - -#: ../src/gajim.py:2043 -msgid "Please type a new username for your local account" -msgstr "Вызначце імя карыстальніка для мясцовага рахунка" - -#: ../src/gajim.py:2055 -msgid "Ping?" -msgstr "" - -#: ../src/gajim.py:2068 -#, python-format -msgid "Pong! (%s s.)" -msgstr "" - -#: ../src/gajim.py:2079 -msgid "Error." -msgstr "" - -#: ../src/gajim.py:2106 -#, fuzzy -msgid "Resource Conflict" -msgstr "Канфлікт імёнаў карыстальнікаў" - -#: ../src/gajim.py:2107 -msgid "" -"You are already connected to this account with the same resource. Please " -"type a new one" -msgstr "" - -#: ../src/gajim.py:2166 -msgid "Error verifying SSL certificate" -msgstr "" - -#: ../src/gajim.py:2167 -#, python-format -msgid "" -"There was an error verifying the SSL certificate of your jabber server: %" -"(error)s\n" -"Do you still want to connect to this server?" -msgstr "" - -#: ../src/gajim.py:2172 -msgid "Ignore this error for this certificate." -msgstr "" - -#: ../src/gajim.py:2192 -msgid "SSL certificate error" -msgstr "" - -#: ../src/gajim.py:2193 -#, python-format -msgid "" -"It seems the SSL certificate of account %(account)s has changed or your " -"connection is being hacked.\n" -"Old fingerprint: %(old)s\n" -"New fingerprint: %(new)s\n" -"\n" -"Do you still want to connect and update the fingerprint of the certificate?" -msgstr "" - -#: ../src/gajim.py:2223 ../src/gajim.py:2258 -#, fuzzy -msgid "Insecure connection" -msgstr "Злучэнне" - -#: ../src/gajim.py:2224 -#, fuzzy -msgid "" -"You are about to send your password on an unencrypted connection. Are you " -"sure you want to do that?" -msgstr "Вы ствараеце мета-кантакт. Вы сапраўды хочаце працягнуць?" - -#: ../src/gajim.py:2226 ../src/gajim.py:2261 -msgid "Yes, I really want to connect insecurely" -msgstr "" - -#: ../src/gajim.py:2259 -msgid "" -"You are about to send your password on an insecure connection. You should " -"install PyOpenSSL to prevent that. Are you sure you want to do that?" -msgstr "" - -#: ../src/gajim.py:2279 -msgid "PEP node was not removed" -msgstr "" - -#: ../src/gajim.py:2280 -#, python-format -msgid "PEP node %(node)s was not removed: %(message)s" -msgstr "" - -#. theme doesn't exist, disable emoticons -#: ../src/gajim.py:2784 ../src/gajim.py:2806 -#, fuzzy -msgid "Emoticons disabled" -msgstr "Шыфраванне адключанае" - -#: ../src/gajim.py:2785 -msgid "" -"Your configured emoticons theme has not been found, so emoticons have been " -"disabled." -msgstr "" - -#: ../src/gajim.py:2807 -msgid "" -"Your configured emoticons theme cannot been loaded. You maybe need to update " -"the format of emoticons.py file. See http://trac.gajim.org/wiki/Emoticons " -"for more details." -msgstr "" - -#: ../src/gajim.py:2833 ../src/roster_window.py:3432 -msgid "You cannot join a group chat while you are invisible" -msgstr "Вы не можаце ўдзельнічаць у групавой размове нябачным" - -#. it is good to notify the user -#. in case he or she cannot see the output of the console -#: ../src/gajim.py:3202 -msgid "Could not save your settings and preferences" -msgstr "Немагчыма захаваць настаўленні" - -#: ../src/gajim-remote.py:78 +#: ../src/gajim-remote.py:77 msgid "Shows a help on specific command" msgstr "Паказвае даведку па вызначаным загадзе" #. User gets help for the command, specified by this parameter -#: ../src/gajim-remote.py:81 +#: ../src/gajim-remote.py:80 msgid "command" msgstr "загад" -#: ../src/gajim-remote.py:82 +#: ../src/gajim-remote.py:81 msgid "show help on command" msgstr "паказаць даведку па загадзе" -#: ../src/gajim-remote.py:86 +#: ../src/gajim-remote.py:85 msgid "Shows or hides the roster window" msgstr "Паказаць / схаваць галоўнае вакно" -#: ../src/gajim-remote.py:90 +#: ../src/gajim-remote.py:89 msgid "Pops up a window with the next pending event" msgstr "Паказаць выплыўнае вакно з наступнай нягледжанай падзеяй" -#: ../src/gajim-remote.py:94 +#: ../src/gajim-remote.py:93 msgid "" "Prints a list of all contacts in the roster. Each contact appears on a " "separate line" @@ -8405,49 +8033,49 @@ msgstr "" "Паказаць спіс усіх людзей у кантактным лісце. Звесткі пра кожнага чалавека " "друкуюцца на асобным радку" -#: ../src/gajim-remote.py:97 ../src/gajim-remote.py:112 -#: ../src/gajim-remote.py:122 ../src/gajim-remote.py:132 -#: ../src/gajim-remote.py:148 ../src/gajim-remote.py:162 -#: ../src/gajim-remote.py:171 ../src/gajim-remote.py:192 -#: ../src/gajim-remote.py:222 ../src/gajim-remote.py:231 -#: ../src/gajim-remote.py:238 ../src/gajim-remote.py:245 -#: ../src/gajim-remote.py:256 ../src/gajim-remote.py:272 -#: ../src/gajim-remote.py:283 +#: ../src/gajim-remote.py:96 ../src/gajim-remote.py:111 +#: ../src/gajim-remote.py:121 ../src/gajim-remote.py:131 +#: ../src/gajim-remote.py:147 ../src/gajim-remote.py:161 +#: ../src/gajim-remote.py:170 ../src/gajim-remote.py:191 +#: ../src/gajim-remote.py:221 ../src/gajim-remote.py:230 +#: ../src/gajim-remote.py:237 ../src/gajim-remote.py:244 +#: ../src/gajim-remote.py:255 ../src/gajim-remote.py:271 +#: ../src/gajim-remote.py:282 msgid "account" msgstr "рахунак" -#: ../src/gajim-remote.py:97 +#: ../src/gajim-remote.py:96 msgid "show only contacts of the given account" msgstr "паказаць людзей з пэўнага рахунка" -#: ../src/gajim-remote.py:103 +#: ../src/gajim-remote.py:102 msgid "Prints a list of registered accounts" msgstr "Паказаць спіс зарэгістраваных рахункаў" -#: ../src/gajim-remote.py:107 +#: ../src/gajim-remote.py:106 msgid "Changes the status of account or accounts" msgstr "Змяніць стан рахунка(ў)" #. offline, online, chat, away, xa, dnd, invisible should not be translated -#: ../src/gajim-remote.py:110 +#: ../src/gajim-remote.py:109 msgid "status" msgstr "стан" -#: ../src/gajim-remote.py:110 +#: ../src/gajim-remote.py:109 msgid "one of: offline, online, chat, away, xa, dnd, invisible " msgstr "адзін з: offline, online, chat, away, xa, dnd, invisible " -#: ../src/gajim-remote.py:111 ../src/gajim-remote.py:134 -#: ../src/gajim-remote.py:145 ../src/gajim-remote.py:159 -#: ../src/gajim-remote.py:170 ../src/gajim-remote.py:274 +#: ../src/gajim-remote.py:110 ../src/gajim-remote.py:133 +#: ../src/gajim-remote.py:144 ../src/gajim-remote.py:158 +#: ../src/gajim-remote.py:169 ../src/gajim-remote.py:273 msgid "message" msgstr "паведамленне" -#: ../src/gajim-remote.py:111 +#: ../src/gajim-remote.py:110 msgid "status message" msgstr "паведамленне стану" -#: ../src/gajim-remote.py:112 +#: ../src/gajim-remote.py:111 msgid "" "change status of account \"account\". If not specified, try to change status " "of all accounts that have \"sync with global status\" option set" @@ -8455,22 +8083,22 @@ msgstr "" "змяніць стан рахунка \"account\". Калі не вызначана, змяняецца стан усіх " "рахункаў, якія \"сінхранізуюцца з глабальным станам\"" -#: ../src/gajim-remote.py:118 +#: ../src/gajim-remote.py:117 #, fuzzy msgid "Changes the priority of account or accounts" msgstr "Змяніць стан рахунка(ў)" -#: ../src/gajim-remote.py:120 +#: ../src/gajim-remote.py:119 #, fuzzy msgid "priority" msgstr "Прыяры_тэт:" -#: ../src/gajim-remote.py:120 +#: ../src/gajim-remote.py:119 #, fuzzy msgid "priority you want to give to the account" msgstr "_Зарэгістраваць новы рахунак" -#: ../src/gajim-remote.py:122 +#: ../src/gajim-remote.py:121 #, fuzzy msgid "" "change the priority of the given account. If not specified, change status of " @@ -8479,24 +8107,24 @@ msgstr "" "змяніць стан рахунка \"account\". Калі не вызначана, змяняецца стан усіх " "рахункаў, якія \"сінхранізуюцца з глабальным станам\"" -#: ../src/gajim-remote.py:128 +#: ../src/gajim-remote.py:127 msgid "Shows the chat dialog so that you can send messages to a contact" msgstr "" "Паказвае вакно, з якога Вы можаце адправіць паведамленне пэўнаму чалавеку" -#: ../src/gajim-remote.py:130 +#: ../src/gajim-remote.py:129 msgid "JID of the contact that you want to chat with" msgstr "JID чалавека, з якім Вы хочаце паразмаўляць" -#: ../src/gajim-remote.py:132 ../src/gajim-remote.py:222 +#: ../src/gajim-remote.py:131 ../src/gajim-remote.py:221 msgid "if specified, contact is taken from the contact list of this account" msgstr "Калі вызначана, то імя чалавека выбіраецца з спіса гэтага рахунка" -#: ../src/gajim-remote.py:135 +#: ../src/gajim-remote.py:134 msgid "message content. The account must be specified or \"\"" msgstr "" -#: ../src/gajim-remote.py:140 +#: ../src/gajim-remote.py:139 msgid "" "Sends new chat message to a contact in the roster. Both OpenPGP key and " "account are optional. If you want to set only 'account', without 'OpenPGP " @@ -8506,29 +8134,29 @@ msgstr "" "рахунка не абавязковае. Калі Вы хочаце вызначыць толькі 'account', без " "'ключа OpenPGP', проста выставіце 'ключ OpenPGP' у ''." -#: ../src/gajim-remote.py:144 ../src/gajim-remote.py:157 +#: ../src/gajim-remote.py:143 ../src/gajim-remote.py:156 msgid "JID of the contact that will receive the message" msgstr "JID чалавека, які атрымае паведамленне" -#: ../src/gajim-remote.py:145 ../src/gajim-remote.py:159 -#: ../src/gajim-remote.py:170 +#: ../src/gajim-remote.py:144 ../src/gajim-remote.py:158 +#: ../src/gajim-remote.py:169 msgid "message contents" msgstr "змест паведамлення" -#: ../src/gajim-remote.py:146 ../src/gajim-remote.py:160 +#: ../src/gajim-remote.py:145 ../src/gajim-remote.py:159 msgid "pgp key" msgstr "ключ pgp" -#: ../src/gajim-remote.py:146 ../src/gajim-remote.py:160 +#: ../src/gajim-remote.py:145 ../src/gajim-remote.py:159 msgid "if specified, the message will be encrypted using this public key" msgstr "Калі вызначана, паведамленне будзе зашыфраванае адкрытым ключом" -#: ../src/gajim-remote.py:148 ../src/gajim-remote.py:162 -#: ../src/gajim-remote.py:171 +#: ../src/gajim-remote.py:147 ../src/gajim-remote.py:161 +#: ../src/gajim-remote.py:170 msgid "if specified, the message will be sent using this account" msgstr "Калі вызначана, паведамленне будзе адпраўленае праз гэты рахунак" -#: ../src/gajim-remote.py:153 +#: ../src/gajim-remote.py:152 msgid "" "Sends new single message to a contact in the roster. Both OpenPGP key and " "account are optional. If you want to set only 'account', without 'OpenPGP " @@ -8538,135 +8166,135 @@ msgstr "" "OpenPGP і рахунка не абавязковае. Калі Вы хочаце вызначыць толькі 'account', " "без 'ключа OpenPGP', проста выставіце 'ключ OpenPGP' у ''." -#: ../src/gajim-remote.py:158 +#: ../src/gajim-remote.py:157 msgid "subject" msgstr "тэма" -#: ../src/gajim-remote.py:158 +#: ../src/gajim-remote.py:157 msgid "message subject" msgstr "тэма паведамлення" -#: ../src/gajim-remote.py:167 +#: ../src/gajim-remote.py:166 msgid "Sends new message to a groupchat you've joined." msgstr "" -#: ../src/gajim-remote.py:169 +#: ../src/gajim-remote.py:168 #, fuzzy msgid "JID of the room that will receive the message" msgstr "JID чалавека, які атрымае паведамленне" -#: ../src/gajim-remote.py:176 +#: ../src/gajim-remote.py:175 msgid "Gets detailed info on a contact" msgstr "Атрымаць падрабязныя звесткі пра чалавека" -#: ../src/gajim-remote.py:178 ../src/gajim-remote.py:191 -#: ../src/gajim-remote.py:221 ../src/gajim-remote.py:230 +#: ../src/gajim-remote.py:177 ../src/gajim-remote.py:190 +#: ../src/gajim-remote.py:220 ../src/gajim-remote.py:229 msgid "JID of the contact" msgstr "JID чалавека" -#: ../src/gajim-remote.py:182 +#: ../src/gajim-remote.py:181 msgid "Gets detailed info on a account" msgstr "Атрымаць падрабязныя звесткі аб рахунку" -#: ../src/gajim-remote.py:184 +#: ../src/gajim-remote.py:183 msgid "Name of the account" msgstr "Назва рахунка" -#: ../src/gajim-remote.py:188 +#: ../src/gajim-remote.py:187 msgid "Sends file to a contact" msgstr "Адправіць файл чалавеку" -#: ../src/gajim-remote.py:190 +#: ../src/gajim-remote.py:189 msgid "file" msgstr "файл" -#: ../src/gajim-remote.py:190 +#: ../src/gajim-remote.py:189 msgid "File path" msgstr "Месца файла" -#: ../src/gajim-remote.py:192 +#: ../src/gajim-remote.py:191 msgid "if specified, file will be sent using this account" msgstr "Калі вызначана, файл будзе адпраўлены праз гэты рахунак" -#: ../src/gajim-remote.py:197 +#: ../src/gajim-remote.py:196 msgid "Lists all preferences and their values" msgstr "Паказаць спіс усіх настаўленняў і іх значэнні" -#: ../src/gajim-remote.py:201 +#: ../src/gajim-remote.py:200 msgid "Sets value of 'key' to 'value'." msgstr "Выстаўляе значэнне 'ключа' ў 'значэнне'" -#: ../src/gajim-remote.py:203 +#: ../src/gajim-remote.py:202 msgid "key=value" msgstr "ключ=значэнне" -#: ../src/gajim-remote.py:203 +#: ../src/gajim-remote.py:202 msgid "'key' is the name of the preference, 'value' is the value to set it to" msgstr "'ключ' ёсць назваю настаўлення, 'значэнне' ёсць выстаўляемым значэннем" -#: ../src/gajim-remote.py:208 +#: ../src/gajim-remote.py:207 msgid "Deletes a preference item" msgstr "Выдаляе ўласцівасць" -#: ../src/gajim-remote.py:210 +#: ../src/gajim-remote.py:209 msgid "key" msgstr "ключ" -#: ../src/gajim-remote.py:210 +#: ../src/gajim-remote.py:209 msgid "name of the preference to be deleted" msgstr "назва выдаляемай уласцівасці" -#: ../src/gajim-remote.py:214 +#: ../src/gajim-remote.py:213 msgid "Writes the current state of Gajim preferences to the .config file" msgstr "Запісвае бягучыя настаўленні Gajim у файл .config" -#: ../src/gajim-remote.py:219 +#: ../src/gajim-remote.py:218 msgid "Removes contact from roster" msgstr "Выдаліць чалавека з спіса" -#: ../src/gajim-remote.py:228 +#: ../src/gajim-remote.py:227 msgid "Adds contact to roster" msgstr "Дадаць чалавека ў спіс" -#: ../src/gajim-remote.py:230 +#: ../src/gajim-remote.py:229 msgid "jid" msgstr "jid" -#: ../src/gajim-remote.py:231 +#: ../src/gajim-remote.py:230 msgid "Adds new contact to this account" msgstr "Дадаць новага чалавека для гэтага рахунка" -#: ../src/gajim-remote.py:236 +#: ../src/gajim-remote.py:235 msgid "Returns current status (the global one unless account is specified)" msgstr "Вяртае бягучы стан (глабальны, калі не вызначаны рахунак)" -#: ../src/gajim-remote.py:243 +#: ../src/gajim-remote.py:242 msgid "" "Returns current status message (the global one unless account is specified)" msgstr "" "Вяртае бягучае паведамленне аб стане (глабальнае, калі не вызначаны рахунак)" -#: ../src/gajim-remote.py:250 +#: ../src/gajim-remote.py:249 msgid "Returns number of unread messages" msgstr "Вяртае колькасць нечытаных паведамленняў" -#: ../src/gajim-remote.py:254 +#: ../src/gajim-remote.py:253 msgid "Opens 'Start Chat' dialog" msgstr "Адкрыць вакно 'Пачаць размову'" -#: ../src/gajim-remote.py:256 +#: ../src/gajim-remote.py:255 msgid "Starts chat, using this account" msgstr "Пачаць размову для рахунка" -#: ../src/gajim-remote.py:260 +#: ../src/gajim-remote.py:259 msgid "Sends custom XML" msgstr "Адправіць асаблівы XML" -#: ../src/gajim-remote.py:262 +#: ../src/gajim-remote.py:261 msgid "XML to send" msgstr "Адправіць XML" -#: ../src/gajim-remote.py:263 +#: ../src/gajim-remote.py:262 msgid "" "Account in which the xml will be sent; if not specified, xml will be sent to " "all accounts" @@ -8674,77 +8302,77 @@ msgstr "" "Рахунак, на які будзе адпраўлены xml; калі не вызначаны, xml будзе " "адпраўлены на ўсе рахункі" -#: ../src/gajim-remote.py:269 +#: ../src/gajim-remote.py:268 msgid "Handle a xmpp:/ uri" msgstr "Апрацоўваць спасылкі xmpp:/" -#: ../src/gajim-remote.py:271 +#: ../src/gajim-remote.py:270 msgid "uri" msgstr "спасылка" -#: ../src/gajim-remote.py:271 +#: ../src/gajim-remote.py:270 msgid "URI to handle" msgstr "" -#: ../src/gajim-remote.py:272 +#: ../src/gajim-remote.py:271 msgid "Account in which you want to handle it" msgstr "" -#: ../src/gajim-remote.py:274 +#: ../src/gajim-remote.py:273 #, fuzzy msgid "Message content" msgstr "змест паведамлення" -#: ../src/gajim-remote.py:278 +#: ../src/gajim-remote.py:277 msgid "Join a MUC room" msgstr "Увайсці ў размоўны пакой" -#: ../src/gajim-remote.py:280 +#: ../src/gajim-remote.py:279 msgid "room" msgstr "пакой" -#: ../src/gajim-remote.py:280 +#: ../src/gajim-remote.py:279 #, fuzzy msgid "Room JID" msgstr "Пакой:" -#: ../src/gajim-remote.py:281 +#: ../src/gajim-remote.py:280 msgid "nick" msgstr "мянушка" -#: ../src/gajim-remote.py:281 +#: ../src/gajim-remote.py:280 #, fuzzy msgid "Nickname to use" msgstr "Мянушка не знойдзеная: %s" -#: ../src/gajim-remote.py:282 +#: ../src/gajim-remote.py:281 msgid "password" msgstr "пароль" -#: ../src/gajim-remote.py:282 +#: ../src/gajim-remote.py:281 #, fuzzy msgid "Password to enter the room" msgstr "Паролі розняцца" -#: ../src/gajim-remote.py:283 +#: ../src/gajim-remote.py:282 msgid "Account from which you want to enter the room" msgstr "" -#: ../src/gajim-remote.py:288 +#: ../src/gajim-remote.py:287 #, fuzzy msgid "Check if Gajim is running" msgstr "Праверце, ці працуе avahi-daemon." -#: ../src/gajim-remote.py:292 +#: ../src/gajim-remote.py:291 #, fuzzy msgid "Shows or hides the ipython window" msgstr "Паказаць / схаваць галоўнае вакно" -#: ../src/gajim-remote.py:319 +#: ../src/gajim-remote.py:318 msgid "Missing argument \"contact_jid\"" msgstr "Не хапае аргумента \"contact_jid\"" -#: ../src/gajim-remote.py:338 +#: ../src/gajim-remote.py:339 #, python-format msgid "" "'%s' is not in your roster.\n" @@ -8753,31 +8381,31 @@ msgstr "" "'%s' няма ў Вашым спісе.\n" "Калі ласка, вызначце рахунак для адпраўкі паведамлення." -#: ../src/gajim-remote.py:341 +#: ../src/gajim-remote.py:342 msgid "You have no active account" msgstr "У Вас няма актыўнага рахунка" -#: ../src/gajim-remote.py:393 +#: ../src/gajim-remote.py:395 msgid "It seems Gajim is not running. So you can't use gajim-remote." msgstr "" -#: ../src/gajim-remote.py:416 +#: ../src/gajim-remote.py:422 #, python-format msgid "" "Usage: %(basename)s %(command)s %(arguments)s \n" "\t %(help)s" msgstr "" -#: ../src/gajim-remote.py:420 +#: ../src/gajim-remote.py:426 msgid "Arguments:" msgstr "Аргументы:" -#: ../src/gajim-remote.py:424 +#: ../src/gajim-remote.py:430 #, python-format msgid "%s not found" msgstr "%s не знойдзены" -#: ../src/gajim-remote.py:428 +#: ../src/gajim-remote.py:436 #, python-format msgid "" "Usage: %s command [arguments]\n" @@ -8786,7 +8414,7 @@ msgstr "" "Карыстанне: %s загад [аргументы]\n" "Загад ёсць адным з:\n" -#: ../src/gajim-remote.py:493 +#: ../src/gajim-remote.py:505 #, fuzzy, python-format msgid "" "Too many arguments. \n" @@ -8795,7 +8423,7 @@ msgstr "" "Надта шмат аргументаў. \n" "Увядзіце \"%s help %s\" для падрабязнейшых звестак" -#: ../src/gajim-remote.py:498 +#: ../src/gajim-remote.py:510 #, fuzzy, python-format msgid "" "Argument \"%(arg)s\" is not specified. \n" @@ -8804,7 +8432,7 @@ msgstr "" "Аргумент \"%s\" не вызначаны. \n" "Увядзіце \"%s help %s\" для падрабязных звестак" -#: ../src/gajim-remote.py:517 +#: ../src/gajim-remote.py:529 msgid "Wrong uri" msgstr "Няправільная спасылка" @@ -8834,174 +8462,198 @@ msgstr "Вы не можаце выдаліць актыўную тэму" msgid "Please first choose another for your current theme." msgstr "Спачатку актывізуйце іншую тэму." -#: ../src/groupchat_control.py:162 +#: ../src/groupchat_control.py:167 msgid "Sending private message failed" msgstr "Памылка адпраўкі прыватнага паведамлення" #. in second %s code replaces with nickname -#: ../src/groupchat_control.py:164 +#: ../src/groupchat_control.py:169 #, fuzzy, python-format msgid "You are no longer in group chat \"%(room)s\" or \"%(nick)s\" has left." msgstr "Вы выйшлі з пакоя \"%s\", альбо \"%s\" сышоў." -#: ../src/groupchat_control.py:436 +#: ../src/groupchat_control.py:439 msgid "Insert Nickname" msgstr "Уставіць мянушку" -#: ../src/groupchat_control.py:595 +#: ../src/groupchat_control.py:617 #, fuzzy msgid "Conversation with " msgstr "Журнал размоў" -#: ../src/groupchat_control.py:597 +#: ../src/groupchat_control.py:619 #, fuzzy msgid "Continued conversation" msgstr "Злучэнне" #. Can be a message (see handle_event_gc_config_change in gajim.py) -#: ../src/groupchat_control.py:1194 +#. Can be a presence (see chg_contact_status in groupchat_control.py) +#: ../src/groupchat_control.py:1228 ../src/gui_interface.py:1050 +msgid "Any occupant is allowed to see your full JID" +msgstr "" + +#. Can be a message (see handle_event_gc_config_change in gajim.py) +#: ../src/groupchat_control.py:1231 msgid "Room logging is enabled" msgstr "" -#: ../src/groupchat_control.py:1196 +#: ../src/groupchat_control.py:1233 #, fuzzy msgid "A new room has been created" msgstr "Новы рахунак паспяхова створаны" -#: ../src/groupchat_control.py:1199 +#: ../src/groupchat_control.py:1236 msgid "The server has assigned or modified your roomnick" msgstr "" #. do not print 'kicked by None' -#: ../src/groupchat_control.py:1205 +#: ../src/groupchat_control.py:1242 #, python-format msgid "%(nick)s has been kicked: %(reason)s" msgstr "%(nick)s пакараны: %(reason)s" -#: ../src/groupchat_control.py:1209 +#: ../src/groupchat_control.py:1246 #, python-format msgid "%(nick)s has been kicked by %(who)s: %(reason)s" msgstr "%(who)s пакараў %(nick)s: %(reason)s" #. do not print 'banned by None' -#: ../src/groupchat_control.py:1219 +#: ../src/groupchat_control.py:1256 #, python-format msgid "%(nick)s has been banned: %(reason)s" msgstr "Для %(nick)s забаронена казанне: %(reason)s" -#: ../src/groupchat_control.py:1223 +#: ../src/groupchat_control.py:1260 #, python-format msgid "%(nick)s has been banned by %(who)s: %(reason)s" msgstr "%(who)s забараніў казанне для %(nick)s: %(reason)s" -#: ../src/groupchat_control.py:1235 ../src/groupchat_control.py:1328 +#: ../src/groupchat_control.py:1272 ../src/groupchat_control.py:1365 #, python-format msgid "You are now known as %s" msgstr "Вашая мянушка змененая на %s" -#: ../src/groupchat_control.py:1289 ../src/groupchat_control.py:1293 -#: ../src/groupchat_control.py:1298 +#: ../src/groupchat_control.py:1288 ../src/gui_interface.py:894 +#, fuzzy, python-format +msgid "%(nick)s is now known as %(new_nick)s" +msgstr "%s змяніў мянушку на %s" + +#: ../src/groupchat_control.py:1326 ../src/groupchat_control.py:1330 +#: ../src/groupchat_control.py:1335 #, fuzzy, python-format msgid "%(nick)s has been removed from the room (%(reason)s)" msgstr "%(who)s пакараў %(nick)s: %(reason)s" -#: ../src/groupchat_control.py:1290 +#: ../src/groupchat_control.py:1327 #, fuzzy msgid "affiliation changed" msgstr "Адносіны: " -#: ../src/groupchat_control.py:1295 +#: ../src/groupchat_control.py:1332 msgid "room configuration changed to members-only" msgstr "" -#: ../src/groupchat_control.py:1300 +#: ../src/groupchat_control.py:1337 msgid "system shutdown" msgstr "" -#: ../src/groupchat_control.py:1377 +#: ../src/groupchat_control.py:1414 #, python-format msgid "** Affiliation of %(nick)s has been set to %(affiliation)s by %(actor)s" msgstr "" -#: ../src/groupchat_control.py:1381 +#: ../src/groupchat_control.py:1418 #, python-format msgid "** Affiliation of %(nick)s has been set to %(affiliation)s" msgstr "" -#: ../src/groupchat_control.py:1396 +#: ../src/groupchat_control.py:1433 #, fuzzy, python-format msgid "** Role of %(nick)s has been set to %(role)s by %(actor)s" msgstr "%(who)s пакараў %(nick)s: %(reason)s" -#: ../src/groupchat_control.py:1400 +#: ../src/groupchat_control.py:1437 #, fuzzy, python-format msgid "** Role of %(nick)s has been set to %(role)s" msgstr "%(nick)s пакараны: %(reason)s" -#: ../src/groupchat_control.py:1429 +#: ../src/groupchat_control.py:1466 #, python-format msgid "%s has left" msgstr "%s сышоў" -#: ../src/groupchat_control.py:1434 +#: ../src/groupchat_control.py:1471 #, python-format msgid "%s has joined the group chat" msgstr "%s далучыўся да групавой размовы" -#: ../src/groupchat_control.py:1668 +#: ../src/groupchat_control.py:1473 ../src/gui_interface.py:919 +#: ../src/history_window.py:442 ../src/notify.py:250 +#, python-format +msgid "%(nick)s is now %(status)s" +msgstr "%(nick)s цяпер %(status)s" + +#: ../src/groupchat_control.py:1706 #, python-format msgid "Are you sure you want to leave group chat \"%s\"?" msgstr "Вы сапраўды хочаце сысці з групавой размовы \"%s\"?" -#: ../src/groupchat_control.py:1670 +#: ../src/groupchat_control.py:1708 msgid "" "If you close this window, you will be disconnected from this group chat." msgstr "Калі Вы закрыеце гэтае вакно, Вы выйдзеце з гэтай групавой размовы." -#: ../src/groupchat_control.py:1707 +#: ../src/groupchat_control.py:1712 ../src/gui_interface.py:1172 +#: ../src/gui_interface.py:1940 ../src/gui_interface.py:1975 +#: ../src/message_window.py:227 ../src/roster_window.py:2658 +#: ../src/roster_window.py:3301 ../src/roster_window.py:3990 +msgid "Do _not ask me again" +msgstr "_Больш не пытацца" + +#: ../src/groupchat_control.py:1745 msgid "Changing Subject" msgstr "Змяненне тэмы" -#: ../src/groupchat_control.py:1708 +#: ../src/groupchat_control.py:1746 msgid "Please specify the new subject:" msgstr "Вызначце новую тэму:" -#: ../src/groupchat_control.py:1715 +#: ../src/groupchat_control.py:1753 msgid "Changing Nickname" msgstr "Змена мянушкі" -#: ../src/groupchat_control.py:1716 +#: ../src/groupchat_control.py:1754 msgid "Please specify the new nickname you want to use:" msgstr "Вызначце сваю новую мянушку:" #. Ask for a reason -#: ../src/groupchat_control.py:1745 +#: ../src/groupchat_control.py:1783 #, fuzzy, python-format msgid "Destroying %s" msgstr "Апісанне: %s" -#: ../src/groupchat_control.py:1746 +#: ../src/groupchat_control.py:1784 msgid "" "You are going to definitively destroy this room.\n" "You may specify a reason below:" msgstr "" -#: ../src/groupchat_control.py:1748 +#: ../src/groupchat_control.py:1786 msgid "You may also enter an alternate venue:" msgstr "" #. ask for reason -#: ../src/groupchat_control.py:1921 +#: ../src/groupchat_control.py:1967 #, python-format msgid "Kicking %s" msgstr "Пакаранне %s" -#: ../src/groupchat_control.py:1922 ../src/groupchat_control.py:2227 +#: ../src/groupchat_control.py:1968 ../src/groupchat_control.py:2291 msgid "You may specify a reason below:" msgstr "Вы можаце вызначыць прычыну:" #. ask for reason -#: ../src/groupchat_control.py:2226 +#: ../src/groupchat_control.py:2290 #, python-format msgid "Banning %s" msgstr "Забарона казання для %s" @@ -9027,61 +8679,452 @@ msgid "Details" msgstr "Падрабязнасці" #. we talk about file -#: ../src/gtkgui_helpers.py:166 ../src/gtkgui_helpers.py:181 +#: ../src/gtkgui_helpers.py:171 ../src/gtkgui_helpers.py:186 #, python-format msgid "Error: cannot open %s for reading" msgstr "Памылка: немагчыма прачытаць %s" -#: ../src/gtkgui_helpers.py:351 +#: ../src/gtkgui_helpers.py:362 msgid "Error reading file:" msgstr "Памылка чытання файла:" -#: ../src/gtkgui_helpers.py:354 +#: ../src/gtkgui_helpers.py:365 msgid "Error parsing file:" msgstr "Памылка разбору файла:" #. do not traceback (could be a permission problem) #. we talk about a file here -#: ../src/gtkgui_helpers.py:391 +#: ../src/gtkgui_helpers.py:406 #, python-format msgid "Could not write to %s. Session Management support will not work" msgstr "Немагчыма запісаць у %s. Сеансы не працуюць" #. xmpp: is currently handled by another program, so ask the user -#: ../src/gtkgui_helpers.py:728 +#: ../src/gtkgui_helpers.py:770 msgid "Gajim is not the default Jabber client" msgstr "Gajim не з'яўляецца прадвызначанай Jabber-праграмай" -#: ../src/gtkgui_helpers.py:729 +#: ../src/gtkgui_helpers.py:771 msgid "Would you like to make Gajim the default Jabber client?" msgstr "Ці Вы хочаце зрабіць Gajim прадвызначанай Jabber-праграмай?" -#: ../src/gtkgui_helpers.py:730 +#: ../src/gtkgui_helpers.py:772 msgid "Always check to see if Gajim is the default Jabber client on startup" msgstr "" "Заўсёды пры запуску спраўджваць, ці з'яўляецца Gajim прадвызначанай Jabber-" "праграмай" -#: ../src/gtkgui_helpers.py:799 +#: ../src/gtkgui_helpers.py:845 msgid "Extension not supported" msgstr "Пашырэнне не падтрымліваецца" -#: ../src/gtkgui_helpers.py:800 +#: ../src/gtkgui_helpers.py:846 #, python-format msgid "Image cannot be saved in %(type)s format. Save as %(new_filename)s?" msgstr "" "Немагчыма захаваць малюнак у фармаце %(type)s. Захаваць як %(new_filename)s?" -#: ../src/gtkgui_helpers.py:835 +#: ../src/gtkgui_helpers.py:881 msgid "Save Image as..." msgstr "Захаваць малюнак як..." -#: ../src/gui_menu_builder.py:89 +#: ../src/gui_interface.py:129 +#, fuzzy, python-format +msgid "" +"Your desired nickname in group chat %s is in use or registered by another " +"occupant.\n" +"Please specify another nickname below:" +msgstr "" +"Гэтая мянушка ўжо ўжытая альбо зарэгістраваная іншым чалавекам.\n" +"Выберыце іншую мянушку:" + +#: ../src/gui_interface.py:132 +msgid "Always use this nickname when there is a conflict" +msgstr "" + +#: ../src/gui_interface.py:149 +msgid "Do you accept this request?" +msgstr "Хочаце задаволіць гэты запыт?" + +#: ../src/gui_interface.py:151 +#, fuzzy, python-format +msgid "Do you accept this request on account %s?" +msgstr "Хочаце задаволіць гэты запыт?" + +#: ../src/gui_interface.py:154 +#, fuzzy, python-format +msgid "HTTP (%(method)s) Authorization for %(url)s (id: %(id)s)" +msgstr "HTTP (%s) аўтарызацыя для %s (id: %s)" + +#: ../src/gui_interface.py:205 ../src/notify.py:524 +msgid "Connection Failed" +msgstr "Памылка злучэння" + +#: ../src/gui_interface.py:544 ../src/gui_interface.py:548 +#, fuzzy, python-format +msgid "Error %(code)s: %(msg)s" +msgstr "%(nickname)s: %(message)s" + +#. ('MSGNOTSENT', account, (jid, ierror_msg, msg, time, session)) +#: ../src/gui_interface.py:558 ../src/gui_interface.py:572 +#, fuzzy, python-format +msgid "error while sending %(message)s ( %(error)s )" +msgstr "памылка адпраўкі %s ( %s )" + +#: ../src/gui_interface.py:599 ../src/notify.py:526 +#, fuzzy +msgid "Subscription request" +msgstr "Запыт падпіскі" + +#: ../src/gui_interface.py:624 +msgid "Authorization accepted" +msgstr "Паспяховая аўтарызацыя" + +#: ../src/gui_interface.py:625 +#, python-format +msgid "The contact \"%s\" has authorized you to see his or her status." +msgstr "Чалавек \"%s\" дазволіў Вам бачыць змены яго стану." + +#: ../src/gui_interface.py:637 +#, python-format +msgid "Contact \"%s\" removed subscription from you" +msgstr "Чалавек \"%s\" забраў у Вас аўтарызацыю" + +#: ../src/gui_interface.py:638 +msgid "" +"You will always see him or her as offline.\n" +"Do you want to remove him or her from your contact list?" +msgstr "" + +#: ../src/gui_interface.py:663 ../src/notify.py:528 +#, fuzzy +msgid "Unsubscribed" +msgstr "_Адпісацца" + +#: ../src/gui_interface.py:704 +#, python-format +msgid "Contact with \"%s\" cannot be established" +msgstr "Немагчыма злучыцца з \"%s\"" + +#: ../src/gui_interface.py:986 +#, python-format +msgid "%(jid)s has set the subject to %(subject)s" +msgstr "" + +#: ../src/gui_interface.py:1053 +msgid "Room now shows unavailable member" +msgstr "" + +#: ../src/gui_interface.py:1055 +msgid "room now does not show unavailable members" +msgstr "" + +#: ../src/gui_interface.py:1058 +msgid "A non-privacy-related room configuration change has occurred" +msgstr "" + +#. Can be a presence (see chg_contact_status in groupchat_control.py) +#: ../src/gui_interface.py:1061 +msgid "Room logging is now enabled" +msgstr "" + +#: ../src/gui_interface.py:1063 +msgid "Room logging is now disabled" +msgstr "" + +#: ../src/gui_interface.py:1065 +msgid "Room is now non-anonymous" +msgstr "" + +#: ../src/gui_interface.py:1068 +msgid "Room is now semi-anonymous" +msgstr "" + +#: ../src/gui_interface.py:1071 +msgid "Room is now fully-anonymous" +msgstr "" + +#: ../src/gui_interface.py:1103 +#, fuzzy, python-format +msgid "A Password is required to join the room %s. Please type it." +msgstr "Каб удзельнічаць у гэтай групавой размове, трэба ведаць пароль." + +#: ../src/gui_interface.py:1137 +msgid "" +"You configured Gajim to use GPG agent, but there is no GPG agent running or " +"it returned a wrong passphrase.\n" +msgstr "" + +#: ../src/gui_interface.py:1139 ../src/gui_interface.py:1145 +msgid "You are currently connected without your OpenPGP key." +msgstr "Вы злучаны без выкарыстання ключа OpenPGP." + +#: ../src/gui_interface.py:1140 +msgid "Your passphrase is incorrect" +msgstr "Пароль няправільны" + +#: ../src/gui_interface.py:1144 +#, fuzzy +msgid "OpenGPG Passphrase Incorrect" +msgstr "Пароль няправільны" + +#: ../src/gui_interface.py:1170 +msgid "GPG key not trusted" +msgstr "" + +#: ../src/gui_interface.py:1170 +msgid "" +"The GPG key used to encrypt this chat is not trusted. Do you really want to " +"encrypt this message?" +msgstr "" + +#: ../src/gui_interface.py:1182 +#, fuzzy +msgid "" +"Gnome Keyring is installed but not \t\t\t\tcorrectly started (environment " +"variable probably not \t\t\t\tcorrectly set)" +msgstr "" +"Кіраўнік пароляў Gnomekeyring усталяваны, але няправільна выконваецца " +"(магчыма, зменная асяроддзя выстаўленая няправільна)" + +#: ../src/gui_interface.py:1292 +#, python-format +msgid "New mail on %(gmail_mail_address)s" +msgstr "Новая пошта на %(gmail_mail_address)s" + +#: ../src/gui_interface.py:1294 +#, python-format +msgid "You have %d new mail conversation" +msgid_plural "You have %d new mail conversations" +msgstr[0] "%d новы ліст" +msgstr[1] "%d новыя лісты" +msgstr[2] "%d новых лістоў" + +#: ../src/gui_interface.py:1307 +#, python-format +msgid "" +"\n" +"\n" +"From: %(from_address)s\n" +"Subject: %(subject)s\n" +"%(snippet)s" +msgstr "" + +#: ../src/gui_interface.py:1379 +#, python-format +msgid "%s wants to send you a file." +msgstr "%s хоча адправіць Вам файл." + +#: ../src/gui_interface.py:1417 ../src/roster_window.py:1814 +#, fuzzy +msgid "Remote contact stopped transfer" +msgstr "Выдаліць чалавека з спіса" + +#: ../src/gui_interface.py:1419 ../src/roster_window.py:1816 +#, fuzzy +msgid "Error opening file" +msgstr "Памылка чытання файла:" + +#: ../src/gui_interface.py:1450 +#, python-format +msgid "You successfully received %(filename)s from %(name)s." +msgstr "Файл %(filename)s паспяхова атрыманы ад %(name)s." + +#. ft stopped +#: ../src/gui_interface.py:1454 +#, python-format +msgid "File transfer of %(filename)s from %(name)s stopped." +msgstr "Перадача файла %(filename)s ад %(name)s спыненая." + +#: ../src/gui_interface.py:1467 +#, python-format +msgid "You successfully sent %(filename)s to %(name)s." +msgstr "Вы паспяхова адправілі файл %(filename)s для %(name)s." + +#. ft stopped +#: ../src/gui_interface.py:1471 +#, python-format +msgid "File transfer of %(filename)s to %(name)s stopped." +msgstr "Перадача файла %(filename)s для %(name)s спыненая." + +#: ../src/gui_interface.py:1576 +#, python-format +msgid "" +"Unable to decrypt message from %s\n" +"It may have been tampered with." +msgstr "" + +#: ../src/gui_interface.py:1583 +#, fuzzy +msgid "Unable to decrypt message" +msgstr "Для кожнага _паведамлення" + +#: ../src/gui_interface.py:1657 +msgid "Username Conflict" +msgstr "Канфлікт імёнаў карыстальнікаў" + +#: ../src/gui_interface.py:1658 +msgid "Please type a new username for your local account" +msgstr "Вызначце імя карыстальніка для мясцовага рахунка" + +#: ../src/gui_interface.py:1670 +msgid "Ping?" +msgstr "" + +#: ../src/gui_interface.py:1683 +#, python-format +msgid "Pong! (%s s.)" +msgstr "" + +#: ../src/gui_interface.py:1694 +msgid "Error." +msgstr "" + +#: ../src/gui_interface.py:1721 +#, fuzzy +msgid "Resource Conflict" +msgstr "Канфлікт імёнаў карыстальнікаў" + +#: ../src/gui_interface.py:1722 +msgid "" +"You are already connected to this account with the same resource. Please " +"type a new one" +msgstr "" + +#: ../src/gui_interface.py:1771 +#, fuzzy, python-format +msgid "%s wants to start a voice chat." +msgstr "%s хоча адправіць Вам файл." + +#: ../src/gui_interface.py:1774 +#, fuzzy +msgid "Voice Chat Request" +msgstr "Запыт на перадачу файла" + +#: ../src/gui_interface.py:1879 +msgid "Error verifying SSL certificate" +msgstr "" + +#: ../src/gui_interface.py:1880 +#, python-format +msgid "" +"There was an error verifying the SSL certificate of your jabber server: %" +"(error)s\n" +"Do you still want to connect to this server?" +msgstr "" + +#: ../src/gui_interface.py:1885 +msgid "Ignore this error for this certificate." +msgstr "" + +#: ../src/gui_interface.py:1905 +msgid "SSL certificate error" +msgstr "" + +#: ../src/gui_interface.py:1906 +#, python-format +msgid "" +"It seems the SSL certificate of account %(account)s has changed or your " +"connection is being hacked.\n" +"Old fingerprint: %(old)s\n" +"New fingerprint: %(new)s\n" +"\n" +"Do you still want to connect and update the fingerprint of the certificate?" +msgstr "" + +#: ../src/gui_interface.py:1936 ../src/gui_interface.py:1971 +#, fuzzy +msgid "Insecure connection" +msgstr "Злучэнне" + +#: ../src/gui_interface.py:1937 +#, fuzzy +msgid "" +"You are about to send your password on an unencrypted connection. Are you " +"sure you want to do that?" +msgstr "Вы ствараеце мета-кантакт. Вы сапраўды хочаце працягнуць?" + +#: ../src/gui_interface.py:1939 ../src/gui_interface.py:1974 +msgid "Yes, I really want to connect insecurely" +msgstr "" + +#: ../src/gui_interface.py:1972 +msgid "" +"You are about to send your password on an insecure connection. You should " +"install PyOpenSSL to prevent that. Are you sure you want to do that?" +msgstr "" + +#: ../src/gui_interface.py:1992 +msgid "PEP node was not removed" +msgstr "" + +#: ../src/gui_interface.py:1993 +#, python-format +msgid "PEP node %(node)s was not removed: %(message)s" +msgstr "" + +#. theme doesn't exist, disable emoticons +#: ../src/gui_interface.py:2547 ../src/gui_interface.py:2569 +#, fuzzy +msgid "Emoticons disabled" +msgstr "Шыфраванне адключанае" + +#: ../src/gui_interface.py:2548 +msgid "" +"Your configured emoticons theme has not been found, so emoticons have been " +"disabled." +msgstr "" + +#: ../src/gui_interface.py:2570 +msgid "" +"Your configured emoticons theme cannot been loaded. You maybe need to update " +"the format of emoticons.py file. See http://trac.gajim.org/wiki/Emoticons " +"for more details." +msgstr "" + +#: ../src/gui_interface.py:2598 ../src/roster_window.py:3441 +msgid "You cannot join a group chat while you are invisible" +msgstr "Вы не можаце ўдзельнічаць у групавой размове нябачным" + +#. it is good to notify the user +#. in case he or she cannot see the output of the console +#: ../src/gui_interface.py:2969 +msgid "Could not save your settings and preferences" +msgstr "Немагчыма захаваць настаўленні" + +#: ../src/gui_interface.py:3462 +msgid "Passphrase Required" +msgstr "Патрэбны пароль" + +#: ../src/gui_interface.py:3463 +#, fuzzy, python-format +msgid "Enter GPG key passphrase for key %(keyid)s (account %(account)s)." +msgstr "Вызначце пароль GPG для рахунка %s." + +#: ../src/gui_interface.py:3477 +msgid "GPG key expired" +msgstr "" + +#: ../src/gui_interface.py:3478 +#, fuzzy, python-format +msgid "Your GPG key has expired, you will be connected to %s without OpenPGP." +msgstr "Вы злучыцеся з %s без падтрымкі OpenPGP." + +#. ask again +#: ../src/gui_interface.py:3487 +msgid "Wrong Passphrase" +msgstr "Няправільны пароль" + +#: ../src/gui_interface.py:3488 +msgid "Please retype your GPG passphrase or press Cancel." +msgstr "Паўтарыце ўвод пароля GPG альбо пстрыкніце Скасаваць." + +#: ../src/gui_menu_builder.py:93 #, fuzzy msgid "_New Group Chat" msgstr "Новая групавая размова" -#: ../src/gui_menu_builder.py:400 +#: ../src/gui_menu_builder.py:413 msgid "I would like to add you to my roster" msgstr "Я хачу дадаць Вас у мой кантактны ліст" @@ -9096,7 +9139,7 @@ msgstr "Людзі" #. holds time #: ../src/history_manager.py:174 ../src/history_manager.py:214 -#: ../src/history_window.py:95 +#: ../src/history_window.py:97 msgid "Date" msgstr "Дата" @@ -9107,7 +9150,7 @@ msgstr "Мянушка" #. holds message #: ../src/history_manager.py:188 ../src/history_manager.py:220 -#: ../src/history_window.py:103 +#: ../src/history_window.py:105 msgid "Message" msgstr "Паведамленне" @@ -9133,197 +9176,197 @@ msgstr "" "\n" "Калі Вы выбралі Так, пачакайце..." -#: ../src/history_manager.py:458 +#: ../src/history_manager.py:467 msgid "Exporting History Logs..." msgstr "Экспартаванне журналаў..." -#: ../src/history_manager.py:533 +#: ../src/history_manager.py:542 #, python-format msgid "%(who)s on %(time)s said: %(message)s\n" msgstr "%(who)s а %(time)s сказаў: %(message)s\n" -#: ../src/history_manager.py:570 +#: ../src/history_manager.py:579 msgid "Do you really want to delete logs of the selected contact?" msgid_plural "Do you really want to delete logs of the selected contacts?" msgstr[0] "Вы сапраўды хочаце выдаліць журнал размоў з выбранай асобай?" msgstr[1] "Вы сапраўды хочаце выдаліць журналы размоў з выбранымі асобамі?" msgstr[2] "Вы сапраўды хочаце выдаліць журналы размоў з выбранымі асобамі?" -#: ../src/history_manager.py:574 ../src/history_manager.py:609 +#: ../src/history_manager.py:583 ../src/history_manager.py:618 msgid "This is an irreversible operation." msgstr "Гэтае дзеянне не аднаўляецца." -#: ../src/history_manager.py:606 +#: ../src/history_manager.py:615 msgid "Do you really want to delete the selected message?" msgid_plural "Do you really want to delete the selected messages?" msgstr[0] "Вы сапраўды хочаце выдаліць выбранае паведамленне?" msgstr[1] "Вы сапраўды хочаце выдаліць выбраныя паведамленні?" msgstr[2] "Вы сапраўды хочаце выдаліць выбраныя паведамленні?" -#: ../src/history_window.py:298 +#: ../src/history_window.py:305 #, python-format msgid "Conversation History with %s" msgstr "Журнал размоў %s" -#: ../src/history_window.py:343 +#: ../src/history_window.py:350 msgid "Disk Error" msgstr "" -#: ../src/history_window.py:427 +#: ../src/history_window.py:438 #, python-format msgid "%(nick)s is now %(status)s: %(status_msg)s" msgstr "%(nick)s цяпер %(status)s: %(status_msg)s" -#: ../src/history_window.py:438 +#: ../src/history_window.py:449 #, fuzzy, python-format msgid "Error: %s" msgstr "Памылка: %s" -#: ../src/history_window.py:440 +#: ../src/history_window.py:451 msgid "Error" msgstr "" -#: ../src/history_window.py:442 +#: ../src/history_window.py:453 #, python-format msgid "Status is now: %(status)s: %(status_msg)s" msgstr "Цяперашні стан: %(status)s: %(status_msg)s" -#: ../src/history_window.py:445 +#: ../src/history_window.py:456 #, python-format msgid "Status is now: %(status)s" msgstr "Цяперашні стан: %(status)s" -#: ../src/htmltextview.py:512 ../src/htmltextview.py:522 +#: ../src/htmltextview.py:513 ../src/htmltextview.py:523 #, fuzzy msgid "Timeout loading image" msgstr "Немагчыма загрузіць малюнак" -#: ../src/htmltextview.py:532 +#: ../src/htmltextview.py:533 msgid "Image is too big" msgstr "" -#: ../src/message_window.py:220 +#: ../src/message_window.py:225 #, fuzzy msgid "You are going to close several tabs" msgstr "Вы не злучаны з серверам" -#: ../src/message_window.py:221 +#: ../src/message_window.py:226 #, fuzzy msgid "Do you really want to close them all?" msgstr "Вы сапраўды хочаце выдаліць выбранае паведамленне?" -#: ../src/message_window.py:481 +#: ../src/message_window.py:490 msgid "Chats" msgstr "Размовы" -#: ../src/message_window.py:483 +#: ../src/message_window.py:492 msgid "Group Chats" msgstr "Групавыя размовы" -#: ../src/message_window.py:485 +#: ../src/message_window.py:494 msgid "Private Chats" msgstr "Прыватныя размовы" -#: ../src/message_window.py:491 +#: ../src/message_window.py:500 msgid "Messages" msgstr "Паведамленні" -#: ../src/negotiation.py:32 +#: ../src/negotiation.py:34 msgid "- messages will be logged" msgstr "" -#: ../src/negotiation.py:34 +#: ../src/negotiation.py:36 msgid "- messages will not be logged" msgstr "" -#: ../src/notify.py:242 +#: ../src/notify.py:248 #, python-format msgid "%(nick)s Changed Status" msgstr "%(nick)s змяніў стан" -#: ../src/notify.py:252 +#: ../src/notify.py:258 #, python-format msgid "%(nickname)s Signed In" msgstr "%(nickname)s прыйшоў" -#: ../src/notify.py:260 +#: ../src/notify.py:266 #, python-format msgid "%(nickname)s Signed Out" msgstr "%(nickname)s сышоў" -#: ../src/notify.py:272 +#: ../src/notify.py:278 #, python-format msgid "New Single Message from %(nickname)s" msgstr "Новае асобнае паведамленне ад %(nickname)s" -#: ../src/notify.py:280 +#: ../src/notify.py:286 #, python-format msgid "New Private Message from group chat %s" msgstr "Новае прыватнае паведамленне ў групавой размове %s" -#: ../src/notify.py:282 +#: ../src/notify.py:288 #, python-format msgid "%(nickname)s: %(message)s" msgstr "%(nickname)s: %(message)s" -#: ../src/notify.py:285 +#: ../src/notify.py:291 #, fuzzy, python-format msgid "Messaged by %(nickname)s" msgstr "Новае паведамленне ад %(nickname)s" -#: ../src/notify.py:291 +#: ../src/notify.py:297 #, python-format msgid "New Message from %(nickname)s" msgstr "Новае паведамленне ад %(nickname)s" -#: ../src/notify.py:555 +#: ../src/notify.py:568 #, fuzzy msgid "Ignore" msgstr "дзевяць" -#: ../src/profile_window.py:55 +#: ../src/profile_window.py:57 msgid "Retrieving profile..." msgstr "Чытанне профіля..." -#: ../src/profile_window.py:108 ../src/roster_window.py:2852 +#: ../src/profile_window.py:110 ../src/roster_window.py:2845 #, fuzzy msgid "File is empty" msgstr "Месца файла" -#: ../src/profile_window.py:111 ../src/roster_window.py:2855 +#: ../src/profile_window.py:113 ../src/roster_window.py:2848 #, fuzzy msgid "File does not exist" msgstr "Такой групавой размовы няма." #. keep identation #. unknown format -#: ../src/profile_window.py:125 ../src/profile_window.py:141 -#: ../src/roster_window.py:2857 ../src/roster_window.py:2868 +#: ../src/profile_window.py:127 ../src/profile_window.py:143 +#: ../src/roster_window.py:2850 ../src/roster_window.py:2861 msgid "Could not load image" msgstr "Немагчыма загрузіць малюнак" -#: ../src/profile_window.py:251 +#: ../src/profile_window.py:255 msgid "Information received" msgstr "Атрыманыя звесткі" -#: ../src/profile_window.py:318 +#: ../src/profile_window.py:326 msgid "Without a connection you can not publish your contact information." msgstr "" "Вы не можаце абнавіць Вашыя асабістыя звесткі, не злучыўшыся з серверам." -#: ../src/profile_window.py:332 +#: ../src/profile_window.py:339 msgid "Sending profile..." msgstr "Адпраўленне профіля..." -#: ../src/profile_window.py:347 +#: ../src/profile_window.py:354 msgid "Information NOT published" msgstr "Звесткі НЕ абноўленыя" -#: ../src/profile_window.py:354 +#: ../src/profile_window.py:361 msgid "vCard publication failed" msgstr "Памылка абнаўлення vCard" -#: ../src/profile_window.py:355 +#: ../src/profile_window.py:362 msgid "" "There was an error while publishing your personal information, try again " "later." @@ -9331,46 +9374,51 @@ msgstr "" "У часе абнаўлення Вашых асабістых звестак адбылася памылка, паспрабуйце " "абнавіць пазней." -#: ../src/roster_window.py:280 ../src/roster_window.py:1017 +#: ../src/roster_window.py:280 ../src/roster_window.py:1019 msgid "Merged accounts" msgstr "Аб'яднаныя рахункі" -#: ../src/roster_window.py:1906 +#: ../src/roster_window.py:1871 msgid "Authorization has been sent" msgstr "Адпраўленая аўтарызацыя" -#: ../src/roster_window.py:1907 +#: ../src/roster_window.py:1872 #, python-format msgid "Now \"%s\" will know your status." msgstr "Цяпер \"%s\" можа бачыць Ваш стан." -#: ../src/roster_window.py:1927 +#: ../src/roster_window.py:1894 msgid "Subscription request has been sent" msgstr "Адпраўлены запыт на падпіску" -#: ../src/roster_window.py:1928 +#: ../src/roster_window.py:1895 #, python-format msgid "If \"%s\" accepts this request you will know his or her status." msgstr "Калі \"%s\" задаволіць гэты запыт, Вы зможаце бачыць яго стан." -#: ../src/roster_window.py:1940 +#: ../src/roster_window.py:1909 msgid "Authorization has been removed" msgstr "Аўтарызацыя забраная" -#: ../src/roster_window.py:1941 +#: ../src/roster_window.py:1910 #, python-format msgid "Now \"%s\" will always see you as offline." msgstr "Цяпер \"%s\" будзе заўсёды бачыць Вас адлучаным." -#: ../src/roster_window.py:1969 +#: ../src/roster_window.py:1938 msgid "GPG is not usable" msgstr "" -#: ../src/roster_window.py:2174 ../src/roster_window.py:3383 +#: ../src/roster_window.py:1939 +#, python-format +msgid "You will be connected to %s without OpenPGP." +msgstr "Вы злучыцеся з %s без падтрымкі OpenPGP." + +#: ../src/roster_window.py:2148 ../src/roster_window.py:3394 msgid "You are participating in one or more group chats" msgstr "Вы ўдзельнічаеце ў некалькіх групавых размовах" -#: ../src/roster_window.py:2175 ../src/roster_window.py:3384 +#: ../src/roster_window.py:2149 ../src/roster_window.py:3395 msgid "" "Changing your status to invisible will result in disconnection from those " "group chats. Are you sure you want to go invisible?" @@ -9378,28 +9426,28 @@ msgstr "" "Змяніўшы свой стан на нябачны, Вы такім чынам выйдзеце з гэтых групавых " "размоў. Вы сапраўды хочаце стаць нябачным?" -#: ../src/roster_window.py:2201 +#: ../src/roster_window.py:2175 msgid "desync'ed" msgstr "" -#: ../src/roster_window.py:2257 +#: ../src/roster_window.py:2236 msgid "Really quit Gajim?" msgstr "" -#: ../src/roster_window.py:2258 +#: ../src/roster_window.py:2237 #, fuzzy msgid "Are you sure you want to quit Gajim?" msgstr "Вы сапраўды хочаце сысці з групавой размовы \"%s\"?" -#: ../src/roster_window.py:2259 +#: ../src/roster_window.py:2238 msgid "Always close Gajim" msgstr "" -#: ../src/roster_window.py:2350 ../src/roster_window.py:2587 +#: ../src/roster_window.py:2333 ../src/roster_window.py:2576 msgid "You have unread messages" msgstr "Ёсць нечытаныя паведамленні" -#: ../src/roster_window.py:2351 +#: ../src/roster_window.py:2334 #, fuzzy msgid "" "Messages will only be available for reading them later if you have history " @@ -9408,95 +9456,95 @@ msgstr "" "Вы зможаце прачытаць нечытаныя паведамленні толькі з уключаным вядзеннем " "журналаў размоў." -#: ../src/roster_window.py:2588 +#: ../src/roster_window.py:2577 msgid "You must read them before removing this transport." msgstr "Вы павінны прачытаць іх перад выдаленнем гэтага транспарта." -#: ../src/roster_window.py:2591 +#: ../src/roster_window.py:2580 #, python-format msgid "Transport \"%s\" will be removed" msgstr "Транспарт \"%s\" будзе выдалены" -#: ../src/roster_window.py:2592 +#: ../src/roster_window.py:2581 msgid "" "You will no longer be able to send and receive messages from contacts using " "this transport." msgstr "Вы больш не зможаце мець зносіны з людзьмі праз гэты транспарт." -#: ../src/roster_window.py:2595 +#: ../src/roster_window.py:2584 msgid "Transports will be removed" msgstr "Транспарты будуць выдаленыя" -#: ../src/roster_window.py:2600 +#: ../src/roster_window.py:2589 #, fuzzy, python-format msgid "" "You will no longer be able to send and receive messages to contacts from " "these transports: %s" msgstr "Вы больш не зможаце мець зносіны з людзьмі праз гэтыя транспарты: %s" -#: ../src/roster_window.py:2662 +#: ../src/roster_window.py:2653 #, fuzzy msgid "You are about to block a contact. Are you sure you want to continue?" msgstr "Вы ствараеце мета-кантакт. Вы сапраўды хочаце працягнуць?" -#: ../src/roster_window.py:2664 +#: ../src/roster_window.py:2655 msgid "" "This contact will see you offline and you will not receive messages he will " "send you." msgstr "" #. it's jid -#: ../src/roster_window.py:2748 +#: ../src/roster_window.py:2741 msgid "Rename Contact" msgstr "Змяніць імя чалавека" -#: ../src/roster_window.py:2749 +#: ../src/roster_window.py:2742 #, python-format msgid "Enter a new nickname for contact %s" msgstr "Вызначце новую мянушку для чалавека %s." -#: ../src/roster_window.py:2756 +#: ../src/roster_window.py:2749 msgid "Rename Group" msgstr "Змяніць назву групы" -#: ../src/roster_window.py:2757 +#: ../src/roster_window.py:2750 #, python-format msgid "Enter a new name for group %s" msgstr "Вызначце новую назву групы %s" -#: ../src/roster_window.py:2798 +#: ../src/roster_window.py:2791 msgid "Remove Group" msgstr "Выдаліць групу" -#: ../src/roster_window.py:2799 +#: ../src/roster_window.py:2792 #, python-format msgid "Do you want to remove group %s from the roster?" msgstr "Хочаце выдаліць групу %s з кантактнага ліста?" -#: ../src/roster_window.py:2800 +#: ../src/roster_window.py:2793 #, fuzzy msgid "Also remove all contacts in this group from your roster" msgstr "Таксама выдаліць усіх людзей з гэтай групы" -#: ../src/roster_window.py:2839 +#: ../src/roster_window.py:2832 msgid "Assign OpenPGP Key" msgstr "Прызначыць ключ OpenPGP" -#: ../src/roster_window.py:2840 +#: ../src/roster_window.py:2833 msgid "Select a key to apply to the contact" msgstr "Выберыце ключ для гэтага чалавека" -#: ../src/roster_window.py:3203 +#: ../src/roster_window.py:3210 #, python-format msgid "Contact \"%s\" will be removed from your roster" msgstr "\"%s\" будзе выдалены з Вашага кантактнага ліста" -#: ../src/roster_window.py:3205 +#: ../src/roster_window.py:3212 #, python-format msgid "You are about to remove \"%(name)s\" (%(jid)s) from your roster.\n" msgstr "" -#: ../src/roster_window.py:3210 +#: ../src/roster_window.py:3217 msgid "" "By removing this contact you also remove authorization resulting in him or " "her always seeing you as offline." @@ -9505,12 +9553,12 @@ msgstr "" "прыбярэце ў яго аўтарызацыю, і ён заўсёды будзе бачыць Вас адлучаным." #. Contact is not in roster -#: ../src/roster_window.py:3216 +#: ../src/roster_window.py:3223 #, fuzzy msgid "Do you want to continue?" msgstr "Што Вы хочаце зрабіць?" -#: ../src/roster_window.py:3219 +#: ../src/roster_window.py:3226 msgid "" "By removing this contact you also by default remove authorization resulting " "in him or her always seeing you as offline." @@ -9519,16 +9567,16 @@ msgstr "" "чынам таксама прыбярэце ў яго аўтарызацыю, і ён заўсёды будзе бачыць Вас " "адлучаным." -#: ../src/roster_window.py:3222 +#: ../src/roster_window.py:3229 msgid "I want this contact to know my status after removal" msgstr "Я хачу, каб гэты чалавек мог бачыць мой стан пасля выдалення" #. several contact to remove at the same time -#: ../src/roster_window.py:3226 +#: ../src/roster_window.py:3233 msgid "Contacts will be removed from your roster" msgstr "Людзі будуць выдаленыя з Вашага кантактнага ліста" -#: ../src/roster_window.py:3231 +#: ../src/roster_window.py:3238 #, python-format msgid "" "By removing these contacts:%s\n" @@ -9538,32 +9586,32 @@ msgstr "" "з Вашага кантактнага ліста, Вы такім чынам таксама прыбярэце ў іх " "аўтарызацыю, і яны заўсёды будуць бачыць Вас адлучаным." -#: ../src/roster_window.py:3286 +#: ../src/roster_window.py:3295 #, fuzzy msgid "" "You are about to send a custom status. Are you sure you want to continue?" msgstr "Вы ствараеце мета-кантакт. Вы сапраўды хочаце працягнуць?" -#: ../src/roster_window.py:3288 +#: ../src/roster_window.py:3297 #, python-format msgid "" "This contact will temporarily see you as %(status)s, but only until you " "change your status. Then he will see your global status." msgstr "" -#: ../src/roster_window.py:3305 +#: ../src/roster_window.py:3316 msgid "No account available" msgstr "Рахункаў няма" -#: ../src/roster_window.py:3306 +#: ../src/roster_window.py:3317 msgid "You must create an account before you can chat with other contacts." msgstr "Вы павінны стварыць рахунак, каб размаўляць з іншымі людзьмі." -#: ../src/roster_window.py:3877 +#: ../src/roster_window.py:3897 msgid "Metacontacts storage not supported by your server" msgstr "Сервер не падтрымлівае сховішча мета-кантактаў" -#: ../src/roster_window.py:3879 +#: ../src/roster_window.py:3899 #, fuzzy msgid "" "Your server does not support storing metacontacts information. So those " @@ -9572,12 +9620,12 @@ msgstr "" "Сервер не падтрымлівае мета-кантакты. Гэтае настаўленне не захаваецца для " "наступных сеансаў." -#: ../src/roster_window.py:3964 +#: ../src/roster_window.py:3984 msgid "" "You are about to create a metacontact. Are you sure you want to continue?" msgstr "Вы ствараеце мета-кантакт. Вы сапраўды хочаце працягнуць?" -#: ../src/roster_window.py:3966 +#: ../src/roster_window.py:3986 msgid "" "Metacontacts are a way to regroup several contacts in one line. Generally it " "is used when the same person has several Jabber accounts or transport " @@ -9587,12 +9635,12 @@ msgstr "" "кантактнага ліста. Звычайна ўжываецца, калі ў чалавека некалькі рахункаў " "Jabber альбо некалькі транспартных рахункаў." -#: ../src/roster_window.py:4081 +#: ../src/roster_window.py:4101 #, fuzzy msgid "Invalid file URI:" msgstr "Няправільны файл" -#: ../src/roster_window.py:4092 +#: ../src/roster_window.py:4112 #, fuzzy, python-format msgid "Do you want to send this file to %s:" msgid_plural "Do you want to send these files to %s:" @@ -9600,12 +9648,12 @@ msgstr[0] "%s хоча адправіць Вам файл:" msgstr[1] "%s хоча адправіць Вам файл:" msgstr[2] "%s хоча адправіць Вам файл:" -#: ../src/roster_window.py:4207 +#: ../src/roster_window.py:4227 #, fuzzy, python-format msgid "Send %s to %s" msgstr "Адправіць %s" -#: ../src/roster_window.py:4213 +#: ../src/roster_window.py:4233 #, python-format msgid "Make %s and %s metacontacts" msgstr "Зрабіць %s і %s мета-кантактамі" @@ -9615,164 +9663,164 @@ msgstr "Зрабіць %s і %s мета-кантактамі" #. for chat_with #. for single message #. join gc -#: ../src/roster_window.py:4794 ../src/roster_window.py:4865 -#: ../src/roster_window.py:4874 ../src/systray.py:216 ../src/systray.py:263 -#: ../src/systray.py:269 +#: ../src/roster_window.py:4718 ../src/roster_window.py:4789 +#: ../src/roster_window.py:4798 ../src/statusicon.py:248 +#: ../src/statusicon.py:295 ../src/statusicon.py:301 #, python-format msgid "using account %s" msgstr "выкарыстоўвае рахунак %s" #. add -#: ../src/roster_window.py:4881 +#: ../src/roster_window.py:4805 #, python-format msgid "to %s account" msgstr "рахунку %s" #. disco -#: ../src/roster_window.py:4886 +#: ../src/roster_window.py:4810 #, python-format msgid "using %s account" msgstr "выкарыстоўвае рахунак %s" -#: ../src/roster_window.py:4923 ../src/systray.py:279 +#: ../src/roster_window.py:4847 ../src/statusicon.py:311 msgid "_Manage Bookmarks..." msgstr "_Кіраванне закладкамі..." #. profile, avatar -#: ../src/roster_window.py:4943 +#: ../src/roster_window.py:4867 #, python-format msgid "of account %s" msgstr "рахунка %s" -#: ../src/roster_window.py:4983 +#: ../src/roster_window.py:4907 #, python-format msgid "for account %s" msgstr "для рахунка %s" -#: ../src/roster_window.py:5039 ../src/roster_window.py:5140 +#: ../src/roster_window.py:4963 ../src/roster_window.py:5064 msgid "_Change Status Message" msgstr "З_мяніць паведамленне аб стане" -#: ../src/roster_window.py:5066 +#: ../src/roster_window.py:4990 #, fuzzy msgid "Publish Tune" msgstr "_Абнавіць" -#: ../src/roster_window.py:5074 +#: ../src/roster_window.py:4998 #, fuzzy msgid "Configure Services..." msgstr "_Праглядзець сервісы..." -#: ../src/roster_window.py:5228 +#: ../src/roster_window.py:5145 msgid "_Maximize All" msgstr "" #. Send Group Message -#: ../src/roster_window.py:5236 ../src/roster_window.py:5404 +#: ../src/roster_window.py:5153 ../src/roster_window.py:5325 msgid "Send Group M_essage" msgstr "Ад_правіць групавое паведамленне" -#: ../src/roster_window.py:5244 +#: ../src/roster_window.py:5161 msgid "To all users" msgstr "Усім карыстальнікам" -#: ../src/roster_window.py:5248 +#: ../src/roster_window.py:5165 msgid "To all online users" msgstr "Усім актыўным карыстальнікам" #. Manage Transport submenu -#: ../src/roster_window.py:5424 +#: ../src/roster_window.py:5345 #, fuzzy msgid "_Manage Contacts" msgstr "Змяніць імя чалавека" #. Edit Groups -#: ../src/roster_window.py:5432 +#: ../src/roster_window.py:5353 msgid "Edit _Groups" msgstr "Змяніць _групы" #. Send single message -#: ../src/roster_window.py:5485 +#: ../src/roster_window.py:5408 #, fuzzy msgid "Send Single Message" msgstr "Ад_правіць асобнае паведамленне" #. Execute Command -#: ../src/roster_window.py:5531 +#: ../src/roster_window.py:5454 msgid "Execute Command..." msgstr "Выканаць загад..." #. Manage Transport submenu -#: ../src/roster_window.py:5541 +#: ../src/roster_window.py:5464 #, fuzzy msgid "_Manage Transport" msgstr "Транспарты" #. Modify Transport -#: ../src/roster_window.py:5549 +#: ../src/roster_window.py:5472 #, fuzzy msgid "_Modify Transport" msgstr "Паказаць _транспарты" #. Rename -#: ../src/roster_window.py:5558 +#: ../src/roster_window.py:5481 msgid "_Rename" msgstr "Змяніць _імя" -#: ../src/roster_window.py:5623 +#: ../src/roster_window.py:5546 msgid "_Maximize" msgstr "" -#: ../src/roster_window.py:5631 +#: ../src/roster_window.py:5554 #, fuzzy msgid "_Reconnect" msgstr "Чалавек адлучыўся" -#: ../src/roster_window.py:5637 +#: ../src/roster_window.py:5560 #, fuzzy msgid "_Disconnect" msgstr "Чалавек адлучыўся" #. History manager -#: ../src/roster_window.py:5716 +#: ../src/roster_window.py:5642 msgid "History Manager" msgstr "Кіраўнік журналаў" -#: ../src/roster_window.py:5725 +#: ../src/roster_window.py:5653 msgid "_Join New Group Chat" msgstr "_Удзельнічаць у групавой размове" -#: ../src/roster_window.py:5881 +#: ../src/roster_window.py:5809 msgid "Change Status Message..." msgstr "Змяніць паведамленне стану..." -#: ../src/search_window.py:93 +#: ../src/search_window.py:94 msgid "Waiting for results" msgstr "" -#: ../src/search_window.py:133 ../src/search_window.py:211 +#: ../src/search_window.py:132 ../src/search_window.py:210 msgid "Error in received dataform" msgstr "" #. No result -#: ../src/search_window.py:167 ../src/search_window.py:203 +#: ../src/search_window.py:166 ../src/search_window.py:202 msgid "No result" msgstr "" -#: ../src/session.py:128 +#: ../src/session.py:132 msgid "Disk WriteError" msgstr "" -#: ../src/session.py:249 +#: ../src/session.py:254 #, python-format msgid "Subject: %s" msgstr "Тэма: %s" -#: ../src/session.py:422 ../src/session.py:457 +#: ../src/session.py:429 ../src/session.py:464 msgid "Confirm these session options" msgstr "" -#: ../src/session.py:424 +#: ../src/session.py:431 #, python-format msgid "" "The remote client wants to negotiate an session with these features:\n" @@ -9782,7 +9830,7 @@ msgid "" "\tAre these options acceptable?" msgstr "" -#: ../src/session.py:458 +#: ../src/session.py:465 #, python-format msgid "" "The remote client selected these options:\n" @@ -9792,119 +9840,119 @@ msgid "" "Continue with the session?" msgstr "" -#: ../src/systray.py:177 +#: ../src/statusicon.py:209 msgid "_Change Status Message..." msgstr "_Змяніць паведамленне стану..." -#: ../src/systray.py:293 +#: ../src/statusicon.py:325 msgid "Hide this menu" msgstr "Схаваць гэтае меню" -#: ../src/tooltips.py:326 ../src/tooltips.py:520 +#: ../src/tooltips.py:347 ../src/tooltips.py:544 msgid "Jabber ID: " msgstr "Jabber ID:" -#: ../src/tooltips.py:329 ../src/tooltips.py:524 +#: ../src/tooltips.py:350 ../src/tooltips.py:548 msgid "Resource: " msgstr "Рэсурс: " -#: ../src/tooltips.py:334 +#: ../src/tooltips.py:355 #, python-format msgid "%(owner_or_admin_or_member)s of this group chat" msgstr "%(owner_or_admin_or_member)s гэтай групавой размовы" -#: ../src/tooltips.py:431 +#: ../src/tooltips.py:455 msgid " [blocked]" msgstr "" -#: ../src/tooltips.py:435 +#: ../src/tooltips.py:459 msgid " [minimized]" msgstr "" -#: ../src/tooltips.py:450 ../src/tooltips.py:705 +#: ../src/tooltips.py:474 ../src/tooltips.py:686 msgid "Status: " msgstr "Стан: " -#: ../src/tooltips.py:480 +#: ../src/tooltips.py:504 #, python-format msgid "Last status: %s" msgstr "Апошняе паведамленне: %s" -#: ../src/tooltips.py:482 +#: ../src/tooltips.py:506 #, python-format msgid " since %s" msgstr " ад %s" -#: ../src/tooltips.py:500 +#: ../src/tooltips.py:524 #, fuzzy msgid "Connected" msgstr "Злучэнне" -#: ../src/tooltips.py:502 +#: ../src/tooltips.py:526 #, fuzzy msgid "Disconnected" msgstr "Чалавек адлучыўся" #. ('both' is the normal sub so we don't show it) -#: ../src/tooltips.py:531 +#: ../src/tooltips.py:555 msgid "Subscription: " msgstr "Падпіска: " -#: ../src/tooltips.py:541 +#: ../src/tooltips.py:565 msgid "OpenPGP: " msgstr "OpenPGP: " -#: ../src/tooltips.py:637 +#: ../src/tooltips.py:618 #, fuzzy msgid "Tune:" msgstr "Тып:" -#: ../src/tooltips.py:663 +#: ../src/tooltips.py:644 msgid "Download" msgstr "Сцягнуць" -#: ../src/tooltips.py:669 +#: ../src/tooltips.py:650 msgid "Upload" msgstr "Загрузіць" -#: ../src/tooltips.py:676 +#: ../src/tooltips.py:657 msgid "Type: " msgstr "Тып: " -#: ../src/tooltips.py:680 +#: ../src/tooltips.py:661 msgid "Transferred: " msgstr "Перададзена: " -#: ../src/tooltips.py:683 ../src/tooltips.py:704 +#: ../src/tooltips.py:664 ../src/tooltips.py:685 msgid "Not started" msgstr "Не пачатая" -#: ../src/tooltips.py:687 +#: ../src/tooltips.py:668 msgid "Stopped" msgstr "Спыненая" -#: ../src/tooltips.py:689 ../src/tooltips.py:692 +#: ../src/tooltips.py:670 ../src/tooltips.py:673 msgid "Completed" msgstr "Скончаная" -#: ../src/tooltips.py:696 +#: ../src/tooltips.py:677 msgid "?transfer status:Paused" msgstr "?transfer status:Прыпыненая" #. stalled is not paused. it is like 'frozen' it stopped alone -#: ../src/tooltips.py:700 +#: ../src/tooltips.py:681 msgid "Stalled" msgstr "Марнаванне часу" -#: ../src/tooltips.py:702 +#: ../src/tooltips.py:683 msgid "Transferring" msgstr "Перадача" -#: ../src/tooltips.py:738 +#: ../src/tooltips.py:721 msgid "This service has not yet responded with detailed information" msgstr "Гэты сервіс яшчэ не адказаў на запыт падрабязных звестак" -#: ../src/tooltips.py:741 +#: ../src/tooltips.py:724 msgid "" "This service could not respond with detailed information.\n" "It is most likely legacy or broken" @@ -9912,64 +9960,103 @@ msgstr "" "Гэты сервіс не дае падрабязных звестак.\n" "Хутчэй за ўсё, гэты сервіс састарэлы ці зламаны" -#: ../src/vcard.py:245 +#: ../src/vcard.py:252 msgid "?Client:Unknown" msgstr "?Праграма:Невядомая" -#: ../src/vcard.py:247 +#: ../src/vcard.py:254 msgid "?OS:Unknown" msgstr "?Сістэма:Невядомая" -#: ../src/vcard.py:268 +#: ../src/vcard.py:275 #, fuzzy msgid "?Time:Unknown" msgstr "?Праграма:Невядомая" -#: ../src/vcard.py:292 ../src/vcard.py:302 ../src/vcard.py:511 +#: ../src/vcard.py:299 ../src/vcard.py:309 ../src/vcard.py:518 #, python-format msgid "since %s" msgstr "ад %s" -#: ../src/vcard.py:331 +#: ../src/vcard.py:336 #, fuzzy msgid "Affiliation:" msgstr "Праграмы" -#: ../src/vcard.py:339 +#: ../src/vcard.py:344 msgid "" "This contact is interested in your presence information, but you are not " "interested in his/her presence" msgstr "Вы не цікавіцеся гэтым чалавекам, але ён цікавіцца Вамі" -#: ../src/vcard.py:341 +#: ../src/vcard.py:346 msgid "" "You are interested in the contact's presence information, but he/she is not " "interested in yours" msgstr "Вы цікавіцеся чалавекам, але ён не цікавіцца Вамі" -#: ../src/vcard.py:343 +#: ../src/vcard.py:348 msgid "You and the contact are interested in each other's presence information" msgstr "Вы і гэты чалавек абодва цікавіцеся адзін адным" #. None -#: ../src/vcard.py:345 +#: ../src/vcard.py:350 msgid "" "You are not interested in the contact's presence, and neither he/she is " "interested in yours" msgstr "Вы не цікавіцеся чалавекам, і ён не цікавіцца Вамі" -#: ../src/vcard.py:352 +#: ../src/vcard.py:357 msgid "You are waiting contact's answer about your subscription request" msgstr "Вы чакаеце адказу на Ваш запыт" -#: ../src/vcard.py:354 +#: ../src/vcard.py:359 msgid "There is no pending subscription request." msgstr "" -#: ../src/vcard.py:359 ../src/vcard.py:413 ../src/vcard.py:536 +#: ../src/vcard.py:364 ../src/vcard.py:418 ../src/vcard.py:541 msgid " resource with priority " msgstr " рэсурс з прыярытэтам " +#~ msgid "_Incoming message:" +#~ msgstr "_Уваходнае паведамленне:" + +#~ msgid "_Outgoing message:" +#~ msgstr "_Выходнае паведамленне:" + +#, fuzzy +#~ msgid "gtk-ok" +#~ msgstr "gtk+" + +#, fuzzy +#~ msgid "" +#~ "The host %s you configured as the ft_add_hosts_to_send advanced option is " +#~ "not valid, so ignored." +#~ msgstr "" +#~ "Вузел, вызначаны опцыяй ft_override_host_to_send, некарэктны, таму " +#~ "ігнаруецца." + +#~ msgid "OpenPGP passphrase was not given" +#~ msgstr "Пароль OpenPGP не вызначаны" + +#~ msgid "" +#~ "To continue sending and receiving messages, you will need to reconnect." +#~ msgstr "" +#~ "Каб працягваць адпраўку і атрыманне паведамленняў, трэба перадалучыцца." + +#~ msgid "" +#~ "You are not connected or not visible to others. Your message could not be " +#~ "sent." +#~ msgstr "" +#~ "Вы не злучаны альбо не бачны для іншых. Вы не можаце адправіць " +#~ "паведамленне." + +#~ msgid "[This message is encrypted]" +#~ msgstr "[Гэтае паведамленне зашыфраванае]" + +#~ msgid "%i days ago" +#~ msgstr "%i дзён таму" + #~ msgid "Add Special _Notification" #~ msgstr "Дадаць спецыяльнае _нагадванне" @@ -10541,9 +10628,6 @@ msgstr " рэсурс з прыярытэтам " #~ msgid "A_fter nickname:" #~ msgstr "_Пасля мянушкі:" -#~ msgid "B_efore nickname:" -#~ msgstr "П_ерад мянушкай:" - #~ msgid "_After time:" #~ msgstr "_Праз пэўны час:" diff --git a/po/be@latin.po b/po/be@latin.po index a32a33a58..4dcbfe38b 100644 --- a/po/be@latin.po +++ b/po/be@latin.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: 0.11.1\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2009-10-28 22:17+0100\n" +"POT-Creation-Date: 2009-11-25 22:20+0100\n" "PO-Revision-Date: 2009-08-19 23:41+0200\n" "Last-Translator: Ihar Hrachyshka \n" "Language-Team: Belarusian Latin \n" @@ -289,9 +289,9 @@ msgstr "Źmiani asabistyja źviestki..." #. No configured account #: ../data/glade/account_modification_window.glade.h:16 #: ../data/glade/accounts_window.glade.h:21 -#: ../data/glade/roster_window.glade.h:5 ../src/common/helpers.py:1217 -#: ../src/common/helpers.py:1229 ../src/notify.py:547 ../src/notify.py:568 -#: ../src/notify.py:607 ../src/notify.py:619 +#: ../data/glade/roster_window.glade.h:5 ../src/common/helpers.py:1100 +#: ../src/common/helpers.py:1112 ../src/notify.py:560 ../src/notify.py:581 +#: ../src/notify.py:620 ../src/notify.py:632 msgid "Gajim" msgstr "Gajim" @@ -300,9 +300,9 @@ msgstr "Gajim" #. General group cannot be changed #: ../data/glade/account_modification_window.glade.h:17 #: ../data/glade/accounts_window.glade.h:22 -#: ../data/glade/preferences_window.glade.h:50 ../src/common/contacts.py:98 -#: ../src/dialogs.py:103 ../src/dialogs.py:111 ../src/roster_window.py:2753 -#: ../src/roster_window.py:5351 +#: ../data/glade/preferences_window.glade.h:52 ../src/common/contacts.py:135 +#: ../src/dialogs.py:111 ../src/dialogs.py:121 ../src/roster_window.py:2746 +#: ../src/roster_window.py:5268 msgid "General" msgstr "Ahulnaja" @@ -361,21 +361,21 @@ msgid "Information about you, as stored in the server" msgstr "Źviestki pra ciabie, jakija zachoŭvajucca na servery" #: ../data/glade/account_modification_window.glade.h:27 -#: ../data/glade/accounts_window.glade.h:35 ../src/config.py:1585 -#: ../src/config.py:2131 +#: ../data/glade/accounts_window.glade.h:35 ../src/config.py:1646 +#: ../src/config.py:2196 msgid "No key selected" msgstr "Kluč nie abrany" #. None means no proxy profile selected #: ../data/glade/account_modification_window.glade.h:29 #: ../data/glade/accounts_window.glade.h:37 -#: ../data/glade/change_mood_dialog.glade.h:3 ../src/config.py:1106 -#: ../src/config.py:1209 ../src/config.py:1489 ../src/config.py:1494 -#: ../src/config.py:2038 ../src/config.py:2117 ../src/config.py:2130 -#: ../src/config.py:3317 ../src/config.py:3390 ../src/dialogs.py:293 -#: ../src/dialogs.py:295 ../src/dialogs.py:498 ../src/dialogs.py:511 -#: ../src/roster_window.py:2807 ../src/roster_window.py:2813 -#: ../src/roster_window.py:2818 +#: ../data/glade/change_mood_dialog.glade.h:3 ../src/config.py:1158 +#: ../src/config.py:1261 ../src/config.py:1550 ../src/config.py:1555 +#: ../src/config.py:2103 ../src/config.py:2182 ../src/config.py:2195 +#: ../src/config.py:3396 ../src/config.py:3469 ../src/dialogs.py:308 +#: ../src/dialogs.py:310 ../src/dialogs.py:513 ../src/dialogs.py:526 +#: ../src/roster_window.py:2800 ../src/roster_window.py:2806 +#: ../src/roster_window.py:2811 msgid "None" msgstr "Nijaki" @@ -532,8 +532,8 @@ msgstr "" "Taksama moža spatrebicca źmianić nałady firewalla." #: ../data/glade/accounts_window.glade.h:32 -#: ../data/glade/zeroconf_information_window.glade.h:4 ../src/config.py:1612 -#: ../src/dialogs.py:806 +#: ../data/glade/zeroconf_information_window.glade.h:4 ../src/config.py:1673 +#: ../src/dialogs.py:830 msgid "Jabber ID:" msgstr "JID:" @@ -547,7 +547,7 @@ msgid "Mer_ge accounts" msgstr "_Źlej konty ŭ adno" #. Rename -#: ../data/glade/accounts_window.glade.h:42 ../src/roster_window.py:5302 +#: ../data/glade/accounts_window.glade.h:42 ../src/roster_window.py:5219 msgid "Re_name" msgstr "_Źmiani nazvu" @@ -954,7 +954,7 @@ msgstr "Apošniaja źmiena:" msgid "New entry received" msgstr "Atrymaŭ novy zapis" -#: ../data/glade/atom_entry_window.glade.h:5 ../src/atom_window.py:114 +#: ../data/glade/atom_entry_window.glade.h:5 ../src/atom_window.py:124 msgid "You have received new entry:" msgstr "Atrymaŭ novy zapis:" @@ -1002,12 +1002,12 @@ msgstr "Uviadzi novy parol:" msgid "Type your new status message" msgstr "Uviadzi novaje paviedamleńnie statusu" -#: ../data/glade/change_status_message_dialog.glade.h:2 ../src/tooltips.py:601 +#: ../data/glade/change_status_message_dialog.glade.h:2 ../src/tooltips.py:613 #, fuzzy msgid "Activity:" msgstr "Dziejny" -#: ../data/glade/change_status_message_dialog.glade.h:3 ../src/tooltips.py:586 +#: ../data/glade/change_status_message_dialog.glade.h:3 ../src/tooltips.py:608 #, fuzzy msgid "Mood:" msgstr "Pakoj:" @@ -1102,8 +1102,8 @@ msgstr "Źmiani _hrupy" #. Invite to #. Invite to Groupchat -#: ../data/glade/contact_context_menu.glade.h:6 ../src/roster_window.py:5257 -#: ../src/roster_window.py:5412 +#: ../data/glade/contact_context_menu.glade.h:6 ../src/roster_window.py:5174 +#: ../src/roster_window.py:5333 msgid "In_vite to" msgstr "_Zaprasi" @@ -1118,8 +1118,8 @@ msgid "Remo_ve" msgstr "_Vydal" #. Send Custom Status -#: ../data/glade/contact_context_menu.glade.h:9 ../src/roster_window.py:5267 -#: ../src/roster_window.py:5497 +#: ../data/glade/contact_context_menu.glade.h:9 ../src/roster_window.py:5184 +#: ../src/roster_window.py:5420 #, fuzzy msgid "Send Cus_tom Status" msgstr "Dasyłaje svoj XML" @@ -1155,8 +1155,8 @@ msgid "_Allow him/her to see my status" msgstr "Dazvol jamu/joj _bačyć moj status" #: ../data/glade/contact_context_menu.glade.h:18 -#: ../data/glade/gc_occupants_menu.glade.h:7 ../src/roster_window.py:5330 -#: ../src/roster_window.py:5449 ../src/roster_window.py:5578 +#: ../data/glade/gc_occupants_menu.glade.h:7 ../src/roster_window.py:5247 +#: ../src/roster_window.py:5370 ../src/roster_window.py:5501 msgid "_Block" msgstr "" @@ -1167,7 +1167,7 @@ msgstr "Za_barani jamu/joj bačyć moj status" #: ../data/glade/contact_context_menu.glade.h:20 #: ../data/glade/gc_control_popup_menu.glade.h:6 #: ../data/glade/gc_occupants_menu.glade.h:8 -#: ../data/glade/roster_window.glade.h:21 ../src/roster_window.py:5647 +#: ../data/glade/roster_window.glade.h:21 ../src/roster_window.py:5570 msgid "_History" msgstr "_Žurnał razmoŭ" @@ -1190,8 +1190,8 @@ msgid "_Subscription" msgstr "_Aŭtaryzacyja" #: ../data/glade/contact_context_menu.glade.h:25 -#: ../data/glade/gc_occupants_menu.glade.h:13 ../src/roster_window.py:5324 -#: ../src/roster_window.py:5443 ../src/roster_window.py:5575 +#: ../data/glade/gc_occupants_menu.glade.h:13 ../src/roster_window.py:5241 +#: ../src/roster_window.py:5364 ../src/roster_window.py:5498 msgid "_Unblock" msgstr "" @@ -1280,7 +1280,7 @@ msgstr "Hetaje dziejańnie anuluje pieradaču fajła i vydalić jaje ź śpisu." msgid "When a file transfer is complete show a popup notification" msgstr "Pakažy nahadvańnie ŭ vypłyŭnym aknie pa zakančeńni pieradačy fajła" -#: ../data/glade/filetransfers.glade.h:13 ../src/filetransfers_window.py:792 +#: ../data/glade/filetransfers.glade.h:13 ../src/filetransfers_window.py:820 msgid "_Continue" msgstr "_Praciahni" @@ -1288,7 +1288,7 @@ msgstr "_Praciahni" msgid "_Notify me when a file transfer is complete" msgstr "_Nahadaj mnie ab zakančeńni pieradačy fajła" -#: ../data/glade/filetransfers.glade.h:15 ../src/filetransfers_window.py:200 +#: ../data/glade/filetransfers.glade.h:15 ../src/filetransfers_window.py:204 msgid "_Open Containing Folder" msgstr "_Adčyni kataloh z fajłam" @@ -1316,7 +1316,7 @@ msgstr "" "Kantakt\n" "Baner" -#: ../data/glade/gajim_themes_window.glade.h:6 ../src/chat_control.py:818 +#: ../data/glade/gajim_themes_window.glade.h:6 ../src/chat_control.py:859 msgid "Bold" msgstr "Tłusty" @@ -1336,11 +1336,11 @@ msgstr "Kanfihuracyja temy Gajim" msgid "Gone" msgstr "Vyjšaŭ" -#: ../data/glade/gajim_themes_window.glade.h:11 ../src/common/pep.py:153 +#: ../data/glade/gajim_themes_window.glade.h:11 ../src/common/pep.py:150 msgid "Inactive" msgstr "Pasiŭny" -#: ../data/glade/gajim_themes_window.glade.h:12 ../src/chat_control.py:819 +#: ../data/glade/gajim_themes_window.glade.h:12 ../src/chat_control.py:860 msgid "Italic" msgstr "Nachileny" @@ -1391,7 +1391,7 @@ msgstr "Źmiani _temu" msgid "Configure _Room..." msgstr "Kanfihuruj _pakoj" -#: ../data/glade/gc_control_popup_menu.glade.h:4 ../src/disco.py:1624 +#: ../data/glade/gc_control_popup_menu.glade.h:4 ../src/disco.py:1746 #, fuzzy msgid "_Bookmark" msgstr "_Stvary zakładku dla hetaja pakoju" @@ -1490,8 +1490,9 @@ msgstr "" msgid "Welcome to Gajim History Logs Manager" msgstr "Kiraŭnik žurnałaŭ razmoŭ Gajim" -#: ../data/glade/history_manager.glade.h:4 ../src/dialogs.py:2884 -#: ../src/dialogs.py:2987 +#. Change label for accept_button to action name instead of 'OK'. +#: ../data/glade/history_manager.glade.h:4 ../src/dialogs.py:3007 +#: ../src/dialogs.py:3104 msgid "Delete" msgstr "Vydal" @@ -1516,7 +1517,7 @@ msgstr "" msgid "_Search Database" msgstr "_Šukaj u bazie žurnałaŭ" -#: ../data/glade/history_window.glade.h:1 ../src/history_window.py:316 +#: ../data/glade/history_window.glade.h:1 ../src/history_window.py:323 msgid "Conversation History" msgstr "Žurnał razmoŭ" @@ -1542,7 +1543,7 @@ msgstr "_Zachoŭvaj žurnał razmoŭ" msgid "Bookmark this room" msgstr "_Stvary zakładku dla hetaja pakoju" -#: ../data/glade/join_groupchat_window.glade.h:3 ../src/dialogs.py:1972 +#: ../data/glade/join_groupchat_window.glade.h:3 ../src/dialogs.py:2076 msgid "Join Group Chat" msgstr "Dałučysia da pakoju" @@ -1569,8 +1570,8 @@ msgstr "Niadaŭna:" msgid "Room:" msgstr "Pakoj:" -#: ../data/glade/join_groupchat_window.glade.h:9 ../src/disco.py:1201 -#: ../src/disco.py:1628 +#: ../data/glade/join_groupchat_window.glade.h:9 ../src/disco.py:1306 +#: ../src/disco.py:1750 msgid "_Join" msgstr "_Dałučysia" @@ -1600,7 +1601,7 @@ msgstr "" msgid "Print status:" msgstr "Pakazvaj status:" -#: ../data/glade/manage_bookmarks_window.glade.h:9 ../src/config.py:1602 +#: ../data/glade/manage_bookmarks_window.glade.h:9 ../src/config.py:1663 msgid "Server:" msgstr "Server:" @@ -1724,17 +1725,26 @@ msgid "Show a list of formattings" msgstr "Klikni, kab ustavić smajlik (Alt+M)" #: ../data/glade/message_window.glade.h:10 -msgid "Show a menu of advanced functions (Alt+A)" -msgstr "" +#, fuzzy +msgid "Show a menu of advanced functions (Alt+D)" +msgstr "Klikni, kab ustavić smajlik (Alt+M)" #: ../data/glade/message_window.glade.h:11 msgid "Show the contact's profile (Ctrl+I)" msgstr "" -#. Make sure the character after "_" is not M/m (conflicts with Alt+M that is supposed to show the Emoticon Selector) +#: ../data/glade/message_window.glade.h:12 +msgid "Toggle audio session" +msgstr "" + #: ../data/glade/message_window.glade.h:13 +msgid "Toggle video session" +msgstr "" + +#. Make sure the character after "_" is not M/m (conflicts with Alt+M that is supposed to show the Emoticon Selector) +#: ../data/glade/message_window.glade.h:15 #: ../data/glade/xml_console_window.glade.h:11 -#: ../src/filetransfers_window.py:260 +#: ../src/filetransfers_window.py:266 msgid "_Send" msgstr "_Vyšli" @@ -1879,6 +1889,16 @@ msgid "Configure color and font of the interface" msgstr "Kanfihuruj koler i šryft interfejsu" #: ../data/glade/preferences_window.glade.h:36 +#, fuzzy +msgid "Contact's message:" +msgstr "Pa_viedamleńnie statusu:" + +#: ../data/glade/preferences_window.glade.h:37 +#, fuzzy +msgid "Contact's nickname:" +msgstr "Nazva kantaktu" + +#: ../data/glade/preferences_window.glade.h:38 msgid "" "Detached roster with detached chats\n" "Detached roster with single chat\n" @@ -1887,34 +1907,34 @@ msgid "" "Detached roster with chat grouped by type" msgstr "" -#: ../data/glade/preferences_window.glade.h:41 +#: ../data/glade/preferences_window.glade.h:43 #, fuzzy msgid "Display _activity of contacts in roster" msgstr "Pakazvaj a_vatary kantaktaŭ u śpisie kantaktaŭ" -#: ../data/glade/preferences_window.glade.h:42 +#: ../data/glade/preferences_window.glade.h:44 msgid "Display _extra email details" msgstr "Pakazvaj dadatkovyja _padrabiaznaści ab emaiłu" -#: ../data/glade/preferences_window.glade.h:43 +#: ../data/glade/preferences_window.glade.h:45 #, fuzzy msgid "Display _tunes of contacts in roster" msgstr "Pakazvaj a_vatary kantaktaŭ u śpisie kantaktaŭ" -#: ../data/glade/preferences_window.glade.h:44 +#: ../data/glade/preferences_window.glade.h:46 msgid "Display a_vatars of contacts in roster" msgstr "Pakazvaj a_vatary kantaktaŭ u śpisie kantaktaŭ" -#: ../data/glade/preferences_window.glade.h:45 +#: ../data/glade/preferences_window.glade.h:47 #, fuzzy msgid "Display m_ood of contacts in roster" msgstr "Pakazvaj a_vatary kantaktaŭ u śpisie kantaktaŭ" -#: ../data/glade/preferences_window.glade.h:46 +#: ../data/glade/preferences_window.glade.h:48 msgid "Display status _messages of contacts in roster" msgstr "Pakazvaj paviedamleńni _statusu kantaktaŭ u śpisie kantaktaŭ" -#: ../data/glade/preferences_window.glade.h:47 +#: ../data/glade/preferences_window.glade.h:49 msgid "" "Gajim can send and receive meta-information related to a conversation you " "may have with a contact. Here you can specify which chatstates you want to " @@ -1924,7 +1944,7 @@ msgstr "" "kantaktam. Tut ty možaš vyznačyć, jakija paviedamleńni statusu treba " "pakazvać u voknach razmoŭ." -#: ../data/glade/preferences_window.glade.h:48 +#: ../data/glade/preferences_window.glade.h:50 msgid "" "Gajim can send and receive meta-information related to a conversation you " "may have with a contact. Here you can specify which chatstates you want to " @@ -1934,7 +1954,7 @@ msgstr "" "kantaktam. Tut ty možaš vyznačyć, jakija paviedamleńni statusu treba dasyłać " "surazmoŭcam." -#: ../data/glade/preferences_window.glade.h:49 +#: ../data/glade/preferences_window.glade.h:51 msgid "" "Gajim will notify you via a popup window in the bottom right of the screen " "about contacts that just signed out" @@ -1942,12 +1962,12 @@ msgstr "" "Gajim budzie paviedamlać ab adłučeńni kantaktaŭ ad servera ŭ pravym nižnim " "kucie ekranu" -#: ../data/glade/preferences_window.glade.h:51 +#: ../data/glade/preferences_window.glade.h:53 #, fuzzy msgid "Hide all buttons in chat windows" msgstr "Chavaje knopki ŭ aknie pakoju." -#: ../data/glade/preferences_window.glade.h:52 +#: ../data/glade/preferences_window.glade.h:54 #, fuzzy msgid "" "If checked, Gajim will allow others to detect the operation system you are " @@ -1956,7 +1976,7 @@ msgstr "" "Kali ŭklučanaja hetaja opcyja, Gajim budzie dałučacca da hetaha pakoju pry " "starcie" -#: ../data/glade/preferences_window.glade.h:53 +#: ../data/glade/preferences_window.glade.h:55 msgid "" "If checked, Gajim will also include information about the sender of the new " "emails" @@ -1964,18 +1984,18 @@ msgstr "" "Kali ŭklučanaja hetaja opcyja, Gajim taksama budzie paviedamlać dadatkovyja " "źviestki pra aŭtaraŭ novych listoŭ" -#: ../data/glade/preferences_window.glade.h:54 +#: ../data/glade/preferences_window.glade.h:56 msgid "" "If checked, Gajim will change status to Away when the computer is unused." msgstr "" -#: ../data/glade/preferences_window.glade.h:55 +#: ../data/glade/preferences_window.glade.h:57 msgid "" "If checked, Gajim will change status to Not Available when the computer has " "not been used even longer" msgstr "" -#: ../data/glade/preferences_window.glade.h:56 +#: ../data/glade/preferences_window.glade.h:58 msgid "" "If checked, Gajim will display avatars of contacts in roster window and in " "group chats" @@ -1983,7 +2003,7 @@ msgstr "" "Kali ŭklučanaja hetaja opcyja, Gajim budzie pakazvać avatary kantaktaŭ u " "śpisie kantaktaŭ i ŭ pakojach" -#: ../data/glade/preferences_window.glade.h:57 +#: ../data/glade/preferences_window.glade.h:59 msgid "" "If checked, Gajim will display status messages of contacts under the contact " "name in roster window and in group chats" @@ -1991,7 +2011,7 @@ msgstr "" "Kali ŭklučanaja hetaja opcyja, Gajim budzie pakazvać paviedamleńni statusu " "kantaktaŭ u śpisie kantaktaŭ i ŭ pakojach" -#: ../data/glade/preferences_window.glade.h:58 +#: ../data/glade/preferences_window.glade.h:60 #, fuzzy msgid "" "If checked, Gajim will display the activity of contacts in the roster window" @@ -1999,7 +2019,7 @@ msgstr "" "Kali ŭklučanaja hetaja opcyja, Gajim budzie pakazvać avatary kantaktaŭ u " "śpisie kantaktaŭ i ŭ pakojach" -#: ../data/glade/preferences_window.glade.h:59 +#: ../data/glade/preferences_window.glade.h:61 #, fuzzy msgid "" "If checked, Gajim will display the mood of contacts in the roster window" @@ -2007,7 +2027,7 @@ msgstr "" "Kali ŭklučanaja hetaja opcyja, Gajim budzie pakazvać avatary kantaktaŭ u " "śpisie kantaktaŭ i ŭ pakojach" -#: ../data/glade/preferences_window.glade.h:60 +#: ../data/glade/preferences_window.glade.h:62 #, fuzzy msgid "" "If checked, Gajim will display the tunes of contacts in the roster window" @@ -2015,14 +2035,14 @@ msgstr "" "Kali ŭklučanaja hetaja opcyja, Gajim budzie pakazvać avatary kantaktaŭ u " "śpisie kantaktaŭ i ŭ pakojach" -#: ../data/glade/preferences_window.glade.h:61 +#: ../data/glade/preferences_window.glade.h:63 msgid "" "If checked, Gajim will highlight spelling errors in input fields of chat " "windows. If no language is explicitly set via right click on the input " "field, the default language will be used for this contact or group chat." msgstr "" -#: ../data/glade/preferences_window.glade.h:62 +#: ../data/glade/preferences_window.glade.h:64 #, fuzzy msgid "" "If checked, Gajim will ignore incoming events from unauthorized contacts. " @@ -2034,14 +2054,14 @@ msgstr "" "što ŭ takim razie nichto, akramia kantaktaŭ z tvajho śpisu, nia zmoža dasłać " "tabie paviedamleńnie" -#: ../data/glade/preferences_window.glade.h:63 +#: ../data/glade/preferences_window.glade.h:65 msgid "" "If checked, Gajim will keep logs for encrypted messages. Please note that " "when using E2E encryption the remote party has to agree on logging, else the " "messages will not be logged." msgstr "" -#: ../data/glade/preferences_window.glade.h:64 +#: ../data/glade/preferences_window.glade.h:66 #, fuzzy msgid "" "If checked, Gajim will show a notification when a new e-mail is received via " @@ -2050,7 +2070,7 @@ msgstr "" "Kali ŭklučanaja hetaja opcyja, Gajim taksama budzie paviedamlać dadatkovyja " "źviestki pra aŭtaraŭ novych listoŭ" -#: ../data/glade/preferences_window.glade.h:65 +#: ../data/glade/preferences_window.glade.h:67 msgid "" "If checked, Gajim will use protocol-specific status icons. (eg. A contact " "from MSN will have the equivalent msn icon for status online, away, busy, " @@ -2060,13 +2080,13 @@ msgstr "" "kožnaha pratakołu (naprykład, kantaktu z MSN buduć adpaviadać ikony statusu " "MSN)" -#: ../data/glade/preferences_window.glade.h:66 +#: ../data/glade/preferences_window.glade.h:68 msgid "" "If enabled, Gajim will not ask for a status message. The specified default " "message will be used instead." msgstr "" -#: ../data/glade/preferences_window.glade.h:67 +#: ../data/glade/preferences_window.glade.h:69 msgid "" "If not disabled, Gajim will replace ascii smilies like ':)' with equivalent " "animated or static graphical emoticons" @@ -2074,79 +2094,79 @@ msgstr "" "Kali ŭklučanaja hetaja opcyja, Gajim budzie zamianiać ascii-smajliki " "(naprykład, ':)' ) na adpaviednyja hrafičnyja smajliki" -#: ../data/glade/preferences_window.glade.h:68 +#: ../data/glade/preferences_window.glade.h:70 msgid "Log _encrypted chat session" msgstr "" -#: ../data/glade/preferences_window.glade.h:69 +#: ../data/glade/preferences_window.glade.h:71 #, fuzzy msgid "Ma_ke message windows compact" msgstr "_Hrupuj vokny:" -#: ../data/glade/preferences_window.glade.h:70 +#: ../data/glade/preferences_window.glade.h:72 msgid "Ma_nage..." msgstr "_Kiruj..." -#: ../data/glade/preferences_window.glade.h:71 +#: ../data/glade/preferences_window.glade.h:73 msgid "" "Never\n" "Only when pending events\n" "Always" msgstr "" -#: ../data/glade/preferences_window.glade.h:74 +#: ../data/glade/preferences_window.glade.h:76 #, fuzzy msgid "Notifications" msgstr "Madyfikacyja kontu" -#: ../data/glade/preferences_window.glade.h:75 +#: ../data/glade/preferences_window.glade.h:77 #, fuzzy msgid "Notify me about contacts that sign _in" msgstr "Paviedamlaj mnie ab kantaktach, jakija źmianiajuć status na: " -#: ../data/glade/preferences_window.glade.h:76 +#: ../data/glade/preferences_window.glade.h:78 #, fuzzy msgid "Notify me about contacts that sign _out" msgstr "Paviedamlaj mnie ab kantaktach, jakija źmianiajuć status na: " -#: ../data/glade/preferences_window.glade.h:77 +#: ../data/glade/preferences_window.glade.h:79 msgid "Notify on new _GMail email" msgstr "Paviedamlaj mnie ab novych listach u skryni _Gmail" -#: ../data/glade/preferences_window.glade.h:78 +#: ../data/glade/preferences_window.glade.h:80 #, fuzzy msgid "Personal Events" msgstr "Asabistyja źviestki" -#: ../data/glade/preferences_window.glade.h:79 +#: ../data/glade/preferences_window.glade.h:81 msgid "Play _sounds" msgstr "_Ahučvaj" -#: ../data/glade/preferences_window.glade.h:80 +#: ../data/glade/preferences_window.glade.h:82 msgid "" "Pop it up\n" "Notify me about it\n" "Show only in roster" msgstr "" -#: ../data/glade/preferences_window.glade.h:83 +#: ../data/glade/preferences_window.glade.h:85 msgid "Preferences" msgstr "Nałady" -#: ../data/glade/preferences_window.glade.h:84 +#: ../data/glade/preferences_window.glade.h:86 #, fuzzy msgid "Show systray:" msgstr "_Pakazvaj padzieju ŭ poli nahadvańnia" -#: ../data/glade/preferences_window.glade.h:85 +#: ../data/glade/preferences_window.glade.h:87 msgid "Sign _in" msgstr "_Dałučajusia" -#: ../data/glade/preferences_window.glade.h:86 +#: ../data/glade/preferences_window.glade.h:88 msgid "Sign _out" msgstr "_Adłučajusia" -#: ../data/glade/preferences_window.glade.h:87 +#: ../data/glade/preferences_window.glade.h:89 msgid "" "Some messages may include rich content (formatting, colors etc). If checked, " "Gajim will just display the raw message text." @@ -2155,30 +2175,30 @@ msgstr "" "kolery i h.d.). Kali ŭklučanaja hetaja opcyja, Gajim budzie pakazvać tekst " "biez afarmleńnia." -#: ../data/glade/preferences_window.glade.h:88 +#: ../data/glade/preferences_window.glade.h:90 #, fuzzy msgid "Sort contacts by status" msgstr "_Paradkuj kantakty pa statusie" -#: ../data/glade/preferences_window.glade.h:89 ../src/config.py:390 +#: ../data/glade/preferences_window.glade.h:91 ../src/config.py:377 msgid "Status" msgstr "Status" -#: ../data/glade/preferences_window.glade.h:90 +#: ../data/glade/preferences_window.glade.h:92 #, fuzzy msgid "Status _iconset:" msgstr "Standartny zbor _ikon statusu:" -#: ../data/glade/preferences_window.glade.h:91 +#: ../data/glade/preferences_window.glade.h:93 #, fuzzy msgid "Style" msgstr "Zatrymana" -#: ../data/glade/preferences_window.glade.h:92 +#: ../data/glade/preferences_window.glade.h:94 msgid "T_heme:" msgstr "T_ema:" -#: ../data/glade/preferences_window.glade.h:93 +#: ../data/glade/preferences_window.glade.h:95 msgid "" "The auto away status message. If empty, Gajim will not change the current " "status message\n" @@ -2186,7 +2206,7 @@ msgid "" "$T will be replaced by auto-away timeout" msgstr "" -#: ../data/glade/preferences_window.glade.h:96 +#: ../data/glade/preferences_window.glade.h:98 msgid "" "The auto not available status message. If empty, Gajim will not change the " "current status message\n" @@ -2194,113 +2214,115 @@ msgid "" "$T will be replaced by auto-not-available timeout" msgstr "" -#: ../data/glade/preferences_window.glade.h:99 +#: ../data/glade/preferences_window.glade.h:101 #, fuzzy msgid "Use _transports icons" msgstr "Užyvaj _ikony transpartaŭ" -#: ../data/glade/preferences_window.glade.h:100 +#: ../data/glade/preferences_window.glade.h:102 msgid "Use system _default" msgstr "Užyvaj _zmoŭčany dla systemy" -#: ../data/glade/preferences_window.glade.h:101 +#: ../data/glade/preferences_window.glade.h:103 #, fuzzy msgid "When new event is received:" msgstr "Kali ŭčyniajecca novaja padzieja" -#: ../data/glade/preferences_window.glade.h:102 +#: ../data/glade/preferences_window.glade.h:104 +#, fuzzy +msgid "Your message:" +msgstr "Tekst pamyłki: %s" + +#: ../data/glade/preferences_window.glade.h:105 +#, fuzzy +msgid "Your nickname:" +msgstr "П_ерад мянушкай:" + +#: ../data/glade/preferences_window.glade.h:106 #, fuzzy msgid "_Away after:" msgstr "Aŭtamatyčna źmianiać stan na \"_Adyjšoŭ\" praz:" -#: ../data/glade/preferences_window.glade.h:103 +#: ../data/glade/preferences_window.glade.h:107 msgid "_Browser:" msgstr "_Hartač:" -#: ../data/glade/preferences_window.glade.h:104 +#: ../data/glade/preferences_window.glade.h:108 #, fuzzy msgid "_Display chat state notifications:" msgstr "Pakazanyja nahadvańni statusu ŭ časie razmovy:" -#: ../data/glade/preferences_window.glade.h:105 +#: ../data/glade/preferences_window.glade.h:109 #, fuzzy msgid "_Emoticons:" msgstr "Smajliki:" -#: ../data/glade/preferences_window.glade.h:106 +#: ../data/glade/preferences_window.glade.h:110 msgid "_File manager:" msgstr "_Kiraŭnik fajłaŭ:" -#: ../data/glade/preferences_window.glade.h:107 +#: ../data/glade/preferences_window.glade.h:111 msgid "_Highlight misspelled words" msgstr "_Padśviatlaj słovy z pamyłkami" -#: ../data/glade/preferences_window.glade.h:108 +#: ../data/glade/preferences_window.glade.h:112 msgid "_Ignore events from contacts not in the roster" msgstr "_Ihnaruj padzieji ad kantaktaŭ, jakich niama ŭ śpisie kantaktaŭ" -#: ../data/glade/preferences_window.glade.h:109 +#: ../data/glade/preferences_window.glade.h:113 #, fuzzy msgid "_Ignore rich content in incoming messages" msgstr "Ihnaruj afarmleńnie ŭvachodnych paviedamleńniaŭ" -#: ../data/glade/preferences_window.glade.h:110 -msgid "_Incoming message:" -msgstr "_Uvachodnaje paviedamleńnie:" - -#: ../data/glade/preferences_window.glade.h:111 +#: ../data/glade/preferences_window.glade.h:114 msgid "_Log status changes of contacts" msgstr "_Zachoŭvać u žurnale źmieny statusu kantaktaŭ" -#: ../data/glade/preferences_window.glade.h:112 +#: ../data/glade/preferences_window.glade.h:115 msgid "_Mail client:" msgstr "_Paštovaja prahrama:" -#: ../data/glade/preferences_window.glade.h:113 +#: ../data/glade/preferences_window.glade.h:116 #, fuzzy msgid "_Not available after:" msgstr "Aŭtamatyčna źmianiać stan na \"_Niedastupny\" praz:" -#: ../data/glade/preferences_window.glade.h:114 +#: ../data/glade/preferences_window.glade.h:117 msgid "_Open..." msgstr "_Adčyni..." -#: ../data/glade/preferences_window.glade.h:115 -msgid "_Outgoing message:" -msgstr "_Zychodnaje paviedamleńnie:" - -#: ../data/glade/preferences_window.glade.h:116 +#: ../data/glade/preferences_window.glade.h:118 msgid "_Reset to Default Colors" msgstr "_Viarni zvyčajnyja kolery" -#: ../data/glade/preferences_window.glade.h:117 +#: ../data/glade/preferences_window.glade.h:119 #, fuzzy msgid "_Send chat state notifications:" msgstr "Pakazanyja nahadvańni statusu ŭ časie razmovy:" -#: ../data/glade/preferences_window.glade.h:118 +#: ../data/glade/preferences_window.glade.h:120 msgid "_Status message:" msgstr "Pa_viedamleńnie statusu:" -#: ../data/glade/preferences_window.glade.h:119 +#: ../data/glade/preferences_window.glade.h:121 msgid "_URL highlight:" msgstr "" -#: ../data/glade/preferences_window.glade.h:120 +#: ../data/glade/preferences_window.glade.h:122 msgid "_Window behavior:" msgstr "" -#: ../data/glade/preferences_window.glade.h:121 +#: ../data/glade/preferences_window.glade.h:123 #, fuzzy msgid "in _group chats" msgstr "Dałučysia da _pakoju" -#: ../data/glade/preferences_window.glade.h:122 +#: ../data/glade/preferences_window.glade.h:124 #, fuzzy msgid "in _roster" msgstr "Niama ŭ śpisie kantaktaŭ" -#: ../data/glade/preferences_window.glade.h:123 +#: ../data/glade/preferences_window.glade.h:125 msgid "minutes" msgstr "chvilinaŭ" @@ -2353,7 +2375,7 @@ msgstr "JID" msgid "Order:" msgstr "Paradak:" -#: ../data/glade/privacy_list_window.glade.h:12 ../src/dialogs.py:3114 +#: ../data/glade/privacy_list_window.glade.h:12 ../src/dialogs.py:3235 msgid "Privacy List" msgstr "Śpis pryvatnaści" @@ -2517,7 +2539,7 @@ msgid "Prefix:" msgstr "Ułaścivaści" #: ../data/glade/profile_window.glade.h:25 -#: ../data/glade/vcard_information_window.glade.h:30 ../src/vcard.py:327 +#: ../data/glade/vcard_information_window.glade.h:30 ../src/vcard.py:332 #, fuzzy msgid "Role:" msgstr "Huki" @@ -2581,8 +2603,8 @@ msgstr "Vydal kont i dla Gajim, i na _servery" #. Remove group #. Remove -#: ../data/glade/remove_account_window.glade.h:4 ../src/roster_window.py:5339 -#: ../src/roster_window.py:5459 ../src/roster_window.py:5588 +#: ../data/glade/remove_account_window.glade.h:4 ../src/roster_window.py:5256 +#: ../src/roster_window.py:5380 ../src/roster_window.py:5511 msgid "_Remove" msgstr "_Vydal" @@ -2601,14 +2623,14 @@ msgid "Roster Item Exchange" msgstr "" #: ../data/glade/roster_item_exchange_window.glade.h:4 -#, fuzzy -msgid "gtk-cancel" -msgstr "Vydal" +#: ../data/glade/service_registration_window.glade.h:3 +msgid "_OK" +msgstr "_Tak" #: ../data/glade/roster_item_exchange_window.glade.h:5 #, fuzzy -msgid "gtk-ok" -msgstr "gtk+" +msgid "gtk-cancel" +msgstr "Vydal" #: ../data/glade/roster_window.glade.h:1 #, fuzzy @@ -2669,7 +2691,7 @@ msgstr "_Dziejańni" msgid "_Contents" msgstr "_Źmiest" -#: ../data/glade/roster_window.glade.h:18 ../src/disco.py:1357 +#: ../data/glade/roster_window.glade.h:18 ../src/disco.py:1467 msgid "_Edit" msgstr "_Źmianić" @@ -2713,12 +2735,12 @@ msgid "_Add contact" msgstr "_Dadaj kantakt" #. Information -#: ../data/glade/search_window.glade.h:4 ../src/roster_window.py:5600 +#: ../data/glade/search_window.glade.h:4 ../src/roster_window.py:5523 #, fuzzy msgid "_Information" msgstr "Źviestki ab kantakcie" -#: ../data/glade/search_window.glade.h:5 ../src/disco.py:1213 +#: ../data/glade/search_window.glade.h:5 ../src/disco.py:1318 msgid "_Search" msgstr "Š_ukaj" @@ -2738,10 +2760,6 @@ msgstr "Zarehistrujsia na" msgid "_Cancel" msgstr "_Anuluj" -#: ../data/glade/service_registration_window.glade.h:3 -msgid "_OK" -msgstr "_Tak" - #: ../data/glade/single_message_window.glade.h:1 msgid "0" msgstr "0" @@ -2960,329 +2978,317 @@ msgstr "Krynica:" msgid "Status:" msgstr "Status:" -#: ../src/adhoc_commands.py:268 +#: ../src/adhoc_commands.py:295 #, fuzzy msgid "Cancel confirmation" msgstr "Źviestki ab kantakcie" -#: ../src/adhoc_commands.py:269 +#: ../src/adhoc_commands.py:296 msgid "" "You are in process of executing command. Do you really want to cancel it?" msgstr "" -#: ../src/adhoc_commands.py:301 ../src/adhoc_commands.py:324 +#: ../src/adhoc_commands.py:328 ../src/adhoc_commands.py:351 msgid "Service sent malformed data" msgstr "" -#: ../src/adhoc_commands.py:310 +#: ../src/adhoc_commands.py:337 msgid "Service changed the session identifier." msgstr "" #. when stanza doesn't have error description -#: ../src/adhoc_commands.py:405 +#: ../src/adhoc_commands.py:436 msgid "Service returned an error." msgstr "" #. For i18n -#: ../src/advanced_configuration_window.py:89 +#: ../src/advanced_configuration_window.py:91 msgid "Activated" msgstr "Dziejny" -#: ../src/advanced_configuration_window.py:89 +#: ../src/advanced_configuration_window.py:91 msgid "Deactivated" msgstr "Niadziejny" -#: ../src/advanced_configuration_window.py:91 +#: ../src/advanced_configuration_window.py:93 msgid "Boolean" msgstr "Lahičnaja źmiennaja" -#: ../src/advanced_configuration_window.py:92 +#: ../src/advanced_configuration_window.py:94 msgid "Integer" msgstr "Cely lik" -#: ../src/advanced_configuration_window.py:93 +#: ../src/advanced_configuration_window.py:95 msgid "Text" msgstr "Tekst" -#: ../src/advanced_configuration_window.py:94 ../src/chat_control.py:838 +#: ../src/advanced_configuration_window.py:96 ../src/chat_control.py:879 msgid "Color" msgstr "Koler" -#: ../src/advanced_configuration_window.py:105 +#: ../src/advanced_configuration_window.py:107 msgid "Preference Name" msgstr "Nazva nałady" -#: ../src/advanced_configuration_window.py:111 +#: ../src/advanced_configuration_window.py:113 msgid "Value" msgstr "Vartaść" -#: ../src/advanced_configuration_window.py:119 +#: ../src/advanced_configuration_window.py:121 msgid "Type" msgstr "Typ" #. we talk about option description in advanced configuration editor -#: ../src/advanced_configuration_window.py:172 +#: ../src/advanced_configuration_window.py:176 msgid "(None)" msgstr "(Niama)" -#: ../src/advanced_configuration_window.py:255 +#: ../src/advanced_configuration_window.py:259 msgid "Hidden" msgstr "Schavany" -#: ../src/atom_window.py:110 +#: ../src/atom_window.py:119 #, fuzzy, python-format -msgid "You have received new entries (and %(count)d not displayed):" -msgstr "Atrymaŭ novy zapis:" +msgid "You have received new entries (and %d not displayed):" +msgid_plural "You have received new entries (and %d not displayed):" +msgstr[0] "Atrymaŭ novy zapis:" +msgstr[1] "Atrymaŭ novy zapis:" +msgstr[2] "Atrymaŭ novy zapis:" #. the next script, executed in the "po" directory, #. generates the following list. #. #!/bin/sh #. LANG=$(for i in *.po; do j=${i/.po/}; echo -n "_('"$j"')":" '"$j"', " ; done) #. echo "{_('en'):'en'",$LANG"}" -#: ../src/chat_control.py:74 +#: ../src/chat_control.py:75 msgid "English" msgstr "Anhielskaja" -#: ../src/chat_control.py:74 +#: ../src/chat_control.py:75 msgid "Belarusian" msgstr "Biełaruskaja" -#: ../src/chat_control.py:74 +#: ../src/chat_control.py:75 msgid "Bulgarian" msgstr "Baŭharskaja" -#: ../src/chat_control.py:74 +#: ../src/chat_control.py:75 #, fuzzy msgid "Breton" msgstr "Brytonskaja" -#: ../src/chat_control.py:74 +#: ../src/chat_control.py:75 msgid "Czech" msgstr "Českaja" -#: ../src/chat_control.py:74 +#: ../src/chat_control.py:75 msgid "German" msgstr "Niamieckaja" -#: ../src/chat_control.py:74 +#: ../src/chat_control.py:75 msgid "Greek" msgstr "Hreckaja" -#: ../src/chat_control.py:74 +#: ../src/chat_control.py:75 msgid "British" msgstr "Brytanskaja" -#: ../src/chat_control.py:74 +#: ../src/chat_control.py:75 msgid "Esperanto" msgstr "Esperanto" -#: ../src/chat_control.py:74 +#: ../src/chat_control.py:75 msgid "Spanish" msgstr "Hišpanskaja" -#: ../src/chat_control.py:74 +#: ../src/chat_control.py:75 msgid "Basque" msgstr "" -#: ../src/chat_control.py:74 +#: ../src/chat_control.py:75 msgid "French" msgstr "Francuzkaja" -#: ../src/chat_control.py:74 +#: ../src/chat_control.py:75 msgid "Croatian" msgstr "Charvackaja" -#: ../src/chat_control.py:74 +#: ../src/chat_control.py:75 msgid "Italian" msgstr "Italijskaja" -#: ../src/chat_control.py:74 +#: ../src/chat_control.py:75 msgid "Norwegian (b)" msgstr "Narveskaja (b)" -#: ../src/chat_control.py:74 +#: ../src/chat_control.py:75 msgid "Dutch" msgstr "Halandzkaja" -#: ../src/chat_control.py:74 +#: ../src/chat_control.py:75 msgid "Norwegian" msgstr "Narveskaja" -#: ../src/chat_control.py:74 +#: ../src/chat_control.py:75 msgid "Polish" msgstr "Polskaja" -#: ../src/chat_control.py:74 +#: ../src/chat_control.py:75 msgid "Portuguese" msgstr "Partuhalskaja" -#: ../src/chat_control.py:74 +#: ../src/chat_control.py:75 msgid "Brazilian Portuguese" msgstr "Brazilskaja partuhalskaja" -#: ../src/chat_control.py:74 +#: ../src/chat_control.py:75 msgid "Russian" msgstr "Rasiejskaja" -#: ../src/chat_control.py:74 +#: ../src/chat_control.py:75 msgid "Serbian" msgstr "Serbskaja" -#: ../src/chat_control.py:74 +#: ../src/chat_control.py:75 msgid "Slovak" msgstr "Słavackaja" -#: ../src/chat_control.py:74 +#: ../src/chat_control.py:75 msgid "Swedish" msgstr "Švedzkaja" -#: ../src/chat_control.py:74 +#: ../src/chat_control.py:75 msgid "Chinese (Ch)" msgstr "Kitajskaja (Ch)" -#: ../src/chat_control.py:426 +#: ../src/chat_control.py:446 msgid "Spelling language" msgstr "Mova spraŭdžvańnia pravapisu" #. we are not connected -#: ../src/chat_control.py:454 ../src/chat_control.py:642 +#: ../src/chat_control.py:478 ../src/chat_control.py:670 msgid "A connection is not available" msgstr "Złučeńnie niemahčymaje" -#: ../src/chat_control.py:455 ../src/chat_control.py:643 +#: ../src/chat_control.py:479 ../src/chat_control.py:671 msgid "Your message can not be sent until you are connected." msgstr "Ty nia možaš dasłać paviedamleńnie, pakul nia złučyśsia z serveram." -#: ../src/chat_control.py:820 +#: ../src/chat_control.py:861 #, fuzzy msgid "Underline" msgstr "dziaviataja" -#: ../src/chat_control.py:821 +#: ../src/chat_control.py:862 #, fuzzy msgid "Strike" msgstr "Mianuška" -#: ../src/chat_control.py:844 +#: ../src/chat_control.py:885 #, fuzzy msgid "Font" msgstr "_Šryft:" -#: ../src/chat_control.py:853 +#: ../src/chat_control.py:894 #, fuzzy msgid "Clear formating" msgstr "Źviestki ab kantakcie" -#: ../src/chat_control.py:925 +#: ../src/chat_control.py:972 msgid "Really send file?" msgstr "" -#: ../src/chat_control.py:926 +#: ../src/chat_control.py:973 #, python-format msgid "If you send a file to %s, he/she will know your real Jabber ID." msgstr "" -#: ../src/chat_control.py:1317 ../src/chat_control.py:1718 +#: ../src/chat_control.py:1411 ../src/chat_control.py:1864 #, fuzzy msgid "GPG encryption enabled" msgstr "Šyfravańnie ŭklučanaje" #. Add to roster -#: ../src/chat_control.py:1346 ../src/common/contacts.py:113 -#: ../src/common/helpers.py:55 ../src/common/helpers.py:231 -#: ../src/conversation_textview.py:903 ../src/dialogs.py:1031 -#: ../src/dialogs.py:1882 ../src/dialogs.py:1907 ../src/gajim.py:999 -#: ../src/gajim.py:1750 ../src/gui_menu_builder.py:243 -#: ../src/gui_menu_builder.py:385 ../src/roster_window.py:988 -#: ../src/roster_window.py:1622 ../src/roster_window.py:1624 -#: ../src/roster_window.py:1926 ../src/roster_window.py:3187 -#: ../src/roster_window.py:3213 +#: ../src/chat_control.py:1436 ../src/common/contacts.py:150 +#: ../src/common/contacts.py:253 ../src/common/helpers.py:55 +#: ../src/common/helpers.py:231 ../src/conversation_textview.py:916 +#: ../src/dialogs.py:1060 ../src/dialogs.py:1973 ../src/dialogs.py:2002 +#: ../src/gui_interface.py:610 ../src/gui_menu_builder.py:255 +#: ../src/gui_menu_builder.py:398 ../src/roster_window.py:1576 +#: ../src/roster_window.py:1578 ../src/roster_window.py:1893 +#: ../src/roster_window.py:3194 ../src/roster_window.py:3220 msgid "Not in Roster" msgstr "Niama ŭ śpisie" -#: ../src/chat_control.py:1359 +#: ../src/chat_control.py:1480 #, fuzzy msgid "This contact does not support file transfer." msgstr "Śpis dziejnych, skončanych i spynienych pieradačaŭ fajłaŭ" -#: ../src/chat_control.py:1362 +#: ../src/chat_control.py:1483 msgid "You need to know the real JID of the contact to send him or her a file." msgstr "" -#: ../src/chat_control.py:1469 ../src/tooltips.py:626 -msgid "Unknown Artist" -msgstr "" - -#: ../src/chat_control.py:1471 ../src/tooltips.py:631 -msgid "Unknown Title" -msgstr "" - -#: ../src/chat_control.py:1473 ../src/tooltips.py:636 -msgid "Unknown Source" -msgstr "" - -#: ../src/chat_control.py:1476 ../src/tooltips.py:638 +#: ../src/chat_control.py:1555 #, python-format -msgid "" -"\"%(title)s\" by %(artist)s\n" -"from %(source)s" +msgid "%(type)s state : %(state)s, reason: %(reason)s" msgstr "" -#: ../src/chat_control.py:1613 +#: ../src/chat_control.py:1720 #, python-format msgid "%(nickname)s from group chat %(room_name)s" msgstr "%(nickname)s z pakoju %(room_name)s" #. No key assigned nor a key is used by remote contact -#: ../src/chat_control.py:1698 ../src/dialogs.py:4484 +#: ../src/chat_control.py:1844 ../src/dialogs.py:4627 msgid "No GPG key assigned" msgstr "" -#: ../src/chat_control.py:1699 +#: ../src/chat_control.py:1845 msgid "" "No GPG key is assigned to this contact. So you cannot encrypt messages with " "GPG." msgstr "" -#: ../src/chat_control.py:1708 +#: ../src/chat_control.py:1854 #, fuzzy msgid "GPG encryption disabled" msgstr "Šyfravańnie adklučanaje" -#: ../src/chat_control.py:1734 +#: ../src/chat_control.py:1880 msgid "Session WILL be logged" msgstr "" -#: ../src/chat_control.py:1736 +#: ../src/chat_control.py:1882 msgid "Session WILL NOT be logged" msgstr "" #. encryption %s active -#: ../src/chat_control.py:1750 +#: ../src/chat_control.py:1899 msgid "is" msgstr "" -#: ../src/chat_control.py:1750 +#: ../src/chat_control.py:1899 msgid "is NOT" msgstr "" #. chat session %s be logged -#: ../src/chat_control.py:1752 +#: ../src/chat_control.py:1901 msgid "will" msgstr "" -#: ../src/chat_control.py:1752 +#: ../src/chat_control.py:1901 msgid "will NOT" msgstr "" #. About encrypted chat session -#: ../src/chat_control.py:1756 +#: ../src/chat_control.py:1905 #, fuzzy msgid "and authenticated" msgstr "Užyvaj aŭtaryzacyju" #. About encrypted chat session -#: ../src/chat_control.py:1760 +#: ../src/chat_control.py:1909 #, fuzzy msgid "and NOT authenticated" msgstr "Užyvaj aŭtaryzacyju" @@ -3290,58 +3296,58 @@ msgstr "Užyvaj aŭtaryzacyju" #. status will become 'is' or 'is not', authentificaed will become #. 'and authentificated' or 'and not authentificated', logged will become #. 'will' or 'will not' -#: ../src/chat_control.py:1766 +#: ../src/chat_control.py:1915 #, python-format msgid "" "%(type)s encryption %(status)s active %(authenticated)s.\n" "Your chat session %(logged)s be logged." msgstr "" -#: ../src/chat_control.py:1906 +#: ../src/chat_control.py:2055 msgid "Session negotiation cancelled" msgstr "" -#: ../src/chat_control.py:1913 +#: ../src/chat_control.py:2064 #, fuzzy msgid "This session is encrypted" msgstr "[Hetaje paviedamleńnie zašyfravanaje]" -#: ../src/chat_control.py:1916 +#: ../src/chat_control.py:2067 msgid " and WILL be logged" msgstr "" -#: ../src/chat_control.py:1918 +#: ../src/chat_control.py:2069 msgid " and WILL NOT be logged" msgstr "" -#: ../src/chat_control.py:1923 +#: ../src/chat_control.py:2074 msgid "" "Remote contact's identity not verified. Click the shield button for more " "details." msgstr "" -#: ../src/chat_control.py:1925 +#: ../src/chat_control.py:2076 #, fuzzy msgid "E2E encryption disabled" msgstr "Šyfravańnie adklučanaje" -#: ../src/chat_control.py:1959 ../src/chat_control.py:1972 +#: ../src/chat_control.py:2113 ../src/chat_control.py:2126 #, fuzzy msgid "The following message was NOT encrypted" msgstr "[Hetaje paviedamleńnie zašyfravanaje]" -#: ../src/chat_control.py:1965 +#: ../src/chat_control.py:2119 #, fuzzy msgid "The following message was encrypted" msgstr "[Hetaje paviedamleńnie zašyfravanaje]" #. %s is being replaced in the code with JID -#: ../src/chat_control.py:2235 +#: ../src/chat_control.py:2388 #, python-format msgid "You just received a new message from \"%s\"" msgstr "Tolki što atrymanaje paviedamleńnie ad \"%s\"" -#: ../src/chat_control.py:2236 +#: ../src/chat_control.py:2389 msgid "" "If you close this tab and you have history disabled, this message will be " "lost." @@ -3349,22 +3355,22 @@ msgstr "" "Kali ty začyniš hetuju kartku i kali žurnały nie vieducca, to hetaje " "paviedamleńnie źniknie nazaŭždy." -#: ../src/chat_control.py:2391 ../src/common/connection_handlers.py:2073 -#: ../src/common/connection_handlers.py:2119 -#: ../src/common/connection_handlers.py:2347 -#: ../src/common/connection_handlers.py:2489 ../src/common/connection.py:1368 -#: ../src/gajim.py:154 ../src/session.py:130 +#: ../src/chat_control.py:2542 ../src/common/connection_handlers.py:2100 +#: ../src/common/connection_handlers.py:2146 +#: ../src/common/connection_handlers.py:2338 +#: ../src/common/connection_handlers.py:2483 ../src/common/connection.py:420 +#: ../src/gajim.py:154 ../src/session.py:134 msgid "Database Error" msgstr "" -#: ../src/chat_control.py:2392 +#: ../src/chat_control.py:2543 #, python-format msgid "" "The database file (%s) cannot be read. Try to repair it or remove it (all " "history will be lost)." msgstr "" -#: ../src/chat_control.py:2622 +#: ../src/chat_control.py:2784 #, fuzzy, python-format msgid "%(name)s is now %(status)s" msgstr "%(nick)s maje ciapier status %(status)s" @@ -3373,23 +3379,23 @@ msgstr "%(nick)s maje ciapier status %(status)s" msgid "creating logs database" msgstr "stvarajecca baza žurnałaŭ" -#: ../src/common/check_paths.py:128 ../src/common/check_paths.py:139 -#: ../src/common/check_paths.py:146 +#: ../src/common/check_paths.py:129 ../src/common/check_paths.py:140 +#: ../src/common/check_paths.py:147 #, python-format msgid "%s is a file but it should be a directory" msgstr "%s jość fajłam, ale musiŭ być kataloh" -#: ../src/common/check_paths.py:129 ../src/common/check_paths.py:140 -#: ../src/common/check_paths.py:147 ../src/common/check_paths.py:155 +#: ../src/common/check_paths.py:130 ../src/common/check_paths.py:141 +#: ../src/common/check_paths.py:148 ../src/common/check_paths.py:156 msgid "Gajim will now exit" msgstr "Gajim zaviaršaje vykanańnie" -#: ../src/common/check_paths.py:154 +#: ../src/common/check_paths.py:155 #, python-format msgid "%s is a directory but should be a file" msgstr "%s jość kataloham, ale musiŭ być fajł" -#: ../src/common/check_paths.py:170 +#: ../src/common/check_paths.py:171 #, python-format msgid "creating %s directory" msgstr "stvarajecca kataloh %s" @@ -3452,10 +3458,10 @@ msgid "Choose the groupchats you want to leave" msgstr "Zaznač pakoji, jakija chočaš pakinuć" #. Make special context menu if group is Groupchats -#: ../src/common/commands.py:205 ../src/common/contacts.py:94 -#: ../src/common/helpers.py:55 ../src/roster_window.py:812 -#: ../src/roster_window.py:1626 ../src/roster_window.py:1628 -#: ../src/roster_window.py:5227 +#: ../src/common/commands.py:205 ../src/common/contacts.py:131 +#: ../src/common/helpers.py:55 ../src/roster_window.py:809 +#: ../src/roster_window.py:1580 ../src/roster_window.py:1582 +#: ../src/roster_window.py:5144 msgid "Groupchats" msgstr "Pakoji" @@ -3567,9 +3573,9 @@ msgid "" msgstr "Śpis (padzielenych prabiełami) zhornutych radkoŭ (kontaŭ i hrupaŭ)." #. sorted alphanum -#: ../src/common/config.py:106 ../src/common/config.py:483 -#: ../src/common/optparser.py:245 ../src/common/optparser.py:463 -#: ../src/common/optparser.py:497 ../src/gajim.py:3471 +#: ../src/common/config.py:106 ../src/common/config.py:482 +#: ../src/common/optparser.py:288 ../src/common/optparser.py:465 +#: ../src/common/optparser.py:499 ../src/gui_interface.py:3251 #, fuzzy msgid "default" msgstr "Zmoŭčany" @@ -4222,7 +4228,7 @@ msgstr "" msgid "Jabberd2 workaround" msgstr "Abychod dla Jabberd2" -#: ../src/common/config.py:331 +#: ../src/common/config.py:330 msgid "" "If checked, Gajim will use your IP and proxies defined in " "file_transfer_proxies option for file transfer." @@ -4230,125 +4236,125 @@ msgstr "" "Kali hetaja opcyja ŭklučanaja, Gajim budzie pieradavać fajły z akreślenym " "adrasam IP i proxy-serveram z opcyi file_transfer_proxies." -#: ../src/common/config.py:345 +#: ../src/common/config.py:344 msgid "Answer to receipt requests" msgstr "" -#: ../src/common/config.py:346 +#: ../src/common/config.py:345 msgid "Sent receipt requests" msgstr "" -#: ../src/common/config.py:354 +#: ../src/common/config.py:353 msgid "" "When negotiating an encrypted session, should Gajim assume you want your " "messages to be logged?" msgstr "" -#: ../src/common/config.py:417 +#: ../src/common/config.py:416 msgid "Is OpenPGP enabled for this contact?" msgstr "Ci vykarystoŭvajecca šyfravańnie OpenPGP dla hetaha kantaktu?" -#: ../src/common/config.py:418 +#: ../src/common/config.py:417 msgid "" "Should Gajim automatically start an encrypted session with this contact when " "possible?" msgstr "" -#: ../src/common/config.py:419 ../src/common/config.py:422 +#: ../src/common/config.py:418 ../src/common/config.py:421 msgid "Language for which we want to check misspelled words" msgstr "Mova, dla jakoj treba praviarać pravapis" -#: ../src/common/config.py:428 +#: ../src/common/config.py:427 msgid "all or space separated status" msgstr "\"all\" albo statusy, padzielenyja prabiełami" -#: ../src/common/config.py:429 +#: ../src/common/config.py:428 msgid "'yes', 'no', or 'both'" msgstr "'yes', 'no' albo 'both'" -#: ../src/common/config.py:430 ../src/common/config.py:432 -#: ../src/common/config.py:433 ../src/common/config.py:436 -#: ../src/common/config.py:437 +#: ../src/common/config.py:429 ../src/common/config.py:431 +#: ../src/common/config.py:432 ../src/common/config.py:435 +#: ../src/common/config.py:436 msgid "'yes', 'no' or ''" msgstr "'yes', 'no' albo ''" -#: ../src/common/config.py:443 ../src/common/pep.py:160 +#: ../src/common/config.py:442 ../src/common/pep.py:157 msgid "Sleeping" msgstr "Splu" -#: ../src/common/config.py:444 +#: ../src/common/config.py:443 msgid "Back soon" msgstr "Chutka viarnusia" -#: ../src/common/config.py:444 +#: ../src/common/config.py:443 msgid "Back in some minutes." msgstr "Viarnusia praz paru chvilinaŭ." -#: ../src/common/config.py:445 ../src/common/pep.py:130 +#: ../src/common/config.py:444 ../src/common/pep.py:127 msgid "Eating" msgstr "Jem" -#: ../src/common/config.py:445 +#: ../src/common/config.py:444 msgid "I'm eating, so leave me a message." msgstr "Ja jem, možaš pakinuć mnie paviedamleńnie." -#: ../src/common/config.py:446 +#: ../src/common/config.py:445 msgid "Movie" msgstr "Film" -#: ../src/common/config.py:446 +#: ../src/common/config.py:445 msgid "I'm watching a movie." msgstr "Hladžu film." -#: ../src/common/config.py:447 ../src/common/pep.py:189 +#: ../src/common/config.py:446 ../src/common/pep.py:186 msgid "Working" msgstr "Pracuju" -#: ../src/common/config.py:447 +#: ../src/common/config.py:446 msgid "I'm working." msgstr "Ja pracuju." -#: ../src/common/config.py:448 +#: ../src/common/config.py:447 msgid "Phone" msgstr "Telefon" -#: ../src/common/config.py:448 +#: ../src/common/config.py:447 msgid "I'm on the phone." msgstr "Ja razmaŭlaju pa telefonie." -#: ../src/common/config.py:449 +#: ../src/common/config.py:448 msgid "Out" msgstr "Vyjšaŭ" -#: ../src/common/config.py:449 +#: ../src/common/config.py:448 msgid "I'm out enjoying life." msgstr "Vyjšaŭ ciešycca z žyćcia." -#: ../src/common/config.py:460 +#: ../src/common/config.py:459 msgid "I'm available." msgstr "Dastupny." -#: ../src/common/config.py:461 +#: ../src/common/config.py:460 msgid "I'm free for chat." msgstr "Achvotna parazmaŭlaju." -#: ../src/common/config.py:462 ../src/config.py:1419 +#: ../src/common/config.py:461 ../src/config.py:1478 msgid "Be right back." msgstr "Chutka viarnusia." -#: ../src/common/config.py:463 +#: ../src/common/config.py:462 msgid "I'm not available." msgstr "Niedastupny." -#: ../src/common/config.py:464 +#: ../src/common/config.py:463 msgid "Do not disturb." msgstr "Nie turbavać." -#: ../src/common/config.py:465 ../src/common/config.py:466 +#: ../src/common/config.py:464 ../src/common/config.py:465 msgid "Bye!" msgstr "Byvaj!" -#: ../src/common/config.py:476 +#: ../src/common/config.py:475 msgid "" "Sound to play when a group chat message contains one of the words in " "muc_highlight_words, or when a group chat message contains your nickname." @@ -4356,107 +4362,106 @@ msgstr "" "Hukm jaki treba hrać, kali paviedamleńnie ŭ pakoji ŭtrymlivaje adno sa " "słovaŭ, akreślenych u opcyi muc_highlight_words, albo tvaju mianušku." -#: ../src/common/config.py:477 +#: ../src/common/config.py:476 msgid "Sound to play when any MUC message arrives." msgstr "Huk, jaki treba hrać pry atrymańni novaha hrupavoha paviedamleńnia." -#: ../src/common/config.py:486 ../src/common/optparser.py:259 +#: ../src/common/config.py:485 ../src/common/optparser.py:302 msgid "green" msgstr "zialony" -#: ../src/common/config.py:490 ../src/common/optparser.py:245 +#: ../src/common/config.py:489 ../src/common/optparser.py:288 msgid "grocery" msgstr "bakaleja" -#: ../src/common/config.py:494 +#: ../src/common/config.py:493 msgid "human" msgstr "čałaviek" -#: ../src/common/config.py:498 +#: ../src/common/config.py:497 msgid "marine" msgstr "marski" -#: ../src/common/connection_handlers.py:76 -#: ../src/common/zeroconf/connection_handlers_zeroconf.py:52 +#: ../src/common/connection_handlers.py:83 +#: ../src/common/zeroconf/connection_handlers_zeroconf.py:53 msgid "Unable to load idle module" msgstr "Niemahčyma adčytać modulu idle" -#: ../src/common/connection_handlers.py:244 -#: ../src/common/zeroconf/connection_handlers_zeroconf.py:94 +#: ../src/common/connection_handlers.py:251 msgid "Wrong host" msgstr "Niapravilny host" -#: ../src/common/connection_handlers.py:245 +#: ../src/common/connection_handlers.py:252 msgid "Invalid local address? :-O" msgstr "" -#: ../src/common/connection_handlers.py:678 +#: ../src/common/connection_handlers.py:696 #, python-format msgid "Registration information for transport %s has not arrived in time" msgstr "Źviestki rehistracyi dla transpartu %s nie pryjšli ŭ čas" -#: ../src/common/connection_handlers.py:685 +#: ../src/common/connection_handlers.py:703 #, fuzzy msgid "Registration succeeded" msgstr "Zarehistrujsia na %s" -#: ../src/common/connection_handlers.py:686 +#: ../src/common/connection_handlers.py:704 #, python-format msgid "Registration with agent %s succeeded" msgstr "" -#: ../src/common/connection_handlers.py:688 +#: ../src/common/connection_handlers.py:706 #, fuzzy msgid "Registration failed" msgstr "Niemahvyma dałučycca" -#: ../src/common/connection_handlers.py:688 +#: ../src/common/connection_handlers.py:706 #, python-format msgid "" "Registration with agent %(agent)s failed with error %(error)s: %(error_msg)s" msgstr "" -#: ../src/common/connection_handlers.py:990 -#: ../src/common/connection_handlers.py:2071 -#: ../src/common/connection_handlers.py:2117 -#: ../src/common/connection_handlers.py:2345 -#: ../src/common/connection_handlers.py:2487 ../src/common/connection.py:1366 -#: ../src/gajim.py:380 +#: ../src/common/connection_handlers.py:1008 +#: ../src/common/connection_handlers.py:2098 +#: ../src/common/connection_handlers.py:2144 +#: ../src/common/connection_handlers.py:2336 +#: ../src/common/connection_handlers.py:2481 ../src/common/connection.py:418 +#: ../src/gajim.py:354 msgid "Disk Write Error" msgstr "" -#: ../src/common/connection_handlers.py:1207 ../src/common/connection.py:935 +#: ../src/common/connection_handlers.py:1225 ../src/common/connection.py:1373 #, fuzzy msgid "Invisibility not supported" msgstr "Pašyreńnie nie padtrymvajecca" -#: ../src/common/connection_handlers.py:1208 ../src/common/connection.py:936 +#: ../src/common/connection_handlers.py:1226 ../src/common/connection.py:1374 #, python-format msgid "Account %s doesn't support invisibility." msgstr "" -#: ../src/common/connection_handlers.py:1892 ../src/common/connection.py:1181 -#: ../src/config.py:1875 ../src/config.py:1884 ../src/config.py:1943 -#: ../src/config.py:3281 ../src/dataforms_widget.py:555 ../src/dialogs.py:2665 +#: ../src/common/connection_handlers.py:1919 ../src/common/connection.py:233 +#: ../src/config.py:1940 ../src/config.py:1949 ../src/config.py:2008 +#: ../src/config.py:3360 ../src/dataforms_widget.py:577 ../src/dialogs.py:2781 msgid "Invalid Jabber ID" msgstr "Niapravilny JID" -#: ../src/common/connection_handlers.py:1893 +#: ../src/common/connection_handlers.py:1920 msgid "A message from a non-valid JID arrived, it has been ignored." msgstr "" -#: ../src/common/connection_handlers.py:2074 -#: ../src/common/connection_handlers.py:2120 -#: ../src/common/connection_handlers.py:2348 -#: ../src/common/connection_handlers.py:2490 ../src/common/connection.py:1369 -#: ../src/gajim.py:155 ../src/session.py:131 +#: ../src/common/connection_handlers.py:2101 +#: ../src/common/connection_handlers.py:2147 +#: ../src/common/connection_handlers.py:2339 +#: ../src/common/connection_handlers.py:2484 ../src/common/connection.py:421 +#: ../src/gajim.py:155 ../src/session.py:135 #, python-format msgid "" "The database file (%s) cannot be read. Try to repair it (see http://trac." "gajim.org/wiki/DatabaseBackup) or remove it (all history will be lost)." msgstr "" -#: ../src/common/connection_handlers.py:2200 +#: ../src/common/connection_handlers.py:2191 #, python-format msgid "Nickname not allowed: %s" msgstr "Mianuška nie dazvolenaja: %s" @@ -4464,77 +4469,77 @@ msgstr "Mianuška nie dazvolenaja: %s" #. maximum user number reached #. we are banned #. group chat does not exist -#: ../src/common/connection_handlers.py:2295 +#: ../src/common/connection_handlers.py:2286 +#: ../src/common/connection_handlers.py:2294 +#: ../src/common/connection_handlers.py:2300 #: ../src/common/connection_handlers.py:2303 -#: ../src/common/connection_handlers.py:2309 -#: ../src/common/connection_handlers.py:2312 -#: ../src/common/connection_handlers.py:2315 -#: ../src/common/connection_handlers.py:2319 ../src/gajim.py:523 +#: ../src/common/connection_handlers.py:2306 +#: ../src/common/connection_handlers.py:2310 ../src/gui_interface.py:128 msgid "Unable to join group chat" msgstr "Niemahčyma dałučycca da pakoju" -#: ../src/common/connection_handlers.py:2296 +#: ../src/common/connection_handlers.py:2287 #, python-format msgid "Maximum number of users for %s has been reached" msgstr "" -#: ../src/common/connection_handlers.py:2304 +#: ../src/common/connection_handlers.py:2295 #, fuzzy, python-format msgid "You are banned from group chat %s." msgstr "Ty zablakavany ŭ hetym pakoji." -#: ../src/common/connection_handlers.py:2310 +#: ../src/common/connection_handlers.py:2301 #, fuzzy, python-format msgid "Group chat %s does not exist." msgstr "Takoha pakoju niama." -#: ../src/common/connection_handlers.py:2313 +#: ../src/common/connection_handlers.py:2304 msgid "Group chat creation is restricted." msgstr "Stvareńnie pakojaŭ abmiežavanaje." -#: ../src/common/connection_handlers.py:2316 +#: ../src/common/connection_handlers.py:2307 #, fuzzy, python-format msgid "Your registered nickname must be used in group chat %s." msgstr "Treba karystacca zarehistravanaj na siabie mianuškaj." -#: ../src/common/connection_handlers.py:2320 +#: ../src/common/connection_handlers.py:2311 #, fuzzy, python-format msgid "You are not in the members list in groupchat %s." msgstr "Ciabie niama ŭ śpisie ŭdzielnikaŭ." #. Room has been destroyed. see #. http://www.xmpp.org/extensions/xep-0045.html#destroyroom -#: ../src/common/connection_handlers.py:2363 +#: ../src/common/connection_handlers.py:2354 #, fuzzy msgid "Room has been destroyed" msgstr "Aŭtaryzacyja anulavanaja" -#: ../src/common/connection_handlers.py:2371 +#: ../src/common/connection_handlers.py:2362 #, python-format msgid "You can join this room instead: %s" msgstr "" -#: ../src/common/connection_handlers.py:2402 +#: ../src/common/connection_handlers.py:2393 msgid "I would like to add you to my roster." msgstr "Ja chaču dadać ciabie ŭ svoj śpis kantaktaŭ." #. BE CAREFUL: no con.updateRosterItem() in a callback -#: ../src/common/connection_handlers.py:2423 +#: ../src/common/connection_handlers.py:2414 #, python-format msgid "we are now subscribed to %s" msgstr "padpisany na %s" -#: ../src/common/connection_handlers.py:2425 +#: ../src/common/connection_handlers.py:2416 #, python-format msgid "unsubscribe request from %s" msgstr "zapyt adpiski ad %s" -#: ../src/common/connection_handlers.py:2427 +#: ../src/common/connection_handlers.py:2418 #, python-format msgid "we are now unsubscribed from %s" msgstr "ciapier adpisany ad %s" -#: ../src/common/connection_handlers.py:2619 +#: ../src/common/connection_handlers.py:2613 #, python-format msgid "" "JID %s is not RFC compliant. It will not be added to your roster. Use roster " @@ -4674,142 +4679,28 @@ msgstr "" msgid "Application verification failure" msgstr "" -#: ../src/common/connection.py:278 -#: ../src/common/zeroconf/connection_zeroconf.py:215 -#, python-format -msgid "Connection with account \"%s\" has been lost" -msgstr "Złučeńnie dla kontu \"%s\" zhubiłasia" - -#: ../src/common/connection.py:279 -msgid "Reconnect manually." -msgstr "Pieradałučysia samastojna." - -#: ../src/common/connection.py:290 -#, fuzzy, python-format -msgid "Server %(name)s answered wrongly to register request: %(error)s" -msgstr "Transpart %s niapravilna adkazaŭ na zapyt rehistracyi: %s" - -#: ../src/common/connection.py:324 -#, python-format -msgid "Server %s provided a different registration form" -msgstr "" - -#: ../src/common/connection.py:337 -#, python-format -msgid "Unknown SSL error: %d" -msgstr "" - -#. wrong answer -#: ../src/common/connection.py:352 -msgid "Invalid answer" -msgstr "Niapravilny adkaz" - -#: ../src/common/connection.py:353 -#, fuzzy, python-format -msgid "Transport %(name)s answered wrongly to register request: %(error)s" -msgstr "Transpart %s niapravilna adkazaŭ na zapyt rehistracyi: %s" - -#: ../src/common/connection.py:636 ../src/common/connection.py:765 -#: ../src/common/connection.py:1526 -#: ../src/common/zeroconf/connection_zeroconf.py:249 -#, python-format -msgid "Could not connect to \"%s\"" -msgstr "Niemahčyma złučycca z \"%s\"" - -#: ../src/common/connection.py:637 ../src/gajim.py:1094 -msgid "Check your connection or try again later." -msgstr "Pravier złučeńnie albo pasprabuj paźniej." - -#: ../src/common/connection.py:642 -#, fuzzy, python-format -msgid "Server replied: %s" -msgstr "Zapisany ŭ: %s" - -#: ../src/common/connection.py:655 -#, fuzzy -msgid "Connection to proxy failed" -msgstr "Niemahvyma dałučycca" - -#: ../src/common/connection.py:686 ../src/common/connection.py:745 -#, fuzzy, python-format -msgid "Could not connect to account %s" -msgstr "Niemahčyma złučycca z \"%s\"" - -#: ../src/common/connection.py:687 ../src/common/connection.py:746 -#, fuzzy, python-format -msgid "Connection with account %s has been lost. Retry connecting." -msgstr "Złučeńnie dla kontu \"%s\" zhubiłasia" - -#: ../src/common/connection.py:712 -#, python-format -msgid "The authenticity of the %s certificate could be invalid." -msgstr "" - -#: ../src/common/connection.py:715 -#, python-format -msgid "" -"\n" -"SSL Error: %s" -msgstr "" - -#: ../src/common/connection.py:717 -#, python-format -msgid "" -"\n" -"Unknown SSL error: %d" -msgstr "" - -#: ../src/common/connection.py:766 -msgid "Check your connection or try again later" -msgstr "Pravier złučeńnie albo paŭtary paźniej" - -#: ../src/common/connection.py:794 -#, python-format -msgid "Authentication failed with \"%s\"" -msgstr "Pamyłka aŭtaryzacyi z \"%s\"" - -#: ../src/common/connection.py:796 -msgid "Please check your login and password for correctness." -msgstr "Kali łaska, pravier pravilnaść loginu i parolu." - -#: ../src/common/connection.py:862 -msgid "Error while removing privacy list" -msgstr "Pamyłka vydaleńnia śpisu pryvatnaści" - -#: ../src/common/connection.py:863 -#, fuzzy, python-format -msgid "" -"Privacy list %s has not been removed. It is maybe active in one of your " -"connected resources. Deactivate it and try again." -msgstr "" -"Śpis pryvatnaści %s nia vydaleny. Jon vykarystoŭvajecca adnoj z dałučanych " -"krynic. Adklučy jaje i paŭtary znoŭ." - -#: ../src/common/connection.py:1182 ../src/dialogs.py:2666 +#: ../src/common/connection.py:234 ../src/dialogs.py:2782 #, fuzzy, python-format msgid "It is not possible to send a message to %s, this JID is not valid." msgstr "Niemahčyma dasyłać pustyja fajły" -#: ../src/common/connection.py:1204 -#: ../src/common/zeroconf/connection_zeroconf.py:389 +#: ../src/common/connection.py:256 msgid "Neither the remote presence is signed, nor a key was assigned." msgstr "" -#: ../src/common/connection.py:1206 -#: ../src/common/zeroconf/connection_zeroconf.py:391 +#: ../src/common/connection.py:259 #, python-format msgid "The contact's key (%s) does not match the key assigned in Gajim." msgstr "" #. we're not english #. one in locale and one en -#: ../src/common/connection.py:1254 +#: ../src/common/connection.py:307 #, fuzzy msgid "[This message is *encrypted* (See :XEP:`27`]" msgstr "[Hetaje paviedamleńnie *zašyfravanaje* (Hladzi :JEP:`27`]" -#: ../src/common/connection.py:1356 -#: ../src/common/zeroconf/connection_zeroconf.py:468 +#: ../src/common/connection.py:408 #, fuzzy, python-format msgid "" "Subject: %(subject)s\n" @@ -4818,44 +4709,155 @@ msgstr "" "Tema: %s\n" "%s" -#: ../src/common/connection.py:1383 +#: ../src/common/connection.py:721 +#, python-format +msgid "Connection with account \"%s\" has been lost" +msgstr "Złučeńnie dla kontu \"%s\" zhubiłasia" + +#: ../src/common/connection.py:722 +msgid "Reconnect manually." +msgstr "Pieradałučysia samastojna." + +#: ../src/common/connection.py:734 +#, fuzzy, python-format +msgid "Server %(name)s answered wrongly to register request: %(error)s" +msgstr "Transpart %s niapravilna adkazaŭ na zapyt rehistracyi: %s" + +#: ../src/common/connection.py:768 +#, python-format +msgid "Server %s provided a different registration form" +msgstr "" + +#: ../src/common/connection.py:781 +#, python-format +msgid "Unknown SSL error: %d" +msgstr "" + +#. wrong answer +#: ../src/common/connection.py:796 +msgid "Invalid answer" +msgstr "Niapravilny adkaz" + +#: ../src/common/connection.py:797 +#, fuzzy, python-format +msgid "Transport %(name)s answered wrongly to register request: %(error)s" +msgstr "Transpart %s niapravilna adkazaŭ na zapyt rehistracyi: %s" + +#: ../src/common/connection.py:1075 ../src/common/connection.py:1204 +#: ../src/common/connection.py:1673 +#: ../src/common/zeroconf/connection_zeroconf.py:189 +#, python-format +msgid "Could not connect to \"%s\"" +msgstr "Niemahčyma złučycca z \"%s\"" + +#: ../src/common/connection.py:1076 ../src/gui_interface.py:705 +msgid "Check your connection or try again later." +msgstr "Pravier złučeńnie albo pasprabuj paźniej." + +#: ../src/common/connection.py:1081 +#, fuzzy, python-format +msgid "Server replied: %s" +msgstr "Zapisany ŭ: %s" + +#: ../src/common/connection.py:1094 +#, fuzzy +msgid "Connection to proxy failed" +msgstr "Niemahvyma dałučycca" + +#: ../src/common/connection.py:1125 ../src/common/connection.py:1184 +#, fuzzy, python-format +msgid "Could not connect to account %s" +msgstr "Niemahčyma złučycca z \"%s\"" + +#: ../src/common/connection.py:1126 ../src/common/connection.py:1185 +#, fuzzy, python-format +msgid "Connection with account %s has been lost. Retry connecting." +msgstr "Złučeńnie dla kontu \"%s\" zhubiłasia" + +#: ../src/common/connection.py:1151 +#, python-format +msgid "The authenticity of the %s certificate could be invalid." +msgstr "" + +#: ../src/common/connection.py:1154 +#, python-format +msgid "" +"\n" +"SSL Error: %s" +msgstr "" + +#: ../src/common/connection.py:1156 +#, python-format +msgid "" +"\n" +"Unknown SSL error: %d" +msgstr "" + +#: ../src/common/connection.py:1205 +msgid "Check your connection or try again later" +msgstr "Pravier złučeńnie albo paŭtary paźniej" + +#: ../src/common/connection.py:1236 +#, python-format +msgid "Authentication failed with \"%s\"" +msgstr "Pamyłka aŭtaryzacyi z \"%s\"" + +#: ../src/common/connection.py:1238 +msgid "Please check your login and password for correctness." +msgstr "Kali łaska, pravier pravilnaść loginu i parolu." + +#: ../src/common/connection.py:1300 +msgid "Error while removing privacy list" +msgstr "Pamyłka vydaleńnia śpisu pryvatnaści" + +#: ../src/common/connection.py:1301 +#, fuzzy, python-format +msgid "" +"Privacy list %s has not been removed. It is maybe active in one of your " +"connected resources. Deactivate it and try again." +msgstr "" +"Śpis pryvatnaści %s nia vydaleny. Jon vykarystoŭvajecca adnoj z dałučanych " +"krynic. Adklučy jaje i paŭtary znoŭ." + +#: ../src/common/connection.py:1541 #, python-format msgid "Sent contact: \"%s\" (%s)" msgstr "" -#: ../src/common/connection.py:1386 +#: ../src/common/connection.py:1544 #, fuzzy msgid "Sent contacts:" msgstr "Kantakty" -#: ../src/common/connection.py:1559 ../src/common/connection.py:1580 +#: ../src/common/connection.py:1703 ../src/common/connection.py:1724 msgid "Not fetched because of invisible status" msgstr "Nia ściahnuta z-za niabačnaha statusu" -#: ../src/common/connection.py:1982 +#: ../src/common/connection.py:2106 #, fuzzy msgid "Unregister failed" msgstr "Niemahvyma dałučycca" -#: ../src/common/connection.py:1983 +#: ../src/common/connection.py:2107 #, python-format msgid "Unregistration with server %(server)s failed: %(error)s" msgstr "" -#: ../src/common/contacts.py:92 ../src/common/helpers.py:55 -#: ../src/gajim.py:999 +#: ../src/common/contacts.py:129 ../src/common/helpers.py:55 +#: ../src/gui_interface.py:610 msgid "Observers" msgstr "Naziralniki" -#: ../src/common/contacts.py:96 ../src/common/contacts.py:348 +#: ../src/common/contacts.py:133 ../src/common/contacts.py:335 #: ../src/common/helpers.py:55 ../src/disco.py:119 ../src/disco.py:120 -#: ../src/disco.py:1354 ../src/gajim.py:802 ../src/roster_window.py:847 -#: ../src/roster_window.py:1549 ../src/roster_window.py:1618 -#: ../src/roster_window.py:1620 ../src/roster_window.py:1773 +#: ../src/disco.py:1464 ../src/gui_interface.py:413 +#: ../src/roster_window.py:848 ../src/roster_window.py:1501 +#: ../src/roster_window.py:1572 ../src/roster_window.py:1574 +#: ../src/roster_window.py:1732 msgid "Transports" msgstr "Transparty" -#: ../src/common/contacts.py:356 +#: ../src/common/contacts.py:343 msgid "Not in roster" msgstr "Niama ŭ śpisie kantaktaŭ" @@ -5103,7 +5105,7 @@ msgstr "Achvotna parazmaŭlaju" msgid "_Available" msgstr "_Dastupny" -#: ../src/common/helpers.py:212 ../src/features_window.py:116 +#: ../src/common/helpers.py:212 ../src/features_window.py:118 msgid "Available" msgstr "Dastupny" @@ -5221,48 +5223,48 @@ msgid "has closed the chat window or tab" msgstr "začyniŭ akno/kartku razmovy" #. GiB means gibibyte -#: ../src/common/helpers.py:658 +#: ../src/common/helpers.py:588 #, python-format msgid "%s GiB" msgstr "%s GiB" #. GB means gigabyte -#: ../src/common/helpers.py:661 +#: ../src/common/helpers.py:591 #, python-format msgid "%s GB" msgstr "%s GB" #. MiB means mibibyte -#: ../src/common/helpers.py:665 +#: ../src/common/helpers.py:595 #, python-format msgid "%s MiB" msgstr "%s MiB" #. MB means megabyte -#: ../src/common/helpers.py:668 +#: ../src/common/helpers.py:598 #, python-format msgid "%s MB" msgstr "%s MB" #. KiB means kibibyte -#: ../src/common/helpers.py:672 +#: ../src/common/helpers.py:602 #, python-format msgid "%s KiB" msgstr "%s KiB" #. KB means kilo bytes -#: ../src/common/helpers.py:675 +#: ../src/common/helpers.py:605 #, python-format msgid "%s KB" msgstr "%s KB" #. B means bytes -#: ../src/common/helpers.py:678 +#: ../src/common/helpers.py:608 #, python-format msgid "%s B" msgstr "%s B" -#: ../src/common/helpers.py:1166 ../src/common/helpers.py:1173 +#: ../src/common/helpers.py:1049 ../src/common/helpers.py:1056 #, fuzzy, python-format msgid "%d message pending" msgid_plural "%d messages pending" @@ -5270,22 +5272,22 @@ msgstr[0] "Dašli paviedamleńnie" msgstr[1] "Dašli paviedamleńnie" msgstr[2] "Dašli paviedamleńnie" -#: ../src/common/helpers.py:1179 +#: ../src/common/helpers.py:1062 #, python-format msgid " from room %s" msgstr "" -#: ../src/common/helpers.py:1182 ../src/common/helpers.py:1201 +#: ../src/common/helpers.py:1065 ../src/common/helpers.py:1084 #, python-format msgid " from user %s" msgstr "" -#: ../src/common/helpers.py:1184 +#: ../src/common/helpers.py:1067 #, python-format msgid " from %s" msgstr "" -#: ../src/common/helpers.py:1191 ../src/common/helpers.py:1198 +#: ../src/common/helpers.py:1074 ../src/common/helpers.py:1081 #, python-format msgid "%d event pending" msgid_plural "%d events pending" @@ -5293,7 +5295,7 @@ msgstr[0] "" msgstr[1] "" msgstr[2] "" -#: ../src/common/helpers.py:1231 +#: ../src/common/helpers.py:1114 #, python-format msgid "Gajim - %s" msgstr "Gajim - %s" @@ -5309,16 +5311,16 @@ msgid "%s is not a valid loglevel" msgstr "" #. we talk about a file -#: ../src/common/optparser.py:57 +#: ../src/common/optparser.py:59 #, python-format msgid "error: cannot open %s for reading" msgstr "pamyłka: niemahčyma adčynić %s, kab adčytać" -#: ../src/common/optparser.py:254 ../src/common/optparser.py:255 +#: ../src/common/optparser.py:297 ../src/common/optparser.py:298 msgid "cyan" msgstr "cyan" -#: ../src/common/optparser.py:371 +#: ../src/common/optparser.py:373 msgid "migrating logs database to indices" msgstr "indeksavańnie bazy razmoŭ" @@ -5327,705 +5329,724 @@ msgstr "indeksavańnie bazy razmoŭ" msgid "XMPP account %s@%s" msgstr "kontu %s" -#: ../src/common/pep.py:30 +#: ../src/common/pep.py:27 msgid "Afraid" msgstr "" -#: ../src/common/pep.py:31 +#: ../src/common/pep.py:28 msgid "Amazed" msgstr "" -#: ../src/common/pep.py:32 +#: ../src/common/pep.py:29 msgid "Amorous" msgstr "" -#: ../src/common/pep.py:33 +#: ../src/common/pep.py:30 msgid "Angry" msgstr "" -#: ../src/common/pep.py:34 +#: ../src/common/pep.py:31 msgid "Annoyed" msgstr "" -#: ../src/common/pep.py:35 +#: ../src/common/pep.py:32 msgid "Anxious" msgstr "" -#: ../src/common/pep.py:36 +#: ../src/common/pep.py:33 #, fuzzy msgid "Aroused" msgstr "Prypynienaja" -#: ../src/common/pep.py:37 +#: ../src/common/pep.py:34 msgid "Ashamed" msgstr "" -#: ../src/common/pep.py:38 +#: ../src/common/pep.py:35 #, fuzzy msgid "Bored" msgstr "Tłusty" -#: ../src/common/pep.py:39 +#: ../src/common/pep.py:36 #, fuzzy msgid "Brave" msgstr "Nie razmaŭlaju " -#: ../src/common/pep.py:40 +#: ../src/common/pep.py:37 msgid "Calm" msgstr "" -#: ../src/common/pep.py:41 +#: ../src/common/pep.py:38 #, fuzzy msgid "Cautious" msgstr "Razmovy" -#: ../src/common/pep.py:42 +#: ../src/common/pep.py:39 #, fuzzy msgid "Cold" msgstr "Tłusty" -#: ../src/common/pep.py:43 +#: ../src/common/pep.py:40 #, fuzzy msgid "Confident" msgstr "_Źmiest" -#: ../src/common/pep.py:44 +#: ../src/common/pep.py:41 msgid "Confused" msgstr "" -#: ../src/common/pep.py:45 +#: ../src/common/pep.py:42 #, fuzzy msgid "Contemplative" msgstr "Zavieršana" -#: ../src/common/pep.py:46 +#: ../src/common/pep.py:43 #, fuzzy msgid "Contented" msgstr "_Źmiest" -#: ../src/common/pep.py:47 +#: ../src/common/pep.py:44 msgid "Cranky" msgstr "" -#: ../src/common/pep.py:48 +#: ../src/common/pep.py:45 msgid "Crazy" msgstr "" -#: ../src/common/pep.py:49 +#: ../src/common/pep.py:46 #, fuzzy msgid "Creative" msgstr "Niadziejny" -#: ../src/common/pep.py:50 +#: ../src/common/pep.py:47 #, fuzzy msgid "Curious" msgstr "uri" -#: ../src/common/pep.py:51 +#: ../src/common/pep.py:48 #, fuzzy msgid "Dejected" msgstr "Vydal" -#: ../src/common/pep.py:52 +#: ../src/common/pep.py:49 msgid "Depressed" msgstr "" -#: ../src/common/pep.py:53 +#: ../src/common/pep.py:50 #, fuzzy msgid "Disappointed" msgstr "Adklučana" -#: ../src/common/pep.py:54 +#: ../src/common/pep.py:51 msgid "Disgusted" msgstr "" -#: ../src/common/pep.py:55 +#: ../src/common/pep.py:52 #, fuzzy msgid "Dismayed" msgstr "Adklučana" -#: ../src/common/pep.py:56 +#: ../src/common/pep.py:53 #, fuzzy msgid "Distracted" msgstr "Adklučana" -#: ../src/common/pep.py:57 +#: ../src/common/pep.py:54 msgid "Embarrassed" msgstr "" -#: ../src/common/pep.py:58 +#: ../src/common/pep.py:55 msgid "Envious" msgstr "" -#: ../src/common/pep.py:59 +#: ../src/common/pep.py:56 #, fuzzy msgid "Excited" msgstr "Dziejny" -#: ../src/common/pep.py:60 +#: ../src/common/pep.py:57 msgid "Flirtatious" msgstr "" -#: ../src/common/pep.py:61 +#: ../src/common/pep.py:58 msgid "Frustrated" msgstr "" -#: ../src/common/pep.py:62 +#: ../src/common/pep.py:59 msgid "Grateful" msgstr "" -#: ../src/common/pep.py:63 +#: ../src/common/pep.py:60 msgid "Grieving" msgstr "" -#: ../src/common/pep.py:64 +#: ../src/common/pep.py:61 #, fuzzy msgid "Grumpy" msgstr "Hrupa" -#: ../src/common/pep.py:65 +#: ../src/common/pep.py:62 msgid "Guilty" msgstr "" -#: ../src/common/pep.py:66 +#: ../src/common/pep.py:63 msgid "Happy" msgstr "" -#: ../src/common/pep.py:67 +#: ../src/common/pep.py:64 msgid "Hopeful" msgstr "" -#: ../src/common/pep.py:68 +#: ../src/common/pep.py:65 #, fuzzy msgid "Hot" msgstr "_Host:" -#: ../src/common/pep.py:69 +#: ../src/common/pep.py:66 msgid "Humbled" msgstr "" -#: ../src/common/pep.py:70 +#: ../src/common/pep.py:67 msgid "Humiliated" msgstr "" -#: ../src/common/pep.py:71 +#: ../src/common/pep.py:68 msgid "Hungry" msgstr "" -#: ../src/common/pep.py:72 +#: ../src/common/pep.py:69 msgid "Hurt" msgstr "" -#: ../src/common/pep.py:73 +#: ../src/common/pep.py:70 #, fuzzy msgid "Impressed" msgstr "paviedamleńnie" -#: ../src/common/pep.py:74 +#: ../src/common/pep.py:71 msgid "In Awe" msgstr "" -#: ../src/common/pep.py:75 +#: ../src/common/pep.py:72 msgid "In Love" msgstr "" -#: ../src/common/pep.py:76 +#: ../src/common/pep.py:73 msgid "Indignant" msgstr "" -#: ../src/common/pep.py:77 +#: ../src/common/pep.py:74 msgid "Interested" msgstr "" -#: ../src/common/pep.py:78 +#: ../src/common/pep.py:75 #, fuzzy msgid "Intoxicated" msgstr "Dziejny" -#: ../src/common/pep.py:79 +#: ../src/common/pep.py:76 #, fuzzy msgid "Invincible" msgstr "Niabačny" -#: ../src/common/pep.py:80 +#: ../src/common/pep.py:77 msgid "Jealous" msgstr "" -#: ../src/common/pep.py:81 +#: ../src/common/pep.py:78 #, fuzzy msgid "Lonely" msgstr "pieršaja" -#: ../src/common/pep.py:82 +#: ../src/common/pep.py:79 #, fuzzy msgid "Lost" msgstr "_Host:" -#: ../src/common/pep.py:83 +#: ../src/common/pep.py:80 msgid "Lucky" msgstr "" -#: ../src/common/pep.py:84 +#: ../src/common/pep.py:81 #, fuzzy msgid "Mean" msgstr "Niamieckaja" -#: ../src/common/pep.py:85 +#: ../src/common/pep.py:82 #, fuzzy msgid "Moody" msgstr "_Madyfikuj" -#: ../src/common/pep.py:86 +#: ../src/common/pep.py:83 msgid "Nervous" msgstr "" -#: ../src/common/pep.py:87 +#: ../src/common/pep.py:84 msgid "Neutral" msgstr "" -#: ../src/common/pep.py:88 +#: ../src/common/pep.py:85 #, fuzzy msgid "Offended" msgstr "Adłučany" -#: ../src/common/pep.py:89 +#: ../src/common/pep.py:86 msgid "Outraged" msgstr "" -#: ../src/common/pep.py:90 +#: ../src/common/pep.py:87 msgid "Playful" msgstr "" -#: ../src/common/pep.py:91 +#: ../src/common/pep.py:88 #, fuzzy msgid "Proud" msgstr "Hrupa" -#: ../src/common/pep.py:92 +#: ../src/common/pep.py:89 msgid "Relaxed" msgstr "" -#: ../src/common/pep.py:93 +#: ../src/common/pep.py:90 #, fuzzy msgid "Relieved" msgstr "adzinaccataja" -#: ../src/common/pep.py:94 +#: ../src/common/pep.py:91 msgid "Remorseful" msgstr "" -#: ../src/common/pep.py:95 +#: ../src/common/pep.py:92 msgid "Restless" msgstr "" -#: ../src/common/pep.py:96 +#: ../src/common/pep.py:93 #, fuzzy msgid "Sad" msgstr "Zatrymana" -#: ../src/common/pep.py:97 +#: ../src/common/pep.py:94 msgid "Sarcastic" msgstr "" -#: ../src/common/pep.py:98 +#: ../src/common/pep.py:95 #, fuzzy msgid "Satisfied" msgstr "Apošniaja źmiena:" -#: ../src/common/pep.py:99 +#: ../src/common/pep.py:96 msgid "Serious" msgstr "" -#: ../src/common/pep.py:100 +#: ../src/common/pep.py:97 msgid "Shocked" msgstr "" -#: ../src/common/pep.py:101 +#: ../src/common/pep.py:98 msgid "Shy" msgstr "" -#: ../src/common/pep.py:102 +#: ../src/common/pep.py:99 #, fuzzy msgid "Sick" msgstr "Mianuška" -#: ../src/common/pep.py:103 +#: ../src/common/pep.py:100 #, fuzzy msgid "Sleepy" msgstr "Splu" -#: ../src/common/pep.py:104 +#: ../src/common/pep.py:101 msgid "Spontaneous" msgstr "" -#: ../src/common/pep.py:105 +#: ../src/common/pep.py:102 #, fuzzy msgid "Stressed" msgstr "Vulica:" -#: ../src/common/pep.py:106 +#: ../src/common/pep.py:103 msgid "Strong" msgstr "" -#: ../src/common/pep.py:107 +#: ../src/common/pep.py:104 #, fuzzy msgid "Surprised" msgstr "Aŭtaryzavany" -#: ../src/common/pep.py:108 +#: ../src/common/pep.py:105 msgid "Thankful" msgstr "" -#: ../src/common/pep.py:109 +#: ../src/common/pep.py:106 msgid "Thirsty" msgstr "" -#: ../src/common/pep.py:110 +#: ../src/common/pep.py:107 #, fuzzy msgid "Tired" msgstr "Čas" -#: ../src/common/pep.py:111 +#: ../src/common/pep.py:108 #, fuzzy msgid "Undefined" msgstr "dziaviataja" -#: ../src/common/pep.py:112 +#: ../src/common/pep.py:109 msgid "Weak" msgstr "" -#: ../src/common/pep.py:113 +#: ../src/common/pep.py:110 msgid "Worried" msgstr "" -#: ../src/common/pep.py:116 +#: ../src/common/pep.py:113 #, fuzzy msgid "Doing Chores" msgstr "Niapravilny host" -#: ../src/common/pep.py:117 +#: ../src/common/pep.py:114 msgid "Buying Groceries" msgstr "" -#: ../src/common/pep.py:118 +#: ../src/common/pep.py:115 #, fuzzy msgid "Cleaning" msgstr "Viečar" -#: ../src/common/pep.py:119 +#: ../src/common/pep.py:116 #, fuzzy msgid "Cooking" msgstr "Uvod paviedamleńnia" -#: ../src/common/pep.py:120 +#: ../src/common/pep.py:117 msgid "Doing Maintenance" msgstr "" -#: ../src/common/pep.py:121 +#: ../src/common/pep.py:118 msgid "Doing the Dishes" msgstr "" -#: ../src/common/pep.py:122 +#: ../src/common/pep.py:119 msgid "Doing the Laundry" msgstr "" -#: ../src/common/pep.py:123 +#: ../src/common/pep.py:120 #, fuzzy msgid "Gardening" msgstr "Ranica" -#: ../src/common/pep.py:124 +#: ../src/common/pep.py:121 msgid "Running an Errand" msgstr "" -#: ../src/common/pep.py:125 +#: ../src/common/pep.py:122 #, fuzzy msgid "Walking the Dog" msgstr "pavodle hrupy" -#: ../src/common/pep.py:126 +#: ../src/common/pep.py:123 #, fuzzy msgid "Drinking" msgstr "Pracuju" -#: ../src/common/pep.py:127 +#: ../src/common/pep.py:124 msgid "Having a Beer" msgstr "" -#: ../src/common/pep.py:128 +#: ../src/common/pep.py:125 msgid "Having Coffee" msgstr "" -#: ../src/common/pep.py:129 +#: ../src/common/pep.py:126 msgid "Having Tea" msgstr "" -#: ../src/common/pep.py:131 +#: ../src/common/pep.py:128 msgid "Having a Snack" msgstr "" -#: ../src/common/pep.py:132 +#: ../src/common/pep.py:129 msgid "Having Breakfast" msgstr "" -#: ../src/common/pep.py:133 +#: ../src/common/pep.py:130 msgid "Having Dinner" msgstr "" -#: ../src/common/pep.py:134 +#: ../src/common/pep.py:131 msgid "Having Lunch" msgstr "" -#: ../src/common/pep.py:135 +#: ../src/common/pep.py:132 msgid "Exercising" msgstr "" -#: ../src/common/pep.py:136 ../src/common/pep.py:181 +#: ../src/common/pep.py:133 ../src/common/pep.py:178 msgid "Cycling" msgstr "" -#: ../src/common/pep.py:137 +#: ../src/common/pep.py:134 #, fuzzy msgid "Dancing" msgstr "Viečar" -#: ../src/common/pep.py:138 +#: ../src/common/pep.py:135 #, fuzzy msgid "Hiking" msgstr "Vypichvajecca %s" -#: ../src/common/pep.py:139 +#: ../src/common/pep.py:136 #, fuzzy msgid "Jogging" msgstr "_Dałučysia" -#: ../src/common/pep.py:140 +#: ../src/common/pep.py:137 msgid "Playing Sports" msgstr "" -#: ../src/common/pep.py:141 +#: ../src/common/pep.py:138 msgid "Running" msgstr "" -#: ../src/common/pep.py:142 +#: ../src/common/pep.py:139 #, fuzzy msgid "Skiing" msgstr "Pracuju" -#: ../src/common/pep.py:143 +#: ../src/common/pep.py:140 msgid "Swimming" msgstr "" -#: ../src/common/pep.py:144 +#: ../src/common/pep.py:141 #, fuzzy msgid "Working out" msgstr "Pracuju" -#: ../src/common/pep.py:145 +#: ../src/common/pep.py:142 #, fuzzy msgid "Grooming" msgstr "pakoj" -#: ../src/common/pep.py:146 +#: ../src/common/pep.py:143 msgid "At the Spa" msgstr "" -#: ../src/common/pep.py:147 +#: ../src/common/pep.py:144 msgid "Brushing Teeth" msgstr "" -#: ../src/common/pep.py:148 +#: ../src/common/pep.py:145 msgid "Getting a Haircut" msgstr "" -#: ../src/common/pep.py:149 +#: ../src/common/pep.py:146 #, fuzzy msgid "Shaving" msgstr "Jem" -#: ../src/common/pep.py:150 +#: ../src/common/pep.py:147 msgid "Taking a Bath" msgstr "" -#: ../src/common/pep.py:151 +#: ../src/common/pep.py:148 msgid "Taking a Shower" msgstr "" -#: ../src/common/pep.py:152 +#: ../src/common/pep.py:149 msgid "Having an Appointment" msgstr "" -#: ../src/common/pep.py:154 +#: ../src/common/pep.py:151 msgid "Day Off" msgstr "" -#: ../src/common/pep.py:155 +#: ../src/common/pep.py:152 #, fuzzy msgid "Hanging out" msgstr "Źmianiajecca tema" -#: ../src/common/pep.py:156 +#: ../src/common/pep.py:153 #, fuzzy msgid "Hiding" msgstr "Vypichvajecca %s" -#: ../src/common/pep.py:157 +#: ../src/common/pep.py:154 msgid "On Vacation" msgstr "" -#: ../src/common/pep.py:158 +#: ../src/common/pep.py:155 #, fuzzy msgid "Praying" msgstr "Jem" -#: ../src/common/pep.py:159 +#: ../src/common/pep.py:156 msgid "Scheduled Holiday" msgstr "" -#: ../src/common/pep.py:161 +#: ../src/common/pep.py:158 #, fuzzy msgid "Thinking" msgstr "Pracuju" -#: ../src/common/pep.py:162 +#: ../src/common/pep.py:159 msgid "Relaxing" msgstr "" -#: ../src/common/pep.py:163 +#: ../src/common/pep.py:160 #, fuzzy msgid "Fishing" msgstr "Vypichvajecca %s" -#: ../src/common/pep.py:164 +#: ../src/common/pep.py:161 #, fuzzy msgid "Gaming" msgstr "Jem" -#: ../src/common/pep.py:165 +#: ../src/common/pep.py:162 #, fuzzy msgid "Going out" msgstr "_Adłučajusia" -#: ../src/common/pep.py:166 +#: ../src/common/pep.py:163 #, fuzzy msgid "Partying" msgstr "Jem" -#: ../src/common/pep.py:167 +#: ../src/common/pep.py:164 #, fuzzy msgid "Reading" msgstr "Pryčyna" -#: ../src/common/pep.py:168 +#: ../src/common/pep.py:165 #, fuzzy msgid "Rehearsing" msgstr "Pryčyna" -#: ../src/common/pep.py:169 +#: ../src/common/pep.py:166 #, fuzzy msgid "Shopping" msgstr "Splu" -#: ../src/common/pep.py:170 +#: ../src/common/pep.py:167 #, fuzzy msgid "Smoking" msgstr "Pracuju" -#: ../src/common/pep.py:171 +#: ../src/common/pep.py:168 msgid "Socializing" msgstr "" -#: ../src/common/pep.py:172 +#: ../src/common/pep.py:169 #, fuzzy msgid "Sunbathing" msgstr "Jem" -#: ../src/common/pep.py:173 +#: ../src/common/pep.py:170 msgid "Watching TV" msgstr "" -#: ../src/common/pep.py:174 +#: ../src/common/pep.py:171 #, fuzzy msgid "Watching a Movie" msgstr "Hladžu film." -#: ../src/common/pep.py:175 +#: ../src/common/pep.py:172 #, fuzzy msgid "Talking" msgstr "Jem" -#: ../src/common/pep.py:176 +#: ../src/common/pep.py:173 msgid "In Real Life" msgstr "" -#: ../src/common/pep.py:177 +#: ../src/common/pep.py:174 #, fuzzy msgid "On the Phone" msgstr "Ja razmaŭlaju pa telefonie." -#: ../src/common/pep.py:178 +#: ../src/common/pep.py:175 msgid "On Video Phone" msgstr "" -#: ../src/common/pep.py:179 +#: ../src/common/pep.py:176 #, fuzzy msgid "Traveling" msgstr "Pieradajecca" -#: ../src/common/pep.py:180 +#: ../src/common/pep.py:177 #, fuzzy msgid "Commuting" msgstr "Uvod paviedamleńnia" -#: ../src/common/pep.py:182 +#: ../src/common/pep.py:179 msgid "Driving" msgstr "" -#: ../src/common/pep.py:183 +#: ../src/common/pep.py:180 msgid "In a Car" msgstr "" -#: ../src/common/pep.py:184 +#: ../src/common/pep.py:181 msgid "On a Bus" msgstr "" -#: ../src/common/pep.py:185 +#: ../src/common/pep.py:182 #, fuzzy msgid "On a Plane" msgstr "Dałučany" -#: ../src/common/pep.py:186 +#: ../src/common/pep.py:183 #, fuzzy msgid "On a Train" msgstr "Adčyni jak _spasyłku" -#: ../src/common/pep.py:187 +#: ../src/common/pep.py:184 msgid "On a Trip" msgstr "" -#: ../src/common/pep.py:188 +#: ../src/common/pep.py:185 #, fuzzy msgid "Walking" msgstr "Pracuju" -#: ../src/common/pep.py:190 +#: ../src/common/pep.py:187 #, fuzzy msgid "Coding" msgstr "Uvod paviedamleńnia" -#: ../src/common/pep.py:191 +#: ../src/common/pep.py:188 msgid "In a Meeting" msgstr "" -#: ../src/common/pep.py:192 +#: ../src/common/pep.py:189 msgid "Studying" msgstr "" -#: ../src/common/pep.py:193 +#: ../src/common/pep.py:190 #, fuzzy msgid "Writing" msgstr "Pracuju" +#: ../src/common/pep.py:335 +msgid "Unknown Artist" +msgstr "" + +#: ../src/common/pep.py:338 +msgid "Unknown Title" +msgstr "" + +#: ../src/common/pep.py:341 +msgid "Unknown Source" +msgstr "" + +#: ../src/common/pep.py:344 +#, python-format +msgid "" +"\"%(title)s\" by %(artist)s\n" +"from %(source)s" +msgstr "" + #. We cannot bind port, call error callback and fail #: ../src/common/socks5.py:86 #, python-format @@ -6046,36 +6067,11 @@ msgid "" "went wrong.]" msgstr "" -#: ../src/common/zeroconf/connection_handlers_zeroconf.py:94 -#, fuzzy, python-format -msgid "" -"The host %s you configured as the ft_add_hosts_to_send advanced option is " -"not valid, so ignored." -msgstr "" -"Host, akreśleny ŭ opcyi ft_override_host_to_send, niapravilny, tamu " -"ihnarujecca." - -#. We didn't set a passphrase -#: ../src/common/zeroconf/connection_zeroconf.py:173 -msgid "OpenPGP passphrase was not given" -msgstr "Parol OpenPGP nia vyznačany" - -#. %s is the account name here -#: ../src/common/zeroconf/connection_zeroconf.py:175 -#: ../src/roster_window.py:1970 -#, python-format -msgid "You will be connected to %s without OpenPGP." -msgstr "Ty dałučyśsia da %s biaz OpenPGP." - -#: ../src/common/zeroconf/connection_zeroconf.py:216 -msgid "To continue sending and receiving messages, you will need to reconnect." -msgstr "Kab paciahnuć kamunikacyju, treba ŭruchomić Gajim nanoŭ." - -#: ../src/common/zeroconf/connection_zeroconf.py:239 +#: ../src/common/zeroconf/connection_zeroconf.py:178 msgid "Avahi error" msgstr "Pamyłka Avahi" -#: ../src/common/zeroconf/connection_zeroconf.py:239 +#: ../src/common/zeroconf/connection_zeroconf.py:179 #, python-format msgid "" "%s\n" @@ -6084,53 +6080,46 @@ msgstr "" "%s\n" "Lakalnyja paviedamleńni mohuć pracavać pamyłkova." -#: ../src/common/zeroconf/connection_zeroconf.py:250 +#: ../src/common/zeroconf/connection_zeroconf.py:190 #, fuzzy msgid "Please check if Avahi or Bonjour is installed." msgstr "Kali łaska, pravier instalacyju Avahi." -#: ../src/common/zeroconf/connection_zeroconf.py:259 -#: ../src/common/zeroconf/connection_zeroconf.py:263 +#: ../src/common/zeroconf/connection_zeroconf.py:199 +#: ../src/common/zeroconf/connection_zeroconf.py:203 msgid "Could not start local service" msgstr "Niemahčyma ŭruchomić lakalny servis" -#: ../src/common/zeroconf/connection_zeroconf.py:260 +#: ../src/common/zeroconf/connection_zeroconf.py:200 #, python-format msgid "Unable to bind to port %d." msgstr "Niemahčyma dałučycca da portu %d." -#: ../src/common/zeroconf/connection_zeroconf.py:264 -#: ../src/common/zeroconf/connection_zeroconf.py:359 +#: ../src/common/zeroconf/connection_zeroconf.py:204 +#: ../src/common/zeroconf/connection_zeroconf.py:283 +#: ../src/common/zeroconf/connection_zeroconf.py:294 +#: ../src/common/zeroconf/connection_zeroconf.py:308 msgid "Please check if avahi-daemon is running." msgstr "Kali łaska, pravier, ci pracuje avahi-daemon." -#: ../src/common/zeroconf/connection_zeroconf.py:358 +#: ../src/common/zeroconf/connection_zeroconf.py:282 +#: ../src/common/zeroconf/connection_zeroconf.py:293 +#: ../src/common/zeroconf/connection_zeroconf.py:307 #, python-format msgid "Could not change status of account \"%s\"" msgstr "Niemahčyma źmianić status kontu \"%s\"" -#: ../src/common/zeroconf/connection_zeroconf.py:381 -msgid "" -"You are not connected or not visible to others. Your message could not be " -"sent." -msgstr "Ty nie dałučany albo niebačny. Ty nia možaš dasyłać paviedamleńni." - -#. we're not english -#: ../src/common/zeroconf/connection_zeroconf.py:399 -msgid "[This message is encrypted]" -msgstr "[Hetaje paviedamleńnie zašyfravanaje]" - -#: ../src/common/zeroconf/connection_zeroconf.py:483 +#: ../src/common/zeroconf/connection_zeroconf.py:324 #, fuzzy msgid "Your message could not be sent." msgstr "Kantakt adłučany. Niemahčyma dasłać paviedamleńnie." #. Contact Offline -#: ../src/common/zeroconf/connection_zeroconf.py:489 +#: ../src/common/zeroconf/connection_zeroconf.py:334 msgid "Contact is offline. Your message could not be sent." msgstr "Kantakt adłučany. Niemahčyma dasłać paviedamleńnie." -#: ../src/common/zeroconf/connection_zeroconf.py:593 +#: ../src/common/zeroconf/connection_zeroconf.py:359 msgid "" "Connection to host could not be established: Timeout while sending data." msgstr "" @@ -6143,26 +6132,26 @@ msgstr "" msgid "Error while adding service. %s" msgstr "Pamyłka dadańnia servisu. %s" -#: ../src/config.py:151 ../src/config.py:597 +#: ../src/config.py:157 ../src/config.py:586 msgid "Disabled" msgstr "Adklučana" -#: ../src/config.py:396 +#: ../src/config.py:383 #, fuzzy msgid "Default Message" msgstr "Standartnyja šablony paviedamleńniaŭ statusu" -#: ../src/config.py:405 +#: ../src/config.py:392 #, fuzzy msgid "Enabled" msgstr "Ukluč" -#: ../src/config.py:663 ../src/dialogs.py:1327 +#: ../src/config.py:654 ../src/dialogs.py:1365 #, python-format msgid "Dictionary for lang %s not available" msgstr "Słoŭnik dla movy %s niedastupny" -#: ../src/config.py:664 +#: ../src/config.py:655 #, python-format msgid "" "You have to install %s dictionary to use spellchecking, or choose another " @@ -6171,215 +6160,215 @@ msgstr "" "Treba zainstalavać słoŭnik %s, kab praviarać pravapis, albo abrać inšuju " "movu ŭ opcyi speller_language." -#: ../src/config.py:1040 +#: ../src/config.py:1092 msgid "status message title" msgstr "zahałovak statusu" -#: ../src/config.py:1040 +#: ../src/config.py:1092 msgid "status message text" msgstr "tekst paviedamleńnia statusu" #. Name column -#: ../src/config.py:1339 ../src/dialogs.py:2122 ../src/dialogs.py:2186 -#: ../src/dialogs.py:2891 ../src/disco.py:773 ../src/disco.py:1568 -#: ../src/disco.py:1854 ../src/history_window.py:87 +#: ../src/config.py:1394 ../src/dialogs.py:2232 ../src/dialogs.py:2298 +#: ../src/dialogs.py:3014 ../src/disco.py:831 ../src/disco.py:1690 +#: ../src/disco.py:1992 ../src/history_window.py:89 msgid "Name" msgstr "Nazva" -#: ../src/config.py:1428 +#: ../src/config.py:1487 msgid "Relogin now?" msgstr "Pieradałučycca?" -#: ../src/config.py:1429 +#: ../src/config.py:1488 msgid "If you want all the changes to apply instantly, you must relogin." msgstr "Kali chočaš zadziejničać źmieny, treba pieradałučycca." -#: ../src/config.py:1559 ../src/config.py:1684 +#: ../src/config.py:1620 ../src/config.py:1745 #, fuzzy msgid "OpenPGP is not usable on this computer" msgstr "Nielha vykarystać OpenPGP na hetym kamputary" -#: ../src/config.py:1720 ../src/config.py:1764 +#: ../src/config.py:1785 ../src/config.py:1829 msgid "Unread events" msgstr "Niepračytanyja paviedamleńni" -#: ../src/config.py:1721 +#: ../src/config.py:1786 msgid "Read all pending events before removing this account." msgstr "Pračytaj usie novyja paviedamleńni pierad vydaleńniem kontu." -#: ../src/config.py:1747 +#: ../src/config.py:1812 #, python-format msgid "You have opened chat in account %s" msgstr "Akno razmovy adčynienaje dla kontu %s" -#: ../src/config.py:1748 +#: ../src/config.py:1813 msgid "All chat and groupchat windows will be closed. Do you want to continue?" msgstr "Usie adčynienyja vokny razmovy buduć začynienyja. Praciahnuć?" -#: ../src/config.py:1760 ../src/config.py:2283 ../src/config.py:2317 +#: ../src/config.py:1825 ../src/config.py:2348 ../src/config.py:2382 msgid "You are currently connected to the server" msgstr "Prahrama dałučanaja da servera" -#: ../src/config.py:1761 +#: ../src/config.py:1826 msgid "To change the account name, you must be disconnected." msgstr "Kab źmianić nazvu kontu, treba pieradałučycca." -#: ../src/config.py:1765 +#: ../src/config.py:1830 msgid "To change the account name, you must read all pending events." msgstr "Kab źmianić nazvu kontu, treba pračytać usie novyja paviedamleńni." -#: ../src/config.py:1771 +#: ../src/config.py:1836 msgid "Account Name Already Used" msgstr "Taki kont užo zaniaty" -#: ../src/config.py:1772 +#: ../src/config.py:1837 msgid "" "This name is already used by another of your accounts. Please choose another " "name." msgstr "Kont z takoj nazvaj užo zaniaty. Kali łaska, abiary inšuju nazvu." -#: ../src/config.py:1776 ../src/config.py:1780 +#: ../src/config.py:1841 ../src/config.py:1845 msgid "Invalid account name" msgstr "Niapravilnaja nazva kontu" -#: ../src/config.py:1777 +#: ../src/config.py:1842 msgid "Account name cannot be empty." msgstr "Nazva kontu nia moža być pustoj." -#: ../src/config.py:1781 +#: ../src/config.py:1846 msgid "Account name cannot contain spaces." msgstr "Nazva kontu nia moža ŭtrymlivać prabiełaŭ." -#: ../src/config.py:1856 +#: ../src/config.py:1921 #, fuzzy msgid "Rename Account" msgstr "Kiruj kontami" -#: ../src/config.py:1857 +#: ../src/config.py:1922 #, fuzzy, python-format msgid "Enter a new name for account %s" msgstr "Vyznač novuju nazvu dla hrupy %s" -#: ../src/config.py:1885 +#: ../src/config.py:1950 msgid "A Jabber ID must be in the form \"user@servername\"." msgstr "JID musić mieć formu \"user@servername\"." -#: ../src/config.py:2093 ../src/config.py:3327 +#: ../src/config.py:2158 ../src/config.py:3406 msgid "Invalid entry" msgstr "Niapravilny zapis" -#: ../src/config.py:2094 ../src/config.py:3328 +#: ../src/config.py:2159 ../src/config.py:3407 msgid "Custom port must be a port number." msgstr "Abrany port musić być numeram portu." -#: ../src/config.py:2115 +#: ../src/config.py:2180 msgid "Failed to get secret keys" msgstr "Niemahčyma atrymać sakretnyja klučy" -#: ../src/config.py:2116 +#: ../src/config.py:2181 #, fuzzy msgid "There is no OpenPGP secret key available." msgstr "Adbyłasia pamyłka ŭ časie atrymańnia sakretnych klučoŭ OpenPGP." -#: ../src/config.py:2150 +#: ../src/config.py:2215 msgid "OpenPGP Key Selection" msgstr "Vybar kluča OpenPGP" -#: ../src/config.py:2151 +#: ../src/config.py:2216 msgid "Choose your OpenPGP key" msgstr "Abiary svoj kluč OpenPGP" -#: ../src/config.py:2158 +#: ../src/config.py:2223 msgid "No such account available" msgstr "Takoha kontu niama" -#: ../src/config.py:2159 +#: ../src/config.py:2224 msgid "You must create your account before editing your personal information." msgstr "Treba stvaryć kont, kab redahavać asabistyja źviestki." -#: ../src/config.py:2166 ../src/dialogs.py:1933 ../src/dialogs.py:2110 -#: ../src/dialogs.py:2289 ../src/disco.py:441 ../src/profile_window.py:317 +#: ../src/config.py:2231 ../src/dialogs.py:2031 ../src/dialogs.py:2220 +#: ../src/dialogs.py:2405 ../src/disco.py:477 ../src/profile_window.py:325 msgid "You are not connected to the server" msgstr "Niama złučeńnia z serveram" -#: ../src/config.py:2167 +#: ../src/config.py:2232 msgid "Without a connection, you can not edit your personal information." msgstr "Nie złučyŭšysia z serveram, niemahčyma źmianiać asabistyja źviestki." -#: ../src/config.py:2171 +#: ../src/config.py:2236 msgid "Your server doesn't support Vcard" msgstr "Server nie padtrymvaje Vcard" -#: ../src/config.py:2172 +#: ../src/config.py:2237 msgid "Your server can't save your personal information." msgstr "Server nia moža zachoŭvać asabistyja źviestki." -#: ../src/config.py:2284 ../src/config.py:2318 +#: ../src/config.py:2349 ../src/config.py:2383 #, fuzzy msgid "To disable the account, you must be disconnected." msgstr "Kab źmianić nazvu kontu, treba pieradałučycca." -#: ../src/config.py:2289 +#: ../src/config.py:2354 msgid "Account Local already exists." msgstr "Kont Local užo isnuje." -#: ../src/config.py:2290 +#: ../src/config.py:2355 msgid "Please rename or remove it before enabling link-local messaging." msgstr "" "Kali łaska, źmiani nazvu albo vydal jaho pierad uklučeńniem miascovych " "paviedamleńniaŭ." -#: ../src/config.py:2438 +#: ../src/config.py:2510 #, python-format msgid "Edit %s" msgstr "Źmiani %s" -#: ../src/config.py:2440 +#: ../src/config.py:2512 #, python-format msgid "Register to %s" msgstr "Zarehistrujsia na %s" #. list at the beginning -#: ../src/config.py:2476 +#: ../src/config.py:2548 msgid "Ban List" msgstr "Śpis zablakavanych kantaktaŭ" -#: ../src/config.py:2477 +#: ../src/config.py:2549 msgid "Member List" msgstr "Śpis udzielnikaŭ" -#: ../src/config.py:2478 +#: ../src/config.py:2550 msgid "Owner List" msgstr "Śpis ułaśnikaŭ" -#: ../src/config.py:2479 +#: ../src/config.py:2551 msgid "Administrator List" msgstr "Śpis administrataraŭ" #. Address column #. holds JID (who said this) -#: ../src/config.py:2528 ../src/disco.py:780 ../src/history_manager.py:208 +#: ../src/config.py:2600 ../src/disco.py:838 ../src/history_manager.py:208 msgid "JID" msgstr "JID" -#: ../src/config.py:2538 +#: ../src/config.py:2610 msgid "Reason" msgstr "Pryčyna" -#: ../src/config.py:2545 +#: ../src/config.py:2617 msgid "Nick" msgstr "Mianuška" -#: ../src/config.py:2551 +#: ../src/config.py:2623 msgid "Role" msgstr "Funkcyja" -#: ../src/config.py:2578 +#: ../src/config.py:2650 msgid "Banning..." msgstr "Blakavańnie..." #. You can move '\n' before user@domain if that line is TOO BIG -#: ../src/config.py:2580 +#: ../src/config.py:2652 msgid "" "Whom do you want to ban?\n" "\n" @@ -6387,11 +6376,11 @@ msgstr "" "Kaho chočaš zablakavać?\n" "\n" -#: ../src/config.py:2582 +#: ../src/config.py:2654 msgid "Adding Member..." msgstr "Dadajecca ŭdzielnik..." -#: ../src/config.py:2583 +#: ../src/config.py:2655 msgid "" "Whom do you want to make a member?\n" "\n" @@ -6399,11 +6388,11 @@ msgstr "" "Kaho chočaš zrabić udzielnikam?\n" "\n" -#: ../src/config.py:2585 +#: ../src/config.py:2657 msgid "Adding Owner..." msgstr "Dadajecca ŭłaśnik..." -#: ../src/config.py:2586 +#: ../src/config.py:2658 msgid "" "Whom do you want to make an owner?\n" "\n" @@ -6411,11 +6400,11 @@ msgstr "" "Kaho chočaš zrabić ułaśnikam?\n" "\n" -#: ../src/config.py:2588 +#: ../src/config.py:2660 msgid "Adding Administrator..." msgstr "Dadajecca administratar..." -#: ../src/config.py:2589 +#: ../src/config.py:2661 msgid "" "Whom do you want to make an administrator?\n" "\n" @@ -6423,7 +6412,7 @@ msgstr "" "Kaho chočaš zrabić administrataram?\n" "\n" -#: ../src/config.py:2590 +#: ../src/config.py:2662 #, fuzzy msgid "" "Can be one of the following:\n" @@ -6440,58 +6429,59 @@ msgstr "" "4. damen (adpaviadaje damen, jak karystalnik@damen,\n" "damen/krynica ci paddamen)." -#: ../src/config.py:2687 +#: ../src/config.py:2763 #, python-format msgid "Removing %s account" msgstr "Vydalajecca kont %s" -#: ../src/config.py:2709 ../src/gajim.py:1491 ../src/gajim.py:1588 +#: ../src/config.py:2785 ../src/gui_interface.py:1102 +#: ../src/gui_interface.py:1199 msgid "Password Required" msgstr "Vymahaje parolu" -#: ../src/config.py:2710 ../src/gajim.py:1568 +#: ../src/config.py:2786 ../src/gui_interface.py:1179 #, python-format msgid "Enter your password for account %s" msgstr "Uviadzi parol dla kontu %s" -#: ../src/config.py:2711 ../src/gajim.py:1588 +#: ../src/config.py:2787 ../src/gui_interface.py:1199 msgid "Save password" msgstr "Zachavaj parol" -#: ../src/config.py:2720 +#: ../src/config.py:2796 #, python-format msgid "Account \"%s\" is connected to the server" msgstr "Kont \"%s\" dałučany da servera" -#: ../src/config.py:2721 +#: ../src/config.py:2797 msgid "If you remove it, the connection will be lost." msgstr "Kali ty vydališ jaho, złučeńnie razarviecca." -#: ../src/config.py:2819 +#: ../src/config.py:2895 msgid "Default" msgstr "Zmoŭčany" -#: ../src/config.py:2819 +#: ../src/config.py:2895 msgid "?print_status:All" msgstr "?print_status:Usie" -#: ../src/config.py:2820 +#: ../src/config.py:2896 msgid "Enter and leave only" msgstr "Tolki ŭvachod i vychad" -#: ../src/config.py:2821 +#: ../src/config.py:2897 msgid "?print_status:None" msgstr "?print_status:Niama" -#: ../src/config.py:2889 +#: ../src/config.py:2967 msgid "New Group Chat" msgstr "Novaja hrupavaja razmova" -#: ../src/config.py:2922 +#: ../src/config.py:3000 msgid "This bookmark has invalid data" msgstr "Hetaja zakładka źmiaščaje niapravilnyja źviestki" -#: ../src/config.py:2923 +#: ../src/config.py:3001 msgid "" "Please be sure to fill out server and room fields or remove this bookmark." msgstr "" @@ -6499,31 +6489,31 @@ msgstr "" "zakładku." #. invalid char -#: ../src/config.py:3041 ../src/dialogs.py:1746 +#: ../src/config.py:3119 ../src/dialogs.py:1829 #, fuzzy msgid "Invalid nickname" msgstr "Niapravilnaje imia karystalnika" -#: ../src/config.py:3042 ../src/config.py:3056 ../src/config.py:3070 +#: ../src/config.py:3120 ../src/config.py:3134 ../src/config.py:3148 #, fuzzy msgid "Character not allowed" msgstr "Mianuška nie dazvolenaja: %s" -#: ../src/config.py:3055 ../src/config.py:3303 +#: ../src/config.py:3133 ../src/config.py:3382 #, fuzzy msgid "Invalid server" msgstr "Niapravilnaje imia karystalnika" -#: ../src/config.py:3069 +#: ../src/config.py:3147 #, fuzzy msgid "Invalid room" msgstr "Niapravilny zapis" -#: ../src/config.py:3220 +#: ../src/config.py:3299 msgid "Account has been added successfully" msgstr "Kont paśpiachova dadany" -#: ../src/config.py:3221 ../src/config.py:3227 +#: ../src/config.py:3300 ../src/config.py:3306 #, fuzzy msgid "" "You can set advanced account options by pressing the Advanced button, or " @@ -6533,34 +6523,34 @@ msgstr "" "Možaš źmianić dadatkovyja nałady kontu, nacisnuŭšy zaraz knopku \"Dadatkovyja" "\", albo paźniej, abraŭšy \"Źmianić\"->\"Konty\" ŭ menu hałoŭnaha akna." -#: ../src/config.py:3226 +#: ../src/config.py:3305 msgid "Your new account has been created successfully" msgstr "Novy kont paśpiachova stvorany" -#: ../src/config.py:3264 +#: ../src/config.py:3343 msgid "Invalid username" msgstr "Niapravilnaje imia karystalnika" -#: ../src/config.py:3266 +#: ../src/config.py:3345 msgid "You must provide a username to configure this account." msgstr "Treba vyznačyć imia karystalnika, kab skanfihuravać hety kont." -#: ../src/config.py:3304 +#: ../src/config.py:3383 #, fuzzy msgid "Please provide a server on which you want to register." msgstr "Kali łaska, vyznač dla siabie novuju mianušku:" -#: ../src/config.py:3360 ../src/gajim.py:2144 +#: ../src/config.py:3439 ../src/gui_interface.py:1857 #, fuzzy msgid "Certificate Already in File" msgstr "Kantakt užo jość u śpisie kantaktaŭ" -#: ../src/config.py:3361 ../src/gajim.py:2145 +#: ../src/config.py:3440 ../src/gui_interface.py:1858 #, python-format msgid "This certificate is already in file %s, so it's not added again." msgstr "" -#: ../src/config.py:3429 +#: ../src/config.py:3510 #, python-format msgid "" "Security Warning\n" @@ -6570,7 +6560,7 @@ msgid "" "Do you still want to connect to this server?" msgstr "" -#: ../src/config.py:3435 ../src/gajim.py:2169 +#: ../src/config.py:3516 ../src/gui_interface.py:1882 #, python-format msgid "" "Add this certificate to the list of trusted certificates.\n" @@ -6578,72 +6568,72 @@ msgid "" "%s" msgstr "" -#: ../src/config.py:3460 ../src/config.py:3483 +#: ../src/config.py:3543 ../src/config.py:3570 msgid "An error occurred during account creation" msgstr "Adbyłasia pamyłka padčas stvareńnia kontu" -#: ../src/config.py:3550 +#: ../src/config.py:3637 msgid "Account name is in use" msgstr "Nazva kontu ŭžo vykarystoŭvajecca" -#: ../src/config.py:3551 +#: ../src/config.py:3638 msgid "You already have an account using this name." msgstr "Kont z takoj nazvaj užo isnuje." -#: ../src/config.py:3704 +#: ../src/config.py:3791 msgid "Active" msgstr "Dziejny" -#: ../src/config.py:3712 +#: ../src/config.py:3799 msgid "Event" msgstr "Padzieja" -#: ../src/config.py:3747 +#: ../src/config.py:3834 msgid "First Message Received" msgstr "Atrymanaje pieršaje paviedamleńnie" -#: ../src/config.py:3748 +#: ../src/config.py:3835 #, fuzzy msgid "Next Message Received Focused" msgstr "Atrymanaje novaje paviedamleńnie" -#: ../src/config.py:3750 +#: ../src/config.py:3837 #, fuzzy msgid "Next Message Received Unfocused" msgstr "Atrymanaje novaje paviedamleńnie" -#: ../src/config.py:3751 +#: ../src/config.py:3838 msgid "Contact Connected" msgstr "Kantakt dałučyŭsia" -#: ../src/config.py:3752 +#: ../src/config.py:3839 msgid "Contact Disconnected" msgstr "Kantakt adłučyŭsia" -#: ../src/config.py:3753 +#: ../src/config.py:3840 msgid "Message Sent" msgstr "Paviedamleńnie dasłanaje" -#: ../src/config.py:3754 +#: ../src/config.py:3841 msgid "Group Chat Message Highlight" msgstr "Padśviatleńnie paviedamleńnia ŭ pakoji" -#: ../src/config.py:3755 +#: ../src/config.py:3842 msgid "Group Chat Message Received" msgstr "Novaje paviedamleńnie ŭ pakoji" -#: ../src/config.py:3756 +#: ../src/config.py:3843 msgid "GMail Email Received" msgstr "Novy list na skryncy GMail" -#: ../src/conversation_textview.py:592 +#: ../src/conversation_textview.py:599 msgid "" "This icon indicates that this message has not yet\n" "been received by the remote end. If this icon stays\n" "for a long time, it's likely the message got lost." msgstr "" -#: ../src/conversation_textview.py:611 +#: ../src/conversation_textview.py:618 #, fuzzy msgid "" "Text below this line is what has been said since the\n" @@ -6652,229 +6642,227 @@ msgstr "" "Tekst pad hetaj rysaj addzialaje toj tekst, jaki ty jašče nia bačyŭ/nia " "bačyła" -#: ../src/conversation_textview.py:724 +#: ../src/conversation_textview.py:737 #, fuzzy msgid "_Quote" msgstr "_Skonč pracu" -#: ../src/conversation_textview.py:731 +#: ../src/conversation_textview.py:744 #, python-format msgid "_Actions for \"%s\"" msgstr "_Dziejańni dla \"%s\"" -#: ../src/conversation_textview.py:743 +#: ../src/conversation_textview.py:756 msgid "Read _Wikipedia Article" msgstr "Pračytać artykuł u _Wikipedii" -#: ../src/conversation_textview.py:748 +#: ../src/conversation_textview.py:761 msgid "Look it up in _Dictionary" msgstr "Šukaj u _słoŭniku" -#: ../src/conversation_textview.py:765 +#: ../src/conversation_textview.py:778 #, python-format msgid "Dictionary URL is missing an \"%s\" and it is not WIKTIONARY" msgstr "U adrasie słoŭnika nie staje \"%s\", i heta nia Wiktionary" #. we must have %s in the url -#: ../src/conversation_textview.py:778 +#: ../src/conversation_textview.py:791 #, python-format msgid "Web Search URL is missing an \"%s\"" msgstr "U adrasie dla web-pošuku nie staje \"%s\"" -#: ../src/conversation_textview.py:781 +#: ../src/conversation_textview.py:794 msgid "Web _Search for it" msgstr "_Šukaj u Web" -#: ../src/conversation_textview.py:787 +#: ../src/conversation_textview.py:800 msgid "Open as _Link" msgstr "Adčyni jak _spasyłku" -#: ../src/conversation_textview.py:1274 +#. %i is day in year (1-365) +#: ../src/conversation_textview.py:1295 +#, fuzzy, python-format msgid "Yesterday" -msgstr "Učora" - -#. the number is >= 2 -#. %i is day in year (1-365), %d (1-31) we want %i -#: ../src/conversation_textview.py:1278 -#, python-format -msgid "%i days ago" -msgstr "%i dzion tamu" +msgid_plural "%i days ago" +msgstr[0] "Učora" +msgstr[1] "Učora" +msgstr[2] "Učora" #. if we have subject, show it too! -#: ../src/conversation_textview.py:1312 ../src/history_window.py:464 +#: ../src/conversation_textview.py:1330 ../src/history_window.py:475 #, python-format msgid "Subject: %s\n" msgstr "Tema: %s\n" -#: ../src/dataforms_widget.py:559 +#: ../src/dataforms_widget.py:581 #, fuzzy msgid "Jabber ID already in list" msgstr "Klijent kamunikacyi dla Jabber" -#: ../src/dataforms_widget.py:560 +#: ../src/dataforms_widget.py:582 msgid "The Jabber ID you entered is already in the list. Choose another one." msgstr "" #. Default jid -#: ../src/dataforms_widget.py:571 +#: ../src/dataforms_widget.py:593 msgid "new@jabber.id" msgstr "" -#: ../src/dataforms_widget.py:574 ../src/dataforms_widget.py:576 +#: ../src/dataforms_widget.py:596 ../src/dataforms_widget.py:598 #, python-format msgid "new%d@jabber.id" msgstr "" -#: ../src/dialogs.py:75 +#: ../src/dialogs.py:81 #, python-format msgid "Contact name: %s" msgstr "Nazva kantaktu: %s" -#: ../src/dialogs.py:77 +#: ../src/dialogs.py:83 #, python-format msgid "Jabber ID: %s" msgstr "JID: %s" -#: ../src/dialogs.py:184 +#: ../src/dialogs.py:194 msgid "Group" msgstr "Hrupa" -#: ../src/dialogs.py:191 +#: ../src/dialogs.py:201 msgid "In the group" msgstr "U hrupie" -#: ../src/dialogs.py:277 +#: ../src/dialogs.py:292 msgid "KeyID" msgstr "ID kluča" -#: ../src/dialogs.py:282 +#: ../src/dialogs.py:297 msgid "Contact name" msgstr "Nazva kantaktu" -#: ../src/dialogs.py:454 +#: ../src/dialogs.py:469 #, fuzzy msgid "Set Mood" msgstr "Vyznač MOTD" -#: ../src/dialogs.py:572 +#: ../src/dialogs.py:589 #, python-format msgid "%s Status Message" msgstr "Paviedamleńnie statusu %s" -#: ../src/dialogs.py:586 +#: ../src/dialogs.py:603 msgid "Status Message" msgstr "Paviedamleńnie statusu" -#: ../src/dialogs.py:772 +#: ../src/dialogs.py:793 #, fuzzy msgid "Overwrite Status Message?" msgstr "Paviedamleńnie statusu" -#: ../src/dialogs.py:773 +#: ../src/dialogs.py:794 #, fuzzy msgid "" "This name is already used. Do you want to overwrite this status message?" msgstr "Kont z takoj nazvaj užo zaniaty. Kali łaska, abiary inšuju nazvu." -#: ../src/dialogs.py:781 +#: ../src/dialogs.py:802 msgid "Save as Preset Status Message" msgstr "Zapišy jak šablon paviedamleńnia statusu" -#: ../src/dialogs.py:782 +#: ../src/dialogs.py:803 msgid "Please type a name for this status message" msgstr "Kali łaska, uviadzi nazvu dla hetaha paviedamleńnia statusu" -#: ../src/dialogs.py:807 +#: ../src/dialogs.py:831 msgid "AIM Address:" msgstr "Adras AIM:" -#: ../src/dialogs.py:808 +#: ../src/dialogs.py:832 msgid "GG Number:" msgstr "Numer GG:" -#: ../src/dialogs.py:809 +#: ../src/dialogs.py:833 msgid "ICQ Number:" msgstr "Numer ICQ:" -#: ../src/dialogs.py:810 +#: ../src/dialogs.py:834 msgid "MSN Address:" msgstr "Adras MSN:" -#: ../src/dialogs.py:811 +#: ../src/dialogs.py:835 msgid "Yahoo! Address:" msgstr "Adras Yahoo!:" -#: ../src/dialogs.py:847 +#: ../src/dialogs.py:872 #, python-format msgid "Please fill in the data of the contact you want to add in account %s" msgstr "" "Kali łaska, zapoŭni źviestki ab kantakcie, kali chočaš dadać kantakt %s" -#: ../src/dialogs.py:849 +#: ../src/dialogs.py:874 msgid "Please fill in the data of the contact you want to add" msgstr "Kali łaska, zapoŭni źviestki ab kantakcie, jaki chočaš dadać" -#: ../src/dialogs.py:1006 ../src/dialogs.py:1012 ../src/dialogs.py:1017 +#: ../src/dialogs.py:1035 ../src/dialogs.py:1041 ../src/dialogs.py:1046 msgid "Invalid User ID" msgstr "Niapravilny identyfikatar karystalnika" -#: ../src/dialogs.py:1013 +#: ../src/dialogs.py:1042 msgid "The user ID must not contain a resource." msgstr "Identyfikatar karystalnika nia moža ŭtrymlivać krynicy." -#: ../src/dialogs.py:1018 +#: ../src/dialogs.py:1047 #, fuzzy msgid "You cannot add yourself to your roster." msgstr "Ja chaču dadać ciabie ŭ svoj śpis kantaktaŭ." -#: ../src/dialogs.py:1032 +#: ../src/dialogs.py:1061 msgid "Contact already in roster" msgstr "Kantakt užo jość u śpisie kantaktaŭ" -#: ../src/dialogs.py:1033 +#: ../src/dialogs.py:1062 msgid "This contact is already listed in your roster." msgstr "Hety kantakt užo jość u tvajim śpisie kantaktaŭ." -#: ../src/dialogs.py:1069 +#: ../src/dialogs.py:1098 msgid "User ID:" msgstr "Identyfikatar karystalnika:" -#: ../src/dialogs.py:1127 +#: ../src/dialogs.py:1159 msgid "A GTK+ jabber client" msgstr "Jabber-klijent dla GTK+" -#: ../src/dialogs.py:1128 +#: ../src/dialogs.py:1160 msgid "GTK+ Version:" msgstr "Versija GTK+:" -#: ../src/dialogs.py:1129 +#: ../src/dialogs.py:1161 msgid "PyGTK Version:" msgstr "Versija PyGTK:" -#: ../src/dialogs.py:1139 +#: ../src/dialogs.py:1171 msgid "Current Developers:" msgstr "Dziejnyja raspracoŭniki:" -#: ../src/dialogs.py:1141 +#: ../src/dialogs.py:1173 msgid "Past Developers:" msgstr "Byłyja raspracoŭniki:" -#: ../src/dialogs.py:1147 +#: ../src/dialogs.py:1179 msgid "THANKS:" msgstr "PADZIAKI:" #. remove one english sentence #. and add it manually as translatable -#: ../src/dialogs.py:1153 +#: ../src/dialogs.py:1185 msgid "Last but not least, we would like to thank all the package maintainers." msgstr "I ŭrešcie, chočacca padziakavać usim apiekunam pakietaŭ." #. here you write your name in the form Name FamilyName -#: ../src/dialogs.py:1166 +#: ../src/dialogs.py:1198 msgid "translator-credits" msgstr "Ihar Hrachyshka " -#: ../src/dialogs.py:1328 +#: ../src/dialogs.py:1366 #, fuzzy, python-format msgid "" "You have to install %s dictionary to use spellchecking, or choose another " @@ -6885,105 +6873,109 @@ msgstr "" "Treba zainstalavać słoŭnik %s, kab praviarać pravapis, albo abrać inšuju " "movu ŭ opcyi speller_language." -#: ../src/dialogs.py:1747 ../src/dialogs.py:2061 +#: ../src/dialogs.py:1830 ../src/dialogs.py:2171 #, fuzzy msgid "The nickname has not allowed characters." msgstr "JID pakoju ŭtrymlivaje niedazvolenyja znaki." -#: ../src/dialogs.py:1859 +#: ../src/dialogs.py:1948 #, fuzzy, python-format msgid "Subscription request for account %(account)s from %(jid)s" msgstr "Zapyt aŭtaryzacyi dla kontu %s ad %s" -#: ../src/dialogs.py:1862 +#: ../src/dialogs.py:1951 #, python-format msgid "Subscription request from %s" msgstr "Zapyt aŭtaryzacyi ad %s" -#: ../src/dialogs.py:1928 ../src/gajim.py:2827 +#: ../src/dialogs.py:2026 ../src/gui_interface.py:2592 #, python-format msgid "You are already in group chat %s" msgstr "Užo ŭdzielničaješ u razmovie ŭ pakoji %s" -#: ../src/dialogs.py:1934 +#: ../src/dialogs.py:2032 msgid "You can not join a group chat unless you are connected." msgstr "" "Niemahčyma ŭdzielničać u hrupavoj razmovie, nie dałučyŭšysia da servera." -#: ../src/dialogs.py:1970 +#: ../src/dialogs.py:2074 #, python-format msgid "Join Group Chat with account %s" msgstr "Dałučysia da pakoju dla kontu %s" -#: ../src/dialogs.py:2050 +#: ../src/dialogs.py:2160 #, fuzzy msgid "Invalid Account" msgstr "Niapravilnaja nazva kontu" -#: ../src/dialogs.py:2051 +#: ../src/dialogs.py:2161 #, fuzzy msgid "" "You have to choose an account from which you want to join the groupchat." msgstr "Treba stvaryć kont, kab razmaŭlać ź inšymi kantaktami." -#: ../src/dialogs.py:2060 +#: ../src/dialogs.py:2170 #, fuzzy msgid "Invalid Nickname" msgstr "Niapravilnaje imia karystalnika" -#: ../src/dialogs.py:2065 ../src/dialogs.py:2071 -#: ../src/groupchat_control.py:1738 +#: ../src/dialogs.py:2175 ../src/dialogs.py:2181 +#: ../src/groupchat_control.py:1776 msgid "Invalid group chat Jabber ID" msgstr "Niapravilny JID pakoju" -#: ../src/dialogs.py:2066 ../src/dialogs.py:2072 -#: ../src/groupchat_control.py:1739 +#: ../src/dialogs.py:2176 +#, fuzzy +msgid "Please enter the group chat Jabber ID as room@server." +msgstr "JID pakoju ŭtrymlivaje niedazvolenyja znaki." + +#: ../src/dialogs.py:2182 ../src/groupchat_control.py:1777 msgid "The group chat Jabber ID has not allowed characters." msgstr "JID pakoju ŭtrymlivaje niedazvolenyja znaki." -#: ../src/dialogs.py:2079 +#: ../src/dialogs.py:2189 msgid "This is not a group chat" msgstr "Heta nie pakoj" -#: ../src/dialogs.py:2080 +#: ../src/dialogs.py:2190 #, python-format msgid "%s is not the name of a group chat." msgstr "Naźvie %s nie adpaviadaje nivodny pakoj." -#: ../src/dialogs.py:2111 +#: ../src/dialogs.py:2221 #, fuzzy msgid "Without a connection, you can not synchronise your contacts." msgstr "Niemahčyma źmianić parol, nie dałučyŭšysia da servera." -#: ../src/dialogs.py:2125 +#: ../src/dialogs.py:2235 msgid "Server" msgstr "Server" -#: ../src/dialogs.py:2158 +#: ../src/dialogs.py:2270 #, fuzzy msgid "This account is not connected to the server" msgstr "Kont \"%s\" dałučany da servera" -#: ../src/dialogs.py:2159 +#: ../src/dialogs.py:2271 #, fuzzy msgid "You cannot synchronize with an account unless it is connected." msgstr "" "Niemahčyma ŭdzielničać u hrupavoj razmovie, nie dałučyŭšysia da servera." -#: ../src/dialogs.py:2183 +#: ../src/dialogs.py:2295 msgid "Synchronise" msgstr "" -#: ../src/dialogs.py:2241 +#: ../src/dialogs.py:2355 #, python-format msgid "Start Chat with account %s" msgstr "Pačni razmovu dla kontu %s" -#: ../src/dialogs.py:2243 +#: ../src/dialogs.py:2357 msgid "Start Chat" msgstr "Pačni razmovu" -#: ../src/dialogs.py:2244 +#: ../src/dialogs.py:2358 msgid "" "Fill in the nickname or the Jabber ID of the contact you would like\n" "to send a chat message to:" @@ -6992,303 +6984,332 @@ msgstr "" "paviedamleńnie:" #. if offline or connecting -#: ../src/dialogs.py:2268 ../src/dialogs.py:2651 ../src/dialogs.py:2813 +#: ../src/dialogs.py:2384 ../src/dialogs.py:2767 ../src/dialogs.py:2929 msgid "Connection not available" msgstr "Złučeńnia niama" -#: ../src/dialogs.py:2269 ../src/dialogs.py:2652 ../src/dialogs.py:2814 +#: ../src/dialogs.py:2385 ../src/dialogs.py:2768 ../src/dialogs.py:2930 #, python-format msgid "Please make sure you are connected with \"%s\"." msgstr "Kali łaska, pravier, ci jość złučeńnie z \"%s\"." -#: ../src/dialogs.py:2278 ../src/dialogs.py:2281 +#: ../src/dialogs.py:2394 ../src/dialogs.py:2397 msgid "Invalid JID" msgstr "Niapravilny JID" -#: ../src/dialogs.py:2281 +#: ../src/dialogs.py:2397 #, python-format msgid "Unable to parse \"%s\"." msgstr "Niemahčyma razabrać \"%s\"." -#: ../src/dialogs.py:2290 +#: ../src/dialogs.py:2406 msgid "Without a connection, you can not change your password." msgstr "Niemahčyma źmianić parol, nie dałučyŭšysia da servera." -#: ../src/dialogs.py:2309 +#: ../src/dialogs.py:2425 msgid "Invalid password" msgstr "Niapravilny parol" -#: ../src/dialogs.py:2309 +#: ../src/dialogs.py:2425 msgid "You must enter a password." msgstr "Treba ŭvieści parol." -#: ../src/dialogs.py:2313 +#: ../src/dialogs.py:2429 msgid "Passwords do not match" msgstr "Paroli roźniacca" -#: ../src/dialogs.py:2314 +#: ../src/dialogs.py:2430 msgid "The passwords typed in both fields must be identical." msgstr "Parolu ŭ abodvuch palach nie pavinny roźnicca." #. img to display #. default value -#: ../src/dialogs.py:2353 ../src/notify.py:257 ../src/notify.py:491 +#: ../src/dialogs.py:2469 ../src/notify.py:263 ../src/notify.py:504 msgid "Contact Signed In" msgstr "Kantakt dałučyŭsia" -#: ../src/dialogs.py:2355 ../src/notify.py:265 ../src/notify.py:493 +#: ../src/dialogs.py:2471 ../src/notify.py:271 ../src/notify.py:506 msgid "Contact Signed Out" msgstr "Kantakt adłučyŭsia" #. chat message #. img to display -#: ../src/dialogs.py:2357 ../src/notify.py:288 ../src/notify.py:342 -#: ../src/notify.py:495 +#: ../src/dialogs.py:2473 ../src/notify.py:294 ../src/notify.py:349 +#: ../src/notify.py:508 msgid "New Message" msgstr "Novaje paviedamleńnie" #. single message -#: ../src/dialogs.py:2357 ../src/notify.py:269 ../src/notify.py:343 -#: ../src/notify.py:495 +#: ../src/dialogs.py:2473 ../src/notify.py:275 ../src/notify.py:350 +#: ../src/notify.py:508 msgid "New Single Message" msgstr "Novaje asobnaje paviedamleńnie" #. private message -#: ../src/dialogs.py:2358 ../src/notify.py:276 ../src/notify.py:343 -#: ../src/notify.py:496 +#: ../src/dialogs.py:2474 ../src/notify.py:282 ../src/notify.py:350 +#: ../src/notify.py:509 msgid "New Private Message" msgstr "Novaje pryvatnaje paviedamleńnie" -#: ../src/dialogs.py:2358 ../src/gajim.py:1704 ../src/notify.py:505 +#: ../src/dialogs.py:2474 ../src/gui_interface.py:1315 ../src/notify.py:518 msgid "New E-mail" msgstr "Novy list" -#: ../src/dialogs.py:2360 ../src/gajim.py:1770 ../src/notify.py:498 +#: ../src/dialogs.py:2476 ../src/gui_interface.py:1382 ../src/notify.py:511 msgid "File Transfer Request" msgstr "Zapyt na pieradaču fajłu" -#: ../src/dialogs.py:2362 ../src/gajim.py:1670 ../src/gajim.py:1737 -#: ../src/notify.py:500 +#: ../src/dialogs.py:2478 ../src/gui_interface.py:1281 +#: ../src/gui_interface.py:1349 ../src/notify.py:513 msgid "File Transfer Error" msgstr "Pamyłka pieradačy fajłu" -#: ../src/dialogs.py:2364 ../src/gajim.py:1815 ../src/gajim.py:1837 -#: ../src/gajim.py:1854 ../src/notify.py:502 +#: ../src/dialogs.py:2480 ../src/gui_interface.py:1427 +#: ../src/gui_interface.py:1449 ../src/gui_interface.py:1466 +#: ../src/notify.py:515 msgid "File Transfer Completed" msgstr "Pieradača fajłu skončana" -#: ../src/dialogs.py:2365 ../src/gajim.py:1818 ../src/notify.py:503 +#: ../src/dialogs.py:2481 ../src/gui_interface.py:1430 ../src/notify.py:516 msgid "File Transfer Stopped" msgstr "Pieradača fajłu spyniena" -#: ../src/dialogs.py:2367 ../src/gajim.py:1512 ../src/notify.py:507 +#: ../src/dialogs.py:2483 ../src/gui_interface.py:1123 ../src/notify.py:520 msgid "Groupchat Invitation" msgstr "Zaprašeńnie ŭ pakoj" -#: ../src/dialogs.py:2369 ../src/notify.py:249 ../src/notify.py:509 +#: ../src/dialogs.py:2485 ../src/notify.py:255 ../src/notify.py:522 msgid "Contact Changed Status" msgstr "Kantakt źmianiŭ status" -#: ../src/dialogs.py:2570 +#: ../src/dialogs.py:2686 #, python-format msgid "Single Message using account %s" msgstr "Asobnaje paviedamleńnie z kontu %s" -#: ../src/dialogs.py:2572 +#: ../src/dialogs.py:2688 #, python-format msgid "Single Message in account %s" msgstr "Asobnaje paviedamleńnie z kontu %s" -#: ../src/dialogs.py:2574 +#: ../src/dialogs.py:2690 msgid "Single Message" msgstr "Asobnaje paviedamleńnie" #. prepare UI for Sending -#: ../src/dialogs.py:2577 +#: ../src/dialogs.py:2693 #, python-format msgid "Send %s" msgstr "Dašli %s" #. prepare UI for Receiving -#: ../src/dialogs.py:2600 +#: ../src/dialogs.py:2716 #, python-format msgid "Received %s" msgstr "Atrymana %s" #. prepare UI for Receiving -#: ../src/dialogs.py:2623 +#: ../src/dialogs.py:2739 #, fuzzy, python-format msgid "Form %s" msgstr "Я %s" #. we create a new blank window to send and we preset RE: and to jid -#: ../src/dialogs.py:2702 +#: ../src/dialogs.py:2818 #, python-format msgid "RE: %s" msgstr "RE: %s" -#: ../src/dialogs.py:2703 +#: ../src/dialogs.py:2819 #, python-format msgid "%s wrote:\n" msgstr "%s napisaŭ:\n" -#: ../src/dialogs.py:2752 +#: ../src/dialogs.py:2868 #, python-format msgid "XML Console for %s" msgstr "Kansol XML dla %s" -#: ../src/dialogs.py:2754 +#: ../src/dialogs.py:2870 msgid "XML Console" msgstr "Kansol XML" -#. Set labels -#. self.action can be 'add', 'modify' or 'remove' -#: ../src/dialogs.py:2865 +#. Action that can be done with an incoming list of contacts +#: ../src/dialogs.py:2958 +#, fuzzy +msgid "add" +msgstr "Zatrymana" + +#: ../src/dialogs.py:2958 +#, fuzzy +msgid "modify" +msgstr "_Madyfikuj" + +#: ../src/dialogs.py:2959 +#, fuzzy +msgid "remove" +msgstr "_Vydal" + +#: ../src/dialogs.py:2987 #, fuzzy, python-format -msgid "%s would like you to %s some contacts in your roster." +msgid "" +"%(jid)s would like you to %(action)s some contacts in your " +"roster." msgstr "Ja chaču dadać Vas u svoj śpis kantaktaŭ." -#: ../src/dialogs.py:2880 ../src/dialogs.py:2928 +#. Change label for accept_button to action name instead of 'OK'. +#: ../src/dialogs.py:3003 ../src/dialogs.py:3049 #, fuzzy msgid "Add" msgstr "Adras" -#: ../src/dialogs.py:2882 ../src/dialogs.py:2961 +#. Change label for accept_button to action name instead of 'OK'. +#: ../src/dialogs.py:3005 ../src/dialogs.py:3080 #, fuzzy msgid "Modify" msgstr "_Madyfikuj" -#: ../src/dialogs.py:2888 +#: ../src/dialogs.py:3011 #, fuzzy msgid "Jabber ID" msgstr "JID:" -#: ../src/dialogs.py:2894 +#: ../src/dialogs.py:3017 #, fuzzy msgid "Groups" msgstr "Hrupa" #. it is selected -#. remote_jid = model[iter][1].decode('utf-8') -#: ../src/dialogs.py:3008 +#. remote_jid = model[iter_][1].decode('utf-8') +#: ../src/dialogs.py:3125 #, fuzzy, python-format msgid "%s suggested me to add you in my roster." msgstr "Ja chaču dadać ciabie ŭ svoj śpis kantaktaŭ." -#: ../src/dialogs.py:3108 +#: ../src/dialogs.py:3139 +#, fuzzy, python-format +msgid "Added %s contacts" +msgstr "_Dadaj kantakt" + +#: ../src/dialogs.py:3176 +#, fuzzy, python-format +msgid "Removed %s contacts" +msgstr "Vydalaje kantakt sa śpisu" + +#: ../src/dialogs.py:3229 #, python-format msgid "Privacy List %s" msgstr "Śpis pryvatnaści %s" -#: ../src/dialogs.py:3112 +#: ../src/dialogs.py:3233 #, python-format msgid "Privacy List for %s" msgstr "Śpis pryvatnaści dla %s" -#: ../src/dialogs.py:3168 +#: ../src/dialogs.py:3289 #, fuzzy, python-format msgid "Order: %(order)s, action: %(action)s, type: %(type)s, value: %(value)s" msgstr "Paradak: %s, dziejańnie: %s, typ: %s, vartaść: %s" -#: ../src/dialogs.py:3173 +#: ../src/dialogs.py:3294 #, fuzzy, python-format msgid "Order: %(order)s, action: %(action)s" msgstr "Paradak: %s, dziejańnie: %s" -#: ../src/dialogs.py:3215 +#: ../src/dialogs.py:3338 msgid "Edit a rule" msgstr "Redahuj praviła" -#: ../src/dialogs.py:3326 +#: ../src/dialogs.py:3449 msgid "Add a rule" msgstr "Dadaj praviła" -#: ../src/dialogs.py:3423 +#: ../src/dialogs.py:3549 #, python-format msgid "Privacy Lists for %s" msgstr "Śpisy pryvatnaści dla %s" -#: ../src/dialogs.py:3425 +#: ../src/dialogs.py:3551 msgid "Privacy Lists" msgstr "Śpisy pryvatnaści" -#: ../src/dialogs.py:3495 +#: ../src/dialogs.py:3621 msgid "Invalid List Name" msgstr "Niapravilnaja nazva śpisu" -#: ../src/dialogs.py:3496 +#: ../src/dialogs.py:3622 msgid "You must enter a name to create a privacy list." msgstr "Treba akreślić nazvu dla novaha śpisu pryvatnaści." -#: ../src/dialogs.py:3528 +#: ../src/dialogs.py:3654 #, fuzzy msgid "You are invited to a groupchat" msgstr "Ty nie dałučyŭsia da pakoju." -#: ../src/dialogs.py:3531 +#: ../src/dialogs.py:3657 #, fuzzy msgid "$Contact has invited you to join a discussion" msgstr "$Contact zaprasiŭ ciabie ŭ pakoj %(room_jid)s" -#: ../src/dialogs.py:3533 +#: ../src/dialogs.py:3659 #, python-format msgid "$Contact has invited you to group chat %(room_jid)s" msgstr "$Contact zaprasiŭ ciabie ŭ pakoj %(room_jid)s" -#: ../src/dialogs.py:3541 +#: ../src/dialogs.py:3667 #, python-format msgid "Comment: %s" msgstr "Kamentar: %s" -#: ../src/dialogs.py:3543 +#: ../src/dialogs.py:3669 #, fuzzy msgid "Do you want to accept the invitation?" msgstr "%s choča dasłać tabie fajł:" -#: ../src/dialogs.py:3599 +#: ../src/dialogs.py:3730 msgid "Choose Sound" msgstr "Abiary hukavy fajł" -#: ../src/dialogs.py:3609 ../src/dialogs.py:3663 +#: ../src/dialogs.py:3740 ../src/dialogs.py:3796 msgid "All files" msgstr "Usie fajły" -#: ../src/dialogs.py:3614 +#: ../src/dialogs.py:3745 msgid "Wav Sounds" msgstr "Fajły ŭ Wav" -#: ../src/dialogs.py:3650 +#: ../src/dialogs.py:3783 msgid "Choose Image" msgstr "Abiary vyjavu" -#: ../src/dialogs.py:3668 +#: ../src/dialogs.py:3801 msgid "Images" msgstr "Vyjavy" -#: ../src/dialogs.py:3733 +#: ../src/dialogs.py:3868 #, python-format msgid "When %s becomes:" msgstr "Kali %s maje status:" -#: ../src/dialogs.py:3735 +#: ../src/dialogs.py:3870 #, python-format msgid "Adding Special Notification for %s" msgstr "Dadajecca admysłovaje nahadvańnie dla %s" #. # means number -#: ../src/dialogs.py:3804 +#: ../src/dialogs.py:3939 msgid "#" msgstr "№" -#: ../src/dialogs.py:3810 +#: ../src/dialogs.py:3945 msgid "Condition" msgstr "Umova" -#: ../src/dialogs.py:3928 +#: ../src/dialogs.py:4065 msgid "when I am " msgstr "kali maju " -#: ../src/dialogs.py:4400 +#: ../src/dialogs.py:4541 #, python-format msgid "" "Your chat session with %(jid)s is encrypted.\n" @@ -7296,38 +7317,38 @@ msgid "" "This session's Short Authentication String is %(sas)s." msgstr "" -#: ../src/dialogs.py:4404 +#: ../src/dialogs.py:4545 msgid "You have already verified this contact's identity." msgstr "" -#: ../src/dialogs.py:4410 ../src/dialogs.py:4497 +#: ../src/dialogs.py:4551 ../src/dialogs.py:4640 msgid "Contact's identity verified" msgstr "" -#: ../src/dialogs.py:4418 +#: ../src/dialogs.py:4559 msgid "Verify again..." msgstr "" -#: ../src/dialogs.py:4423 +#: ../src/dialogs.py:4564 msgid "" "To be certain that only the expected person can read your messages or " "send you messages, you need to verify their identity by clicking the button " "below." msgstr "" -#: ../src/dialogs.py:4426 ../src/dialogs.py:4478 ../src/dialogs.py:4491 +#: ../src/dialogs.py:4567 ../src/dialogs.py:4621 ../src/dialogs.py:4634 msgid "Contact's identity NOT verified" msgstr "" -#: ../src/dialogs.py:4433 +#: ../src/dialogs.py:4574 msgid "Verify..." msgstr "" -#: ../src/dialogs.py:4445 +#: ../src/dialogs.py:4586 msgid "Have you verified the contact's identity?" msgstr "" -#: ../src/dialogs.py:4446 +#: ../src/dialogs.py:4587 #, python-format msgid "" "To prevent talking to an unknown person, you should speak to %(jid)s " @@ -7337,31 +7358,50 @@ msgid "" "This session's Short Authentication String is %(sas)s." msgstr "" -#: ../src/dialogs.py:4447 +#: ../src/dialogs.py:4588 msgid "Did you talk to the remote contact and verify the SAS?" msgstr "" -#: ../src/dialogs.py:4479 +#: ../src/dialogs.py:4622 #, python-format msgid "The contact's key (%s) does not match the key assigned in Gajim." msgstr "" -#: ../src/dialogs.py:4485 +#: ../src/dialogs.py:4628 msgid "No GPG key is assigned to this contact. So you cannot encrypt messages." msgstr "" -#: ../src/dialogs.py:4492 +#: ../src/dialogs.py:4635 msgid "" "GPG key is assigned to this contact, but you do not trust his key, so " "message cannot be encrypted. Use your GPG client to trust this key." msgstr "" -#: ../src/dialogs.py:4498 +#: ../src/dialogs.py:4641 msgid "" "GPG Key is assigned to this contact, and you trust his key, so messages will " "be encrypted." msgstr "" +#: ../src/dialogs.py:4708 +msgid "an audio and video" +msgstr "" + +#: ../src/dialogs.py:4710 +msgid "an audio" +msgstr "" + +#: ../src/dialogs.py:4712 +msgid "a video" +msgstr "" + +#: ../src/dialogs.py:4716 +#, python-format +msgid "" +"%(contact)s wants to start %(type)s session with you. Do you want to answer " +"the call?" +msgstr "" + #: ../src/disco.py:118 msgid "Others" msgstr "Inšyja" @@ -7371,24 +7411,24 @@ msgstr "Inšyja" msgid "Conference" msgstr "Kanferencyja" -#: ../src/disco.py:442 +#: ../src/disco.py:478 msgid "Without a connection, you can not browse available services" msgstr "Nia možaš prahladać najaŭnyja servisy, nie dałučyŭšysia da servera" -#: ../src/disco.py:516 +#: ../src/disco.py:554 #, python-format msgid "Service Discovery using account %s" msgstr "Prahlad servisaŭ dla kontu %s" -#: ../src/disco.py:518 +#: ../src/disco.py:556 msgid "Service Discovery" msgstr "Prahlad servisaŭ" -#: ../src/disco.py:659 +#: ../src/disco.py:706 msgid "The service could not be found" msgstr "Niemahčyma znajści servis" -#: ../src/disco.py:660 +#: ../src/disco.py:707 msgid "" "There is no service at the address you entered, or it is not responding. " "Check the address and try again." @@ -7396,341 +7436,336 @@ msgstr "" "Niama servisu z akreślenym adrasam, albo jon nie adkazvaje. Pravier adras i " "pasprabuj znoŭ." -#: ../src/disco.py:664 ../src/disco.py:960 +#: ../src/disco.py:711 ../src/disco.py:1047 msgid "The service is not browsable" msgstr "Niemahčyma ahladać hety servis" -#: ../src/disco.py:665 +#: ../src/disco.py:712 msgid "This type of service does not contain any items to browse." msgstr "Taki servis nia ŭtrymlivaje elementaŭ dla ahladańnia." -#: ../src/disco.py:702 ../src/disco.py:712 +#: ../src/disco.py:751 ../src/disco.py:761 #, fuzzy msgid "Invalid Server Name" msgstr "Niapravilnaje imia karystalnika" -#: ../src/disco.py:759 +#: ../src/disco.py:815 #, fuzzy, python-format msgid "Browsing %(address)s using account %(account)s" msgstr "Prahlad %s dla kontu %s" -#: ../src/disco.py:799 +#: ../src/disco.py:859 msgid "_Browse" msgstr "_Prahladaj" -#: ../src/disco.py:961 +#: ../src/disco.py:1048 msgid "This service does not contain any items to browse." msgstr "Hety servis nia ŭtrymlivaje elementaŭ dla prahladu." -#: ../src/disco.py:1183 +#: ../src/disco.py:1288 #, fuzzy msgid "_Execute Command" msgstr "_Vykanaj zahad..." -#: ../src/disco.py:1193 ../src/disco.py:1359 +#: ../src/disco.py:1298 ../src/disco.py:1469 msgid "Re_gister" msgstr "_Zarehistrujsia" -#: ../src/disco.py:1396 +#: ../src/disco.py:1510 #, fuzzy, python-format msgid "Scanning %(current)d / %(total)d.." msgstr "Skanavańnie %d / %d.." #. Users column -#: ../src/disco.py:1578 +#: ../src/disco.py:1700 msgid "Users" msgstr "Karystalniki" #. Description column -#: ../src/disco.py:1586 +#: ../src/disco.py:1708 msgid "Description" msgstr "Apisańnie" #. Id column -#: ../src/disco.py:1594 +#: ../src/disco.py:1716 msgid "Id" msgstr "Identyfikatar" -#: ../src/disco.py:1659 ../src/gajim.py:3311 +#: ../src/disco.py:1781 ../src/gui_interface.py:3088 msgid "Bookmark already set" msgstr "Zakładka ŭžo dadana" -#: ../src/disco.py:1660 ../src/gajim.py:3312 +#: ../src/disco.py:1782 ../src/gui_interface.py:3089 #, python-format msgid "Group Chat \"%s\" is already in your bookmarks." msgstr "Pakoj \"%s\" užo jość u tvajich zakładkach." -#: ../src/disco.py:1669 ../src/gajim.py:3325 +#: ../src/disco.py:1791 ../src/gui_interface.py:3102 msgid "Bookmark has been added successfully" msgstr "Zakładka paśpiachova dadanaja" -#: ../src/disco.py:1670 ../src/gajim.py:3326 +#: ../src/disco.py:1792 ../src/gui_interface.py:3103 msgid "You can manage your bookmarks via Actions menu in your roster." msgstr "" "Možaš kiravać svajimi zakładkami praz menu \"Dziejańni\" śpisu kantaktaŭ." -#: ../src/disco.py:1863 +#: ../src/disco.py:2001 msgid "Subscribed" msgstr "Aŭtaryzavany" -#: ../src/disco.py:1871 +#: ../src/disco.py:2009 #, fuzzy msgid "Node" msgstr "Nijaki" -#: ../src/disco.py:1933 +#: ../src/disco.py:2073 msgid "New post" msgstr "Novy zapis" -#: ../src/disco.py:1939 +#: ../src/disco.py:2079 msgid "_Subscribe" msgstr "_Aŭtaryzuj" -#: ../src/disco.py:1945 +#: ../src/disco.py:2085 msgid "_Unsubscribe" msgstr "_Anuluj aŭtaryzacyju" -#: ../src/features_window.py:46 +#: ../src/features_window.py:48 msgid "SSL certificat validation" msgstr "" -#: ../src/features_window.py:47 +#: ../src/features_window.py:49 msgid "" "A library used to validate server certificates to ensure a secure connection." msgstr "" -#: ../src/features_window.py:48 ../src/features_window.py:49 +#: ../src/features_window.py:50 ../src/features_window.py:51 msgid "Requires python-pyopenssl." msgstr "" -#: ../src/features_window.py:50 +#: ../src/features_window.py:52 msgid "Bonjour / Zeroconf" msgstr "" -#: ../src/features_window.py:51 +#: ../src/features_window.py:53 msgid "Serverless chatting with autodetected clients in a local network." msgstr "" -#: ../src/features_window.py:52 +#: ../src/features_window.py:54 msgid "Requires python-avahi." msgstr "" -#: ../src/features_window.py:53 +#: ../src/features_window.py:55 msgid "Requires pybonjour (http://o2s.csail.mit.edu/o2s-wiki/pybonjour)." msgstr "" -#: ../src/features_window.py:54 +#: ../src/features_window.py:56 #, fuzzy msgid "Command line" msgstr "Zahady: %s" -#: ../src/features_window.py:55 +#: ../src/features_window.py:57 msgid "A script to control Gajim via commandline." msgstr "" -#: ../src/features_window.py:56 +#: ../src/features_window.py:58 msgid "Requires python-dbus." msgstr "" -#: ../src/features_window.py:57 ../src/features_window.py:61 -#: ../src/features_window.py:65 ../src/features_window.py:69 -#: ../src/features_window.py:73 ../src/features_window.py:81 -#: ../src/features_window.py:85 +#: ../src/features_window.py:59 ../src/features_window.py:63 +#: ../src/features_window.py:67 ../src/features_window.py:71 +#: ../src/features_window.py:75 ../src/features_window.py:83 +#: ../src/features_window.py:87 ../src/features_window.py:111 msgid "Feature not available under Windows." msgstr "" -#: ../src/features_window.py:58 +#: ../src/features_window.py:60 #, fuzzy msgid "OpenGPG message encryption" msgstr "Šyfravańnie OpenPGP" -#: ../src/features_window.py:59 +#: ../src/features_window.py:61 #, fuzzy msgid "Encrypting chat messages with gpg keys." msgstr "_Uvachodnaje paviedamleńnie:" -#: ../src/features_window.py:60 +#: ../src/features_window.py:62 msgid "Requires gpg and python-GnuPGInterface." msgstr "" -#: ../src/features_window.py:62 +#: ../src/features_window.py:64 #, fuzzy msgid "Network-manager" msgstr "Kiraŭnik žurnałaŭ" -#: ../src/features_window.py:63 +#: ../src/features_window.py:65 msgid "Autodetection of network status." msgstr "" -#: ../src/features_window.py:64 +#: ../src/features_window.py:66 msgid "Requires gnome-network-manager and python-dbus." msgstr "" -#: ../src/features_window.py:66 +#: ../src/features_window.py:68 #, fuzzy msgid "Session Management" msgstr "Paviedamleńnie dasłanaje" -#: ../src/features_window.py:67 +#: ../src/features_window.py:69 msgid "Gajim session is stored on logout and restored on login." msgstr "" -#: ../src/features_window.py:68 +#: ../src/features_window.py:70 msgid "Requires python-gnome2." msgstr "" -#: ../src/features_window.py:70 +#: ../src/features_window.py:72 #, fuzzy msgid "Password encryption" msgstr "Paroli roźniacca" -#: ../src/features_window.py:71 +#: ../src/features_window.py:73 msgid "Passwords can be stored securely and not just in plaintext." msgstr "" -#: ../src/features_window.py:72 +#: ../src/features_window.py:74 msgid "Requires gnome-keyring and python-gnome2-desktop, or kwalletcli." msgstr "" -#: ../src/features_window.py:74 +#: ../src/features_window.py:76 msgid "SRV" msgstr "" -#: ../src/features_window.py:75 +#: ../src/features_window.py:77 msgid "Ability to connect to servers which are using SRV records." msgstr "" -#: ../src/features_window.py:76 +#: ../src/features_window.py:78 msgid "Requires dnsutils." msgstr "" -#: ../src/features_window.py:77 +#: ../src/features_window.py:79 msgid "Requires nslookup to use SRV records." msgstr "" -#: ../src/features_window.py:78 +#: ../src/features_window.py:80 msgid "Spell Checker" msgstr "" -#: ../src/features_window.py:79 +#: ../src/features_window.py:81 msgid "Spellchecking of composed messages." msgstr "" -#: ../src/features_window.py:80 +#: ../src/features_window.py:82 msgid "Requires libgtkspell." msgstr "" -#: ../src/features_window.py:82 +#: ../src/features_window.py:84 #, fuzzy msgid "Notification" msgstr "Madyfikacyja kontu" -#: ../src/features_window.py:83 +#: ../src/features_window.py:85 msgid "Passive popups notifying for new events." msgstr "" -#: ../src/features_window.py:84 +#: ../src/features_window.py:86 msgid "" "Requires python-notify or instead python-dbus in conjunction with " "notification-daemon." msgstr "" -#: ../src/features_window.py:86 -msgid "Trayicon" -msgstr "" - -#: ../src/features_window.py:87 -msgid "A icon in systemtray reflecting the current presence." -msgstr "" - #: ../src/features_window.py:88 -msgid "" -"Requires python-gnome2-extras or compiled trayicon module from Gajim sources." -msgstr "" - -#: ../src/features_window.py:89 -msgid "Requires PyGTK >= 2.10." -msgstr "" - -#: ../src/features_window.py:90 #, fuzzy msgid "Automatic status" msgstr "_Dastasuj da statusu" -#: ../src/features_window.py:91 +#: ../src/features_window.py:89 msgid "Ability to measure idle time, in order to set auto status." msgstr "" -#: ../src/features_window.py:92 +#: ../src/features_window.py:90 msgid "Requires libxss library." msgstr "" -#: ../src/features_window.py:93 +#: ../src/features_window.py:91 msgid "Requires python2.5." msgstr "" -#: ../src/features_window.py:94 +#: ../src/features_window.py:92 msgid "LaTeX" msgstr "" -#: ../src/features_window.py:95 +#: ../src/features_window.py:93 msgid "Transform LaTeX expressions between $$ $$." msgstr "" -#: ../src/features_window.py:96 +#: ../src/features_window.py:94 msgid "" "Requires texlive-latex-base and dvipng. You have to set 'use_latex' to True " "in the Advanced Configuration Editor." msgstr "" -#: ../src/features_window.py:97 +#: ../src/features_window.py:95 msgid "" "Requires texlive-latex-base and dvipng (All is in MikTeX). You have to set " "'use_latex' to True in the Advanced Configuration Editor." msgstr "" -#: ../src/features_window.py:98 +#: ../src/features_window.py:96 #, fuzzy msgid "End to End message encryption" msgstr "Šyfravańnie OpenPGP" -#: ../src/features_window.py:99 +#: ../src/features_window.py:97 #, fuzzy msgid "Encrypting chat messages." msgstr "_Uvachodnaje paviedamleńnie:" -#: ../src/features_window.py:100 ../src/features_window.py:101 +#: ../src/features_window.py:98 ../src/features_window.py:99 msgid "Requires python-crypto." msgstr "" -#: ../src/features_window.py:102 +#: ../src/features_window.py:100 #, fuzzy msgid "RST Generator" msgstr "Ahulnaja" -#: ../src/features_window.py:103 +#: ../src/features_window.py:101 msgid "" "Generate XHTML output from RST code (see http://docutils.sourceforge.net/" "docs/ref/rst/restructuredtext.html)." msgstr "" -#: ../src/features_window.py:104 ../src/features_window.py:105 +#: ../src/features_window.py:102 ../src/features_window.py:103 msgid "Requires python-docutils." msgstr "" -#: ../src/features_window.py:106 +#: ../src/features_window.py:104 msgid "Banners and clickable links" msgstr "" -#: ../src/features_window.py:107 +#: ../src/features_window.py:105 msgid "Ability to have clickable URLs in chat and groupchat window banners." msgstr "" -#: ../src/features_window.py:108 ../src/features_window.py:109 +#: ../src/features_window.py:106 ../src/features_window.py:107 msgid "Requires python-sexy." msgstr "" -#: ../src/features_window.py:123 +#: ../src/features_window.py:108 +msgid "Audio / Video" +msgstr "" + +#: ../src/features_window.py:109 +msgid "Ability to start audio and video chat." +msgstr "" + +#: ../src/features_window.py:110 +msgid "Requires python-farsight." +msgstr "" + +#: ../src/features_window.py:125 #, fuzzy msgid "Feature" msgstr "Zdolnaści serveraŭ" @@ -7747,108 +7782,108 @@ msgstr "Čas" msgid "Progress" msgstr "Prahres" -#: ../src/filetransfers_window.py:173 ../src/filetransfers_window.py:227 +#: ../src/filetransfers_window.py:177 ../src/filetransfers_window.py:233 #, python-format msgid "Filename: %s" msgstr "Nazva fajłu: %s" -#: ../src/filetransfers_window.py:174 ../src/filetransfers_window.py:313 +#: ../src/filetransfers_window.py:178 ../src/filetransfers_window.py:323 #, python-format msgid "Size: %s" msgstr "Pamier: %s" #. You is a reply of who sent a file #. You is a reply of who received a file -#: ../src/filetransfers_window.py:183 ../src/filetransfers_window.py:193 -#: ../src/history_manager.py:520 +#: ../src/filetransfers_window.py:187 ../src/filetransfers_window.py:197 +#: ../src/history_manager.py:529 msgid "You" msgstr "Ty" -#: ../src/filetransfers_window.py:184 +#: ../src/filetransfers_window.py:188 #, python-format msgid "Sender: %s" msgstr "Dasłaŭ: %s" -#: ../src/filetransfers_window.py:185 ../src/filetransfers_window.py:596 -#: ../src/tooltips.py:670 +#: ../src/filetransfers_window.py:189 ../src/filetransfers_window.py:617 +#: ../src/tooltips.py:651 msgid "Recipient: " msgstr "Atrymaŭ: " -#: ../src/filetransfers_window.py:196 +#: ../src/filetransfers_window.py:200 #, python-format msgid "Saved in: %s" msgstr "Zapisany ŭ: %s" -#: ../src/filetransfers_window.py:198 +#: ../src/filetransfers_window.py:202 msgid "File transfer completed" msgstr "Pieradača fajłu skončana" -#: ../src/filetransfers_window.py:212 ../src/filetransfers_window.py:218 +#: ../src/filetransfers_window.py:217 ../src/filetransfers_window.py:224 msgid "File transfer cancelled" msgstr "Pieradača fajłu anulavana" -#: ../src/filetransfers_window.py:212 ../src/filetransfers_window.py:219 +#: ../src/filetransfers_window.py:217 ../src/filetransfers_window.py:225 msgid "Connection with peer cannot be established." msgstr "NIemahčyma złučycca ź inšym bokam." -#: ../src/filetransfers_window.py:228 +#: ../src/filetransfers_window.py:234 #, python-format msgid "Recipient: %s" msgstr "Atrymoŭca: %s" -#: ../src/filetransfers_window.py:230 +#: ../src/filetransfers_window.py:236 #, python-format msgid "Error message: %s" msgstr "Tekst pamyłki: %s" -#: ../src/filetransfers_window.py:231 +#: ../src/filetransfers_window.py:237 #, fuzzy msgid "File transfer stopped" msgstr "Pieradača fajłu spyniena" -#: ../src/filetransfers_window.py:251 +#: ../src/filetransfers_window.py:257 msgid "Choose File to Send..." msgstr "Abiary fajł dla adsyłańnia..." -#: ../src/filetransfers_window.py:267 ../src/tooltips.py:708 +#: ../src/filetransfers_window.py:273 ../src/tooltips.py:689 #, fuzzy msgid "Description: " msgstr "Apisańnie: %s" -#: ../src/filetransfers_window.py:278 +#: ../src/filetransfers_window.py:286 msgid "Gajim cannot access this file" msgstr "Gajim nia moža dastupicca da hetaha fajłu" -#: ../src/filetransfers_window.py:279 +#: ../src/filetransfers_window.py:287 msgid "This file is being used by another process." msgstr "Hety fajł vykarystoŭvajecca inšym pracesam." -#: ../src/filetransfers_window.py:310 +#: ../src/filetransfers_window.py:320 #, python-format msgid "File: %s" msgstr "Fajł: %s" -#: ../src/filetransfers_window.py:316 +#: ../src/filetransfers_window.py:326 #, python-format msgid "Type: %s" msgstr "Typ: %s" -#: ../src/filetransfers_window.py:318 +#: ../src/filetransfers_window.py:328 #, python-format msgid "Description: %s" msgstr "Apisańnie: %s" -#: ../src/filetransfers_window.py:319 +#: ../src/filetransfers_window.py:329 #, python-format msgid "%s wants to send you a file:" msgstr "%s choča dasłać tabie fajł:" -#: ../src/filetransfers_window.py:332 ../src/gtkgui_helpers.py:812 +#: ../src/filetransfers_window.py:342 ../src/gtkgui_helpers.py:858 #, python-format msgid "Cannot overwrite existing file \"%s\"" msgstr "Niemahčyma nadpisać fajł \"%s\"" -#: ../src/filetransfers_window.py:333 ../src/gtkgui_helpers.py:814 +#: ../src/filetransfers_window.py:343 ../src/gtkgui_helpers.py:860 msgid "" "A file with this name already exists and you do not have permission to " "overwrite it." @@ -7856,33 +7891,33 @@ msgstr "" "Fajł z takoj nazvaj užo isnuje, i nie staje pravoŭ dla nadpisańnia hetaha " "fajłu." -#: ../src/filetransfers_window.py:349 ../src/gtkgui_helpers.py:818 +#: ../src/filetransfers_window.py:359 ../src/gtkgui_helpers.py:864 msgid "This file already exists" msgstr "Hety fajł užo isnuje" -#: ../src/filetransfers_window.py:349 ../src/gtkgui_helpers.py:818 +#: ../src/filetransfers_window.py:359 ../src/gtkgui_helpers.py:864 msgid "What do you want to do?" msgstr "Što chočaš zrabić?" #. read-only bit is used to mark special folder under windows, #. not to mark that a folder is read-only. See ticket #3587 -#: ../src/filetransfers_window.py:359 ../src/gtkgui_helpers.py:825 +#: ../src/filetransfers_window.py:369 ../src/gtkgui_helpers.py:871 #, python-format msgid "Directory \"%s\" is not writable" msgstr "Niemahčyma zapisać u kataloh \"%s\"" -#: ../src/filetransfers_window.py:359 ../src/gtkgui_helpers.py:826 +#: ../src/filetransfers_window.py:369 ../src/gtkgui_helpers.py:872 msgid "You do not have permission to create files in this directory." msgstr "Nie staje pravoŭ dla stvareńnia fajłaŭ u hetym katalohu." -#: ../src/filetransfers_window.py:369 +#: ../src/filetransfers_window.py:379 msgid "Save File as..." msgstr "Zapišy fajł jak..." #. Print remaining time in format 00:00:00 #. You can change the places of (hours), (minutes), (seconds) - #. they are not translatable. -#: ../src/filetransfers_window.py:435 +#: ../src/filetransfers_window.py:449 #, python-format msgid "%(hours)02.d:%(minutes)02.d:%(seconds)02.d" msgstr "%(hours)02.d:%(minutes)02.d:%(seconds)02.d" @@ -7890,32 +7925,32 @@ msgstr "%(hours)02.d:%(minutes)02.d:%(seconds)02.d" #. This should make the string Kb/s, #. where 'Kb' part is taken from %s. #. Only the 's' after / (which means second) should be translated. -#: ../src/filetransfers_window.py:526 +#: ../src/filetransfers_window.py:542 #, python-format msgid "(%(filesize_unit)s/s)" msgstr "(%(filesize_unit)s/s)" -#: ../src/filetransfers_window.py:566 ../src/filetransfers_window.py:569 +#: ../src/filetransfers_window.py:585 ../src/filetransfers_window.py:588 msgid "Invalid File" msgstr "Niapravilny fajł" -#: ../src/filetransfers_window.py:566 +#: ../src/filetransfers_window.py:585 msgid "File: " msgstr "Fajł: " -#: ../src/filetransfers_window.py:570 +#: ../src/filetransfers_window.py:589 msgid "It is not possible to send empty files" msgstr "Niemahčyma dasyłać pustyja fajły" -#: ../src/filetransfers_window.py:592 ../src/tooltips.py:660 +#: ../src/filetransfers_window.py:613 ../src/tooltips.py:641 msgid "Name: " msgstr "Nazva:" -#: ../src/filetransfers_window.py:594 ../src/tooltips.py:664 +#: ../src/filetransfers_window.py:615 ../src/tooltips.py:645 msgid "Sender: " msgstr "Adpraŭnik:" -#: ../src/filetransfers_window.py:781 +#: ../src/filetransfers_window.py:809 msgid "Pause" msgstr "Prypyni" @@ -7986,11 +8021,11 @@ msgstr "" "ściahnuć z %s" #. set the icon to all newly opened wind -#: ../src/gajim.py:354 +#: ../src/gajim.py:328 msgid "Gajim is already running" msgstr "Gajim užo vykonvajecca" -#: ../src/gajim.py:355 +#: ../src/gajim.py:329 msgid "" "Another instance of Gajim seems to be running\n" "Run anyway?" @@ -7998,434 +8033,28 @@ msgstr "" "Gajim užo vykonvajecca\n" "Usio adno ŭruchomić?" -#: ../src/gajim.py:440 -msgid "Passphrase Required" -msgstr "Musiš vyznačyć parol" - -#: ../src/gajim.py:441 -#, fuzzy, python-format -msgid "Enter GPG key passphrase for key %(keyid)s (account %(account)s)." -msgstr "Vyznač parol GPG dla kontu %s." - -#: ../src/gajim.py:455 -msgid "GPG key expired" -msgstr "" - -#: ../src/gajim.py:456 -#, fuzzy, python-format -msgid "Your GPG key has expied, you will be connected to %s without OpenPGP." -msgstr "Ty dałučyśsia da %s biaz OpenPGP." - -#. ask again -#: ../src/gajim.py:465 -msgid "Wrong Passphrase" -msgstr "Niapravilny parol" - -#: ../src/gajim.py:466 -msgid "Please retype your GPG passphrase or press Cancel." -msgstr "Kali łaska, vyznač parol GPG znoŭ albo naciśni knopku \"Anuluj\"." - -#: ../src/gajim.py:524 -#, fuzzy, python-format -msgid "" -"Your desired nickname in group chat %s is in use or registered by another " -"occupant.\n" -"Please specify another nickname below:" -msgstr "" -"Hetaja mianuška vykarystoŭvajecca ci zarehistravanaja na inšuju asobu.\n" -"Kali łaska, vyznač inšuju mianušku nižej:" - -#: ../src/gajim.py:527 -msgid "Always use this nickname when there is a conflict" -msgstr "" - -#: ../src/gajim.py:544 -msgid "Do you accept this request?" -msgstr "Prymaješ hety zapyt?" - -#: ../src/gajim.py:546 -#, fuzzy, python-format -msgid "Do you accept this request on account %s?" -msgstr "Prymaješ hety zapyt?" - -#: ../src/gajim.py:549 -#, fuzzy, python-format -msgid "HTTP (%(method)s) Authorization for %(url)s (id: %(id)s)" -msgstr "Aŭtaryzacyja HTTP (%s) dla %s (id: %s)" - -#: ../src/gajim.py:600 ../src/notify.py:511 -msgid "Connection Failed" -msgstr "Niemahvyma dałučycca" - -#: ../src/gajim.py:933 ../src/gajim.py:937 -#, fuzzy, python-format -msgid "Error %(code)s: %(msg)s" -msgstr "%(nickname)s: %(message)s" - -#. ('MSGNOTSENT', account, (jid, ierror_msg, msg, time, session)) -#: ../src/gajim.py:947 ../src/gajim.py:961 -#, fuzzy, python-format -msgid "error while sending %(message)s ( %(error)s )" -msgstr "pamyłka dasyłańnia %s ( %s )" - -#: ../src/gajim.py:988 ../src/notify.py:513 -#, fuzzy -msgid "Subscription request" -msgstr "Zapyt aŭtaryzacyi" - -#: ../src/gajim.py:1013 -msgid "Authorization accepted" -msgstr "Aŭtaryzacyja pryniataja" - -#: ../src/gajim.py:1014 -#, python-format -msgid "The contact \"%s\" has authorized you to see his or her status." -msgstr "" -"Kantakt \"%s\" aŭtaryzavaŭ ciabie, i ciapier ty možaš bačyć jaho status." - -#: ../src/gajim.py:1026 -#, python-format -msgid "Contact \"%s\" removed subscription from you" -msgstr "Kantakt \"%s\" anulavaŭ tvaju aŭtaryzacyju" - -#: ../src/gajim.py:1027 -msgid "" -"You will always see him or her as offline.\n" -"Do you want to remove him or her from your contact list?" -msgstr "" - -#: ../src/gajim.py:1052 ../src/notify.py:515 -#, fuzzy -msgid "Unsubscribed" -msgstr "_Anuluj aŭtaryzacyju" - -#: ../src/gajim.py:1093 -#, python-format -msgid "Contact with \"%s\" cannot be established" -msgstr "Niemahčyma złučycca z \"%s\"" - -#: ../src/gajim.py:1283 ../src/groupchat_control.py:1251 -#, fuzzy, python-format -msgid "%(nick)s is now known as %(new_nick)s" -msgstr "%s ciapier viadomy jak %s" - -#: ../src/gajim.py:1308 ../src/groupchat_control.py:1436 -#: ../src/history_window.py:431 ../src/notify.py:244 -#, python-format -msgid "%(nick)s is now %(status)s" -msgstr "%(nick)s maje ciapier status %(status)s" - -#: ../src/gajim.py:1375 -#, python-format -msgid "%(jid)s has set the subject to %(subject)s" -msgstr "" - -#. Can be a presence (see chg_contact_status in groupchat_control.py) -#. Can be a message (see handle_event_gc_config_change in gajim.py) -#: ../src/gajim.py:1439 ../src/groupchat_control.py:1191 -msgid "Any occupant is allowed to see your full JID" -msgstr "" - -#: ../src/gajim.py:1442 -msgid "Room now shows unavailable member" -msgstr "" - -#: ../src/gajim.py:1444 -msgid "room now does not show unavailable members" -msgstr "" - -#: ../src/gajim.py:1447 -msgid "A non-privacy-related room configuration change has occurred" -msgstr "" - -#. Can be a presence (see chg_contact_status in groupchat_control.py) -#: ../src/gajim.py:1450 -msgid "Room logging is now enabled" -msgstr "" - -#: ../src/gajim.py:1452 -msgid "Room logging is now disabled" -msgstr "" - -#: ../src/gajim.py:1454 -msgid "Room is now non-anonymous" -msgstr "" - -#: ../src/gajim.py:1457 -msgid "Room is now semi-anonymous" -msgstr "" - -#: ../src/gajim.py:1460 -msgid "Room is now fully-anonymous" -msgstr "" - -#: ../src/gajim.py:1492 -#, fuzzy, python-format -msgid "A Password is required to join the room %s. Please type it." -msgstr "Treba ŭvieści parol, kab dałučycca da pakoju." - -#: ../src/gajim.py:1526 -msgid "" -"You configured Gajim to use GPG agent, but there is no GPG agent running or " -"it returned a wrong passphrase.\n" -msgstr "" - -#: ../src/gajim.py:1528 ../src/gajim.py:1534 -msgid "You are currently connected without your OpenPGP key." -msgstr "Dałučany biez kluča OpenPGP." - -#: ../src/gajim.py:1529 -msgid "Your passphrase is incorrect" -msgstr "Parol niapravilny" - -#: ../src/gajim.py:1533 -#, fuzzy -msgid "OpenGPG Passphrase Incorrect" -msgstr "Parol niapravilny" - -#: ../src/gajim.py:1559 -msgid "GPG key not trusted" -msgstr "" - -#: ../src/gajim.py:1559 -msgid "" -"The GPG key used to encrypt this chat is not trusted. Do you really want to " -"encrypt this message?" -msgstr "" - -#: ../src/gajim.py:1561 ../src/gajim.py:2227 ../src/gajim.py:2262 -#: ../src/groupchat_control.py:1674 ../src/message_window.py:222 -#: ../src/roster_window.py:2667 ../src/roster_window.py:3292 -#: ../src/roster_window.py:3970 -msgid "Do _not ask me again" -msgstr "_Bolš nie pytajsia" - -#: ../src/gajim.py:1571 -#, fuzzy -msgid "" -"Gnome Keyring is installed but not \t\t\t\tcorrectly started (environment " -"variable probably not \t\t\t\tcorrectly set)" -msgstr "" -"Kiraŭnik parolaŭ GNOME instalavany, ale niapravilna vykonvajecca (mahčyma, " -"źmiennaja asiarodździa niapravilna akreślenaja)" - -#: ../src/gajim.py:1681 -#, python-format -msgid "New mail on %(gmail_mail_address)s" -msgstr "Novaja pošta ŭ skryncy %(gmail_mail_address)s" - -#: ../src/gajim.py:1683 -#, python-format -msgid "You have %d new mail conversation" -msgid_plural "You have %d new mail conversations" -msgstr[0] "%d novy list" -msgstr[1] "%d novyja listy" -msgstr[2] "%d novych listoŭ" - -#: ../src/gajim.py:1696 -#, python-format -msgid "" -"\n" -"\n" -"From: %(from_address)s\n" -"Subject: %(subject)s\n" -"%(snippet)s" -msgstr "" - -#: ../src/gajim.py:1767 -#, python-format -msgid "%s wants to send you a file." -msgstr "%s choča dasłać tabie fajł." - -#: ../src/gajim.py:1805 ../src/roster_window.py:1851 -#, fuzzy -msgid "Remote contact stopped transfer" -msgstr "Vydalaje kantakt sa śpisu" - -#: ../src/gajim.py:1807 ../src/roster_window.py:1853 -#, fuzzy -msgid "Error opening file" -msgstr "Pamyłka adčytańnia fajłu:" - -#: ../src/gajim.py:1838 -#, python-format -msgid "You successfully received %(filename)s from %(name)s." -msgstr "Atrymany fajł %(filename)s ad %(name)s." - -#. ft stopped -#: ../src/gajim.py:1842 -#, python-format -msgid "File transfer of %(filename)s from %(name)s stopped." -msgstr "Pieradača fajłu %(filename)s ad %(name)s spyniena." - -#: ../src/gajim.py:1855 -#, python-format -msgid "You successfully sent %(filename)s to %(name)s." -msgstr "Fajł %(filename)s paśpiachova dasłany da %(name)s." - -#. ft stopped -#: ../src/gajim.py:1859 -#, python-format -msgid "File transfer of %(filename)s to %(name)s stopped." -msgstr "Pieradača fajłu %(filename)s da %(name)s spynienaja." - -#: ../src/gajim.py:1961 -#, python-format -msgid "" -"Unable to decrypt message from %s\n" -"It may have been tampered with." -msgstr "" - -#: ../src/gajim.py:1968 -#, fuzzy -msgid "Unable to decrypt message" -msgstr "Dla kožnaha _paviedamleńnia" - -#: ../src/gajim.py:2042 -msgid "Username Conflict" -msgstr "Kanflikt imionaŭ karystalnikaŭ" - -#: ../src/gajim.py:2043 -msgid "Please type a new username for your local account" -msgstr "Kali łaska, akreśli novaje imia karystalnika dla lakalnaha kontu" - -#: ../src/gajim.py:2055 -msgid "Ping?" -msgstr "" - -#: ../src/gajim.py:2068 -#, python-format -msgid "Pong! (%s s.)" -msgstr "" - -#: ../src/gajim.py:2079 -msgid "Error." -msgstr "" - -#: ../src/gajim.py:2106 -#, fuzzy -msgid "Resource Conflict" -msgstr "Kanflikt imionaŭ karystalnikaŭ" - -#: ../src/gajim.py:2107 -msgid "" -"You are already connected to this account with the same resource. Please " -"type a new one" -msgstr "" - -#: ../src/gajim.py:2166 -msgid "Error verifying SSL certificate" -msgstr "" - -#: ../src/gajim.py:2167 -#, python-format -msgid "" -"There was an error verifying the SSL certificate of your jabber server: %" -"(error)s\n" -"Do you still want to connect to this server?" -msgstr "" - -#: ../src/gajim.py:2172 -msgid "Ignore this error for this certificate." -msgstr "" - -#: ../src/gajim.py:2192 -msgid "SSL certificate error" -msgstr "" - -#: ../src/gajim.py:2193 -#, python-format -msgid "" -"It seems the SSL certificate of account %(account)s has changed or your " -"connection is being hacked.\n" -"Old fingerprint: %(old)s\n" -"New fingerprint: %(new)s\n" -"\n" -"Do you still want to connect and update the fingerprint of the certificate?" -msgstr "" - -#: ../src/gajim.py:2223 ../src/gajim.py:2258 -#, fuzzy -msgid "Insecure connection" -msgstr "Złučeńnie" - -#: ../src/gajim.py:2224 -#, fuzzy -msgid "" -"You are about to send your password on an unencrypted connection. Are you " -"sure you want to do that?" -msgstr "Stvarajecca metakantakt. Ty sapraŭdy chočaš praciahnuć?" - -#: ../src/gajim.py:2226 ../src/gajim.py:2261 -msgid "Yes, I really want to connect insecurely" -msgstr "" - -#: ../src/gajim.py:2259 -msgid "" -"You are about to send your password on an insecure connection. You should " -"install PyOpenSSL to prevent that. Are you sure you want to do that?" -msgstr "" - -#: ../src/gajim.py:2279 -msgid "PEP node was not removed" -msgstr "" - -#: ../src/gajim.py:2280 -#, python-format -msgid "PEP node %(node)s was not removed: %(message)s" -msgstr "" - -#. theme doesn't exist, disable emoticons -#: ../src/gajim.py:2784 ../src/gajim.py:2806 -#, fuzzy -msgid "Emoticons disabled" -msgstr "Šyfravańnie adklučanaje" - -#: ../src/gajim.py:2785 -msgid "" -"Your configured emoticons theme has not been found, so emoticons have been " -"disabled." -msgstr "" - -#: ../src/gajim.py:2807 -msgid "" -"Your configured emoticons theme cannot been loaded. You maybe need to update " -"the format of emoticons.py file. See http://trac.gajim.org/wiki/Emoticons " -"for more details." -msgstr "" - -#: ../src/gajim.py:2833 ../src/roster_window.py:3432 -msgid "You cannot join a group chat while you are invisible" -msgstr "Niemahčyma dałučycca da pakoju, kali ty niabačny" - -#. it is good to notify the user -#. in case he or she cannot see the output of the console -#: ../src/gajim.py:3202 -msgid "Could not save your settings and preferences" -msgstr "Niemahčyma zapisać tvaje nałady i opcyi" - -#: ../src/gajim-remote.py:78 +#: ../src/gajim-remote.py:77 msgid "Shows a help on specific command" msgstr "Pakazvaje daviedku pa akreślenym zahadzie" #. User gets help for the command, specified by this parameter -#: ../src/gajim-remote.py:81 +#: ../src/gajim-remote.py:80 msgid "command" msgstr "zahad" -#: ../src/gajim-remote.py:82 +#: ../src/gajim-remote.py:81 msgid "show help on command" msgstr "pakažy daviedku pa zahadzie" -#: ../src/gajim-remote.py:86 +#: ../src/gajim-remote.py:85 msgid "Shows or hides the roster window" msgstr "Pakazvaje / chavaje śpis kantaktaŭ" -#: ../src/gajim-remote.py:90 +#: ../src/gajim-remote.py:89 msgid "Pops up a window with the next pending event" msgstr "Adčyniaje akno z nastupnym niečytanym paviedamleńniem" -#: ../src/gajim-remote.py:94 +#: ../src/gajim-remote.py:93 msgid "" "Prints a list of all contacts in the roster. Each contact appears on a " "separate line" @@ -8433,49 +8062,49 @@ msgstr "" "Pakazvaje śpis usich kantaktaŭ sa śpisu kantaktaŭ. Źviestki ab kožnym " "kantakcie źjaŭlajucca na novym radku" -#: ../src/gajim-remote.py:97 ../src/gajim-remote.py:112 -#: ../src/gajim-remote.py:122 ../src/gajim-remote.py:132 -#: ../src/gajim-remote.py:148 ../src/gajim-remote.py:162 -#: ../src/gajim-remote.py:171 ../src/gajim-remote.py:192 -#: ../src/gajim-remote.py:222 ../src/gajim-remote.py:231 -#: ../src/gajim-remote.py:238 ../src/gajim-remote.py:245 -#: ../src/gajim-remote.py:256 ../src/gajim-remote.py:272 -#: ../src/gajim-remote.py:283 +#: ../src/gajim-remote.py:96 ../src/gajim-remote.py:111 +#: ../src/gajim-remote.py:121 ../src/gajim-remote.py:131 +#: ../src/gajim-remote.py:147 ../src/gajim-remote.py:161 +#: ../src/gajim-remote.py:170 ../src/gajim-remote.py:191 +#: ../src/gajim-remote.py:221 ../src/gajim-remote.py:230 +#: ../src/gajim-remote.py:237 ../src/gajim-remote.py:244 +#: ../src/gajim-remote.py:255 ../src/gajim-remote.py:271 +#: ../src/gajim-remote.py:282 msgid "account" msgstr "kont" -#: ../src/gajim-remote.py:97 +#: ../src/gajim-remote.py:96 msgid "show only contacts of the given account" msgstr "pakažy kantakty akreślenaha kontu" -#: ../src/gajim-remote.py:103 +#: ../src/gajim-remote.py:102 msgid "Prints a list of registered accounts" msgstr "Pakazvaje śpis zarehistravanych kontaŭ" -#: ../src/gajim-remote.py:107 +#: ../src/gajim-remote.py:106 msgid "Changes the status of account or accounts" msgstr "Źmianiaje status kontu albo kontaŭ" #. offline, online, chat, away, xa, dnd, invisible should not be translated -#: ../src/gajim-remote.py:110 +#: ../src/gajim-remote.py:109 msgid "status" msgstr "status" -#: ../src/gajim-remote.py:110 +#: ../src/gajim-remote.py:109 msgid "one of: offline, online, chat, away, xa, dnd, invisible " msgstr "adno z: offline, online, chat, away, xa, dnd, invisible " -#: ../src/gajim-remote.py:111 ../src/gajim-remote.py:134 -#: ../src/gajim-remote.py:145 ../src/gajim-remote.py:159 -#: ../src/gajim-remote.py:170 ../src/gajim-remote.py:274 +#: ../src/gajim-remote.py:110 ../src/gajim-remote.py:133 +#: ../src/gajim-remote.py:144 ../src/gajim-remote.py:158 +#: ../src/gajim-remote.py:169 ../src/gajim-remote.py:273 msgid "message" msgstr "paviedamleńnie" -#: ../src/gajim-remote.py:111 +#: ../src/gajim-remote.py:110 msgid "status message" msgstr "paviedamlennie statusu" -#: ../src/gajim-remote.py:112 +#: ../src/gajim-remote.py:111 msgid "" "change status of account \"account\". If not specified, try to change status " "of all accounts that have \"sync with global status\" option set" @@ -8484,22 +8113,22 @@ msgstr "" "dla ŭsich kontaŭ, dla jakich vystaŭlenaja opcyja \"Synchranizuj z hlabalnym " "statusam\"" -#: ../src/gajim-remote.py:118 +#: ../src/gajim-remote.py:117 #, fuzzy msgid "Changes the priority of account or accounts" msgstr "Źmianiaje status kontu albo kontaŭ" -#: ../src/gajim-remote.py:120 +#: ../src/gajim-remote.py:119 #, fuzzy msgid "priority" msgstr "Pryjary_tet:" -#: ../src/gajim-remote.py:120 +#: ../src/gajim-remote.py:119 #, fuzzy msgid "priority you want to give to the account" msgstr "Ja chaču za_rehistravać novy kont" -#: ../src/gajim-remote.py:122 +#: ../src/gajim-remote.py:121 #, fuzzy msgid "" "change the priority of the given account. If not specified, change status of " @@ -8509,23 +8138,23 @@ msgstr "" "dla ŭsich kontaŭ, dla jakich vystaŭlenaja opcyja \"Synchranizuj z hlabalnym " "statusam\"" -#: ../src/gajim-remote.py:128 +#: ../src/gajim-remote.py:127 msgid "Shows the chat dialog so that you can send messages to a contact" msgstr "Pakazvaje akno razmovy, kab dasyłać paviedamleńni kantaktu" -#: ../src/gajim-remote.py:130 +#: ../src/gajim-remote.py:129 msgid "JID of the contact that you want to chat with" msgstr "JID kantaktu, ź jakim chočaš parazmaŭlać" -#: ../src/gajim-remote.py:132 ../src/gajim-remote.py:222 +#: ../src/gajim-remote.py:131 ../src/gajim-remote.py:221 msgid "if specified, contact is taken from the contact list of this account" msgstr "Kali akreślena, kantakt biarecca sa śpisu kantaktaŭ hetaha kontu" -#: ../src/gajim-remote.py:135 +#: ../src/gajim-remote.py:134 msgid "message content. The account must be specified or \"\"" msgstr "" -#: ../src/gajim-remote.py:140 +#: ../src/gajim-remote.py:139 msgid "" "Sends new chat message to a contact in the roster. Both OpenPGP key and " "account are optional. If you want to set only 'account', without 'OpenPGP " @@ -8535,30 +8164,30 @@ msgstr "" "kont nie abaviazkovyja dla akreśleńnia. Kali chočaš akreślić tolki 'kont', " "biez 'kluča OpenPGP', tady prosta akreśli 'kluč OpenPGP' jak ''." -#: ../src/gajim-remote.py:144 ../src/gajim-remote.py:157 +#: ../src/gajim-remote.py:143 ../src/gajim-remote.py:156 msgid "JID of the contact that will receive the message" msgstr "JID kantaktu, jaki atrymaje paviedamleńnie" -#: ../src/gajim-remote.py:145 ../src/gajim-remote.py:159 -#: ../src/gajim-remote.py:170 +#: ../src/gajim-remote.py:144 ../src/gajim-remote.py:158 +#: ../src/gajim-remote.py:169 msgid "message contents" msgstr "źmiest paviedamleńnia" -#: ../src/gajim-remote.py:146 ../src/gajim-remote.py:160 +#: ../src/gajim-remote.py:145 ../src/gajim-remote.py:159 msgid "pgp key" msgstr "kluč pgp" -#: ../src/gajim-remote.py:146 ../src/gajim-remote.py:160 +#: ../src/gajim-remote.py:145 ../src/gajim-remote.py:159 msgid "if specified, the message will be encrypted using this public key" msgstr "" "Kali akreślena, paviedamleńnie budzie zašyfravana hetym publičnym klučom" -#: ../src/gajim-remote.py:148 ../src/gajim-remote.py:162 -#: ../src/gajim-remote.py:171 +#: ../src/gajim-remote.py:147 ../src/gajim-remote.py:161 +#: ../src/gajim-remote.py:170 msgid "if specified, the message will be sent using this account" msgstr "Kali akreślena, paviedamleńnie budzie dasłanaje z hetaha kontu" -#: ../src/gajim-remote.py:153 +#: ../src/gajim-remote.py:152 msgid "" "Sends new single message to a contact in the roster. Both OpenPGP key and " "account are optional. If you want to set only 'account', without 'OpenPGP " @@ -8568,136 +8197,136 @@ msgstr "" "OpenPGP i kont nie abaviazkovyja dla akreśleńnia. Kali chočaš akreślić tolki " "'kont', biez 'kluča OpenPGP', tady prosta akreśli 'kluč OpenPGP' jak ''." -#: ../src/gajim-remote.py:158 +#: ../src/gajim-remote.py:157 msgid "subject" msgstr "tema" -#: ../src/gajim-remote.py:158 +#: ../src/gajim-remote.py:157 msgid "message subject" msgstr "tema paviedamleńnia" -#: ../src/gajim-remote.py:167 +#: ../src/gajim-remote.py:166 msgid "Sends new message to a groupchat you've joined." msgstr "" -#: ../src/gajim-remote.py:169 +#: ../src/gajim-remote.py:168 #, fuzzy msgid "JID of the room that will receive the message" msgstr "JID kantaktu, jaki atrymaje paviedamleńnie" -#: ../src/gajim-remote.py:176 +#: ../src/gajim-remote.py:175 msgid "Gets detailed info on a contact" msgstr "Atrymvaje padrabiaznyja źviestki ab kantakcie" -#: ../src/gajim-remote.py:178 ../src/gajim-remote.py:191 -#: ../src/gajim-remote.py:221 ../src/gajim-remote.py:230 +#: ../src/gajim-remote.py:177 ../src/gajim-remote.py:190 +#: ../src/gajim-remote.py:220 ../src/gajim-remote.py:229 msgid "JID of the contact" msgstr "JID kantaktu" -#: ../src/gajim-remote.py:182 +#: ../src/gajim-remote.py:181 msgid "Gets detailed info on a account" msgstr "Atrymvaje padrabiaznyja źviestki ab kantakcie" -#: ../src/gajim-remote.py:184 +#: ../src/gajim-remote.py:183 msgid "Name of the account" msgstr "Nazva kontu" -#: ../src/gajim-remote.py:188 +#: ../src/gajim-remote.py:187 msgid "Sends file to a contact" msgstr "Dasyłaje kantaktu fajł" -#: ../src/gajim-remote.py:190 +#: ../src/gajim-remote.py:189 msgid "file" msgstr "fajł" -#: ../src/gajim-remote.py:190 +#: ../src/gajim-remote.py:189 msgid "File path" msgstr "Ściežka da fajłu" -#: ../src/gajim-remote.py:192 +#: ../src/gajim-remote.py:191 msgid "if specified, file will be sent using this account" msgstr "Kali akreślena, fajł budzie dasłany z hetaha kontu" -#: ../src/gajim-remote.py:197 +#: ../src/gajim-remote.py:196 msgid "Lists all preferences and their values" msgstr "Pakazvaje ŭsie nałady i ichnyja vartaści" -#: ../src/gajim-remote.py:201 +#: ../src/gajim-remote.py:200 msgid "Sets value of 'key' to 'value'." msgstr "Akreślivaje dla 'kluča' 'vartaść'" -#: ../src/gajim-remote.py:203 +#: ../src/gajim-remote.py:202 msgid "key=value" msgstr "kluč=vartaść" -#: ../src/gajim-remote.py:203 +#: ../src/gajim-remote.py:202 msgid "'key' is the name of the preference, 'value' is the value to set it to" msgstr "'kluč' jość nazvaj nałady, 'vartaść' jość vartaściu hetaj nałady" -#: ../src/gajim-remote.py:208 +#: ../src/gajim-remote.py:207 msgid "Deletes a preference item" msgstr "Vydalaje naładu" -#: ../src/gajim-remote.py:210 +#: ../src/gajim-remote.py:209 msgid "key" msgstr "kluč" -#: ../src/gajim-remote.py:210 +#: ../src/gajim-remote.py:209 msgid "name of the preference to be deleted" msgstr "nazva vydalenaj nałady" -#: ../src/gajim-remote.py:214 +#: ../src/gajim-remote.py:213 msgid "Writes the current state of Gajim preferences to the .config file" msgstr "Zapisvaje dziejnyja nałady Gajima ŭ fajł .config" -#: ../src/gajim-remote.py:219 +#: ../src/gajim-remote.py:218 msgid "Removes contact from roster" msgstr "Vydalaje kantakt sa śpisu" -#: ../src/gajim-remote.py:228 +#: ../src/gajim-remote.py:227 msgid "Adds contact to roster" msgstr "Dadaje kantakt u śpis kantaktaŭ" -#: ../src/gajim-remote.py:230 +#: ../src/gajim-remote.py:229 msgid "jid" msgstr "jid" -#: ../src/gajim-remote.py:231 +#: ../src/gajim-remote.py:230 msgid "Adds new contact to this account" msgstr "Dadaje novy kantakt dla hetaha kontu" -#: ../src/gajim-remote.py:236 +#: ../src/gajim-remote.py:235 msgid "Returns current status (the global one unless account is specified)" msgstr "Viartaje dziejny status (hlabalny, kali nie akreśleny kont)" -#: ../src/gajim-remote.py:243 +#: ../src/gajim-remote.py:242 msgid "" "Returns current status message (the global one unless account is specified)" msgstr "" "Viartaje dziejnaje paviedamleńnie statusu (hlabalnaha, kali nie akreśleny " "kont)" -#: ../src/gajim-remote.py:250 +#: ../src/gajim-remote.py:249 msgid "Returns number of unread messages" msgstr "Viartaje kolkaść niečytanych paviedamleńniaŭ" -#: ../src/gajim-remote.py:254 +#: ../src/gajim-remote.py:253 msgid "Opens 'Start Chat' dialog" msgstr "Adčyniaje akno 'Pačni razmovu'" -#: ../src/gajim-remote.py:256 +#: ../src/gajim-remote.py:255 msgid "Starts chat, using this account" msgstr "Pačynaje razmovu dla hetaha kontu" -#: ../src/gajim-remote.py:260 +#: ../src/gajim-remote.py:259 msgid "Sends custom XML" msgstr "Dasyłaje svoj XML" -#: ../src/gajim-remote.py:262 +#: ../src/gajim-remote.py:261 msgid "XML to send" msgstr "XML dla dasyłańnia" -#: ../src/gajim-remote.py:263 +#: ../src/gajim-remote.py:262 msgid "" "Account in which the xml will be sent; if not specified, xml will be sent to " "all accounts" @@ -8705,77 +8334,77 @@ msgstr "" "Kont, na jaki budzie dasłany XML; kali kont nie akreśleny, XML budzie " "dasłany na ŭsie konty" -#: ../src/gajim-remote.py:269 +#: ../src/gajim-remote.py:268 msgid "Handle a xmpp:/ uri" msgstr "Absłuhoŭvaj spasyłki xmpp:/" -#: ../src/gajim-remote.py:271 +#: ../src/gajim-remote.py:270 msgid "uri" msgstr "uri" -#: ../src/gajim-remote.py:271 +#: ../src/gajim-remote.py:270 msgid "URI to handle" msgstr "" -#: ../src/gajim-remote.py:272 +#: ../src/gajim-remote.py:271 msgid "Account in which you want to handle it" msgstr "" -#: ../src/gajim-remote.py:274 +#: ../src/gajim-remote.py:273 #, fuzzy msgid "Message content" msgstr "źmiest paviedamleńnia" -#: ../src/gajim-remote.py:278 +#: ../src/gajim-remote.py:277 msgid "Join a MUC room" msgstr "Dałučysia da pakoju" -#: ../src/gajim-remote.py:280 +#: ../src/gajim-remote.py:279 msgid "room" msgstr "pakoj" -#: ../src/gajim-remote.py:280 +#: ../src/gajim-remote.py:279 #, fuzzy msgid "Room JID" msgstr "Pakoj:" -#: ../src/gajim-remote.py:281 +#: ../src/gajim-remote.py:280 msgid "nick" msgstr "mianuška" -#: ../src/gajim-remote.py:281 +#: ../src/gajim-remote.py:280 #, fuzzy msgid "Nickname to use" msgstr "Mianuška nia znojdziena: %s" -#: ../src/gajim-remote.py:282 +#: ../src/gajim-remote.py:281 msgid "password" msgstr "parol" -#: ../src/gajim-remote.py:282 +#: ../src/gajim-remote.py:281 #, fuzzy msgid "Password to enter the room" msgstr "Paroli roźniacca" -#: ../src/gajim-remote.py:283 +#: ../src/gajim-remote.py:282 msgid "Account from which you want to enter the room" msgstr "" -#: ../src/gajim-remote.py:288 +#: ../src/gajim-remote.py:287 #, fuzzy msgid "Check if Gajim is running" msgstr "Kali łaska, pravier, ci pracuje avahi-daemon." -#: ../src/gajim-remote.py:292 +#: ../src/gajim-remote.py:291 #, fuzzy msgid "Shows or hides the ipython window" msgstr "Pakazvaje / chavaje śpis kantaktaŭ" -#: ../src/gajim-remote.py:319 +#: ../src/gajim-remote.py:318 msgid "Missing argument \"contact_jid\"" msgstr "Nie staje arhumenta \"contact_jid\"" -#: ../src/gajim-remote.py:338 +#: ../src/gajim-remote.py:339 #, python-format msgid "" "'%s' is not in your roster.\n" @@ -8784,31 +8413,31 @@ msgstr "" "'%s' niama ŭ tvajim śpisie kantaktaŭ.\n" "Kali łaska, akreśli kont dla dasyłańnia paviedamleńnia." -#: ../src/gajim-remote.py:341 +#: ../src/gajim-remote.py:342 msgid "You have no active account" msgstr "Nivodny kont nia dziejny" -#: ../src/gajim-remote.py:393 +#: ../src/gajim-remote.py:395 msgid "It seems Gajim is not running. So you can't use gajim-remote." msgstr "" -#: ../src/gajim-remote.py:416 +#: ../src/gajim-remote.py:422 #, python-format msgid "" "Usage: %(basename)s %(command)s %(arguments)s \n" "\t %(help)s" msgstr "" -#: ../src/gajim-remote.py:420 +#: ../src/gajim-remote.py:426 msgid "Arguments:" msgstr "Arhumenty:" -#: ../src/gajim-remote.py:424 +#: ../src/gajim-remote.py:430 #, python-format msgid "%s not found" msgstr "%s nia znojdzieny" -#: ../src/gajim-remote.py:428 +#: ../src/gajim-remote.py:436 #, python-format msgid "" "Usage: %s command [arguments]\n" @@ -8817,7 +8446,7 @@ msgstr "" "Užyvańnie: %s zahad [arhumenty]\n" "Zahadam moža być adzin z nastupnych vyrazaŭ:\n" -#: ../src/gajim-remote.py:493 +#: ../src/gajim-remote.py:505 #, fuzzy, python-format msgid "" "Too many arguments. \n" @@ -8826,7 +8455,7 @@ msgstr "" "Nadta šmat arhumentaŭ. \n" "Vykanaj \"%s help %s\" dla padrabiaźniejšych źviestak" -#: ../src/gajim-remote.py:498 +#: ../src/gajim-remote.py:510 #, fuzzy, python-format msgid "" "Argument \"%(arg)s\" is not specified. \n" @@ -8835,7 +8464,7 @@ msgstr "" "Arhument \"%s\" nie akreśleny. \n" "Vykanaj \"%s help %s\" dla padrabiaźniejšych źviestak" -#: ../src/gajim-remote.py:517 +#: ../src/gajim-remote.py:529 msgid "Wrong uri" msgstr "Niapravilnaja spasyłka" @@ -8865,174 +8494,198 @@ msgstr "Niemahčyma vydalić dziejnuju temu" msgid "Please first choose another for your current theme." msgstr "Kali łaska, zadziejničaj spačatku inšuju temu." -#: ../src/groupchat_control.py:162 +#: ../src/groupchat_control.py:167 msgid "Sending private message failed" msgstr "Pamyłka dasyłańnia pryvatnaha paviedamleńnia" #. in second %s code replaces with nickname -#: ../src/groupchat_control.py:164 +#: ../src/groupchat_control.py:169 #, fuzzy, python-format msgid "You are no longer in group chat \"%(room)s\" or \"%(nick)s\" has left." msgstr "Ciabie niama ŭ pakoji \"%s\", albo \"%s\" pakinuŭ jaho." -#: ../src/groupchat_control.py:436 +#: ../src/groupchat_control.py:439 msgid "Insert Nickname" msgstr "Ustaŭ mianušku" -#: ../src/groupchat_control.py:595 +#: ../src/groupchat_control.py:617 #, fuzzy msgid "Conversation with " msgstr "Žurnał razmoŭ" -#: ../src/groupchat_control.py:597 +#: ../src/groupchat_control.py:619 #, fuzzy msgid "Continued conversation" msgstr "Złučeńnie" #. Can be a message (see handle_event_gc_config_change in gajim.py) -#: ../src/groupchat_control.py:1194 +#. Can be a presence (see chg_contact_status in groupchat_control.py) +#: ../src/groupchat_control.py:1228 ../src/gui_interface.py:1050 +msgid "Any occupant is allowed to see your full JID" +msgstr "" + +#. Can be a message (see handle_event_gc_config_change in gajim.py) +#: ../src/groupchat_control.py:1231 msgid "Room logging is enabled" msgstr "" -#: ../src/groupchat_control.py:1196 +#: ../src/groupchat_control.py:1233 #, fuzzy msgid "A new room has been created" msgstr "Aŭtaryzacyja anulavanaja" -#: ../src/groupchat_control.py:1199 +#: ../src/groupchat_control.py:1236 msgid "The server has assigned or modified your roomnick" msgstr "" #. do not print 'kicked by None' -#: ../src/groupchat_control.py:1205 +#: ../src/groupchat_control.py:1242 #, python-format msgid "%(nick)s has been kicked: %(reason)s" msgstr "%(nick)s vypchnuty z pakoju: %(reason)s" -#: ../src/groupchat_control.py:1209 +#: ../src/groupchat_control.py:1246 #, python-format msgid "%(nick)s has been kicked by %(who)s: %(reason)s" msgstr "%(who)s vypchnuŭ %(nick)s: %(reason)s" #. do not print 'banned by None' -#: ../src/groupchat_control.py:1219 +#: ../src/groupchat_control.py:1256 #, python-format msgid "%(nick)s has been banned: %(reason)s" msgstr "%(nick)s zablakavany: %(reason)s" -#: ../src/groupchat_control.py:1223 +#: ../src/groupchat_control.py:1260 #, python-format msgid "%(nick)s has been banned by %(who)s: %(reason)s" msgstr "%(who)s zablakavaŭ %(nick)s: %(reason)s" -#: ../src/groupchat_control.py:1235 ../src/groupchat_control.py:1328 +#: ../src/groupchat_control.py:1272 ../src/groupchat_control.py:1365 #, python-format msgid "You are now known as %s" msgstr "Ciabie ciapier viedajuć jak %s" -#: ../src/groupchat_control.py:1289 ../src/groupchat_control.py:1293 -#: ../src/groupchat_control.py:1298 +#: ../src/groupchat_control.py:1288 ../src/gui_interface.py:894 +#, fuzzy, python-format +msgid "%(nick)s is now known as %(new_nick)s" +msgstr "%s ciapier viadomy jak %s" + +#: ../src/groupchat_control.py:1326 ../src/groupchat_control.py:1330 +#: ../src/groupchat_control.py:1335 #, fuzzy, python-format msgid "%(nick)s has been removed from the room (%(reason)s)" msgstr "%(who)s vypchnuŭ %(nick)s: %(reason)s" -#: ../src/groupchat_control.py:1290 +#: ../src/groupchat_control.py:1327 #, fuzzy msgid "affiliation changed" msgstr "Suviaź: " -#: ../src/groupchat_control.py:1295 +#: ../src/groupchat_control.py:1332 msgid "room configuration changed to members-only" msgstr "" -#: ../src/groupchat_control.py:1300 +#: ../src/groupchat_control.py:1337 msgid "system shutdown" msgstr "" -#: ../src/groupchat_control.py:1377 +#: ../src/groupchat_control.py:1414 #, python-format msgid "** Affiliation of %(nick)s has been set to %(affiliation)s by %(actor)s" msgstr "" -#: ../src/groupchat_control.py:1381 +#: ../src/groupchat_control.py:1418 #, python-format msgid "** Affiliation of %(nick)s has been set to %(affiliation)s" msgstr "" -#: ../src/groupchat_control.py:1396 +#: ../src/groupchat_control.py:1433 #, fuzzy, python-format msgid "** Role of %(nick)s has been set to %(role)s by %(actor)s" msgstr "%(who)s vypchnuŭ %(nick)s: %(reason)s" -#: ../src/groupchat_control.py:1400 +#: ../src/groupchat_control.py:1437 #, fuzzy, python-format msgid "** Role of %(nick)s has been set to %(role)s" msgstr "%(nick)s vypchnuty z pakoju: %(reason)s" -#: ../src/groupchat_control.py:1429 +#: ../src/groupchat_control.py:1466 #, python-format msgid "%s has left" msgstr "%s vyjšaŭ" -#: ../src/groupchat_control.py:1434 +#: ../src/groupchat_control.py:1471 #, python-format msgid "%s has joined the group chat" msgstr "%s dałučyŭsia da pakoju" -#: ../src/groupchat_control.py:1668 +#: ../src/groupchat_control.py:1473 ../src/gui_interface.py:919 +#: ../src/history_window.py:442 ../src/notify.py:250 +#, python-format +msgid "%(nick)s is now %(status)s" +msgstr "%(nick)s maje ciapier status %(status)s" + +#: ../src/groupchat_control.py:1706 #, python-format msgid "Are you sure you want to leave group chat \"%s\"?" msgstr "Ty sapraŭdy chočaš pakinuć pakoj \"%s\"?" -#: ../src/groupchat_control.py:1670 +#: ../src/groupchat_control.py:1708 msgid "" "If you close this window, you will be disconnected from this group chat." msgstr "Kali začyniš hetaje akno, adłučyśsia ad pakoju." -#: ../src/groupchat_control.py:1707 +#: ../src/groupchat_control.py:1712 ../src/gui_interface.py:1172 +#: ../src/gui_interface.py:1940 ../src/gui_interface.py:1975 +#: ../src/message_window.py:227 ../src/roster_window.py:2658 +#: ../src/roster_window.py:3301 ../src/roster_window.py:3990 +msgid "Do _not ask me again" +msgstr "_Bolš nie pytajsia" + +#: ../src/groupchat_control.py:1745 msgid "Changing Subject" msgstr "Źmianiajecca tema" -#: ../src/groupchat_control.py:1708 +#: ../src/groupchat_control.py:1746 msgid "Please specify the new subject:" msgstr "Kali łaska, vyznač novuju temu:" -#: ../src/groupchat_control.py:1715 +#: ../src/groupchat_control.py:1753 msgid "Changing Nickname" msgstr "Źmianiajecca mianuška" -#: ../src/groupchat_control.py:1716 +#: ../src/groupchat_control.py:1754 msgid "Please specify the new nickname you want to use:" msgstr "Kali łaska, vyznač dla siabie novuju mianušku:" #. Ask for a reason -#: ../src/groupchat_control.py:1745 +#: ../src/groupchat_control.py:1783 #, fuzzy, python-format msgid "Destroying %s" msgstr "Apisańnie: %s" -#: ../src/groupchat_control.py:1746 +#: ../src/groupchat_control.py:1784 msgid "" "You are going to definitively destroy this room.\n" "You may specify a reason below:" msgstr "" -#: ../src/groupchat_control.py:1748 +#: ../src/groupchat_control.py:1786 msgid "You may also enter an alternate venue:" msgstr "" #. ask for reason -#: ../src/groupchat_control.py:1921 +#: ../src/groupchat_control.py:1967 #, python-format msgid "Kicking %s" msgstr "Vypichvajecca %s" -#: ../src/groupchat_control.py:1922 ../src/groupchat_control.py:2227 +#: ../src/groupchat_control.py:1968 ../src/groupchat_control.py:2291 msgid "You may specify a reason below:" msgstr "Možaš akreślić pryčynu nižej:" #. ask for reason -#: ../src/groupchat_control.py:2226 +#: ../src/groupchat_control.py:2290 #, python-format msgid "Banning %s" msgstr "Blakavańnie %s" @@ -9058,59 +8711,451 @@ msgid "Details" msgstr "Padrabiaznaści" #. we talk about file -#: ../src/gtkgui_helpers.py:166 ../src/gtkgui_helpers.py:181 +#: ../src/gtkgui_helpers.py:171 ../src/gtkgui_helpers.py:186 #, python-format msgid "Error: cannot open %s for reading" msgstr "Pamyłka: niemahčyma adčytać %s" -#: ../src/gtkgui_helpers.py:351 +#: ../src/gtkgui_helpers.py:362 msgid "Error reading file:" msgstr "Pamyłka adčytańnia fajłu:" -#: ../src/gtkgui_helpers.py:354 +#: ../src/gtkgui_helpers.py:365 msgid "Error parsing file:" msgstr "Pamyłka razboru fajłu:" #. do not traceback (could be a permission problem) #. we talk about a file here -#: ../src/gtkgui_helpers.py:391 +#: ../src/gtkgui_helpers.py:406 #, python-format msgid "Could not write to %s. Session Management support will not work" msgstr "Niemahčyma zapisać u %s. Kiravańnie sesijami nia budzie dziejničać" #. xmpp: is currently handled by another program, so ask the user -#: ../src/gtkgui_helpers.py:728 +#: ../src/gtkgui_helpers.py:770 msgid "Gajim is not the default Jabber client" msgstr "Gajim nie akreśleny jak zmoŭčany klijent Jabber" -#: ../src/gtkgui_helpers.py:729 +#: ../src/gtkgui_helpers.py:771 msgid "Would you like to make Gajim the default Jabber client?" msgstr "Chočaš zrabić Gajim zmoŭčanym klijentam Jabber?" -#: ../src/gtkgui_helpers.py:730 +#: ../src/gtkgui_helpers.py:772 msgid "Always check to see if Gajim is the default Jabber client on startup" msgstr "Zaŭsiody praviaraj, ci akreśleny Gajim jak zmoŭčany klijent Jabber" -#: ../src/gtkgui_helpers.py:799 +#: ../src/gtkgui_helpers.py:845 msgid "Extension not supported" msgstr "Pašyreńnie nie padtrymvajecca" -#: ../src/gtkgui_helpers.py:800 +#: ../src/gtkgui_helpers.py:846 #, python-format msgid "Image cannot be saved in %(type)s format. Save as %(new_filename)s?" msgstr "" "Niemahčyma zapisać vyjavu ŭ farmacie %(type)s. Zapisać jak %(new_filename)s?" -#: ../src/gtkgui_helpers.py:835 +#: ../src/gtkgui_helpers.py:881 msgid "Save Image as..." msgstr "Zapišy vyjavu jak..." -#: ../src/gui_menu_builder.py:89 +#: ../src/gui_interface.py:129 +#, fuzzy, python-format +msgid "" +"Your desired nickname in group chat %s is in use or registered by another " +"occupant.\n" +"Please specify another nickname below:" +msgstr "" +"Hetaja mianuška vykarystoŭvajecca ci zarehistravanaja na inšuju asobu.\n" +"Kali łaska, vyznač inšuju mianušku nižej:" + +#: ../src/gui_interface.py:132 +msgid "Always use this nickname when there is a conflict" +msgstr "" + +#: ../src/gui_interface.py:149 +msgid "Do you accept this request?" +msgstr "Prymaješ hety zapyt?" + +#: ../src/gui_interface.py:151 +#, fuzzy, python-format +msgid "Do you accept this request on account %s?" +msgstr "Prymaješ hety zapyt?" + +#: ../src/gui_interface.py:154 +#, fuzzy, python-format +msgid "HTTP (%(method)s) Authorization for %(url)s (id: %(id)s)" +msgstr "Aŭtaryzacyja HTTP (%s) dla %s (id: %s)" + +#: ../src/gui_interface.py:205 ../src/notify.py:524 +msgid "Connection Failed" +msgstr "Niemahvyma dałučycca" + +#: ../src/gui_interface.py:544 ../src/gui_interface.py:548 +#, fuzzy, python-format +msgid "Error %(code)s: %(msg)s" +msgstr "%(nickname)s: %(message)s" + +#. ('MSGNOTSENT', account, (jid, ierror_msg, msg, time, session)) +#: ../src/gui_interface.py:558 ../src/gui_interface.py:572 +#, fuzzy, python-format +msgid "error while sending %(message)s ( %(error)s )" +msgstr "pamyłka dasyłańnia %s ( %s )" + +#: ../src/gui_interface.py:599 ../src/notify.py:526 +#, fuzzy +msgid "Subscription request" +msgstr "Zapyt aŭtaryzacyi" + +#: ../src/gui_interface.py:624 +msgid "Authorization accepted" +msgstr "Aŭtaryzacyja pryniataja" + +#: ../src/gui_interface.py:625 +#, python-format +msgid "The contact \"%s\" has authorized you to see his or her status." +msgstr "" +"Kantakt \"%s\" aŭtaryzavaŭ ciabie, i ciapier ty možaš bačyć jaho status." + +#: ../src/gui_interface.py:637 +#, python-format +msgid "Contact \"%s\" removed subscription from you" +msgstr "Kantakt \"%s\" anulavaŭ tvaju aŭtaryzacyju" + +#: ../src/gui_interface.py:638 +msgid "" +"You will always see him or her as offline.\n" +"Do you want to remove him or her from your contact list?" +msgstr "" + +#: ../src/gui_interface.py:663 ../src/notify.py:528 +#, fuzzy +msgid "Unsubscribed" +msgstr "_Anuluj aŭtaryzacyju" + +#: ../src/gui_interface.py:704 +#, python-format +msgid "Contact with \"%s\" cannot be established" +msgstr "Niemahčyma złučycca z \"%s\"" + +#: ../src/gui_interface.py:986 +#, python-format +msgid "%(jid)s has set the subject to %(subject)s" +msgstr "" + +#: ../src/gui_interface.py:1053 +msgid "Room now shows unavailable member" +msgstr "" + +#: ../src/gui_interface.py:1055 +msgid "room now does not show unavailable members" +msgstr "" + +#: ../src/gui_interface.py:1058 +msgid "A non-privacy-related room configuration change has occurred" +msgstr "" + +#. Can be a presence (see chg_contact_status in groupchat_control.py) +#: ../src/gui_interface.py:1061 +msgid "Room logging is now enabled" +msgstr "" + +#: ../src/gui_interface.py:1063 +msgid "Room logging is now disabled" +msgstr "" + +#: ../src/gui_interface.py:1065 +msgid "Room is now non-anonymous" +msgstr "" + +#: ../src/gui_interface.py:1068 +msgid "Room is now semi-anonymous" +msgstr "" + +#: ../src/gui_interface.py:1071 +msgid "Room is now fully-anonymous" +msgstr "" + +#: ../src/gui_interface.py:1103 +#, fuzzy, python-format +msgid "A Password is required to join the room %s. Please type it." +msgstr "Treba ŭvieści parol, kab dałučycca da pakoju." + +#: ../src/gui_interface.py:1137 +msgid "" +"You configured Gajim to use GPG agent, but there is no GPG agent running or " +"it returned a wrong passphrase.\n" +msgstr "" + +#: ../src/gui_interface.py:1139 ../src/gui_interface.py:1145 +msgid "You are currently connected without your OpenPGP key." +msgstr "Dałučany biez kluča OpenPGP." + +#: ../src/gui_interface.py:1140 +msgid "Your passphrase is incorrect" +msgstr "Parol niapravilny" + +#: ../src/gui_interface.py:1144 +#, fuzzy +msgid "OpenGPG Passphrase Incorrect" +msgstr "Parol niapravilny" + +#: ../src/gui_interface.py:1170 +msgid "GPG key not trusted" +msgstr "" + +#: ../src/gui_interface.py:1170 +msgid "" +"The GPG key used to encrypt this chat is not trusted. Do you really want to " +"encrypt this message?" +msgstr "" + +#: ../src/gui_interface.py:1182 +#, fuzzy +msgid "" +"Gnome Keyring is installed but not \t\t\t\tcorrectly started (environment " +"variable probably not \t\t\t\tcorrectly set)" +msgstr "" +"Kiraŭnik parolaŭ GNOME instalavany, ale niapravilna vykonvajecca (mahčyma, " +"źmiennaja asiarodździa niapravilna akreślenaja)" + +#: ../src/gui_interface.py:1292 +#, python-format +msgid "New mail on %(gmail_mail_address)s" +msgstr "Novaja pošta ŭ skryncy %(gmail_mail_address)s" + +#: ../src/gui_interface.py:1294 +#, python-format +msgid "You have %d new mail conversation" +msgid_plural "You have %d new mail conversations" +msgstr[0] "%d novy list" +msgstr[1] "%d novyja listy" +msgstr[2] "%d novych listoŭ" + +#: ../src/gui_interface.py:1307 +#, python-format +msgid "" +"\n" +"\n" +"From: %(from_address)s\n" +"Subject: %(subject)s\n" +"%(snippet)s" +msgstr "" + +#: ../src/gui_interface.py:1379 +#, python-format +msgid "%s wants to send you a file." +msgstr "%s choča dasłać tabie fajł." + +#: ../src/gui_interface.py:1417 ../src/roster_window.py:1814 +#, fuzzy +msgid "Remote contact stopped transfer" +msgstr "Vydalaje kantakt sa śpisu" + +#: ../src/gui_interface.py:1419 ../src/roster_window.py:1816 +#, fuzzy +msgid "Error opening file" +msgstr "Pamyłka adčytańnia fajłu:" + +#: ../src/gui_interface.py:1450 +#, python-format +msgid "You successfully received %(filename)s from %(name)s." +msgstr "Atrymany fajł %(filename)s ad %(name)s." + +#. ft stopped +#: ../src/gui_interface.py:1454 +#, python-format +msgid "File transfer of %(filename)s from %(name)s stopped." +msgstr "Pieradača fajłu %(filename)s ad %(name)s spyniena." + +#: ../src/gui_interface.py:1467 +#, python-format +msgid "You successfully sent %(filename)s to %(name)s." +msgstr "Fajł %(filename)s paśpiachova dasłany da %(name)s." + +#. ft stopped +#: ../src/gui_interface.py:1471 +#, python-format +msgid "File transfer of %(filename)s to %(name)s stopped." +msgstr "Pieradača fajłu %(filename)s da %(name)s spynienaja." + +#: ../src/gui_interface.py:1576 +#, python-format +msgid "" +"Unable to decrypt message from %s\n" +"It may have been tampered with." +msgstr "" + +#: ../src/gui_interface.py:1583 +#, fuzzy +msgid "Unable to decrypt message" +msgstr "Dla kožnaha _paviedamleńnia" + +#: ../src/gui_interface.py:1657 +msgid "Username Conflict" +msgstr "Kanflikt imionaŭ karystalnikaŭ" + +#: ../src/gui_interface.py:1658 +msgid "Please type a new username for your local account" +msgstr "Kali łaska, akreśli novaje imia karystalnika dla lakalnaha kontu" + +#: ../src/gui_interface.py:1670 +msgid "Ping?" +msgstr "" + +#: ../src/gui_interface.py:1683 +#, python-format +msgid "Pong! (%s s.)" +msgstr "" + +#: ../src/gui_interface.py:1694 +msgid "Error." +msgstr "" + +#: ../src/gui_interface.py:1721 +#, fuzzy +msgid "Resource Conflict" +msgstr "Kanflikt imionaŭ karystalnikaŭ" + +#: ../src/gui_interface.py:1722 +msgid "" +"You are already connected to this account with the same resource. Please " +"type a new one" +msgstr "" + +#: ../src/gui_interface.py:1771 +#, fuzzy, python-format +msgid "%s wants to start a voice chat." +msgstr "%s choča dasłać tabie fajł." + +#: ../src/gui_interface.py:1774 +#, fuzzy +msgid "Voice Chat Request" +msgstr "Zapyt na pieradaču fajłu" + +#: ../src/gui_interface.py:1879 +msgid "Error verifying SSL certificate" +msgstr "" + +#: ../src/gui_interface.py:1880 +#, python-format +msgid "" +"There was an error verifying the SSL certificate of your jabber server: %" +"(error)s\n" +"Do you still want to connect to this server?" +msgstr "" + +#: ../src/gui_interface.py:1885 +msgid "Ignore this error for this certificate." +msgstr "" + +#: ../src/gui_interface.py:1905 +msgid "SSL certificate error" +msgstr "" + +#: ../src/gui_interface.py:1906 +#, python-format +msgid "" +"It seems the SSL certificate of account %(account)s has changed or your " +"connection is being hacked.\n" +"Old fingerprint: %(old)s\n" +"New fingerprint: %(new)s\n" +"\n" +"Do you still want to connect and update the fingerprint of the certificate?" +msgstr "" + +#: ../src/gui_interface.py:1936 ../src/gui_interface.py:1971 +#, fuzzy +msgid "Insecure connection" +msgstr "Złučeńnie" + +#: ../src/gui_interface.py:1937 +#, fuzzy +msgid "" +"You are about to send your password on an unencrypted connection. Are you " +"sure you want to do that?" +msgstr "Stvarajecca metakantakt. Ty sapraŭdy chočaš praciahnuć?" + +#: ../src/gui_interface.py:1939 ../src/gui_interface.py:1974 +msgid "Yes, I really want to connect insecurely" +msgstr "" + +#: ../src/gui_interface.py:1972 +msgid "" +"You are about to send your password on an insecure connection. You should " +"install PyOpenSSL to prevent that. Are you sure you want to do that?" +msgstr "" + +#: ../src/gui_interface.py:1992 +msgid "PEP node was not removed" +msgstr "" + +#: ../src/gui_interface.py:1993 +#, python-format +msgid "PEP node %(node)s was not removed: %(message)s" +msgstr "" + +#. theme doesn't exist, disable emoticons +#: ../src/gui_interface.py:2547 ../src/gui_interface.py:2569 +#, fuzzy +msgid "Emoticons disabled" +msgstr "Šyfravańnie adklučanaje" + +#: ../src/gui_interface.py:2548 +msgid "" +"Your configured emoticons theme has not been found, so emoticons have been " +"disabled." +msgstr "" + +#: ../src/gui_interface.py:2570 +msgid "" +"Your configured emoticons theme cannot been loaded. You maybe need to update " +"the format of emoticons.py file. See http://trac.gajim.org/wiki/Emoticons " +"for more details." +msgstr "" + +#: ../src/gui_interface.py:2598 ../src/roster_window.py:3441 +msgid "You cannot join a group chat while you are invisible" +msgstr "Niemahčyma dałučycca da pakoju, kali ty niabačny" + +#. it is good to notify the user +#. in case he or she cannot see the output of the console +#: ../src/gui_interface.py:2969 +msgid "Could not save your settings and preferences" +msgstr "Niemahčyma zapisać tvaje nałady i opcyi" + +#: ../src/gui_interface.py:3462 +msgid "Passphrase Required" +msgstr "Musiš vyznačyć parol" + +#: ../src/gui_interface.py:3463 +#, fuzzy, python-format +msgid "Enter GPG key passphrase for key %(keyid)s (account %(account)s)." +msgstr "Vyznač parol GPG dla kontu %s." + +#: ../src/gui_interface.py:3477 +msgid "GPG key expired" +msgstr "" + +#: ../src/gui_interface.py:3478 +#, fuzzy, python-format +msgid "Your GPG key has expired, you will be connected to %s without OpenPGP." +msgstr "Ty dałučyśsia da %s biaz OpenPGP." + +#. ask again +#: ../src/gui_interface.py:3487 +msgid "Wrong Passphrase" +msgstr "Niapravilny parol" + +#: ../src/gui_interface.py:3488 +msgid "Please retype your GPG passphrase or press Cancel." +msgstr "Kali łaska, vyznač parol GPG znoŭ albo naciśni knopku \"Anuluj\"." + +#: ../src/gui_menu_builder.py:93 #, fuzzy msgid "_New Group Chat" msgstr "Novaja hrupavaja razmova" -#: ../src/gui_menu_builder.py:400 +#: ../src/gui_menu_builder.py:413 msgid "I would like to add you to my roster" msgstr "Ja chaču dadać ciabie da svajho śpisu kantaktaŭ" @@ -9125,7 +9170,7 @@ msgstr "Kantakty" #. holds time #: ../src/history_manager.py:174 ../src/history_manager.py:214 -#: ../src/history_window.py:95 +#: ../src/history_window.py:97 msgid "Date" msgstr "Data" @@ -9136,7 +9181,7 @@ msgstr "Mianuška" #. holds message #: ../src/history_manager.py:188 ../src/history_manager.py:220 -#: ../src/history_window.py:103 +#: ../src/history_window.py:105 msgid "Message" msgstr "Paviedamleńnie" @@ -9161,243 +9206,248 @@ msgstr "" "\n" "Kali ty abraŭ \"Tak\", pačakaj..." -#: ../src/history_manager.py:458 +#: ../src/history_manager.py:467 msgid "Exporting History Logs..." msgstr "Ekspartavańnie žurnałaŭ..." -#: ../src/history_manager.py:533 +#: ../src/history_manager.py:542 #, python-format msgid "%(who)s on %(time)s said: %(message)s\n" msgstr "%(who)s a %(time)s napisaŭ: %(message)s\n" -#: ../src/history_manager.py:570 +#: ../src/history_manager.py:579 msgid "Do you really want to delete logs of the selected contact?" msgid_plural "Do you really want to delete logs of the selected contacts?" msgstr[0] "Sapraŭdy chočaš vydalić žurnał razmoŭ z abranym kantaktam?" msgstr[1] "Sapraŭdy chočaš vydalić žurnały razmoŭ z abranymi kantaktami?" msgstr[2] "Sapraŭdy chočaš vydalić žurnały razmoŭ z abranymi kantaktami?" -#: ../src/history_manager.py:574 ../src/history_manager.py:609 +#: ../src/history_manager.py:583 ../src/history_manager.py:618 msgid "This is an irreversible operation." msgstr "Vynikaŭ hetaj aperacyi niemahčyma anulavać." -#: ../src/history_manager.py:606 +#: ../src/history_manager.py:615 msgid "Do you really want to delete the selected message?" msgid_plural "Do you really want to delete the selected messages?" msgstr[0] "Sapraŭdy chočaš vydalić zaznačanaje paviedamleńnie?" msgstr[1] "Sapraŭdy chočaš vydalić zaznačanyja paviedamleńni?" msgstr[2] "Sapraŭdy chočaš vydalić zaznačanyja paviedamleńni?" -#: ../src/history_window.py:298 +#: ../src/history_window.py:305 #, python-format msgid "Conversation History with %s" msgstr "Žurnał razmoŭ z %s" -#: ../src/history_window.py:343 +#: ../src/history_window.py:350 msgid "Disk Error" msgstr "" -#: ../src/history_window.py:427 +#: ../src/history_window.py:438 #, python-format msgid "%(nick)s is now %(status)s: %(status_msg)s" msgstr "%(nick)s maje ciapier status %(status)s: %(status_msg)s" -#: ../src/history_window.py:438 +#: ../src/history_window.py:449 #, fuzzy, python-format msgid "Error: %s" msgstr "Tekst pamyłki: %s" -#: ../src/history_window.py:440 +#: ../src/history_window.py:451 msgid "Error" msgstr "" -#: ../src/history_window.py:442 +#: ../src/history_window.py:453 #, python-format msgid "Status is now: %(status)s: %(status_msg)s" msgstr "Dziejny status: %(status)s: %(status_msg)s" -#: ../src/history_window.py:445 +#: ../src/history_window.py:456 #, python-format msgid "Status is now: %(status)s" msgstr "Dziejny status: %(status)s" -#: ../src/htmltextview.py:512 ../src/htmltextview.py:522 +#: ../src/htmltextview.py:513 ../src/htmltextview.py:523 #, fuzzy msgid "Timeout loading image" msgstr "Niemahčyma adčytać vyjavu" -#: ../src/htmltextview.py:532 +#: ../src/htmltextview.py:533 msgid "Image is too big" msgstr "" -#: ../src/message_window.py:220 +#: ../src/message_window.py:225 #, fuzzy msgid "You are going to close several tabs" msgstr "Niama złučeńnia z serveram" -#: ../src/message_window.py:221 +#: ../src/message_window.py:226 #, fuzzy msgid "Do you really want to close them all?" msgstr "Sapraŭdy chočaš vydalić zaznačanaje paviedamleńnie?" -#: ../src/message_window.py:481 +#: ../src/message_window.py:490 msgid "Chats" msgstr "Razmovy" -#: ../src/message_window.py:483 +#: ../src/message_window.py:492 msgid "Group Chats" msgstr "Pakoji" -#: ../src/message_window.py:485 +#: ../src/message_window.py:494 msgid "Private Chats" msgstr "Pryvatnyja razmovy" -#: ../src/message_window.py:491 +#: ../src/message_window.py:500 msgid "Messages" msgstr "Paviedamleńni" -#: ../src/negotiation.py:32 +#: ../src/negotiation.py:34 msgid "- messages will be logged" msgstr "" -#: ../src/negotiation.py:34 +#: ../src/negotiation.py:36 msgid "- messages will not be logged" msgstr "" -#: ../src/notify.py:242 +#: ../src/notify.py:248 #, python-format msgid "%(nick)s Changed Status" msgstr "%(nick)s źmianiŭ status" -#: ../src/notify.py:252 +#: ../src/notify.py:258 #, python-format msgid "%(nickname)s Signed In" msgstr "%(nickname)s dałučyŭsia" -#: ../src/notify.py:260 +#: ../src/notify.py:266 #, python-format msgid "%(nickname)s Signed Out" msgstr "%(nickname)s adłučyŭsia" -#: ../src/notify.py:272 +#: ../src/notify.py:278 #, python-format msgid "New Single Message from %(nickname)s" msgstr "Novaje asobnaje paviedamleńnie ad %(nickname)s" -#: ../src/notify.py:280 +#: ../src/notify.py:286 #, python-format msgid "New Private Message from group chat %s" msgstr "Novaje pryvatnaje paviedamleńnie ŭ pakoji %s" -#: ../src/notify.py:282 +#: ../src/notify.py:288 #, python-format msgid "%(nickname)s: %(message)s" msgstr "%(nickname)s: %(message)s" -#: ../src/notify.py:285 +#: ../src/notify.py:291 #, fuzzy, python-format msgid "Messaged by %(nickname)s" msgstr "Novaje paviedamleńnie ad %(nickname)s" -#: ../src/notify.py:291 +#: ../src/notify.py:297 #, python-format msgid "New Message from %(nickname)s" msgstr "Novaje paviedamleńnie ad %(nickname)s" -#: ../src/notify.py:555 +#: ../src/notify.py:568 #, fuzzy msgid "Ignore" msgstr "dziaviataja" -#: ../src/profile_window.py:55 +#: ../src/profile_window.py:57 msgid "Retrieving profile..." msgstr "Atrymańnie profilu..." -#: ../src/profile_window.py:108 ../src/roster_window.py:2852 +#: ../src/profile_window.py:110 ../src/roster_window.py:2845 #, fuzzy msgid "File is empty" msgstr "Ściežka da fajłu" -#: ../src/profile_window.py:111 ../src/roster_window.py:2855 +#: ../src/profile_window.py:113 ../src/roster_window.py:2848 #, fuzzy msgid "File does not exist" msgstr "Takoha pakoju niama." #. keep identation #. unknown format -#: ../src/profile_window.py:125 ../src/profile_window.py:141 -#: ../src/roster_window.py:2857 ../src/roster_window.py:2868 +#: ../src/profile_window.py:127 ../src/profile_window.py:143 +#: ../src/roster_window.py:2850 ../src/roster_window.py:2861 msgid "Could not load image" msgstr "Niemahčyma adčytać vyjavu" -#: ../src/profile_window.py:251 +#: ../src/profile_window.py:255 msgid "Information received" msgstr "Źviestki atrymanyja" -#: ../src/profile_window.py:318 +#: ../src/profile_window.py:326 msgid "Without a connection you can not publish your contact information." msgstr "" "Niemahčyma apublikavać asabistyja źviestki, nie dałučyŭšysia da servera." -#: ../src/profile_window.py:332 +#: ../src/profile_window.py:339 msgid "Sending profile..." msgstr "Dasyłańnie profilu..." -#: ../src/profile_window.py:347 +#: ../src/profile_window.py:354 msgid "Information NOT published" msgstr "Źviestki NIE apublikavanyja" -#: ../src/profile_window.py:354 +#: ../src/profile_window.py:361 msgid "vCard publication failed" msgstr "Pamyłka publikacyi vCard" -#: ../src/profile_window.py:355 +#: ../src/profile_window.py:362 msgid "" "There was an error while publishing your personal information, try again " "later." msgstr "" "Adbyłasia pamyłka padčas publikacyi asabistych źviestak, pasprabuj paźniej." -#: ../src/roster_window.py:280 ../src/roster_window.py:1017 +#: ../src/roster_window.py:280 ../src/roster_window.py:1019 msgid "Merged accounts" msgstr "Abjadnanyja konty" -#: ../src/roster_window.py:1906 +#: ../src/roster_window.py:1871 msgid "Authorization has been sent" msgstr "Aŭtaryzacyja dasłanaja" -#: ../src/roster_window.py:1907 +#: ../src/roster_window.py:1872 #, python-format msgid "Now \"%s\" will know your status." msgstr "Ciapier \"%s\" budzie viedać tvoj status." -#: ../src/roster_window.py:1927 +#: ../src/roster_window.py:1894 msgid "Subscription request has been sent" msgstr "Zapyt aŭtaryzacyi dasłany" -#: ../src/roster_window.py:1928 +#: ../src/roster_window.py:1895 #, python-format msgid "If \"%s\" accepts this request you will know his or her status." msgstr "Kali \"%s\" zadavolić tvoj zapyt, ty zmožaš bačyć jahony status." -#: ../src/roster_window.py:1940 +#: ../src/roster_window.py:1909 msgid "Authorization has been removed" msgstr "Aŭtaryzacyja anulavanaja" -#: ../src/roster_window.py:1941 +#: ../src/roster_window.py:1910 #, python-format msgid "Now \"%s\" will always see you as offline." msgstr "Ciapier \"%s\" budzie zaŭsiody bačyć ciabie jak adłučanaha." -#: ../src/roster_window.py:1969 +#: ../src/roster_window.py:1938 msgid "GPG is not usable" msgstr "" -#: ../src/roster_window.py:2174 ../src/roster_window.py:3383 +#: ../src/roster_window.py:1939 +#, python-format +msgid "You will be connected to %s without OpenPGP." +msgstr "Ty dałučyśsia da %s biaz OpenPGP." + +#: ../src/roster_window.py:2148 ../src/roster_window.py:3394 msgid "You are participating in one or more group chats" msgstr "Ty znachodziśsia ŭ adnym ci niekalkich pakojach" -#: ../src/roster_window.py:2175 ../src/roster_window.py:3384 +#: ../src/roster_window.py:2149 ../src/roster_window.py:3395 msgid "" "Changing your status to invisible will result in disconnection from those " "group chats. Are you sure you want to go invisible?" @@ -9405,28 +9455,28 @@ msgstr "" "Źmianiŭšy status na niabačny, ty adłučyśsia ad hetych pakojaŭ. Ty sapraŭdy " "chočaš stać niabačnym?" -#: ../src/roster_window.py:2201 +#: ../src/roster_window.py:2175 msgid "desync'ed" msgstr "" -#: ../src/roster_window.py:2257 +#: ../src/roster_window.py:2236 msgid "Really quit Gajim?" msgstr "" -#: ../src/roster_window.py:2258 +#: ../src/roster_window.py:2237 #, fuzzy msgid "Are you sure you want to quit Gajim?" msgstr "Ty sapraŭdy chočaš pakinuć pakoj \"%s\"?" -#: ../src/roster_window.py:2259 +#: ../src/roster_window.py:2238 msgid "Always close Gajim" msgstr "" -#: ../src/roster_window.py:2350 ../src/roster_window.py:2587 +#: ../src/roster_window.py:2333 ../src/roster_window.py:2576 msgid "You have unread messages" msgstr "Jość niečytanyja paviedamleńni" -#: ../src/roster_window.py:2351 +#: ../src/roster_window.py:2334 #, fuzzy msgid "" "Messages will only be available for reading them later if you have history " @@ -9435,16 +9485,16 @@ msgstr "" "Paviedamleńni možna budzie pračytać paźniej, kali ŭklučana viadzieńnie " "žurnałaŭ razmoŭ." -#: ../src/roster_window.py:2588 +#: ../src/roster_window.py:2577 msgid "You must read them before removing this transport." msgstr "Musiš pračytać ich pierad vydaleńniem hetaha transpartu." -#: ../src/roster_window.py:2591 +#: ../src/roster_window.py:2580 #, python-format msgid "Transport \"%s\" will be removed" msgstr "Transpart \"%s\" budzie vydaleny" -#: ../src/roster_window.py:2592 +#: ../src/roster_window.py:2581 msgid "" "You will no longer be able to send and receive messages from contacts using " "this transport." @@ -9452,11 +9502,11 @@ msgstr "" "Ty bolš nia zmožaš kamunikavać z kantaktami, jakija karystajucca hetym " "transpartam." -#: ../src/roster_window.py:2595 +#: ../src/roster_window.py:2584 msgid "Transports will be removed" msgstr "Transparty buduć vydalenyja" -#: ../src/roster_window.py:2600 +#: ../src/roster_window.py:2589 #, fuzzy, python-format msgid "" "You will no longer be able to send and receive messages to contacts from " @@ -9465,69 +9515,69 @@ msgstr "" "Ty bolš nia zmožaš kamunikavać z kantaktami, jakija karystajucca hetymi " "transpartami:%s" -#: ../src/roster_window.py:2662 +#: ../src/roster_window.py:2653 #, fuzzy msgid "You are about to block a contact. Are you sure you want to continue?" msgstr "Stvarajecca metakantakt. Ty sapraŭdy chočaš praciahnuć?" -#: ../src/roster_window.py:2664 +#: ../src/roster_window.py:2655 msgid "" "This contact will see you offline and you will not receive messages he will " "send you." msgstr "" #. it's jid -#: ../src/roster_window.py:2748 +#: ../src/roster_window.py:2741 msgid "Rename Contact" msgstr "Źmiani nazvu kantaktu" -#: ../src/roster_window.py:2749 +#: ../src/roster_window.py:2742 #, python-format msgid "Enter a new nickname for contact %s" msgstr "Vyznač novuju mianušku dla kantaktu %s." -#: ../src/roster_window.py:2756 +#: ../src/roster_window.py:2749 msgid "Rename Group" msgstr "Źmiani nazvu hrupy" -#: ../src/roster_window.py:2757 +#: ../src/roster_window.py:2750 #, python-format msgid "Enter a new name for group %s" msgstr "Vyznač novuju nazvu dla hrupy %s" -#: ../src/roster_window.py:2798 +#: ../src/roster_window.py:2791 msgid "Remove Group" msgstr "Vydal hrupu" -#: ../src/roster_window.py:2799 +#: ../src/roster_window.py:2792 #, python-format msgid "Do you want to remove group %s from the roster?" msgstr "Chočaš vydalić hrupu %s sa śpisu kantaktaŭ?" -#: ../src/roster_window.py:2800 +#: ../src/roster_window.py:2793 #, fuzzy msgid "Also remove all contacts in this group from your roster" msgstr "Vydal taksama ŭsie kantakty z hetaj hrupy sa śpisu kantaktaŭ" -#: ../src/roster_window.py:2839 +#: ../src/roster_window.py:2832 msgid "Assign OpenPGP Key" msgstr "Pryznač kluč OpenPGP" -#: ../src/roster_window.py:2840 +#: ../src/roster_window.py:2833 msgid "Select a key to apply to the contact" msgstr "Abiary kluč dla hetaha kantaktu" -#: ../src/roster_window.py:3203 +#: ../src/roster_window.py:3210 #, python-format msgid "Contact \"%s\" will be removed from your roster" msgstr "Kantakt \"%s\" budzie vydaleny z tvajho śpisu kantaktaŭ" -#: ../src/roster_window.py:3205 +#: ../src/roster_window.py:3212 #, python-format msgid "You are about to remove \"%(name)s\" (%(jid)s) from your roster.\n" msgstr "" -#: ../src/roster_window.py:3210 +#: ../src/roster_window.py:3217 msgid "" "By removing this contact you also remove authorization resulting in him or " "her always seeing you as offline." @@ -9536,12 +9586,12 @@ msgstr "" "jon zaŭsiody budzie bačyć ciabie adłučanym." #. Contact is not in roster -#: ../src/roster_window.py:3216 +#: ../src/roster_window.py:3223 #, fuzzy msgid "Do you want to continue?" msgstr "Što chočaš zrabić?" -#: ../src/roster_window.py:3219 +#: ../src/roster_window.py:3226 msgid "" "By removing this contact you also by default remove authorization resulting " "in him or her always seeing you as offline." @@ -9549,16 +9599,16 @@ msgstr "" "Vydaliŭšy hety kantakt, ty zmoŭčana taksama anuluješ jahonuju aŭtaryzacyju. " "U vyniku jon zaŭsiody budzie bačyć ciabie adłučanym." -#: ../src/roster_window.py:3222 +#: ../src/roster_window.py:3229 msgid "I want this contact to know my status after removal" msgstr "Ja chaču, kab hety kantakt moh bačyć moj status paśla vydaleńnia" #. several contact to remove at the same time -#: ../src/roster_window.py:3226 +#: ../src/roster_window.py:3233 msgid "Contacts will be removed from your roster" msgstr "Kantakty buduć vydalenyja z tvajho śpisu kantaktaŭ" -#: ../src/roster_window.py:3231 +#: ../src/roster_window.py:3238 #, python-format msgid "" "By removing these contacts:%s\n" @@ -9568,32 +9618,32 @@ msgstr "" "ty taksama anuluješ ichnyja aŭtaryzacyi. U vyniku jany zaŭsiody buduć bačyć " "ciabie adłučanym." -#: ../src/roster_window.py:3286 +#: ../src/roster_window.py:3295 #, fuzzy msgid "" "You are about to send a custom status. Are you sure you want to continue?" msgstr "Stvarajecca metakantakt. Ty sapraŭdy chočaš praciahnuć?" -#: ../src/roster_window.py:3288 +#: ../src/roster_window.py:3297 #, python-format msgid "" "This contact will temporarily see you as %(status)s, but only until you " "change your status. Then he will see your global status." msgstr "" -#: ../src/roster_window.py:3305 +#: ../src/roster_window.py:3316 msgid "No account available" msgstr "Konty niedastupnyja" -#: ../src/roster_window.py:3306 +#: ../src/roster_window.py:3317 msgid "You must create an account before you can chat with other contacts." msgstr "Treba stvaryć kont, kab razmaŭlać ź inšymi kantaktami." -#: ../src/roster_window.py:3877 +#: ../src/roster_window.py:3897 msgid "Metacontacts storage not supported by your server" msgstr "Tvoj server nie padtrymvaje zachoŭvańnia metakantaktaŭ" -#: ../src/roster_window.py:3879 +#: ../src/roster_window.py:3899 #, fuzzy msgid "" "Your server does not support storing metacontacts information. So those " @@ -9602,12 +9652,12 @@ msgstr "" "Tvoj server nie padtrymvaje zachoŭvańnia metakantaktaŭ. Tamu hetyja źviestki " "nia buduć dastupnyja pry nastupnym złučeńni." -#: ../src/roster_window.py:3964 +#: ../src/roster_window.py:3984 msgid "" "You are about to create a metacontact. Are you sure you want to continue?" msgstr "Stvarajecca metakantakt. Ty sapraŭdy chočaš praciahnuć?" -#: ../src/roster_window.py:3966 +#: ../src/roster_window.py:3986 msgid "" "Metacontacts are a way to regroup several contacts in one line. Generally it " "is used when the same person has several Jabber accounts or transport " @@ -9617,12 +9667,12 @@ msgstr "" "Zvyčajna hetaja mažlivaść vykarystoŭvajecca, kali adzin čałaviek " "karystajecca niekalkimi kontami Jabber albo niekalkimi kontami z transpartaŭ." -#: ../src/roster_window.py:4081 +#: ../src/roster_window.py:4101 #, fuzzy msgid "Invalid file URI:" msgstr "Niapravilny fajł" -#: ../src/roster_window.py:4092 +#: ../src/roster_window.py:4112 #, fuzzy, python-format msgid "Do you want to send this file to %s:" msgid_plural "Do you want to send these files to %s:" @@ -9630,12 +9680,12 @@ msgstr[0] "%s choča dasłać tabie fajł:" msgstr[1] "%s choča dasłać tabie fajł:" msgstr[2] "%s choča dasłać tabie fajł:" -#: ../src/roster_window.py:4207 +#: ../src/roster_window.py:4227 #, fuzzy, python-format msgid "Send %s to %s" msgstr "Dašli %s" -#: ../src/roster_window.py:4213 +#: ../src/roster_window.py:4233 #, python-format msgid "Make %s and %s metacontacts" msgstr "Zrabi z %s i %s metakantakt" @@ -9645,164 +9695,164 @@ msgstr "Zrabi z %s i %s metakantakt" #. for chat_with #. for single message #. join gc -#: ../src/roster_window.py:4794 ../src/roster_window.py:4865 -#: ../src/roster_window.py:4874 ../src/systray.py:216 ../src/systray.py:263 -#: ../src/systray.py:269 +#: ../src/roster_window.py:4718 ../src/roster_window.py:4789 +#: ../src/roster_window.py:4798 ../src/statusicon.py:248 +#: ../src/statusicon.py:295 ../src/statusicon.py:301 #, python-format msgid "using account %s" msgstr "praz kont %s" #. add -#: ../src/roster_window.py:4881 +#: ../src/roster_window.py:4805 #, python-format msgid "to %s account" msgstr "da kontu %s" #. disco -#: ../src/roster_window.py:4886 +#: ../src/roster_window.py:4810 #, python-format msgid "using %s account" msgstr "praz kont %s" -#: ../src/roster_window.py:4923 ../src/systray.py:279 +#: ../src/roster_window.py:4847 ../src/statusicon.py:311 msgid "_Manage Bookmarks..." msgstr "_Kiruj zakładkami..." #. profile, avatar -#: ../src/roster_window.py:4943 +#: ../src/roster_window.py:4867 #, python-format msgid "of account %s" msgstr "kontu %s" -#: ../src/roster_window.py:4983 +#: ../src/roster_window.py:4907 #, python-format msgid "for account %s" msgstr "dla kontu %s" -#: ../src/roster_window.py:5039 ../src/roster_window.py:5140 +#: ../src/roster_window.py:4963 ../src/roster_window.py:5064 msgid "_Change Status Message" msgstr "Ź_miani paviedamleńnie statusu" -#: ../src/roster_window.py:5066 +#: ../src/roster_window.py:4990 #, fuzzy msgid "Publish Tune" msgstr "_Абнавіць" -#: ../src/roster_window.py:5074 +#: ../src/roster_window.py:4998 #, fuzzy msgid "Configure Services..." msgstr "_Šukaj servisy..." -#: ../src/roster_window.py:5228 +#: ../src/roster_window.py:5145 msgid "_Maximize All" msgstr "" #. Send Group Message -#: ../src/roster_window.py:5236 ../src/roster_window.py:5404 +#: ../src/roster_window.py:5153 ../src/roster_window.py:5325 msgid "Send Group M_essage" msgstr "_Dašli hrupavoje paviedamleńnie" -#: ../src/roster_window.py:5244 +#: ../src/roster_window.py:5161 msgid "To all users" msgstr "Usim karystalnikam" -#: ../src/roster_window.py:5248 +#: ../src/roster_window.py:5165 msgid "To all online users" msgstr "Usim dałučanym karystalnikam" #. Manage Transport submenu -#: ../src/roster_window.py:5424 +#: ../src/roster_window.py:5345 #, fuzzy msgid "_Manage Contacts" msgstr "Źmiani nazvu kantaktu" #. Edit Groups -#: ../src/roster_window.py:5432 +#: ../src/roster_window.py:5353 msgid "Edit _Groups" msgstr "Źmiani _hrupy" #. Send single message -#: ../src/roster_window.py:5485 +#: ../src/roster_window.py:5408 #, fuzzy msgid "Send Single Message" msgstr "_Dašli asobnaje paviedamleńnie" #. Execute Command -#: ../src/roster_window.py:5531 +#: ../src/roster_window.py:5454 msgid "Execute Command..." msgstr "Vykanaj zahad..." #. Manage Transport submenu -#: ../src/roster_window.py:5541 +#: ../src/roster_window.py:5464 #, fuzzy msgid "_Manage Transport" msgstr "Transparty" #. Modify Transport -#: ../src/roster_window.py:5549 +#: ../src/roster_window.py:5472 #, fuzzy msgid "_Modify Transport" msgstr "Pakažy _transparty" #. Rename -#: ../src/roster_window.py:5558 +#: ../src/roster_window.py:5481 msgid "_Rename" msgstr "Źmiani _nazvu" -#: ../src/roster_window.py:5623 +#: ../src/roster_window.py:5546 msgid "_Maximize" msgstr "" -#: ../src/roster_window.py:5631 +#: ../src/roster_window.py:5554 #, fuzzy msgid "_Reconnect" msgstr "Kantakt adłučyŭsia" -#: ../src/roster_window.py:5637 +#: ../src/roster_window.py:5560 #, fuzzy msgid "_Disconnect" msgstr "Kantakt adłučyŭsia" #. History manager -#: ../src/roster_window.py:5716 +#: ../src/roster_window.py:5642 msgid "History Manager" msgstr "Kiraŭnik žurnałaŭ" -#: ../src/roster_window.py:5725 +#: ../src/roster_window.py:5653 msgid "_Join New Group Chat" msgstr "_Dałučysia da pakoju" -#: ../src/roster_window.py:5881 +#: ../src/roster_window.py:5809 msgid "Change Status Message..." msgstr "Źmiani paviedamleńnie statusu..." -#: ../src/search_window.py:93 +#: ../src/search_window.py:94 msgid "Waiting for results" msgstr "" -#: ../src/search_window.py:133 ../src/search_window.py:211 +#: ../src/search_window.py:132 ../src/search_window.py:210 msgid "Error in received dataform" msgstr "" #. No result -#: ../src/search_window.py:167 ../src/search_window.py:203 +#: ../src/search_window.py:166 ../src/search_window.py:202 msgid "No result" msgstr "" -#: ../src/session.py:128 +#: ../src/session.py:132 msgid "Disk WriteError" msgstr "" -#: ../src/session.py:249 +#: ../src/session.py:254 #, python-format msgid "Subject: %s" msgstr "Tema: %s" -#: ../src/session.py:422 ../src/session.py:457 +#: ../src/session.py:429 ../src/session.py:464 msgid "Confirm these session options" msgstr "" -#: ../src/session.py:424 +#: ../src/session.py:431 #, python-format msgid "" "The remote client wants to negotiate an session with these features:\n" @@ -9812,7 +9862,7 @@ msgid "" "\tAre these options acceptable?" msgstr "" -#: ../src/session.py:458 +#: ../src/session.py:465 #, python-format msgid "" "The remote client selected these options:\n" @@ -9822,119 +9872,119 @@ msgid "" "Continue with the session?" msgstr "" -#: ../src/systray.py:177 +#: ../src/statusicon.py:209 msgid "_Change Status Message..." msgstr "Ź_miani paviedamleńnie statusu..." -#: ../src/systray.py:293 +#: ../src/statusicon.py:325 msgid "Hide this menu" msgstr "Schavaj hetaje menu" -#: ../src/tooltips.py:326 ../src/tooltips.py:520 +#: ../src/tooltips.py:347 ../src/tooltips.py:544 msgid "Jabber ID: " msgstr "JID:" -#: ../src/tooltips.py:329 ../src/tooltips.py:524 +#: ../src/tooltips.py:350 ../src/tooltips.py:548 msgid "Resource: " msgstr "Krynica: " -#: ../src/tooltips.py:334 +#: ../src/tooltips.py:355 #, python-format msgid "%(owner_or_admin_or_member)s of this group chat" msgstr "%(owner_or_admin_or_member)s hetaha pakoju" -#: ../src/tooltips.py:431 +#: ../src/tooltips.py:455 msgid " [blocked]" msgstr "" -#: ../src/tooltips.py:435 +#: ../src/tooltips.py:459 msgid " [minimized]" msgstr "" -#: ../src/tooltips.py:450 ../src/tooltips.py:705 +#: ../src/tooltips.py:474 ../src/tooltips.py:686 msgid "Status: " msgstr "Status: " -#: ../src/tooltips.py:480 +#: ../src/tooltips.py:504 #, python-format msgid "Last status: %s" msgstr "Apošni status: %s" -#: ../src/tooltips.py:482 +#: ../src/tooltips.py:506 #, python-format msgid " since %s" msgstr " ad %s" -#: ../src/tooltips.py:500 +#: ../src/tooltips.py:524 #, fuzzy msgid "Connected" msgstr "Złučeńnie" -#: ../src/tooltips.py:502 +#: ../src/tooltips.py:526 #, fuzzy msgid "Disconnected" msgstr "Kantakt adłučyŭsia" #. ('both' is the normal sub so we don't show it) -#: ../src/tooltips.py:531 +#: ../src/tooltips.py:555 msgid "Subscription: " msgstr "Aŭtaryzacyja: " -#: ../src/tooltips.py:541 +#: ../src/tooltips.py:565 msgid "OpenPGP: " msgstr "OpenPGP: " -#: ../src/tooltips.py:637 +#: ../src/tooltips.py:618 #, fuzzy msgid "Tune:" msgstr "Typ:" -#: ../src/tooltips.py:663 +#: ../src/tooltips.py:644 msgid "Download" msgstr "Ściahni" -#: ../src/tooltips.py:669 +#: ../src/tooltips.py:650 msgid "Upload" msgstr "Zaciahni na server" -#: ../src/tooltips.py:676 +#: ../src/tooltips.py:657 msgid "Type: " msgstr "Typ: " -#: ../src/tooltips.py:680 +#: ../src/tooltips.py:661 msgid "Transferred: " msgstr "Pierasłany: " -#: ../src/tooltips.py:683 ../src/tooltips.py:704 +#: ../src/tooltips.py:664 ../src/tooltips.py:685 msgid "Not started" msgstr "Nie pačata" -#: ../src/tooltips.py:687 +#: ../src/tooltips.py:668 msgid "Stopped" msgstr "Spyniena" -#: ../src/tooltips.py:689 ../src/tooltips.py:692 +#: ../src/tooltips.py:670 ../src/tooltips.py:673 msgid "Completed" msgstr "Zavieršana" -#: ../src/tooltips.py:696 +#: ../src/tooltips.py:677 msgid "?transfer status:Paused" msgstr "?status pieradačy:Prypyniena" #. stalled is not paused. it is like 'frozen' it stopped alone -#: ../src/tooltips.py:700 +#: ../src/tooltips.py:681 msgid "Stalled" msgstr "Zatrymana" -#: ../src/tooltips.py:702 +#: ../src/tooltips.py:683 msgid "Transferring" msgstr "Pieradajecca" -#: ../src/tooltips.py:738 +#: ../src/tooltips.py:721 msgid "This service has not yet responded with detailed information" msgstr "Hety servis dahetul nie adkazaŭ na zapyt padrabiaznych źviestak" -#: ../src/tooltips.py:741 +#: ../src/tooltips.py:724 msgid "" "This service could not respond with detailed information.\n" "It is most likely legacy or broken" @@ -9942,66 +9992,102 @@ msgstr "" "Hety servis nia zmoh adkazać na zapyt padrabiaznych źviestak.\n" "Servis sastareły albo złamany" -#: ../src/vcard.py:245 +#: ../src/vcard.py:252 msgid "?Client:Unknown" msgstr "?Klijent:Nieviadomy" -#: ../src/vcard.py:247 +#: ../src/vcard.py:254 msgid "?OS:Unknown" msgstr "?AS:Nieviadomaja" -#: ../src/vcard.py:268 +#: ../src/vcard.py:275 #, fuzzy msgid "?Time:Unknown" msgstr "?Klijent:Nieviadomy" -#: ../src/vcard.py:292 ../src/vcard.py:302 ../src/vcard.py:511 +#: ../src/vcard.py:299 ../src/vcard.py:309 ../src/vcard.py:518 #, python-format msgid "since %s" msgstr "ad %s" -#: ../src/vcard.py:331 +#: ../src/vcard.py:336 #, fuzzy msgid "Affiliation:" msgstr "Aplikacyi" -#: ../src/vcard.py:339 +#: ../src/vcard.py:344 msgid "" "This contact is interested in your presence information, but you are not " "interested in his/her presence" msgstr "" "Hety kantakt cikavicca tvajim statusam, ale ciabie jahony status nie cikavić" -#: ../src/vcard.py:341 +#: ../src/vcard.py:346 msgid "" "You are interested in the contact's presence information, but he/she is not " "interested in yours" msgstr "" "Ty cikaviśsia statusam hetaha kantaktu, ale jaho nie cikavić tvoj status" -#: ../src/vcard.py:343 +#: ../src/vcard.py:348 msgid "You and the contact are interested in each other's presence information" msgstr "Ty i hety kantakt uzajemna cikaviciesia statusam adno adnaho" #. None -#: ../src/vcard.py:345 +#: ../src/vcard.py:350 msgid "" "You are not interested in the contact's presence, and neither he/she is " "interested in yours" msgstr "Ty i hety kantakt nie cikaviciesia statusam adno adnaho" -#: ../src/vcard.py:352 +#: ../src/vcard.py:357 msgid "You are waiting contact's answer about your subscription request" msgstr "Ty čakaješ adkazu kantaktu na zapyt aŭtaryzacyi" -#: ../src/vcard.py:354 +#: ../src/vcard.py:359 msgid "There is no pending subscription request." msgstr "" -#: ../src/vcard.py:359 ../src/vcard.py:413 ../src/vcard.py:536 +#: ../src/vcard.py:364 ../src/vcard.py:418 ../src/vcard.py:541 msgid " resource with priority " msgstr " krynica z pryjarytetam " +#~ msgid "_Incoming message:" +#~ msgstr "_Uvachodnaje paviedamleńnie:" + +#~ msgid "_Outgoing message:" +#~ msgstr "_Zychodnaje paviedamleńnie:" + +#, fuzzy +#~ msgid "gtk-ok" +#~ msgstr "gtk+" + +#, fuzzy +#~ msgid "" +#~ "The host %s you configured as the ft_add_hosts_to_send advanced option is " +#~ "not valid, so ignored." +#~ msgstr "" +#~ "Host, akreśleny ŭ opcyi ft_override_host_to_send, niapravilny, tamu " +#~ "ihnarujecca." + +#~ msgid "OpenPGP passphrase was not given" +#~ msgstr "Parol OpenPGP nia vyznačany" + +#~ msgid "" +#~ "To continue sending and receiving messages, you will need to reconnect." +#~ msgstr "Kab paciahnuć kamunikacyju, treba ŭruchomić Gajim nanoŭ." + +#~ msgid "" +#~ "You are not connected or not visible to others. Your message could not be " +#~ "sent." +#~ msgstr "Ty nie dałučany albo niebačny. Ty nia možaš dasyłać paviedamleńni." + +#~ msgid "[This message is encrypted]" +#~ msgstr "[Hetaje paviedamleńnie zašyfravanaje]" + +#~ msgid "%i days ago" +#~ msgstr "%i dzion tamu" + #~ msgid "Add Special _Notification" #~ msgstr "Dadaj admysłovaje _nahadvańnie" @@ -10588,9 +10674,6 @@ msgstr " krynica z pryjarytetam " #~ msgid "A_fter nickname:" #~ msgstr "_Пасля мянушкі:" -#~ msgid "B_efore nickname:" -#~ msgstr "П_ерад мянушкай:" - #~ msgid "_After time:" #~ msgstr "_Праз пэўны час:" diff --git a/po/bg.po b/po/bg.po index 50c97c6b0..6248118bb 100644 --- a/po/bg.po +++ b/po/bg.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: Gajim 0.12\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2009-10-28 22:17+0100\n" +"POT-Creation-Date: 2009-11-25 22:20+0100\n" "PO-Revision-Date: 2009-08-19 23:43+0200\n" "Last-Translator: Yavor Doganov \n" "Language-Team: Bulgarian \n" @@ -281,9 +281,9 @@ msgstr "Редактиране на личните данни…" #. No configured account #: ../data/glade/account_modification_window.glade.h:16 #: ../data/glade/accounts_window.glade.h:21 -#: ../data/glade/roster_window.glade.h:5 ../src/common/helpers.py:1217 -#: ../src/common/helpers.py:1229 ../src/notify.py:547 ../src/notify.py:568 -#: ../src/notify.py:607 ../src/notify.py:619 +#: ../data/glade/roster_window.glade.h:5 ../src/common/helpers.py:1100 +#: ../src/common/helpers.py:1112 ../src/notify.py:560 ../src/notify.py:581 +#: ../src/notify.py:620 ../src/notify.py:632 msgid "Gajim" msgstr "Gajim" @@ -292,9 +292,9 @@ msgstr "Gajim" #. General group cannot be changed #: ../data/glade/account_modification_window.glade.h:17 #: ../data/glade/accounts_window.glade.h:22 -#: ../data/glade/preferences_window.glade.h:50 ../src/common/contacts.py:98 -#: ../src/dialogs.py:103 ../src/dialogs.py:111 ../src/roster_window.py:2753 -#: ../src/roster_window.py:5351 +#: ../data/glade/preferences_window.glade.h:52 ../src/common/contacts.py:135 +#: ../src/dialogs.py:111 ../src/dialogs.py:121 ../src/roster_window.py:2746 +#: ../src/roster_window.py:5268 msgid "General" msgstr "Общи" @@ -353,21 +353,21 @@ msgid "Information about you, as stored in the server" msgstr "Вашите лични данни, както са запазени на сървъра" #: ../data/glade/account_modification_window.glade.h:27 -#: ../data/glade/accounts_window.glade.h:35 ../src/config.py:1585 -#: ../src/config.py:2131 +#: ../data/glade/accounts_window.glade.h:35 ../src/config.py:1646 +#: ../src/config.py:2196 msgid "No key selected" msgstr "Няма избран ключ" #. None means no proxy profile selected #: ../data/glade/account_modification_window.glade.h:29 #: ../data/glade/accounts_window.glade.h:37 -#: ../data/glade/change_mood_dialog.glade.h:3 ../src/config.py:1106 -#: ../src/config.py:1209 ../src/config.py:1489 ../src/config.py:1494 -#: ../src/config.py:2038 ../src/config.py:2117 ../src/config.py:2130 -#: ../src/config.py:3317 ../src/config.py:3390 ../src/dialogs.py:293 -#: ../src/dialogs.py:295 ../src/dialogs.py:498 ../src/dialogs.py:511 -#: ../src/roster_window.py:2807 ../src/roster_window.py:2813 -#: ../src/roster_window.py:2818 +#: ../data/glade/change_mood_dialog.glade.h:3 ../src/config.py:1158 +#: ../src/config.py:1261 ../src/config.py:1550 ../src/config.py:1555 +#: ../src/config.py:2103 ../src/config.py:2182 ../src/config.py:2195 +#: ../src/config.py:3396 ../src/config.py:3469 ../src/dialogs.py:308 +#: ../src/dialogs.py:310 ../src/dialogs.py:513 ../src/dialogs.py:526 +#: ../src/roster_window.py:2800 ../src/roster_window.py:2806 +#: ../src/roster_window.py:2811 msgid "None" msgstr "Няма" @@ -525,8 +525,8 @@ msgstr "" "Може да помислите и да промените настройките на огнената стена, евентуално." #: ../data/glade/accounts_window.glade.h:32 -#: ../data/glade/zeroconf_information_window.glade.h:4 ../src/config.py:1612 -#: ../src/dialogs.py:806 +#: ../data/glade/zeroconf_information_window.glade.h:4 ../src/config.py:1673 +#: ../src/dialogs.py:830 msgid "Jabber ID:" msgstr "Jabber ID:" @@ -540,7 +540,7 @@ msgid "Mer_ge accounts" msgstr "_Смесване на акаунти" #. Rename -#: ../data/glade/accounts_window.glade.h:42 ../src/roster_window.py:5302 +#: ../data/glade/accounts_window.glade.h:42 ../src/roster_window.py:5219 msgid "Re_name" msgstr "Пре_именуване" @@ -950,7 +950,7 @@ msgstr "Последно променена:" msgid "New entry received" msgstr "Получен е нов запис" -#: ../data/glade/atom_entry_window.glade.h:5 ../src/atom_window.py:114 +#: ../data/glade/atom_entry_window.glade.h:5 ../src/atom_window.py:124 msgid "You have received new entry:" msgstr "Получихте нов запис:" @@ -994,11 +994,11 @@ msgstr "Въведете нова парола:" msgid "Type your new status message" msgstr "Напишете новото съобщение за състояние" -#: ../data/glade/change_status_message_dialog.glade.h:2 ../src/tooltips.py:601 +#: ../data/glade/change_status_message_dialog.glade.h:2 ../src/tooltips.py:613 msgid "Activity:" msgstr "Дейност:" -#: ../data/glade/change_status_message_dialog.glade.h:3 ../src/tooltips.py:586 +#: ../data/glade/change_status_message_dialog.glade.h:3 ../src/tooltips.py:608 msgid "Mood:" msgstr "Настроение:" @@ -1088,8 +1088,8 @@ msgstr "Редактиране на _групи…" #. Invite to #. Invite to Groupchat -#: ../data/glade/contact_context_menu.glade.h:6 ../src/roster_window.py:5257 -#: ../src/roster_window.py:5412 +#: ../data/glade/contact_context_menu.glade.h:6 ../src/roster_window.py:5174 +#: ../src/roster_window.py:5333 msgid "In_vite to" msgstr "По_кана в" @@ -1102,8 +1102,8 @@ msgid "Remo_ve" msgstr "П_ремахване" #. Send Custom Status -#: ../data/glade/contact_context_menu.glade.h:9 ../src/roster_window.py:5267 -#: ../src/roster_window.py:5497 +#: ../data/glade/contact_context_menu.glade.h:9 ../src/roster_window.py:5184 +#: ../src/roster_window.py:5420 msgid "Send Cus_tom Status" msgstr "Изпращане на _специфично състояние" @@ -1136,8 +1136,8 @@ msgid "_Allow him/her to see my status" msgstr "_Позволение за виждане на състоянието ми" #: ../data/glade/contact_context_menu.glade.h:18 -#: ../data/glade/gc_occupants_menu.glade.h:7 ../src/roster_window.py:5330 -#: ../src/roster_window.py:5449 ../src/roster_window.py:5578 +#: ../data/glade/gc_occupants_menu.glade.h:7 ../src/roster_window.py:5247 +#: ../src/roster_window.py:5370 ../src/roster_window.py:5501 msgid "_Block" msgstr "_Блокиране" @@ -1148,7 +1148,7 @@ msgstr "За_брана за виждане на състоянието ми" #: ../data/glade/contact_context_menu.glade.h:20 #: ../data/glade/gc_control_popup_menu.glade.h:6 #: ../data/glade/gc_occupants_menu.glade.h:8 -#: ../data/glade/roster_window.glade.h:21 ../src/roster_window.py:5647 +#: ../data/glade/roster_window.glade.h:21 ../src/roster_window.py:5570 msgid "_History" msgstr "Ист_ория" @@ -1169,8 +1169,8 @@ msgid "_Subscription" msgstr "_Записване" #: ../data/glade/contact_context_menu.glade.h:25 -#: ../data/glade/gc_occupants_menu.glade.h:13 ../src/roster_window.py:5324 -#: ../src/roster_window.py:5443 ../src/roster_window.py:5575 +#: ../data/glade/gc_occupants_menu.glade.h:13 ../src/roster_window.py:5241 +#: ../src/roster_window.py:5364 ../src/roster_window.py:5498 msgid "_Unblock" msgstr "_Деблокиране" @@ -1259,7 +1259,7 @@ msgstr "" msgid "When a file transfer is complete show a popup notification" msgstr "Уведомяване чрез изскачащ прозорец при завършване на файловия трансфер" -#: ../data/glade/filetransfers.glade.h:13 ../src/filetransfers_window.py:792 +#: ../data/glade/filetransfers.glade.h:13 ../src/filetransfers_window.py:820 msgid "_Continue" msgstr "П_родължаване" @@ -1267,7 +1267,7 @@ msgstr "П_родължаване" msgid "_Notify me when a file transfer is complete" msgstr "_Уведомяване при завършване на файловия трансфер" -#: ../data/glade/filetransfers.glade.h:15 ../src/filetransfers_window.py:200 +#: ../data/glade/filetransfers.glade.h:15 ../src/filetransfers_window.py:204 msgid "_Open Containing Folder" msgstr "_Отваряне на папката" @@ -1295,7 +1295,7 @@ msgstr "" "Ред за контакт\n" "Лента за разговор" -#: ../data/glade/gajim_themes_window.glade.h:6 ../src/chat_control.py:818 +#: ../data/glade/gajim_themes_window.glade.h:6 ../src/chat_control.py:859 msgid "Bold" msgstr "Получер" @@ -1315,11 +1315,11 @@ msgstr "Персонализиране на темите на Gajim" msgid "Gone" msgstr "Отсъства" -#: ../data/glade/gajim_themes_window.glade.h:11 ../src/common/pep.py:153 +#: ../data/glade/gajim_themes_window.glade.h:11 ../src/common/pep.py:150 msgid "Inactive" msgstr "Бездеен" -#: ../data/glade/gajim_themes_window.glade.h:12 ../src/chat_control.py:819 +#: ../data/glade/gajim_themes_window.glade.h:12 ../src/chat_control.py:860 msgid "Italic" msgstr "Курсив" @@ -1367,7 +1367,7 @@ msgstr "Промяна на _темата…" msgid "Configure _Room..." msgstr "Настройки на _стаята…" -#: ../data/glade/gc_control_popup_menu.glade.h:4 ../src/disco.py:1624 +#: ../data/glade/gc_control_popup_menu.glade.h:4 ../src/disco.py:1746 msgid "_Bookmark" msgstr "_Добавяне на стаята към отметките" @@ -1456,8 +1456,9 @@ msgstr "" msgid "Welcome to Gajim History Logs Manager" msgstr "Добре дошли в мениджъра на историята на разговорите" -#: ../data/glade/history_manager.glade.h:4 ../src/dialogs.py:2884 -#: ../src/dialogs.py:2987 +#. Change label for accept_button to action name instead of 'OK'. +#: ../data/glade/history_manager.glade.h:4 ../src/dialogs.py:3007 +#: ../src/dialogs.py:3104 msgid "Delete" msgstr "Изтриване" @@ -1487,7 +1488,7 @@ msgstr "" msgid "_Search Database" msgstr "_Търсене в базата от данни" -#: ../data/glade/history_window.glade.h:1 ../src/history_window.py:316 +#: ../data/glade/history_window.glade.h:1 ../src/history_window.py:323 msgid "Conversation History" msgstr "История на разговорите" @@ -1515,7 +1516,7 @@ msgstr "_Запазване на разговорите" msgid "Bookmark this room" msgstr "_Добавяне на стаята към отметките (Ctrl+B)" -#: ../data/glade/join_groupchat_window.glade.h:3 ../src/dialogs.py:1972 +#: ../data/glade/join_groupchat_window.glade.h:3 ../src/dialogs.py:2076 msgid "Join Group Chat" msgstr "Влизане в стая" @@ -1542,8 +1543,8 @@ msgstr "Скоро посетени:" msgid "Room:" msgstr "Стая:" -#: ../data/glade/join_groupchat_window.glade.h:9 ../src/disco.py:1201 -#: ../src/disco.py:1628 +#: ../data/glade/join_groupchat_window.glade.h:9 ../src/disco.py:1306 +#: ../src/disco.py:1750 msgid "_Join" msgstr "_Влизане" @@ -1571,7 +1572,7 @@ msgstr "Минимизиране при автоматично влизане" msgid "Print status:" msgstr "Изписване на състоянията:" -#: ../data/glade/manage_bookmarks_window.glade.h:9 ../src/config.py:1602 +#: ../data/glade/manage_bookmarks_window.glade.h:9 ../src/config.py:1663 msgid "Server:" msgstr "Сървър:" @@ -1687,17 +1688,26 @@ msgid "Show a list of formattings" msgstr "Списък с емотикони (Alt+M)" #: ../data/glade/message_window.glade.h:10 -msgid "Show a menu of advanced functions (Alt+A)" +#, fuzzy +msgid "Show a menu of advanced functions (Alt+D)" msgstr "Меню с функции за напреднали (Ctrl+A)" #: ../data/glade/message_window.glade.h:11 msgid "Show the contact's profile (Ctrl+I)" msgstr "Показване на профила на контакта (Ctrl+I)" -#. Make sure the character after "_" is not M/m (conflicts with Alt+M that is supposed to show the Emoticon Selector) +#: ../data/glade/message_window.glade.h:12 +msgid "Toggle audio session" +msgstr "" + #: ../data/glade/message_window.glade.h:13 +msgid "Toggle video session" +msgstr "" + +#. Make sure the character after "_" is not M/m (conflicts with Alt+M that is supposed to show the Emoticon Selector) +#: ../data/glade/message_window.glade.h:15 #: ../data/glade/xml_console_window.glade.h:11 -#: ../src/filetransfers_window.py:260 +#: ../src/filetransfers_window.py:266 msgid "_Send" msgstr "_Изпращане" @@ -1829,6 +1839,16 @@ msgid "Configure color and font of the interface" msgstr "Настройване на цвят и шрифт на интерфейса" #: ../data/glade/preferences_window.glade.h:36 +#, fuzzy +msgid "Contact's message:" +msgstr "Съобщение от разговор:" + +#: ../data/glade/preferences_window.glade.h:37 +#, fuzzy +msgid "Contact's nickname:" +msgstr "Име на контакта" + +#: ../data/glade/preferences_window.glade.h:38 msgid "" "Detached roster with detached chats\n" "Detached roster with single chat\n" @@ -1842,31 +1862,31 @@ msgstr "" "Отделен списък и разговори, групирани по акаунт\n" "Отделен списък и разговори, групирани по вид" -#: ../data/glade/preferences_window.glade.h:41 +#: ../data/glade/preferences_window.glade.h:43 msgid "Display _activity of contacts in roster" msgstr "Показване на _дейност на контактите в списъка" -#: ../data/glade/preferences_window.glade.h:42 +#: ../data/glade/preferences_window.glade.h:44 msgid "Display _extra email details" msgstr "Показване на _допълнителни данни за е-поща" -#: ../data/glade/preferences_window.glade.h:43 +#: ../data/glade/preferences_window.glade.h:45 msgid "Display _tunes of contacts in roster" msgstr "Показване на _слушаната от контактите музика в списъка" -#: ../data/glade/preferences_window.glade.h:44 +#: ../data/glade/preferences_window.glade.h:46 msgid "Display a_vatars of contacts in roster" msgstr "Показване на _аватари на контактите в списъка" -#: ../data/glade/preferences_window.glade.h:45 +#: ../data/glade/preferences_window.glade.h:47 msgid "Display m_ood of contacts in roster" msgstr "Показване на _настроенията на контактите в списъка" -#: ../data/glade/preferences_window.glade.h:46 +#: ../data/glade/preferences_window.glade.h:48 msgid "Display status _messages of contacts in roster" msgstr "Показване на _съобщенията за състояние на контактите в списъка" -#: ../data/glade/preferences_window.glade.h:47 +#: ../data/glade/preferences_window.glade.h:49 msgid "" "Gajim can send and receive meta-information related to a conversation you " "may have with a contact. Here you can specify which chatstates you want to " @@ -1876,7 +1896,7 @@ msgstr "" "даден контакт. Тук може да укажете кои състояния бихте искали да се показват " "в прозорците за разговор." -#: ../data/glade/preferences_window.glade.h:48 +#: ../data/glade/preferences_window.glade.h:50 msgid "" "Gajim can send and receive meta-information related to a conversation you " "may have with a contact. Here you can specify which chatstates you want to " @@ -1885,7 +1905,7 @@ msgstr "" "Gajim може да изпраща и получава мета-информация, свързана с разговора с " "даден контакт. Тук може да укажете кои състояния бихте искали да изпращате." -#: ../data/glade/preferences_window.glade.h:49 +#: ../data/glade/preferences_window.glade.h:51 msgid "" "Gajim will notify you via a popup window in the bottom right of the screen " "about contacts that just signed out" @@ -1893,11 +1913,11 @@ msgstr "" "Ще се появява съобщение за уведомяване в долния десен ъгъл на екрана при " "изключване на контакти" -#: ../data/glade/preferences_window.glade.h:51 +#: ../data/glade/preferences_window.glade.h:53 msgid "Hide all buttons in chat windows" msgstr "Скриване на всички бутони в прозорците за разговор." -#: ../data/glade/preferences_window.glade.h:52 +#: ../data/glade/preferences_window.glade.h:54 msgid "" "If checked, Gajim will allow others to detect the operation system you are " "using" @@ -1905,7 +1925,7 @@ msgstr "" "Ако тази опция е избрана, контактите ще могат да откриват операционната " "система, която използвате." -#: ../data/glade/preferences_window.glade.h:53 +#: ../data/glade/preferences_window.glade.h:55 msgid "" "If checked, Gajim will also include information about the sender of the new " "emails" @@ -1913,14 +1933,14 @@ msgstr "" "Ако тази опция е избрана, Gajim ще включва информация за подателя на новите " "писма." -#: ../data/glade/preferences_window.glade.h:54 +#: ../data/glade/preferences_window.glade.h:56 msgid "" "If checked, Gajim will change status to Away when the computer is unused." msgstr "" "Ако тази опция е избрана, Gajim ще променя състоянието на „Отсъствам“ когато " "компютърът не се използва." -#: ../data/glade/preferences_window.glade.h:55 +#: ../data/glade/preferences_window.glade.h:57 msgid "" "If checked, Gajim will change status to Not Available when the computer has " "not been used even longer" @@ -1928,7 +1948,7 @@ msgstr "" "Ако тази опция е избрана, Gajim ще променя състоянието на „Не съм на " "разположение“ когато компютърът не се използва по-дълго време." -#: ../data/glade/preferences_window.glade.h:56 +#: ../data/glade/preferences_window.glade.h:58 msgid "" "If checked, Gajim will display avatars of contacts in roster window and in " "group chats" @@ -1936,7 +1956,7 @@ msgstr "" "Ако тази опция е избрана, Gajim ще изобразява аватари на контакти в списъка " "и стаите" -#: ../data/glade/preferences_window.glade.h:57 +#: ../data/glade/preferences_window.glade.h:59 msgid "" "If checked, Gajim will display status messages of contacts under the contact " "name in roster window and in group chats" @@ -1944,28 +1964,28 @@ msgstr "" "Ако тази опция е избрана, съобщенията за състояние на контактите ще се " "показват под имената им в списъка и в стаите" -#: ../data/glade/preferences_window.glade.h:58 +#: ../data/glade/preferences_window.glade.h:60 msgid "" "If checked, Gajim will display the activity of contacts in the roster window" msgstr "" "Ако тази опция е избрана, Gajim ще изобразява дейността на контактите в " "списъка." -#: ../data/glade/preferences_window.glade.h:59 +#: ../data/glade/preferences_window.glade.h:61 msgid "" "If checked, Gajim will display the mood of contacts in the roster window" msgstr "" "Ако тази опция е избрана, Gajim ще изобразява настроението на контактите в " "списъка." -#: ../data/glade/preferences_window.glade.h:60 +#: ../data/glade/preferences_window.glade.h:62 msgid "" "If checked, Gajim will display the tunes of contacts in the roster window" msgstr "" "Ако тази опция е избрана, Gajim ще изобразява слушаната от контактите музика " "в списъка." -#: ../data/glade/preferences_window.glade.h:61 +#: ../data/glade/preferences_window.glade.h:63 msgid "" "If checked, Gajim will highlight spelling errors in input fields of chat " "windows. If no language is explicitly set via right click on the input " @@ -1976,7 +1996,7 @@ msgstr "" "натискане с десния бутон на мишката в полето за въвеждане, ще се използва " "езикът по подразбиране." -#: ../data/glade/preferences_window.glade.h:62 +#: ../data/glade/preferences_window.glade.h:64 msgid "" "If checked, Gajim will ignore incoming events from unauthorized contacts. " "Use with caution, because it blocks all messages from any contact that is " @@ -1986,7 +2006,7 @@ msgstr "" "неупълномощени контакти. Използвайте я внимателно, тъй като блокира всички " "съобщения от всеки контакт, който не е в списъка." -#: ../data/glade/preferences_window.glade.h:63 +#: ../data/glade/preferences_window.glade.h:65 msgid "" "If checked, Gajim will keep logs for encrypted messages. Please note that " "when using E2E encryption the remote party has to agree on logging, else the " @@ -1996,7 +2016,7 @@ msgstr "" "съобщение. Забележете, че при шифриране тип „E2E“ другата страна трябва да " "се съгласи, иначе съобщенията няма да бъдат запазвани." -#: ../data/glade/preferences_window.glade.h:64 +#: ../data/glade/preferences_window.glade.h:66 msgid "" "If checked, Gajim will show a notification when a new e-mail is received via " "GMail" @@ -2004,7 +2024,7 @@ msgstr "" "Ако тази опция е избрана, Gajim ще показва уведомление при получаването на " "ново писмо чрез GMail." -#: ../data/glade/preferences_window.glade.h:65 +#: ../data/glade/preferences_window.glade.h:67 msgid "" "If checked, Gajim will use protocol-specific status icons. (eg. A contact " "from MSN will have the equivalent msn icon for status online, away, busy, " @@ -2014,7 +2034,7 @@ msgstr "" "състояние (т.е. контакт от MSN ще има еквивалентната за MSN икона за " "състоянията „На линия“, „Отсъствам“, „Зает“ и т.н.)." -#: ../data/glade/preferences_window.glade.h:66 +#: ../data/glade/preferences_window.glade.h:68 msgid "" "If enabled, Gajim will not ask for a status message. The specified default " "message will be used instead." @@ -2022,7 +2042,7 @@ msgstr "" "Ако тази опция е избрана, няма да се пита за съобщение за състояние — ще се " "използва стандартно зададеното." -#: ../data/glade/preferences_window.glade.h:67 +#: ../data/glade/preferences_window.glade.h:69 msgid "" "If not disabled, Gajim will replace ascii smilies like ':)' with equivalent " "animated or static graphical emoticons" @@ -2030,50 +2050,50 @@ msgstr "" "Ако тази опция е избрана, усмивките в ASCII като „:)“ ще се изобразяват със " "съответните анимирани или статични емотикони." -#: ../data/glade/preferences_window.glade.h:68 +#: ../data/glade/preferences_window.glade.h:70 msgid "Log _encrypted chat session" msgstr "Запазване на дневник на _шифрираната сесия" -#: ../data/glade/preferences_window.glade.h:69 +#: ../data/glade/preferences_window.glade.h:71 msgid "Ma_ke message windows compact" msgstr "_Компактни прозорци за разговор" -#: ../data/glade/preferences_window.glade.h:70 +#: ../data/glade/preferences_window.glade.h:72 msgid "Ma_nage..." msgstr "_Управление…" -#: ../data/glade/preferences_window.glade.h:71 +#: ../data/glade/preferences_window.glade.h:73 msgid "" "Never\n" "Only when pending events\n" "Always" msgstr "" -#: ../data/glade/preferences_window.glade.h:74 +#: ../data/glade/preferences_window.glade.h:76 msgid "Notifications" msgstr "Уведомления" -#: ../data/glade/preferences_window.glade.h:75 +#: ../data/glade/preferences_window.glade.h:77 msgid "Notify me about contacts that sign _in" msgstr "Уведомяване за _включващи се контакти" -#: ../data/glade/preferences_window.glade.h:76 +#: ../data/glade/preferences_window.glade.h:78 msgid "Notify me about contacts that sign _out" msgstr "Уведомяване за _изключващи се контакти" -#: ../data/glade/preferences_window.glade.h:77 +#: ../data/glade/preferences_window.glade.h:79 msgid "Notify on new _GMail email" msgstr "Уведомяване при нова поща от _GMail" -#: ../data/glade/preferences_window.glade.h:78 +#: ../data/glade/preferences_window.glade.h:80 msgid "Personal Events" msgstr "Лични събития" -#: ../data/glade/preferences_window.glade.h:79 +#: ../data/glade/preferences_window.glade.h:81 msgid "Play _sounds" msgstr "Изпълнение на з_вуци" -#: ../data/glade/preferences_window.glade.h:80 +#: ../data/glade/preferences_window.glade.h:82 msgid "" "Pop it up\n" "Notify me about it\n" @@ -2083,24 +2103,24 @@ msgstr "" "Уведомяване\n" "Показване само в списъка" -#: ../data/glade/preferences_window.glade.h:83 +#: ../data/glade/preferences_window.glade.h:85 msgid "Preferences" msgstr "Настройки" -#: ../data/glade/preferences_window.glade.h:84 +#: ../data/glade/preferences_window.glade.h:86 #, fuzzy msgid "Show systray:" msgstr "Показване на събитието в областта за _уведомяване" -#: ../data/glade/preferences_window.glade.h:85 +#: ../data/glade/preferences_window.glade.h:87 msgid "Sign _in" msgstr "_Включване" -#: ../data/glade/preferences_window.glade.h:86 +#: ../data/glade/preferences_window.glade.h:88 msgid "Sign _out" msgstr "Изкл_ючване" -#: ../data/glade/preferences_window.glade.h:87 +#: ../data/glade/preferences_window.glade.h:89 msgid "" "Some messages may include rich content (formatting, colors etc). If checked, " "Gajim will just display the raw message text." @@ -2108,27 +2128,27 @@ msgstr "" "Някои съобщения могат да включват „rich content“ (форматиране, цветове и т." "н.). Ако тази опция е избрана, Gajim ще изобразява само обикновения текст." -#: ../data/glade/preferences_window.glade.h:88 +#: ../data/glade/preferences_window.glade.h:90 msgid "Sort contacts by status" msgstr "Подреждане на контактите по състояние" -#: ../data/glade/preferences_window.glade.h:89 ../src/config.py:390 +#: ../data/glade/preferences_window.glade.h:91 ../src/config.py:377 msgid "Status" msgstr "Състояние" -#: ../data/glade/preferences_window.glade.h:90 +#: ../data/glade/preferences_window.glade.h:92 msgid "Status _iconset:" msgstr "_Набор икони за състояние:" -#: ../data/glade/preferences_window.glade.h:91 +#: ../data/glade/preferences_window.glade.h:93 msgid "Style" msgstr "Стил" -#: ../data/glade/preferences_window.glade.h:92 +#: ../data/glade/preferences_window.glade.h:94 msgid "T_heme:" msgstr "_Тема:" -#: ../data/glade/preferences_window.glade.h:93 +#: ../data/glade/preferences_window.glade.h:95 #, fuzzy msgid "" "The auto away status message. If empty, Gajim will not change the current " @@ -2139,7 +2159,7 @@ msgstr "" "Съобщение за автоматично състояние „Отсъствам“. Ако е празно, няма да се " "сменя текущото съобщение." -#: ../data/glade/preferences_window.glade.h:96 +#: ../data/glade/preferences_window.glade.h:98 #, fuzzy msgid "" "The auto not available status message. If empty, Gajim will not change the " @@ -2150,103 +2170,105 @@ msgstr "" "Съобщение за автоматично състояние „Не съм на разположение“. Ако е празно, " "няма да се сменя текущото съобщение." -#: ../data/glade/preferences_window.glade.h:99 +#: ../data/glade/preferences_window.glade.h:101 msgid "Use _transports icons" msgstr "Използване на и_кони за транспортите" -#: ../data/glade/preferences_window.glade.h:100 +#: ../data/glade/preferences_window.glade.h:102 msgid "Use system _default" msgstr "Използване на стан_дартните за системата" -#: ../data/glade/preferences_window.glade.h:101 +#: ../data/glade/preferences_window.glade.h:103 msgid "When new event is received:" msgstr "При получаване на ново събитие:" -#: ../data/glade/preferences_window.glade.h:102 +#: ../data/glade/preferences_window.glade.h:104 +#, fuzzy +msgid "Your message:" +msgstr "Грешка: %s" + +#: ../data/glade/preferences_window.glade.h:105 +#, fuzzy +msgid "Your nickname:" +msgstr "Псевдоним:" + +#: ../data/glade/preferences_window.glade.h:106 msgid "_Away after:" msgstr "„_Отсъствам“ след:" -#: ../data/glade/preferences_window.glade.h:103 +#: ../data/glade/preferences_window.glade.h:107 msgid "_Browser:" msgstr "Интернет _браузър:" -#: ../data/glade/preferences_window.glade.h:104 +#: ../data/glade/preferences_window.glade.h:108 msgid "_Display chat state notifications:" msgstr "Показване на уведомления при _разговор:" -#: ../data/glade/preferences_window.glade.h:105 +#: ../data/glade/preferences_window.glade.h:109 msgid "_Emoticons:" msgstr "_Емотикони:" -#: ../data/glade/preferences_window.glade.h:106 +#: ../data/glade/preferences_window.glade.h:110 msgid "_File manager:" msgstr "_Файлов мениджър:" -#: ../data/glade/preferences_window.glade.h:107 +#: ../data/glade/preferences_window.glade.h:111 msgid "_Highlight misspelled words" msgstr "_Осветяване на неправилно изписаните думи" -#: ../data/glade/preferences_window.glade.h:108 +#: ../data/glade/preferences_window.glade.h:112 msgid "_Ignore events from contacts not in the roster" msgstr "Прене_брегване на събития от контакти, които не са в списъка" -#: ../data/glade/preferences_window.glade.h:109 +#: ../data/glade/preferences_window.glade.h:113 msgid "_Ignore rich content in incoming messages" msgstr "_Пренебрегване на излишно форматиране на входящите съобщения" -#: ../data/glade/preferences_window.glade.h:110 -msgid "_Incoming message:" -msgstr "В_ходящо съобщение:" - -#: ../data/glade/preferences_window.glade.h:111 +#: ../data/glade/preferences_window.glade.h:114 msgid "_Log status changes of contacts" msgstr "Запазване на промените на _състоянията на контактите" -#: ../data/glade/preferences_window.glade.h:112 +#: ../data/glade/preferences_window.glade.h:115 msgid "_Mail client:" msgstr "_Програма за е-поща:" -#: ../data/glade/preferences_window.glade.h:113 +#: ../data/glade/preferences_window.glade.h:116 msgid "_Not available after:" msgstr "„Не съм на _разположение“ след:" -#: ../data/glade/preferences_window.glade.h:114 +#: ../data/glade/preferences_window.glade.h:117 msgid "_Open..." msgstr "_Отваряне…" -#: ../data/glade/preferences_window.glade.h:115 -msgid "_Outgoing message:" -msgstr "_Изходящо съобщение:" - -#: ../data/glade/preferences_window.glade.h:116 +#: ../data/glade/preferences_window.glade.h:118 msgid "_Reset to Default Colors" msgstr "Възстановяване на стандартните _цветове" -#: ../data/glade/preferences_window.glade.h:117 +#: ../data/glade/preferences_window.glade.h:119 msgid "_Send chat state notifications:" msgstr "Изпращане на уведомления при _разговор:" -#: ../data/glade/preferences_window.glade.h:118 +#: ../data/glade/preferences_window.glade.h:120 msgid "_Status message:" msgstr "С_ъобщение за състояние:" -#: ../data/glade/preferences_window.glade.h:119 +#: ../data/glade/preferences_window.glade.h:121 msgid "_URL highlight:" msgstr "_Адреси:" -#: ../data/glade/preferences_window.glade.h:120 +#: ../data/glade/preferences_window.glade.h:122 msgid "_Window behavior:" msgstr "_Поведение на прозорците:" -#: ../data/glade/preferences_window.glade.h:121 +#: ../data/glade/preferences_window.glade.h:123 msgid "in _group chats" msgstr "в _стаи" -#: ../data/glade/preferences_window.glade.h:122 +#: ../data/glade/preferences_window.glade.h:124 msgid "in _roster" msgstr "в с_писъка" -#: ../data/glade/preferences_window.glade.h:123 +#: ../data/glade/preferences_window.glade.h:125 msgid "minutes" msgstr "минути" @@ -2299,7 +2321,7 @@ msgstr "Jabber ID" msgid "Order:" msgstr "Ред:" -#: ../data/glade/privacy_list_window.glade.h:12 ../src/dialogs.py:3114 +#: ../data/glade/privacy_list_window.glade.h:12 ../src/dialogs.py:3235 msgid "Privacy List" msgstr "Филтър за уединение" @@ -2443,7 +2465,7 @@ msgid "Prefix:" msgstr "Представка:" #: ../data/glade/profile_window.glade.h:25 -#: ../data/glade/vcard_information_window.glade.h:30 ../src/vcard.py:327 +#: ../data/glade/vcard_information_window.glade.h:30 ../src/vcard.py:332 msgid "Role:" msgstr "Роля:" @@ -2503,8 +2525,8 @@ msgstr "Премахване на акаунт от Gajim и от с_ървър #. Remove group #. Remove -#: ../data/glade/remove_account_window.glade.h:4 ../src/roster_window.py:5339 -#: ../src/roster_window.py:5459 ../src/roster_window.py:5588 +#: ../data/glade/remove_account_window.glade.h:4 ../src/roster_window.py:5256 +#: ../src/roster_window.py:5380 ../src/roster_window.py:5511 msgid "_Remove" msgstr "_Премахване" @@ -2523,13 +2545,13 @@ msgid "Roster Item Exchange" msgstr "" #: ../data/glade/roster_item_exchange_window.glade.h:4 -#, fuzzy -msgid "gtk-cancel" -msgstr "gtk-close" +#: ../data/glade/service_registration_window.glade.h:3 +msgid "_OK" +msgstr "_Да" #: ../data/glade/roster_item_exchange_window.glade.h:5 #, fuzzy -msgid "gtk-ok" +msgid "gtk-cancel" msgstr "gtk-close" #: ../data/glade/roster_window.glade.h:1 @@ -2588,7 +2610,7 @@ msgstr "_Действия" msgid "_Contents" msgstr "_Ръководства" -#: ../data/glade/roster_window.glade.h:18 ../src/disco.py:1357 +#: ../data/glade/roster_window.glade.h:18 ../src/disco.py:1467 msgid "_Edit" msgstr "_Редактиране" @@ -2629,11 +2651,11 @@ msgid "_Add contact" msgstr "Добавяне на _контакт" #. Information -#: ../data/glade/search_window.glade.h:4 ../src/roster_window.py:5600 +#: ../data/glade/search_window.glade.h:4 ../src/roster_window.py:5523 msgid "_Information" msgstr "_Информация" -#: ../data/glade/search_window.glade.h:5 ../src/disco.py:1213 +#: ../data/glade/search_window.glade.h:5 ../src/disco.py:1318 msgid "_Search" msgstr "_Търсене" @@ -2653,10 +2675,6 @@ msgstr "Регистриране към" msgid "_Cancel" msgstr "_Отказ" -#: ../data/glade/service_registration_window.glade.h:3 -msgid "_OK" -msgstr "_Да" - #: ../data/glade/single_message_window.glade.h:1 msgid "0" msgstr "0" @@ -2863,283 +2881,268 @@ msgstr "Ресурс:" msgid "Status:" msgstr "Състояние:" -#: ../src/adhoc_commands.py:268 +#: ../src/adhoc_commands.py:295 msgid "Cancel confirmation" msgstr "Отмяна на потвърждението" -#: ../src/adhoc_commands.py:269 +#: ../src/adhoc_commands.py:296 msgid "" "You are in process of executing command. Do you really want to cancel it?" msgstr "На път сте да изпълните команда. Наистина ли искате да я отмените?" -#: ../src/adhoc_commands.py:301 ../src/adhoc_commands.py:324 +#: ../src/adhoc_commands.py:328 ../src/adhoc_commands.py:351 msgid "Service sent malformed data" msgstr "Услугата изпрати лошо форматирани данни" -#: ../src/adhoc_commands.py:310 +#: ../src/adhoc_commands.py:337 msgid "Service changed the session identifier." msgstr "Услугата промени идентификатора на сесията." #. when stanza doesn't have error description -#: ../src/adhoc_commands.py:405 +#: ../src/adhoc_commands.py:436 msgid "Service returned an error." msgstr "Услугата върна грешка." #. For i18n -#: ../src/advanced_configuration_window.py:89 +#: ../src/advanced_configuration_window.py:91 msgid "Activated" msgstr "Активирана" -#: ../src/advanced_configuration_window.py:89 +#: ../src/advanced_configuration_window.py:91 msgid "Deactivated" msgstr "Изключена" -#: ../src/advanced_configuration_window.py:91 +#: ../src/advanced_configuration_window.py:93 msgid "Boolean" msgstr "Булев израз" -#: ../src/advanced_configuration_window.py:92 +#: ../src/advanced_configuration_window.py:94 msgid "Integer" msgstr "Число" -#: ../src/advanced_configuration_window.py:93 +#: ../src/advanced_configuration_window.py:95 msgid "Text" msgstr "Текст" -#: ../src/advanced_configuration_window.py:94 ../src/chat_control.py:838 +#: ../src/advanced_configuration_window.py:96 ../src/chat_control.py:879 msgid "Color" msgstr "Цвят" -#: ../src/advanced_configuration_window.py:105 +#: ../src/advanced_configuration_window.py:107 msgid "Preference Name" msgstr "Име на опцията" -#: ../src/advanced_configuration_window.py:111 +#: ../src/advanced_configuration_window.py:113 msgid "Value" msgstr "Стойност" -#: ../src/advanced_configuration_window.py:119 +#: ../src/advanced_configuration_window.py:121 msgid "Type" msgstr "Тип" #. we talk about option description in advanced configuration editor -#: ../src/advanced_configuration_window.py:172 +#: ../src/advanced_configuration_window.py:176 msgid "(None)" msgstr "(Няма)" -#: ../src/advanced_configuration_window.py:255 +#: ../src/advanced_configuration_window.py:259 msgid "Hidden" msgstr "Скрита" -#: ../src/atom_window.py:110 +#: ../src/atom_window.py:119 #, fuzzy, python-format -msgid "You have received new entries (and %(count)d not displayed):" -msgstr "Получихте нов запис:" +msgid "You have received new entries (and %d not displayed):" +msgid_plural "You have received new entries (and %d not displayed):" +msgstr[0] "Получихте нов запис:" +msgstr[1] "Получихте нов запис:" #. the next script, executed in the "po" directory, #. generates the following list. #. #!/bin/sh #. LANG=$(for i in *.po; do j=${i/.po/}; echo -n "_('"$j"')":" '"$j"', " ; done) #. echo "{_('en'):'en'",$LANG"}" -#: ../src/chat_control.py:74 +#: ../src/chat_control.py:75 msgid "English" msgstr "английски" -#: ../src/chat_control.py:74 +#: ../src/chat_control.py:75 msgid "Belarusian" msgstr "белоруски" -#: ../src/chat_control.py:74 +#: ../src/chat_control.py:75 msgid "Bulgarian" msgstr "български" -#: ../src/chat_control.py:74 +#: ../src/chat_control.py:75 msgid "Breton" msgstr "бретонски" -#: ../src/chat_control.py:74 +#: ../src/chat_control.py:75 msgid "Czech" msgstr "чешки" -#: ../src/chat_control.py:74 +#: ../src/chat_control.py:75 msgid "German" msgstr "немски" -#: ../src/chat_control.py:74 +#: ../src/chat_control.py:75 msgid "Greek" msgstr "гръцки" -#: ../src/chat_control.py:74 +#: ../src/chat_control.py:75 msgid "British" msgstr "британски английски" -#: ../src/chat_control.py:74 +#: ../src/chat_control.py:75 msgid "Esperanto" msgstr "есперанто" -#: ../src/chat_control.py:74 +#: ../src/chat_control.py:75 msgid "Spanish" msgstr "испански" -#: ../src/chat_control.py:74 +#: ../src/chat_control.py:75 msgid "Basque" msgstr "баски" -#: ../src/chat_control.py:74 +#: ../src/chat_control.py:75 msgid "French" msgstr "френски" -#: ../src/chat_control.py:74 +#: ../src/chat_control.py:75 msgid "Croatian" msgstr "хърватски" -#: ../src/chat_control.py:74 +#: ../src/chat_control.py:75 msgid "Italian" msgstr "италиански" -#: ../src/chat_control.py:74 +#: ../src/chat_control.py:75 msgid "Norwegian (b)" msgstr "норвежки (Bokmål)" -#: ../src/chat_control.py:74 +#: ../src/chat_control.py:75 msgid "Dutch" msgstr "холандски" -#: ../src/chat_control.py:74 +#: ../src/chat_control.py:75 msgid "Norwegian" msgstr "норвежки (Nynorsk)" -#: ../src/chat_control.py:74 +#: ../src/chat_control.py:75 msgid "Polish" msgstr "полски" -#: ../src/chat_control.py:74 +#: ../src/chat_control.py:75 msgid "Portuguese" msgstr "португалски" -#: ../src/chat_control.py:74 +#: ../src/chat_control.py:75 msgid "Brazilian Portuguese" msgstr "бразилски португалски" -#: ../src/chat_control.py:74 +#: ../src/chat_control.py:75 msgid "Russian" msgstr "руски" -#: ../src/chat_control.py:74 +#: ../src/chat_control.py:75 msgid "Serbian" msgstr "сръбски" -#: ../src/chat_control.py:74 +#: ../src/chat_control.py:75 msgid "Slovak" msgstr "словашки" -#: ../src/chat_control.py:74 +#: ../src/chat_control.py:75 msgid "Swedish" msgstr "шведски" -#: ../src/chat_control.py:74 +#: ../src/chat_control.py:75 msgid "Chinese (Ch)" msgstr "китайски" -#: ../src/chat_control.py:426 +#: ../src/chat_control.py:446 msgid "Spelling language" msgstr "Език за проверка на правописа" #. we are not connected -#: ../src/chat_control.py:454 ../src/chat_control.py:642 +#: ../src/chat_control.py:478 ../src/chat_control.py:670 msgid "A connection is not available" msgstr "В момента няма връзка" -#: ../src/chat_control.py:455 ../src/chat_control.py:643 +#: ../src/chat_control.py:479 ../src/chat_control.py:671 msgid "Your message can not be sent until you are connected." msgstr "Съобщението не може да бъде изпратено, докато не се свържете." -#: ../src/chat_control.py:820 +#: ../src/chat_control.py:861 #, fuzzy msgid "Underline" msgstr "Неопределен" -#: ../src/chat_control.py:821 +#: ../src/chat_control.py:862 #, fuzzy msgid "Strike" msgstr "Болен" -#: ../src/chat_control.py:844 +#: ../src/chat_control.py:885 msgid "Font" msgstr "" -#: ../src/chat_control.py:853 +#: ../src/chat_control.py:894 #, fuzzy msgid "Clear formating" msgstr "Информация за контакта" -#: ../src/chat_control.py:925 +#: ../src/chat_control.py:972 msgid "Really send file?" msgstr "Наистина ли да се изпрати файла?" -#: ../src/chat_control.py:926 +#: ../src/chat_control.py:973 #, python-format msgid "If you send a file to %s, he/she will know your real Jabber ID." msgstr "Ако изпратите файл на %s, той/тя ще разбере истинския ви Jabber ID." -#: ../src/chat_control.py:1317 ../src/chat_control.py:1718 +#: ../src/chat_control.py:1411 ../src/chat_control.py:1864 msgid "GPG encryption enabled" msgstr "Шифрирането чрез GPG е включено" #. Add to roster -#: ../src/chat_control.py:1346 ../src/common/contacts.py:113 -#: ../src/common/helpers.py:55 ../src/common/helpers.py:231 -#: ../src/conversation_textview.py:903 ../src/dialogs.py:1031 -#: ../src/dialogs.py:1882 ../src/dialogs.py:1907 ../src/gajim.py:999 -#: ../src/gajim.py:1750 ../src/gui_menu_builder.py:243 -#: ../src/gui_menu_builder.py:385 ../src/roster_window.py:988 -#: ../src/roster_window.py:1622 ../src/roster_window.py:1624 -#: ../src/roster_window.py:1926 ../src/roster_window.py:3187 -#: ../src/roster_window.py:3213 +#: ../src/chat_control.py:1436 ../src/common/contacts.py:150 +#: ../src/common/contacts.py:253 ../src/common/helpers.py:55 +#: ../src/common/helpers.py:231 ../src/conversation_textview.py:916 +#: ../src/dialogs.py:1060 ../src/dialogs.py:1973 ../src/dialogs.py:2002 +#: ../src/gui_interface.py:610 ../src/gui_menu_builder.py:255 +#: ../src/gui_menu_builder.py:398 ../src/roster_window.py:1576 +#: ../src/roster_window.py:1578 ../src/roster_window.py:1893 +#: ../src/roster_window.py:3194 ../src/roster_window.py:3220 msgid "Not in Roster" msgstr "Не е в списъка" -#: ../src/chat_control.py:1359 +#: ../src/chat_control.py:1480 #, fuzzy msgid "This contact does not support file transfer." msgstr "Списък с активни, завършили и прекъснати файлови трансфери" -#: ../src/chat_control.py:1362 +#: ../src/chat_control.py:1483 msgid "You need to know the real JID of the contact to send him or her a file." msgstr "" -#: ../src/chat_control.py:1469 ../src/tooltips.py:626 -msgid "Unknown Artist" -msgstr "Неизвестен изпълнител" - -#: ../src/chat_control.py:1471 ../src/tooltips.py:631 -msgid "Unknown Title" -msgstr "Неизвестно заглавие" - -#: ../src/chat_control.py:1473 ../src/tooltips.py:636 -msgid "Unknown Source" -msgstr "Неизвестен източник" - -#: ../src/chat_control.py:1476 ../src/tooltips.py:638 +#: ../src/chat_control.py:1555 #, python-format -msgid "" -"\"%(title)s\" by %(artist)s\n" -"from %(source)s" +msgid "%(type)s state : %(state)s, reason: %(reason)s" msgstr "" -"\"%(title)s\" на %(artist)s\n" -"от %(source)s" -#: ../src/chat_control.py:1613 +#: ../src/chat_control.py:1720 #, python-format msgid "%(nickname)s from group chat %(room_name)s" msgstr "%(nickname)s от стая %(room_name)s" #. No key assigned nor a key is used by remote contact -#: ../src/chat_control.py:1698 ../src/dialogs.py:4484 +#: ../src/chat_control.py:1844 ../src/dialogs.py:4627 msgid "No GPG key assigned" msgstr "Няма зададен ключ на GPG" -#: ../src/chat_control.py:1699 +#: ../src/chat_control.py:1845 msgid "" "No GPG key is assigned to this contact. So you cannot encrypt messages with " "GPG." @@ -3147,50 +3150,50 @@ msgstr "" "Няма зададен ключ на GPG за този контакт, така че не може да шифрирате " "съобщенията с GPG." -#: ../src/chat_control.py:1708 +#: ../src/chat_control.py:1854 msgid "GPG encryption disabled" msgstr "Шифрирането чрез GPG е изключено" -#: ../src/chat_control.py:1734 +#: ../src/chat_control.py:1880 msgid "Session WILL be logged" msgstr "ЩЕ СЕ запазва дневник за сесията" -#: ../src/chat_control.py:1736 +#: ../src/chat_control.py:1882 msgid "Session WILL NOT be logged" msgstr "НЯМА да се запазва дневник за сесията" #. encryption %s active -#: ../src/chat_control.py:1750 +#: ../src/chat_control.py:1899 msgid "is" msgstr "е" -#: ../src/chat_control.py:1750 +#: ../src/chat_control.py:1899 msgid "is NOT" msgstr "НЕ е" #. chat session %s be logged -#: ../src/chat_control.py:1752 +#: ../src/chat_control.py:1901 msgid "will" msgstr "Ще" -#: ../src/chat_control.py:1752 +#: ../src/chat_control.py:1901 msgid "will NOT" msgstr "НЯМА да" #. About encrypted chat session -#: ../src/chat_control.py:1756 +#: ../src/chat_control.py:1905 msgid "and authenticated" msgstr "и удостоверяването е успешно" #. About encrypted chat session -#: ../src/chat_control.py:1760 +#: ../src/chat_control.py:1909 msgid "and NOT authenticated" msgstr "и удостоверяването НЕ Е успешно" #. status will become 'is' or 'is not', authentificaed will become #. 'and authentificated' or 'and not authentificated', logged will become #. 'will' or 'will not' -#: ../src/chat_control.py:1766 +#: ../src/chat_control.py:1915 #, python-format msgid "" "%(type)s encryption %(status)s active %(authenticated)s.\n" @@ -3199,23 +3202,23 @@ msgstr "" "Шифрирането чрез %(type)s %(status)s включено %(authenticated)s.\n" "%(logged)s се запазва дневник за сесията." -#: ../src/chat_control.py:1906 +#: ../src/chat_control.py:2055 msgid "Session negotiation cancelled" msgstr "Договорката за сесията отменена" -#: ../src/chat_control.py:1913 +#: ../src/chat_control.py:2064 msgid "This session is encrypted" msgstr "Тази сесия е шифрирана" -#: ../src/chat_control.py:1916 +#: ../src/chat_control.py:2067 msgid " and WILL be logged" msgstr " и ЩЕ СЕ запазва дневник" -#: ../src/chat_control.py:1918 +#: ../src/chat_control.py:2069 msgid " and WILL NOT be logged" msgstr " и НЯМА да се запазва дневник" -#: ../src/chat_control.py:1923 +#: ../src/chat_control.py:2074 msgid "" "Remote contact's identity not verified. Click the shield button for more " "details." @@ -3223,25 +3226,25 @@ msgstr "" "Идентичността на отсрещния контакт не е потвърдена. Натиснете бутона със " "щита за повече информация." -#: ../src/chat_control.py:1925 +#: ../src/chat_control.py:2076 msgid "E2E encryption disabled" msgstr "Шифрирането чрез E2E е изключено" -#: ../src/chat_control.py:1959 ../src/chat_control.py:1972 +#: ../src/chat_control.py:2113 ../src/chat_control.py:2126 msgid "The following message was NOT encrypted" msgstr "Следното съобщение НЕ БЕШЕ шифрирано" -#: ../src/chat_control.py:1965 +#: ../src/chat_control.py:2119 msgid "The following message was encrypted" msgstr "Следното съобщение беше шифрирано" #. %s is being replaced in the code with JID -#: ../src/chat_control.py:2235 +#: ../src/chat_control.py:2388 #, python-format msgid "You just received a new message from \"%s\"" msgstr "Току-що получихте ново съобщение от „%s“" -#: ../src/chat_control.py:2236 +#: ../src/chat_control.py:2389 msgid "" "If you close this tab and you have history disabled, this message will be " "lost." @@ -3249,15 +3252,15 @@ msgstr "" "Ако затворите този прозорец и нямате включена опция за запазване на " "историята, съобщението ще бъде загубено." -#: ../src/chat_control.py:2391 ../src/common/connection_handlers.py:2073 -#: ../src/common/connection_handlers.py:2119 -#: ../src/common/connection_handlers.py:2347 -#: ../src/common/connection_handlers.py:2489 ../src/common/connection.py:1368 -#: ../src/gajim.py:154 ../src/session.py:130 +#: ../src/chat_control.py:2542 ../src/common/connection_handlers.py:2100 +#: ../src/common/connection_handlers.py:2146 +#: ../src/common/connection_handlers.py:2338 +#: ../src/common/connection_handlers.py:2483 ../src/common/connection.py:420 +#: ../src/gajim.py:154 ../src/session.py:134 msgid "Database Error" msgstr "Грешка в базата от данни" -#: ../src/chat_control.py:2392 +#: ../src/chat_control.py:2543 #, python-format msgid "" "The database file (%s) cannot be read. Try to repair it or remove it (all " @@ -3266,7 +3269,7 @@ msgstr "" "Файлът „%s“ от базата от данни не може да бъде прочетен. Опитайте се да го " "поправите или изтриете (цялата история ще бъде загубена)." -#: ../src/chat_control.py:2622 +#: ../src/chat_control.py:2784 #, python-format msgid "%(name)s is now %(status)s" msgstr "%(name)s вече е %(status)s" @@ -3275,23 +3278,23 @@ msgstr "%(name)s вече е %(status)s" msgid "creating logs database" msgstr "създаване на база от данни за разговорите" -#: ../src/common/check_paths.py:128 ../src/common/check_paths.py:139 -#: ../src/common/check_paths.py:146 +#: ../src/common/check_paths.py:129 ../src/common/check_paths.py:140 +#: ../src/common/check_paths.py:147 #, python-format msgid "%s is a file but it should be a directory" msgstr "%s e файл, а би трябвало да е папка" -#: ../src/common/check_paths.py:129 ../src/common/check_paths.py:140 -#: ../src/common/check_paths.py:147 ../src/common/check_paths.py:155 +#: ../src/common/check_paths.py:130 ../src/common/check_paths.py:141 +#: ../src/common/check_paths.py:148 ../src/common/check_paths.py:156 msgid "Gajim will now exit" msgstr "Спиране на програмата" -#: ../src/common/check_paths.py:154 +#: ../src/common/check_paths.py:155 #, python-format msgid "%s is a directory but should be a file" msgstr "%s e папка, а би трябвало да е файл" -#: ../src/common/check_paths.py:170 +#: ../src/common/check_paths.py:171 #, python-format msgid "creating %s directory" msgstr "създаване на папка %s" @@ -3354,10 +3357,10 @@ msgid "Choose the groupchats you want to leave" msgstr "Изберете стаите, които искате да напуснете" #. Make special context menu if group is Groupchats -#: ../src/common/commands.py:205 ../src/common/contacts.py:94 -#: ../src/common/helpers.py:55 ../src/roster_window.py:812 -#: ../src/roster_window.py:1626 ../src/roster_window.py:1628 -#: ../src/roster_window.py:5227 +#: ../src/common/commands.py:205 ../src/common/contacts.py:131 +#: ../src/common/helpers.py:55 ../src/roster_window.py:809 +#: ../src/roster_window.py:1580 ../src/roster_window.py:1582 +#: ../src/roster_window.py:5144 msgid "Groupchats" msgstr "Стаи" @@ -3472,9 +3475,9 @@ msgstr "" "свиват автоматично." #. sorted alphanum -#: ../src/common/config.py:106 ../src/common/config.py:483 -#: ../src/common/optparser.py:245 ../src/common/optparser.py:463 -#: ../src/common/optparser.py:497 ../src/gajim.py:3471 +#: ../src/common/config.py:106 ../src/common/config.py:482 +#: ../src/common/optparser.py:288 ../src/common/optparser.py:465 +#: ../src/common/optparser.py:499 ../src/gui_interface.py:3251 msgid "default" msgstr "по подразбиране" @@ -4155,7 +4158,7 @@ msgstr "" msgid "Jabberd2 workaround" msgstr "Заобикалка заради Jabberd2" -#: ../src/common/config.py:331 +#: ../src/common/config.py:330 msgid "" "If checked, Gajim will use your IP and proxies defined in " "file_transfer_proxies option for file transfer." @@ -4163,15 +4166,15 @@ msgstr "" "Ако тази опция е избрана, ще се използва вашия IP адрес и сървърите-" "посредници, указани в опцията file_transfer_proxies, за файлови трансфери." -#: ../src/common/config.py:345 +#: ../src/common/config.py:344 msgid "Answer to receipt requests" msgstr "Отговор на заявки" -#: ../src/common/config.py:346 +#: ../src/common/config.py:345 msgid "Sent receipt requests" msgstr "Изпратени заявки" -#: ../src/common/config.py:354 +#: ../src/common/config.py:353 msgid "" "When negotiating an encrypted session, should Gajim assume you want your " "messages to be logged?" @@ -4179,111 +4182,111 @@ msgstr "" "Когато се договаря шифрирана сесия, да се приема ли, че искате собствените " "съобщения да се запазват в дневник?" -#: ../src/common/config.py:417 +#: ../src/common/config.py:416 msgid "Is OpenPGP enabled for this contact?" msgstr "Активиран ли е OpenPGP за този контакт?" -#: ../src/common/config.py:418 +#: ../src/common/config.py:417 msgid "" "Should Gajim automatically start an encrypted session with this contact when " "possible?" msgstr "Да се започва ли шифрирана сесия с този контакт, когато е възможно?" -#: ../src/common/config.py:419 ../src/common/config.py:422 +#: ../src/common/config.py:418 ../src/common/config.py:421 msgid "Language for which we want to check misspelled words" msgstr "Език, за който желаете да се проверяват сгрешените думи." -#: ../src/common/config.py:428 +#: ../src/common/config.py:427 msgid "all or space separated status" msgstr "„all“ или състояния, разделени с интервал" -#: ../src/common/config.py:429 +#: ../src/common/config.py:428 msgid "'yes', 'no', or 'both'" msgstr "„yes“, „no“ или „both“" -#: ../src/common/config.py:430 ../src/common/config.py:432 -#: ../src/common/config.py:433 ../src/common/config.py:436 -#: ../src/common/config.py:437 +#: ../src/common/config.py:429 ../src/common/config.py:431 +#: ../src/common/config.py:432 ../src/common/config.py:435 +#: ../src/common/config.py:436 msgid "'yes', 'no' or ''" msgstr "„yes“, „no“ или „“" -#: ../src/common/config.py:443 ../src/common/pep.py:160 +#: ../src/common/config.py:442 ../src/common/pep.py:157 msgid "Sleeping" msgstr "Спя" -#: ../src/common/config.py:444 +#: ../src/common/config.py:443 msgid "Back soon" msgstr "Връщам се скоро" -#: ../src/common/config.py:444 +#: ../src/common/config.py:443 msgid "Back in some minutes." msgstr "Ще се върна след малко." -#: ../src/common/config.py:445 ../src/common/pep.py:130 +#: ../src/common/config.py:444 ../src/common/pep.py:127 msgid "Eating" msgstr "Хапвам" -#: ../src/common/config.py:445 +#: ../src/common/config.py:444 msgid "I'm eating, so leave me a message." msgstr "Хапвам, така че ми оставете съобщение." -#: ../src/common/config.py:446 +#: ../src/common/config.py:445 msgid "Movie" msgstr "Филм" -#: ../src/common/config.py:446 +#: ../src/common/config.py:445 msgid "I'm watching a movie." msgstr "Гледам филм." -#: ../src/common/config.py:447 ../src/common/pep.py:189 +#: ../src/common/config.py:446 ../src/common/pep.py:186 msgid "Working" msgstr "Работя" -#: ../src/common/config.py:447 +#: ../src/common/config.py:446 msgid "I'm working." msgstr "Работя." -#: ../src/common/config.py:448 +#: ../src/common/config.py:447 msgid "Phone" msgstr "Телефон" -#: ../src/common/config.py:448 +#: ../src/common/config.py:447 msgid "I'm on the phone." msgstr "Говоря по телефона." -#: ../src/common/config.py:449 +#: ../src/common/config.py:448 msgid "Out" msgstr "Навън" -#: ../src/common/config.py:449 +#: ../src/common/config.py:448 msgid "I'm out enjoying life." msgstr "Наслаждавам се на живота навън." -#: ../src/common/config.py:460 +#: ../src/common/config.py:459 msgid "I'm available." msgstr "На линия съм." -#: ../src/common/config.py:461 +#: ../src/common/config.py:460 msgid "I'm free for chat." msgstr "Свободен за разговор." -#: ../src/common/config.py:462 ../src/config.py:1419 +#: ../src/common/config.py:461 ../src/config.py:1478 msgid "Be right back." msgstr "Сега се връщам." -#: ../src/common/config.py:463 +#: ../src/common/config.py:462 msgid "I'm not available." msgstr "Не съм на разположение." -#: ../src/common/config.py:464 +#: ../src/common/config.py:463 msgid "Do not disturb." msgstr "Не ме притеснявайте." -#: ../src/common/config.py:465 ../src/common/config.py:466 +#: ../src/common/config.py:464 ../src/common/config.py:465 msgid "Bye!" msgstr "Довиждане!" -#: ../src/common/config.py:476 +#: ../src/common/config.py:475 msgid "" "Sound to play when a group chat message contains one of the words in " "muc_highlight_words, or when a group chat message contains your nickname." @@ -4291,99 +4294,98 @@ msgstr "" "Звукът, който да се възпроизвежда, когато в стаята се изпише дума от " "„muc_higlighted_words“ или когато съобщение съдържа псевдонима ви." -#: ../src/common/config.py:477 +#: ../src/common/config.py:476 msgid "Sound to play when any MUC message arrives." msgstr "Звук за изпълнение при получаване на каквото и да е съобщение в стая." -#: ../src/common/config.py:486 ../src/common/optparser.py:259 +#: ../src/common/config.py:485 ../src/common/optparser.py:302 msgid "green" msgstr "зелена" -#: ../src/common/config.py:490 ../src/common/optparser.py:245 +#: ../src/common/config.py:489 ../src/common/optparser.py:288 msgid "grocery" msgstr "колониална" -#: ../src/common/config.py:494 +#: ../src/common/config.py:493 msgid "human" msgstr "хуманна" -#: ../src/common/config.py:498 +#: ../src/common/config.py:497 msgid "marine" msgstr "морска" -#: ../src/common/connection_handlers.py:76 -#: ../src/common/zeroconf/connection_handlers_zeroconf.py:52 +#: ../src/common/connection_handlers.py:83 +#: ../src/common/zeroconf/connection_handlers_zeroconf.py:53 msgid "Unable to load idle module" msgstr "Неуспех при зареждането на модула „idle“" -#: ../src/common/connection_handlers.py:244 -#: ../src/common/zeroconf/connection_handlers_zeroconf.py:94 +#: ../src/common/connection_handlers.py:251 msgid "Wrong host" msgstr "Грешен хост" -#: ../src/common/connection_handlers.py:245 +#: ../src/common/connection_handlers.py:252 msgid "Invalid local address? :-O" msgstr "Невалиден локален адрес? :-O" -#: ../src/common/connection_handlers.py:678 +#: ../src/common/connection_handlers.py:696 #, python-format msgid "Registration information for transport %s has not arrived in time" msgstr "Информацията за регистрация за транспорт %s не пристигна навреме" -#: ../src/common/connection_handlers.py:685 +#: ../src/common/connection_handlers.py:703 #, fuzzy msgid "Registration succeeded" msgstr "Регистриране в %s" -#: ../src/common/connection_handlers.py:686 +#: ../src/common/connection_handlers.py:704 #, python-format msgid "Registration with agent %s succeeded" msgstr "" -#: ../src/common/connection_handlers.py:688 +#: ../src/common/connection_handlers.py:706 #, fuzzy msgid "Registration failed" msgstr "Неуспех при свързването" -#: ../src/common/connection_handlers.py:688 +#: ../src/common/connection_handlers.py:706 #, python-format msgid "" "Registration with agent %(agent)s failed with error %(error)s: %(error_msg)s" msgstr "" -#: ../src/common/connection_handlers.py:990 -#: ../src/common/connection_handlers.py:2071 -#: ../src/common/connection_handlers.py:2117 -#: ../src/common/connection_handlers.py:2345 -#: ../src/common/connection_handlers.py:2487 ../src/common/connection.py:1366 -#: ../src/gajim.py:380 +#: ../src/common/connection_handlers.py:1008 +#: ../src/common/connection_handlers.py:2098 +#: ../src/common/connection_handlers.py:2144 +#: ../src/common/connection_handlers.py:2336 +#: ../src/common/connection_handlers.py:2481 ../src/common/connection.py:418 +#: ../src/gajim.py:354 msgid "Disk Write Error" msgstr "Грешка при запис" -#: ../src/common/connection_handlers.py:1207 ../src/common/connection.py:935 +#: ../src/common/connection_handlers.py:1225 ../src/common/connection.py:1373 msgid "Invisibility not supported" msgstr "Състоянието „Невидим“ не се поддържа." -#: ../src/common/connection_handlers.py:1208 ../src/common/connection.py:936 +#: ../src/common/connection_handlers.py:1226 ../src/common/connection.py:1374 #, python-format msgid "Account %s doesn't support invisibility." msgstr "Акаунтът „%s“ не поддържа невидимост." -#: ../src/common/connection_handlers.py:1892 ../src/common/connection.py:1181 -#: ../src/config.py:1875 ../src/config.py:1884 ../src/config.py:1943 -#: ../src/config.py:3281 ../src/dataforms_widget.py:555 ../src/dialogs.py:2665 +#: ../src/common/connection_handlers.py:1919 ../src/common/connection.py:233 +#: ../src/config.py:1940 ../src/config.py:1949 ../src/config.py:2008 +#: ../src/config.py:3360 ../src/dataforms_widget.py:577 ../src/dialogs.py:2781 msgid "Invalid Jabber ID" msgstr "Невалиден Jabber ID" -#: ../src/common/connection_handlers.py:1893 +#: ../src/common/connection_handlers.py:1920 msgid "A message from a non-valid JID arrived, it has been ignored." msgstr "" -#: ../src/common/connection_handlers.py:2074 -#: ../src/common/connection_handlers.py:2120 -#: ../src/common/connection_handlers.py:2348 -#: ../src/common/connection_handlers.py:2490 ../src/common/connection.py:1369 -#: ../src/gajim.py:155 ../src/session.py:131 +#: ../src/common/connection_handlers.py:2101 +#: ../src/common/connection_handlers.py:2147 +#: ../src/common/connection_handlers.py:2339 +#: ../src/common/connection_handlers.py:2484 ../src/common/connection.py:421 +#: ../src/gajim.py:155 ../src/session.py:135 #, python-format msgid "" "The database file (%s) cannot be read. Try to repair it (see http://trac." @@ -4393,7 +4395,7 @@ msgstr "" "поправите (вижте http://trac.gajim.org/wiki/DatabaseBackup) или изтриете " "(цялата история ще бъде загубена)." -#: ../src/common/connection_handlers.py:2200 +#: ../src/common/connection_handlers.py:2191 #, python-format msgid "Nickname not allowed: %s" msgstr "Псевдонимът не е позволен: %s" @@ -4401,78 +4403,78 @@ msgstr "Псевдонимът не е позволен: %s" #. maximum user number reached #. we are banned #. group chat does not exist -#: ../src/common/connection_handlers.py:2295 +#: ../src/common/connection_handlers.py:2286 +#: ../src/common/connection_handlers.py:2294 +#: ../src/common/connection_handlers.py:2300 #: ../src/common/connection_handlers.py:2303 -#: ../src/common/connection_handlers.py:2309 -#: ../src/common/connection_handlers.py:2312 -#: ../src/common/connection_handlers.py:2315 -#: ../src/common/connection_handlers.py:2319 ../src/gajim.py:523 +#: ../src/common/connection_handlers.py:2306 +#: ../src/common/connection_handlers.py:2310 ../src/gui_interface.py:128 msgid "Unable to join group chat" msgstr "Неуспех при влизането в стаята" -#: ../src/common/connection_handlers.py:2296 +#: ../src/common/connection_handlers.py:2287 #, python-format msgid "Maximum number of users for %s has been reached" msgstr "" -#: ../src/common/connection_handlers.py:2304 +#: ../src/common/connection_handlers.py:2295 #, python-format msgid "You are banned from group chat %s." msgstr "Вие сте отлъчени от стаята %s." -#: ../src/common/connection_handlers.py:2310 +#: ../src/common/connection_handlers.py:2301 #, python-format msgid "Group chat %s does not exist." msgstr "Стаята %s не съществува." -#: ../src/common/connection_handlers.py:2313 +#: ../src/common/connection_handlers.py:2304 msgid "Group chat creation is restricted." msgstr "Създаването на стаи е ограничено." -#: ../src/common/connection_handlers.py:2316 +#: ../src/common/connection_handlers.py:2307 #, python-format msgid "Your registered nickname must be used in group chat %s." msgstr "Трябва да се използва регистрирания ви псевдоним в стаята %s." -#: ../src/common/connection_handlers.py:2320 +#: ../src/common/connection_handlers.py:2311 #, python-format msgid "You are not in the members list in groupchat %s." msgstr "Не сте в списъка с членове на стаята %s." #. Room has been destroyed. see #. http://www.xmpp.org/extensions/xep-0045.html#destroyroom -#: ../src/common/connection_handlers.py:2363 +#: ../src/common/connection_handlers.py:2354 msgid "Room has been destroyed" msgstr "Стаята е била унищожена" -#: ../src/common/connection_handlers.py:2371 +#: ../src/common/connection_handlers.py:2362 #, python-format msgid "You can join this room instead: %s" msgstr "Вместо това може да влезете в тази стая: %s" -#: ../src/common/connection_handlers.py:2402 +#: ../src/common/connection_handlers.py:2393 msgid "I would like to add you to my roster." msgstr "" "Бих искал(а) да ви добавя към списъка си. I would like to add you to my " "roster." #. BE CAREFUL: no con.updateRosterItem() in a callback -#: ../src/common/connection_handlers.py:2423 +#: ../src/common/connection_handlers.py:2414 #, python-format msgid "we are now subscribed to %s" msgstr "вече сме записани за %s" -#: ../src/common/connection_handlers.py:2425 +#: ../src/common/connection_handlers.py:2416 #, python-format msgid "unsubscribe request from %s" msgstr "искане за отписване от %s" -#: ../src/common/connection_handlers.py:2427 +#: ../src/common/connection_handlers.py:2418 #, python-format msgid "we are now unsubscribed from %s" msgstr "вече сме отписани от %s" -#: ../src/common/connection_handlers.py:2619 +#: ../src/common/connection_handlers.py:2613 #, python-format msgid "" "JID %s is not RFC compliant. It will not be added to your roster. Use roster " @@ -4614,148 +4616,27 @@ msgstr "Основната употреба не включва подписва msgid "Application verification failure" msgstr "Грешка на приложението за проверка" -#: ../src/common/connection.py:278 -#: ../src/common/zeroconf/connection_zeroconf.py:215 -#, python-format -msgid "Connection with account \"%s\" has been lost" -msgstr "Връзката на акаунт „%s“ се разпадна" - -#: ../src/common/connection.py:279 -msgid "Reconnect manually." -msgstr "Свържете се наново." - -#: ../src/common/connection.py:290 -#, python-format -msgid "Server %(name)s answered wrongly to register request: %(error)s" -msgstr "" -"Сървърът „%(name)s“ отговори погрешно на запитването за регистрация: %(error)" -"s" - -#: ../src/common/connection.py:324 -#, python-format -msgid "Server %s provided a different registration form" -msgstr "Сървърът „%s“ предостави различна форма за регистрация" - -#: ../src/common/connection.py:337 -#, python-format -msgid "Unknown SSL error: %d" -msgstr "Неизвестна грешка на SSL: %d" - -#. wrong answer -#: ../src/common/connection.py:352 -msgid "Invalid answer" -msgstr "Невалиден отговор" - -#: ../src/common/connection.py:353 -#, python-format -msgid "Transport %(name)s answered wrongly to register request: %(error)s" -msgstr "" -"Транспортът „%(name)s“ отговори погрешно на запитването за регистрация: %" -"(error)s" - -#: ../src/common/connection.py:636 ../src/common/connection.py:765 -#: ../src/common/connection.py:1526 -#: ../src/common/zeroconf/connection_zeroconf.py:249 -#, python-format -msgid "Could not connect to \"%s\"" -msgstr "Неуспех при свързване с „%s“" - -#: ../src/common/connection.py:637 ../src/gajim.py:1094 -msgid "Check your connection or try again later." -msgstr "Проверете връзката или опитайте отново по-късно." - -#: ../src/common/connection.py:642 -#, fuzzy, python-format -msgid "Server replied: %s" -msgstr "Запазен в: %s" - -#: ../src/common/connection.py:655 -msgid "Connection to proxy failed" -msgstr "Неуспех при свързването със сървъра-посредник" - -#: ../src/common/connection.py:686 ../src/common/connection.py:745 -#, python-format -msgid "Could not connect to account %s" -msgstr "Неуспех при свързване с акаунт „%s“" - -#: ../src/common/connection.py:687 ../src/common/connection.py:746 -#, python-format -msgid "Connection with account %s has been lost. Retry connecting." -msgstr "Връзката на акаунт „%s“ се разпадна. Опит за повторно свързване." - -#: ../src/common/connection.py:712 -#, python-format -msgid "The authenticity of the %s certificate could be invalid." -msgstr "Автентичността на сертификата на %s може да е под въпрос." - -#: ../src/common/connection.py:715 -#, python-format -msgid "" -"\n" -"SSL Error: %s" -msgstr "" -"\n" -"Грешка на SSL: %s" - -#: ../src/common/connection.py:717 -#, python-format -msgid "" -"\n" -"Unknown SSL error: %d" -msgstr "" -"\n" -"Неизвестна грешка на SSL: %d" - -#: ../src/common/connection.py:766 -msgid "Check your connection or try again later" -msgstr "Проверете връзката или опитайте отново по-късно" - -#: ../src/common/connection.py:794 -#, python-format -msgid "Authentication failed with \"%s\"" -msgstr "Неуспех при удостоверяването с „%s“" - -#: ../src/common/connection.py:796 -msgid "Please check your login and password for correctness." -msgstr "Проверете дали името и паролата са правилни." - -#: ../src/common/connection.py:862 -msgid "Error while removing privacy list" -msgstr "Грешка при премахването на списъка за уединение" - -#: ../src/common/connection.py:863 -#, python-format -msgid "" -"Privacy list %s has not been removed. It is maybe active in one of your " -"connected resources. Deactivate it and try again." -msgstr "" -"Списъкът за уединение „%s“ не беше премахнат. Навярно е активен в някой от " -"свързаните ви ресурси. Изключете го и опитайте отново." - -#: ../src/common/connection.py:1182 ../src/dialogs.py:2666 +#: ../src/common/connection.py:234 ../src/dialogs.py:2782 #, fuzzy, python-format msgid "It is not possible to send a message to %s, this JID is not valid." msgstr "Не е възможно да бъдат изпращани празни файлове" -#: ../src/common/connection.py:1204 -#: ../src/common/zeroconf/connection_zeroconf.py:389 +#: ../src/common/connection.py:256 msgid "Neither the remote presence is signed, nor a key was assigned." msgstr "Нито отдалеченото присъствие е подписано, нито има зададен ключ." -#: ../src/common/connection.py:1206 -#: ../src/common/zeroconf/connection_zeroconf.py:391 +#: ../src/common/connection.py:259 #, python-format msgid "The contact's key (%s) does not match the key assigned in Gajim." msgstr "Ключът на контакта (%s) не съвпада със зададения в Gajim." #. we're not english #. one in locale and one en -#: ../src/common/connection.py:1254 +#: ../src/common/connection.py:307 msgid "[This message is *encrypted* (See :XEP:`27`]" msgstr "[Това съобщение е *шифрирано* (вижте XEP:„27“)]" -#: ../src/common/connection.py:1356 -#: ../src/common/zeroconf/connection_zeroconf.py:468 +#: ../src/common/connection.py:408 #, python-format msgid "" "Subject: %(subject)s\n" @@ -4764,44 +4645,162 @@ msgstr "" "Тема: %(subject)s\n" "%(message)s" -#: ../src/common/connection.py:1383 +#: ../src/common/connection.py:721 +#, python-format +msgid "Connection with account \"%s\" has been lost" +msgstr "Връзката на акаунт „%s“ се разпадна" + +#: ../src/common/connection.py:722 +msgid "Reconnect manually." +msgstr "Свържете се наново." + +#: ../src/common/connection.py:734 +#, python-format +msgid "Server %(name)s answered wrongly to register request: %(error)s" +msgstr "" +"Сървърът „%(name)s“ отговори погрешно на запитването за регистрация: %(error)" +"s" + +#: ../src/common/connection.py:768 +#, python-format +msgid "Server %s provided a different registration form" +msgstr "Сървърът „%s“ предостави различна форма за регистрация" + +#: ../src/common/connection.py:781 +#, python-format +msgid "Unknown SSL error: %d" +msgstr "Неизвестна грешка на SSL: %d" + +#. wrong answer +#: ../src/common/connection.py:796 +msgid "Invalid answer" +msgstr "Невалиден отговор" + +#: ../src/common/connection.py:797 +#, python-format +msgid "Transport %(name)s answered wrongly to register request: %(error)s" +msgstr "" +"Транспортът „%(name)s“ отговори погрешно на запитването за регистрация: %" +"(error)s" + +#: ../src/common/connection.py:1075 ../src/common/connection.py:1204 +#: ../src/common/connection.py:1673 +#: ../src/common/zeroconf/connection_zeroconf.py:189 +#, python-format +msgid "Could not connect to \"%s\"" +msgstr "Неуспех при свързване с „%s“" + +#: ../src/common/connection.py:1076 ../src/gui_interface.py:705 +msgid "Check your connection or try again later." +msgstr "Проверете връзката или опитайте отново по-късно." + +#: ../src/common/connection.py:1081 +#, fuzzy, python-format +msgid "Server replied: %s" +msgstr "Запазен в: %s" + +#: ../src/common/connection.py:1094 +msgid "Connection to proxy failed" +msgstr "Неуспех при свързването със сървъра-посредник" + +#: ../src/common/connection.py:1125 ../src/common/connection.py:1184 +#, python-format +msgid "Could not connect to account %s" +msgstr "Неуспех при свързване с акаунт „%s“" + +#: ../src/common/connection.py:1126 ../src/common/connection.py:1185 +#, python-format +msgid "Connection with account %s has been lost. Retry connecting." +msgstr "Връзката на акаунт „%s“ се разпадна. Опит за повторно свързване." + +#: ../src/common/connection.py:1151 +#, python-format +msgid "The authenticity of the %s certificate could be invalid." +msgstr "Автентичността на сертификата на %s може да е под въпрос." + +#: ../src/common/connection.py:1154 +#, python-format +msgid "" +"\n" +"SSL Error: %s" +msgstr "" +"\n" +"Грешка на SSL: %s" + +#: ../src/common/connection.py:1156 +#, python-format +msgid "" +"\n" +"Unknown SSL error: %d" +msgstr "" +"\n" +"Неизвестна грешка на SSL: %d" + +#: ../src/common/connection.py:1205 +msgid "Check your connection or try again later" +msgstr "Проверете връзката или опитайте отново по-късно" + +#: ../src/common/connection.py:1236 +#, python-format +msgid "Authentication failed with \"%s\"" +msgstr "Неуспех при удостоверяването с „%s“" + +#: ../src/common/connection.py:1238 +msgid "Please check your login and password for correctness." +msgstr "Проверете дали името и паролата са правилни." + +#: ../src/common/connection.py:1300 +msgid "Error while removing privacy list" +msgstr "Грешка при премахването на списъка за уединение" + +#: ../src/common/connection.py:1301 +#, python-format +msgid "" +"Privacy list %s has not been removed. It is maybe active in one of your " +"connected resources. Deactivate it and try again." +msgstr "" +"Списъкът за уединение „%s“ не беше премахнат. Навярно е активен в някой от " +"свързаните ви ресурси. Изключете го и опитайте отново." + +#: ../src/common/connection.py:1541 #, python-format msgid "Sent contact: \"%s\" (%s)" msgstr "" -#: ../src/common/connection.py:1386 +#: ../src/common/connection.py:1544 #, fuzzy msgid "Sent contacts:" msgstr "Покана на _контакти" -#: ../src/common/connection.py:1559 ../src/common/connection.py:1580 +#: ../src/common/connection.py:1703 ../src/common/connection.py:1724 msgid "Not fetched because of invisible status" msgstr "Не е изтеглен, понеже е в състояние „Невидим“" -#: ../src/common/connection.py:1982 +#: ../src/common/connection.py:2106 #, fuzzy msgid "Unregister failed" msgstr "Неуспех при свързването" -#: ../src/common/connection.py:1983 +#: ../src/common/connection.py:2107 #, python-format msgid "Unregistration with server %(server)s failed: %(error)s" msgstr "" -#: ../src/common/contacts.py:92 ../src/common/helpers.py:55 -#: ../src/gajim.py:999 +#: ../src/common/contacts.py:129 ../src/common/helpers.py:55 +#: ../src/gui_interface.py:610 msgid "Observers" msgstr "Наблюдатели" -#: ../src/common/contacts.py:96 ../src/common/contacts.py:348 +#: ../src/common/contacts.py:133 ../src/common/contacts.py:335 #: ../src/common/helpers.py:55 ../src/disco.py:119 ../src/disco.py:120 -#: ../src/disco.py:1354 ../src/gajim.py:802 ../src/roster_window.py:847 -#: ../src/roster_window.py:1549 ../src/roster_window.py:1618 -#: ../src/roster_window.py:1620 ../src/roster_window.py:1773 +#: ../src/disco.py:1464 ../src/gui_interface.py:413 +#: ../src/roster_window.py:848 ../src/roster_window.py:1501 +#: ../src/roster_window.py:1572 ../src/roster_window.py:1574 +#: ../src/roster_window.py:1732 msgid "Transports" msgstr "Транспорти" -#: ../src/common/contacts.py:356 +#: ../src/common/contacts.py:343 msgid "Not in roster" msgstr "Не е в списъка" @@ -5050,7 +5049,7 @@ msgstr "Свободен за разговор" msgid "_Available" msgstr "На _линия" -#: ../src/common/helpers.py:212 ../src/features_window.py:116 +#: ../src/common/helpers.py:212 ../src/features_window.py:118 msgid "Available" msgstr "На линия" @@ -5168,77 +5167,77 @@ msgid "has closed the chat window or tab" msgstr "затвори прозореца или подпрозореца" #. GiB means gibibyte -#: ../src/common/helpers.py:658 +#: ../src/common/helpers.py:588 #, python-format msgid "%s GiB" msgstr "%s GiB" #. GB means gigabyte -#: ../src/common/helpers.py:661 +#: ../src/common/helpers.py:591 #, python-format msgid "%s GB" msgstr "%s GB" #. MiB means mibibyte -#: ../src/common/helpers.py:665 +#: ../src/common/helpers.py:595 #, python-format msgid "%s MiB" msgstr "%s MiB" #. MB means megabyte -#: ../src/common/helpers.py:668 +#: ../src/common/helpers.py:598 #, python-format msgid "%s MB" msgstr "%s MB" #. KiB means kibibyte -#: ../src/common/helpers.py:672 +#: ../src/common/helpers.py:602 #, python-format msgid "%s KiB" msgstr "%s KB" #. KB means kilo bytes -#: ../src/common/helpers.py:675 +#: ../src/common/helpers.py:605 #, python-format msgid "%s KB" msgstr "%s KB" #. B means bytes -#: ../src/common/helpers.py:678 +#: ../src/common/helpers.py:608 #, python-format msgid "%s B" msgstr "%s B" -#: ../src/common/helpers.py:1166 ../src/common/helpers.py:1173 +#: ../src/common/helpers.py:1049 ../src/common/helpers.py:1056 #, python-format msgid "%d message pending" msgid_plural "%d messages pending" msgstr[0] "%d непрочетено съобщение" msgstr[1] "%d непрочетени съобщения" -#: ../src/common/helpers.py:1179 +#: ../src/common/helpers.py:1062 #, python-format msgid " from room %s" msgstr " от стая %s" -#: ../src/common/helpers.py:1182 ../src/common/helpers.py:1201 +#: ../src/common/helpers.py:1065 ../src/common/helpers.py:1084 #, python-format msgid " from user %s" msgstr " от потребител %s" -#: ../src/common/helpers.py:1184 +#: ../src/common/helpers.py:1067 #, python-format msgid " from %s" msgstr " от %s" -#: ../src/common/helpers.py:1191 ../src/common/helpers.py:1198 +#: ../src/common/helpers.py:1074 ../src/common/helpers.py:1081 #, python-format msgid "%d event pending" msgid_plural "%d events pending" msgstr[0] "%d чакащо събитие" msgstr[1] "%d чакащи събития" -#: ../src/common/helpers.py:1231 +#: ../src/common/helpers.py:1114 #, python-format msgid "Gajim - %s" msgstr "Gajim - %s" @@ -5254,16 +5253,16 @@ msgid "%s is not a valid loglevel" msgstr "%s не е валидно ниво за дневник" #. we talk about a file -#: ../src/common/optparser.py:57 +#: ../src/common/optparser.py:59 #, python-format msgid "error: cannot open %s for reading" msgstr "грешка: %s не може да бъде отворен за четене" -#: ../src/common/optparser.py:254 ../src/common/optparser.py:255 +#: ../src/common/optparser.py:297 ../src/common/optparser.py:298 msgid "cyan" msgstr "синьозелена" -#: ../src/common/optparser.py:371 +#: ../src/common/optparser.py:373 msgid "migrating logs database to indices" msgstr "мигриране на базата от данни с дневници към индекси" @@ -5272,634 +5271,655 @@ msgstr "мигриране на базата от данни с дневници msgid "XMPP account %s@%s" msgstr "за акаунт „%s“" -#: ../src/common/pep.py:30 +#: ../src/common/pep.py:27 msgid "Afraid" msgstr "Уплашен" -#: ../src/common/pep.py:31 +#: ../src/common/pep.py:28 msgid "Amazed" msgstr "Изумен" -#: ../src/common/pep.py:32 +#: ../src/common/pep.py:29 msgid "Amorous" msgstr "Страстен" -#: ../src/common/pep.py:33 +#: ../src/common/pep.py:30 msgid "Angry" msgstr "Ядосан" -#: ../src/common/pep.py:34 +#: ../src/common/pep.py:31 msgid "Annoyed" msgstr "Раздразнен" -#: ../src/common/pep.py:35 +#: ../src/common/pep.py:32 msgid "Anxious" msgstr "Обезпокоен" -#: ../src/common/pep.py:36 +#: ../src/common/pep.py:33 msgid "Aroused" msgstr "Възбуден" -#: ../src/common/pep.py:37 +#: ../src/common/pep.py:34 msgid "Ashamed" msgstr "Засрамен" -#: ../src/common/pep.py:38 +#: ../src/common/pep.py:35 msgid "Bored" msgstr "Отегчен" -#: ../src/common/pep.py:39 +#: ../src/common/pep.py:36 msgid "Brave" msgstr "Смел" -#: ../src/common/pep.py:40 +#: ../src/common/pep.py:37 msgid "Calm" msgstr "Спокоен" -#: ../src/common/pep.py:41 +#: ../src/common/pep.py:38 msgid "Cautious" msgstr "Предпазлив" -#: ../src/common/pep.py:42 +#: ../src/common/pep.py:39 msgid "Cold" msgstr "Бездушен" -#: ../src/common/pep.py:43 +#: ../src/common/pep.py:40 msgid "Confident" msgstr "Уверен" -#: ../src/common/pep.py:44 +#: ../src/common/pep.py:41 msgid "Confused" msgstr "Объркан" -#: ../src/common/pep.py:45 +#: ../src/common/pep.py:42 msgid "Contemplative" msgstr "Замислен" -#: ../src/common/pep.py:46 +#: ../src/common/pep.py:43 msgid "Contented" msgstr "Спорещ" -#: ../src/common/pep.py:47 +#: ../src/common/pep.py:44 msgid "Cranky" msgstr "Раздразнителен" -#: ../src/common/pep.py:48 +#: ../src/common/pep.py:45 msgid "Crazy" msgstr "Луд" -#: ../src/common/pep.py:49 +#: ../src/common/pep.py:46 msgid "Creative" msgstr "Съзидателен" -#: ../src/common/pep.py:50 +#: ../src/common/pep.py:47 msgid "Curious" msgstr "Любопитен" -#: ../src/common/pep.py:51 +#: ../src/common/pep.py:48 msgid "Dejected" msgstr "Обезсърчен" -#: ../src/common/pep.py:52 +#: ../src/common/pep.py:49 msgid "Depressed" msgstr "Депресиран" -#: ../src/common/pep.py:53 +#: ../src/common/pep.py:50 msgid "Disappointed" msgstr "Разочарован" -#: ../src/common/pep.py:54 +#: ../src/common/pep.py:51 msgid "Disgusted" msgstr "Отвратен" -#: ../src/common/pep.py:55 +#: ../src/common/pep.py:52 msgid "Dismayed" msgstr "Уплашен" -#: ../src/common/pep.py:56 +#: ../src/common/pep.py:53 msgid "Distracted" msgstr "Шашнат" -#: ../src/common/pep.py:57 +#: ../src/common/pep.py:54 msgid "Embarrassed" msgstr "Смутен" -#: ../src/common/pep.py:58 +#: ../src/common/pep.py:55 msgid "Envious" msgstr "Завистлив" -#: ../src/common/pep.py:59 +#: ../src/common/pep.py:56 msgid "Excited" msgstr "Развълнуван" -#: ../src/common/pep.py:60 +#: ../src/common/pep.py:57 msgid "Flirtatious" msgstr "Склонен към флиртуване" -#: ../src/common/pep.py:61 +#: ../src/common/pep.py:58 msgid "Frustrated" msgstr "Разочарован" -#: ../src/common/pep.py:62 +#: ../src/common/pep.py:59 msgid "Grateful" msgstr "Признателен" -#: ../src/common/pep.py:63 +#: ../src/common/pep.py:60 msgid "Grieving" msgstr "Опечален" -#: ../src/common/pep.py:64 +#: ../src/common/pep.py:61 msgid "Grumpy" msgstr "Кисел" -#: ../src/common/pep.py:65 +#: ../src/common/pep.py:62 msgid "Guilty" msgstr "Виновен" -#: ../src/common/pep.py:66 +#: ../src/common/pep.py:63 msgid "Happy" msgstr "Щастлив" -#: ../src/common/pep.py:67 +#: ../src/common/pep.py:64 msgid "Hopeful" msgstr "С надежда" -#: ../src/common/pep.py:68 +#: ../src/common/pep.py:65 msgid "Hot" msgstr "Сгорещен" -#: ../src/common/pep.py:69 +#: ../src/common/pep.py:66 msgid "Humbled" msgstr "Скромен" -#: ../src/common/pep.py:70 +#: ../src/common/pep.py:67 msgid "Humiliated" msgstr "Унизен" -#: ../src/common/pep.py:71 +#: ../src/common/pep.py:68 msgid "Hungry" msgstr "Гладен" -#: ../src/common/pep.py:72 +#: ../src/common/pep.py:69 msgid "Hurt" msgstr "Ранен" -#: ../src/common/pep.py:73 +#: ../src/common/pep.py:70 msgid "Impressed" msgstr "Впечатлен" -#: ../src/common/pep.py:74 +#: ../src/common/pep.py:71 msgid "In Awe" msgstr "Със страхопочитание" -#: ../src/common/pep.py:75 +#: ../src/common/pep.py:72 msgid "In Love" msgstr "Влюбен" -#: ../src/common/pep.py:76 +#: ../src/common/pep.py:73 msgid "Indignant" msgstr "Възмутен" -#: ../src/common/pep.py:77 +#: ../src/common/pep.py:74 msgid "Interested" msgstr "Заинтересуван" -#: ../src/common/pep.py:78 +#: ../src/common/pep.py:75 msgid "Intoxicated" msgstr "Пиян" -#: ../src/common/pep.py:79 +#: ../src/common/pep.py:76 msgid "Invincible" msgstr "Непобедим" -#: ../src/common/pep.py:80 +#: ../src/common/pep.py:77 msgid "Jealous" msgstr "Ревнив" -#: ../src/common/pep.py:81 +#: ../src/common/pep.py:78 msgid "Lonely" msgstr "Самотен" -#: ../src/common/pep.py:82 +#: ../src/common/pep.py:79 msgid "Lost" msgstr "Безпомощен" -#: ../src/common/pep.py:83 +#: ../src/common/pep.py:80 msgid "Lucky" msgstr "Късметлия" -#: ../src/common/pep.py:84 +#: ../src/common/pep.py:81 msgid "Mean" msgstr "Подъл" -#: ../src/common/pep.py:85 +#: ../src/common/pep.py:82 msgid "Moody" msgstr "Унил" -#: ../src/common/pep.py:86 +#: ../src/common/pep.py:83 msgid "Nervous" msgstr "Нервен" -#: ../src/common/pep.py:87 +#: ../src/common/pep.py:84 msgid "Neutral" msgstr "Безразличен" -#: ../src/common/pep.py:88 +#: ../src/common/pep.py:85 msgid "Offended" msgstr "Обиден" -#: ../src/common/pep.py:89 +#: ../src/common/pep.py:86 msgid "Outraged" msgstr "Оскърбен" -#: ../src/common/pep.py:90 +#: ../src/common/pep.py:87 msgid "Playful" msgstr "Игрив" -#: ../src/common/pep.py:91 +#: ../src/common/pep.py:88 msgid "Proud" msgstr "Горд" -#: ../src/common/pep.py:92 +#: ../src/common/pep.py:89 msgid "Relaxed" msgstr "Отпуснат" -#: ../src/common/pep.py:93 +#: ../src/common/pep.py:90 msgid "Relieved" msgstr "Облекчен" -#: ../src/common/pep.py:94 +#: ../src/common/pep.py:91 msgid "Remorseful" msgstr "Разкайващ се" -#: ../src/common/pep.py:95 +#: ../src/common/pep.py:92 msgid "Restless" msgstr "Неспокоен" -#: ../src/common/pep.py:96 +#: ../src/common/pep.py:93 msgid "Sad" msgstr "Тъжен" -#: ../src/common/pep.py:97 +#: ../src/common/pep.py:94 msgid "Sarcastic" msgstr "Саркастичен" -#: ../src/common/pep.py:98 +#: ../src/common/pep.py:95 msgid "Satisfied" msgstr "Удовлетворен" -#: ../src/common/pep.py:99 +#: ../src/common/pep.py:96 msgid "Serious" msgstr "Сериозен" -#: ../src/common/pep.py:100 +#: ../src/common/pep.py:97 msgid "Shocked" msgstr "Шокиран" -#: ../src/common/pep.py:101 +#: ../src/common/pep.py:98 msgid "Shy" msgstr "Срамежлив" -#: ../src/common/pep.py:102 +#: ../src/common/pep.py:99 msgid "Sick" msgstr "Болен" -#: ../src/common/pep.py:103 +#: ../src/common/pep.py:100 msgid "Sleepy" msgstr "Сънен" -#: ../src/common/pep.py:104 +#: ../src/common/pep.py:101 msgid "Spontaneous" msgstr "Спонтанен" -#: ../src/common/pep.py:105 +#: ../src/common/pep.py:102 msgid "Stressed" msgstr "Стресиран" -#: ../src/common/pep.py:106 +#: ../src/common/pep.py:103 msgid "Strong" msgstr "Твърд" -#: ../src/common/pep.py:107 +#: ../src/common/pep.py:104 msgid "Surprised" msgstr "Изненадан" -#: ../src/common/pep.py:108 +#: ../src/common/pep.py:105 msgid "Thankful" msgstr "Благодарен" -#: ../src/common/pep.py:109 +#: ../src/common/pep.py:106 msgid "Thirsty" msgstr "Жаден" -#: ../src/common/pep.py:110 +#: ../src/common/pep.py:107 msgid "Tired" msgstr "Уморен" -#: ../src/common/pep.py:111 +#: ../src/common/pep.py:108 msgid "Undefined" msgstr "Неопределен" -#: ../src/common/pep.py:112 +#: ../src/common/pep.py:109 msgid "Weak" msgstr "Слаб" -#: ../src/common/pep.py:113 +#: ../src/common/pep.py:110 msgid "Worried" msgstr "Обезпокоен" -#: ../src/common/pep.py:116 +#: ../src/common/pep.py:113 msgid "Doing Chores" msgstr "Домакинствам" -#: ../src/common/pep.py:117 +#: ../src/common/pep.py:114 msgid "Buying Groceries" msgstr "Купувам хранителни продукти" -#: ../src/common/pep.py:118 +#: ../src/common/pep.py:115 msgid "Cleaning" msgstr "Чистя" -#: ../src/common/pep.py:119 +#: ../src/common/pep.py:116 msgid "Cooking" msgstr "Готвя" -#: ../src/common/pep.py:120 +#: ../src/common/pep.py:117 msgid "Doing Maintenance" msgstr "Ремонтирам" -#: ../src/common/pep.py:121 +#: ../src/common/pep.py:118 msgid "Doing the Dishes" msgstr "Мия чиниите" -#: ../src/common/pep.py:122 +#: ../src/common/pep.py:119 msgid "Doing the Laundry" msgstr "Пера" -#: ../src/common/pep.py:123 +#: ../src/common/pep.py:120 msgid "Gardening" msgstr "Работя в градината" -#: ../src/common/pep.py:124 +#: ../src/common/pep.py:121 msgid "Running an Errand" msgstr "Изпълнявам поръчка" -#: ../src/common/pep.py:125 +#: ../src/common/pep.py:122 msgid "Walking the Dog" msgstr "Разхождам кучето" -#: ../src/common/pep.py:126 +#: ../src/common/pep.py:123 msgid "Drinking" msgstr "Пия" -#: ../src/common/pep.py:127 +#: ../src/common/pep.py:124 msgid "Having a Beer" msgstr "Пия бира" -#: ../src/common/pep.py:128 +#: ../src/common/pep.py:125 msgid "Having Coffee" msgstr "Пия кафе" -#: ../src/common/pep.py:129 +#: ../src/common/pep.py:126 msgid "Having Tea" msgstr "Пия чай" -#: ../src/common/pep.py:131 +#: ../src/common/pep.py:128 msgid "Having a Snack" msgstr "Похапвам" -#: ../src/common/pep.py:132 +#: ../src/common/pep.py:129 msgid "Having Breakfast" msgstr "Закусвам" -#: ../src/common/pep.py:133 +#: ../src/common/pep.py:130 msgid "Having Dinner" msgstr "Вечерям" -#: ../src/common/pep.py:134 +#: ../src/common/pep.py:131 msgid "Having Lunch" msgstr "Обядвам" -#: ../src/common/pep.py:135 +#: ../src/common/pep.py:132 msgid "Exercising" msgstr "Правя упражнения" -#: ../src/common/pep.py:136 ../src/common/pep.py:181 +#: ../src/common/pep.py:133 ../src/common/pep.py:178 msgid "Cycling" msgstr "Карам велосипед" -#: ../src/common/pep.py:137 +#: ../src/common/pep.py:134 msgid "Dancing" msgstr "Танцувам" -#: ../src/common/pep.py:138 +#: ../src/common/pep.py:135 msgid "Hiking" msgstr "На поход съм" -#: ../src/common/pep.py:139 +#: ../src/common/pep.py:136 msgid "Jogging" msgstr "Тичам за здраве" -#: ../src/common/pep.py:140 +#: ../src/common/pep.py:137 msgid "Playing Sports" msgstr "Спортувам" -#: ../src/common/pep.py:141 +#: ../src/common/pep.py:138 msgid "Running" msgstr "Бягам" -#: ../src/common/pep.py:142 +#: ../src/common/pep.py:139 msgid "Skiing" msgstr "Карам ски" -#: ../src/common/pep.py:143 +#: ../src/common/pep.py:140 msgid "Swimming" msgstr "Плувам" -#: ../src/common/pep.py:144 +#: ../src/common/pep.py:141 msgid "Working out" msgstr "Тренирам" -#: ../src/common/pep.py:145 +#: ../src/common/pep.py:142 msgid "Grooming" msgstr "Поддържам се" -#: ../src/common/pep.py:146 +#: ../src/common/pep.py:143 msgid "At the Spa" msgstr "В Спа-центъра" -#: ../src/common/pep.py:147 +#: ../src/common/pep.py:144 msgid "Brushing Teeth" msgstr "Мия си зъбите" -#: ../src/common/pep.py:148 +#: ../src/common/pep.py:145 msgid "Getting a Haircut" msgstr "Подстригвам се" -#: ../src/common/pep.py:149 +#: ../src/common/pep.py:146 msgid "Shaving" msgstr "Бръсна се" -#: ../src/common/pep.py:150 +#: ../src/common/pep.py:147 msgid "Taking a Bath" msgstr "Във ваната" -#: ../src/common/pep.py:151 +#: ../src/common/pep.py:148 msgid "Taking a Shower" msgstr "Взимам си душ" -#: ../src/common/pep.py:152 +#: ../src/common/pep.py:149 msgid "Having an Appointment" msgstr "На среща" -#: ../src/common/pep.py:154 +#: ../src/common/pep.py:151 msgid "Day Off" msgstr "Почивен ден" -#: ../src/common/pep.py:155 +#: ../src/common/pep.py:152 msgid "Hanging out" msgstr "Вися си" -#: ../src/common/pep.py:156 +#: ../src/common/pep.py:153 msgid "Hiding" msgstr "Крия се" -#: ../src/common/pep.py:157 +#: ../src/common/pep.py:154 msgid "On Vacation" msgstr "В отпуск" -#: ../src/common/pep.py:158 +#: ../src/common/pep.py:155 msgid "Praying" msgstr "Моля се" -#: ../src/common/pep.py:159 +#: ../src/common/pep.py:156 msgid "Scheduled Holiday" msgstr "Планиран отдих" -#: ../src/common/pep.py:161 +#: ../src/common/pep.py:158 msgid "Thinking" msgstr "Мисля" -#: ../src/common/pep.py:162 +#: ../src/common/pep.py:159 msgid "Relaxing" msgstr "Почивам" -#: ../src/common/pep.py:163 +#: ../src/common/pep.py:160 msgid "Fishing" msgstr "Ловя риба" -#: ../src/common/pep.py:164 +#: ../src/common/pep.py:161 msgid "Gaming" msgstr "Играя" -#: ../src/common/pep.py:165 +#: ../src/common/pep.py:162 msgid "Going out" msgstr "Навън съм" -#: ../src/common/pep.py:166 +#: ../src/common/pep.py:163 msgid "Partying" msgstr "На купон съм" -#: ../src/common/pep.py:167 +#: ../src/common/pep.py:164 msgid "Reading" msgstr "Чета" -#: ../src/common/pep.py:168 +#: ../src/common/pep.py:165 msgid "Rehearsing" msgstr "Репетирам" -#: ../src/common/pep.py:169 +#: ../src/common/pep.py:166 msgid "Shopping" msgstr "На пазар съм" -#: ../src/common/pep.py:170 +#: ../src/common/pep.py:167 msgid "Smoking" msgstr "Пуша" -#: ../src/common/pep.py:171 +#: ../src/common/pep.py:168 msgid "Socializing" msgstr "Общувам" -#: ../src/common/pep.py:172 +#: ../src/common/pep.py:169 msgid "Sunbathing" msgstr "На плаж съм" -#: ../src/common/pep.py:173 +#: ../src/common/pep.py:170 msgid "Watching TV" msgstr "Гледам телевизия" -#: ../src/common/pep.py:174 +#: ../src/common/pep.py:171 msgid "Watching a Movie" msgstr "Гледам филм" -#: ../src/common/pep.py:175 +#: ../src/common/pep.py:172 msgid "Talking" msgstr "Разговарям" -#: ../src/common/pep.py:176 +#: ../src/common/pep.py:173 msgid "In Real Life" msgstr "На четири очи" -#: ../src/common/pep.py:177 +#: ../src/common/pep.py:174 msgid "On the Phone" msgstr "Говоря по телефона" -#: ../src/common/pep.py:178 +#: ../src/common/pep.py:175 msgid "On Video Phone" msgstr "Говоря по видеотелефона" -#: ../src/common/pep.py:179 +#: ../src/common/pep.py:176 msgid "Traveling" msgstr "Пътувам" -#: ../src/common/pep.py:180 +#: ../src/common/pep.py:177 msgid "Commuting" msgstr "Пътувам от/до работа" -#: ../src/common/pep.py:182 +#: ../src/common/pep.py:179 msgid "Driving" msgstr "Карам велосипед" -#: ../src/common/pep.py:183 +#: ../src/common/pep.py:180 msgid "In a Car" msgstr "В колата" -#: ../src/common/pep.py:184 +#: ../src/common/pep.py:181 msgid "On a Bus" msgstr "В автобуса" -#: ../src/common/pep.py:185 +#: ../src/common/pep.py:182 msgid "On a Plane" msgstr "В самолета" -#: ../src/common/pep.py:186 +#: ../src/common/pep.py:183 msgid "On a Train" msgstr "Във влака" -#: ../src/common/pep.py:187 +#: ../src/common/pep.py:184 msgid "On a Trip" msgstr "На екскурзия" -#: ../src/common/pep.py:188 +#: ../src/common/pep.py:185 msgid "Walking" msgstr "Разхождам се" -#: ../src/common/pep.py:190 +#: ../src/common/pep.py:187 msgid "Coding" msgstr "Програмирам" -#: ../src/common/pep.py:191 +#: ../src/common/pep.py:188 msgid "In a Meeting" msgstr "На съвещание" -#: ../src/common/pep.py:192 +#: ../src/common/pep.py:189 msgid "Studying" msgstr "Уча" -#: ../src/common/pep.py:193 +#: ../src/common/pep.py:190 msgid "Writing" msgstr "Пиша" +#: ../src/common/pep.py:335 +msgid "Unknown Artist" +msgstr "Неизвестен изпълнител" + +#: ../src/common/pep.py:338 +msgid "Unknown Title" +msgstr "Неизвестно заглавие" + +#: ../src/common/pep.py:341 +msgid "Unknown Source" +msgstr "Неизвестен източник" + +#: ../src/common/pep.py:344 +#, python-format +msgid "" +"\"%(title)s\" by %(artist)s\n" +"from %(source)s" +msgstr "" +"\"%(title)s\" на %(artist)s\n" +"от %(source)s" + #. We cannot bind port, call error callback and fail #: ../src/common/socks5.py:86 #, python-format @@ -5923,38 +5943,11 @@ msgstr "" "[Това е част от шифрирана сесия. Ако виждате това съобщение, нещо не е както " "трябва.]" -#: ../src/common/zeroconf/connection_handlers_zeroconf.py:94 -#, python-format -msgid "" -"The host %s you configured as the ft_add_hosts_to_send advanced option is " -"not valid, so ignored." -msgstr "" -"Хостът „%s“, който сте конфигурирали в опцията „ft_add_hosts_to_send“, не е " -"валиден, така че се пренебрегва." - -#. We didn't set a passphrase -#: ../src/common/zeroconf/connection_zeroconf.py:173 -msgid "OpenPGP passphrase was not given" -msgstr "Не беше зададена парола за OpenPGP" - -#. %s is the account name here -#: ../src/common/zeroconf/connection_zeroconf.py:175 -#: ../src/roster_window.py:1970 -#, python-format -msgid "You will be connected to %s without OpenPGP." -msgstr "Ще бъдете свързани към „%s“ без OpenPGP." - -#: ../src/common/zeroconf/connection_zeroconf.py:216 -msgid "To continue sending and receiving messages, you will need to reconnect." -msgstr "" -"За да продължите да изпращате и получавате съобщения, трябва да се свържете " -"наново." - -#: ../src/common/zeroconf/connection_zeroconf.py:239 +#: ../src/common/zeroconf/connection_zeroconf.py:178 msgid "Avahi error" msgstr "Грешка на Avahi" -#: ../src/common/zeroconf/connection_zeroconf.py:239 +#: ../src/common/zeroconf/connection_zeroconf.py:179 #, python-format msgid "" "%s\n" @@ -5964,53 +5957,44 @@ msgstr "" "Изпращането и получаването на съобщения тип „link-local“ може и да не " "функционира правилно." -#: ../src/common/zeroconf/connection_zeroconf.py:250 +#: ../src/common/zeroconf/connection_zeroconf.py:190 msgid "Please check if Avahi or Bonjour is installed." msgstr "Проверете дали Avahi или Bonjour е инсталиран." -#: ../src/common/zeroconf/connection_zeroconf.py:259 -#: ../src/common/zeroconf/connection_zeroconf.py:263 +#: ../src/common/zeroconf/connection_zeroconf.py:199 +#: ../src/common/zeroconf/connection_zeroconf.py:203 msgid "Could not start local service" msgstr "Неуспех при стартирането на локална услуга" -#: ../src/common/zeroconf/connection_zeroconf.py:260 +#: ../src/common/zeroconf/connection_zeroconf.py:200 #, python-format msgid "Unable to bind to port %d." msgstr "Неуспех при свързването с порт %d." -#: ../src/common/zeroconf/connection_zeroconf.py:264 -#: ../src/common/zeroconf/connection_zeroconf.py:359 +#: ../src/common/zeroconf/connection_zeroconf.py:204 +#: ../src/common/zeroconf/connection_zeroconf.py:283 +#: ../src/common/zeroconf/connection_zeroconf.py:294 +#: ../src/common/zeroconf/connection_zeroconf.py:308 msgid "Please check if avahi-daemon is running." msgstr "Проверете дали е стартиран avahi-daemon." -#: ../src/common/zeroconf/connection_zeroconf.py:358 +#: ../src/common/zeroconf/connection_zeroconf.py:282 +#: ../src/common/zeroconf/connection_zeroconf.py:293 +#: ../src/common/zeroconf/connection_zeroconf.py:307 #, python-format msgid "Could not change status of account \"%s\"" msgstr "Неуспех при промяната на състоянието на акаунт „%s“" -#: ../src/common/zeroconf/connection_zeroconf.py:381 -msgid "" -"You are not connected or not visible to others. Your message could not be " -"sent." -msgstr "" -"Не сте свързани и не сте видими за другите. Съобщението ви не можа да бъде " -"изпратено." - -#. we're not english -#: ../src/common/zeroconf/connection_zeroconf.py:399 -msgid "[This message is encrypted]" -msgstr "[Това съобщение е шифрирано]" - -#: ../src/common/zeroconf/connection_zeroconf.py:483 +#: ../src/common/zeroconf/connection_zeroconf.py:324 msgid "Your message could not be sent." msgstr "Съобщението ви не можа да бъде изпратено." #. Contact Offline -#: ../src/common/zeroconf/connection_zeroconf.py:489 +#: ../src/common/zeroconf/connection_zeroconf.py:334 msgid "Contact is offline. Your message could not be sent." msgstr "Контактът е изключен. Съобщението ви не можа да бъде изпратено." -#: ../src/common/zeroconf/connection_zeroconf.py:593 +#: ../src/common/zeroconf/connection_zeroconf.py:359 msgid "" "Connection to host could not be established: Timeout while sending data." msgstr "" @@ -6023,24 +6007,24 @@ msgstr "" msgid "Error while adding service. %s" msgstr "Грешка при добавянето на услугата. %s" -#: ../src/config.py:151 ../src/config.py:597 +#: ../src/config.py:157 ../src/config.py:586 msgid "Disabled" msgstr "Изключени" -#: ../src/config.py:396 +#: ../src/config.py:383 msgid "Default Message" msgstr "Стандартно съобщение" -#: ../src/config.py:405 +#: ../src/config.py:392 msgid "Enabled" msgstr "Включено" -#: ../src/config.py:663 ../src/dialogs.py:1327 +#: ../src/config.py:654 ../src/dialogs.py:1365 #, python-format msgid "Dictionary for lang %s not available" msgstr "Няма наличен речник за %s език" -#: ../src/config.py:664 +#: ../src/config.py:655 #, python-format msgid "" "You have to install %s dictionary to use spellchecking, or choose another " @@ -6049,220 +6033,220 @@ msgstr "" "За да използвате проверката за правопис, трябва да инсталирате %s речник или " "да изберете друг език чрез настройването на опцията „speller_language“." -#: ../src/config.py:1040 +#: ../src/config.py:1092 msgid "status message title" msgstr "заглавие на съобщението за състояние" -#: ../src/config.py:1040 +#: ../src/config.py:1092 msgid "status message text" msgstr "текст на съобщението за състояние" #. Name column -#: ../src/config.py:1339 ../src/dialogs.py:2122 ../src/dialogs.py:2186 -#: ../src/dialogs.py:2891 ../src/disco.py:773 ../src/disco.py:1568 -#: ../src/disco.py:1854 ../src/history_window.py:87 +#: ../src/config.py:1394 ../src/dialogs.py:2232 ../src/dialogs.py:2298 +#: ../src/dialogs.py:3014 ../src/disco.py:831 ../src/disco.py:1690 +#: ../src/disco.py:1992 ../src/history_window.py:89 msgid "Name" msgstr "Име" -#: ../src/config.py:1428 +#: ../src/config.py:1487 msgid "Relogin now?" msgstr "Свързване наново?" -#: ../src/config.py:1429 +#: ../src/config.py:1488 msgid "If you want all the changes to apply instantly, you must relogin." msgstr "" "Ако искате всички промени да влязат в сила веднага, трябва да се свържете " "наново." -#: ../src/config.py:1559 ../src/config.py:1684 +#: ../src/config.py:1620 ../src/config.py:1745 #, fuzzy msgid "OpenPGP is not usable on this computer" msgstr "OpenPGP не може да бъде използван на този компютър" -#: ../src/config.py:1720 ../src/config.py:1764 +#: ../src/config.py:1785 ../src/config.py:1829 msgid "Unread events" msgstr "Непрочетени събития" -#: ../src/config.py:1721 +#: ../src/config.py:1786 msgid "Read all pending events before removing this account." msgstr "Преди да премахнете този акаунт, прочетете всички чакащи събития." -#: ../src/config.py:1747 +#: ../src/config.py:1812 #, python-format msgid "You have opened chat in account %s" msgstr "Имате активни разговори за акаунт „%s“" -#: ../src/config.py:1748 +#: ../src/config.py:1813 msgid "All chat and groupchat windows will be closed. Do you want to continue?" msgstr "" "Всички прозорци за разговори и стаи ще бъдат затворени. Искате ли да " "продължите?" -#: ../src/config.py:1760 ../src/config.py:2283 ../src/config.py:2317 +#: ../src/config.py:1825 ../src/config.py:2348 ../src/config.py:2382 msgid "You are currently connected to the server" msgstr "В момента сте свързани със сървъра" -#: ../src/config.py:1761 +#: ../src/config.py:1826 msgid "To change the account name, you must be disconnected." msgstr "Трябва да сте изключени, за да смените името на акаунта." -#: ../src/config.py:1765 +#: ../src/config.py:1830 msgid "To change the account name, you must read all pending events." msgstr "" "За да смените името на акаунта, трябва да прочетете всички чакащи събития." -#: ../src/config.py:1771 +#: ../src/config.py:1836 msgid "Account Name Already Used" msgstr "Името на акаунта вече се използва" -#: ../src/config.py:1772 +#: ../src/config.py:1837 msgid "" "This name is already used by another of your accounts. Please choose another " "name." msgstr "Това име вече се използва от друг акаунт. Изберете друго име." -#: ../src/config.py:1776 ../src/config.py:1780 +#: ../src/config.py:1841 ../src/config.py:1845 msgid "Invalid account name" msgstr "Невалидно име на акаунт" -#: ../src/config.py:1777 +#: ../src/config.py:1842 msgid "Account name cannot be empty." msgstr "Трябва да посочите някакво име на акаунта." -#: ../src/config.py:1781 +#: ../src/config.py:1846 msgid "Account name cannot contain spaces." msgstr "Името на акаунта не може да съдържа интервали." -#: ../src/config.py:1856 +#: ../src/config.py:1921 msgid "Rename Account" msgstr "Преименуване на акаунт" -#: ../src/config.py:1857 +#: ../src/config.py:1922 #, python-format msgid "Enter a new name for account %s" msgstr "Въведете ново име за акаунт „%s“" -#: ../src/config.py:1885 +#: ../src/config.py:1950 msgid "A Jabber ID must be in the form \"user@servername\"." msgstr "Jabber ID трябва да бъде във формат „user@server“." -#: ../src/config.py:2093 ../src/config.py:3327 +#: ../src/config.py:2158 ../src/config.py:3406 msgid "Invalid entry" msgstr "Невалиден формат" -#: ../src/config.py:2094 ../src/config.py:3328 +#: ../src/config.py:2159 ../src/config.py:3407 msgid "Custom port must be a port number." msgstr "Портът по избор трябва все пак да е номер на порт." -#: ../src/config.py:2115 +#: ../src/config.py:2180 msgid "Failed to get secret keys" msgstr "Неуспех при извличането на частните ключове" -#: ../src/config.py:2116 +#: ../src/config.py:2181 #, fuzzy msgid "There is no OpenPGP secret key available." msgstr "Възникна проблем при извличането на частните ви OpenPGP ключове." -#: ../src/config.py:2150 +#: ../src/config.py:2215 msgid "OpenPGP Key Selection" msgstr "Избор на ключ на OpenPGP" -#: ../src/config.py:2151 +#: ../src/config.py:2216 msgid "Choose your OpenPGP key" msgstr "Изберете вашия ключ на OpenPGP" -#: ../src/config.py:2158 +#: ../src/config.py:2223 msgid "No such account available" msgstr "Няма такъв наличен акаунт" -#: ../src/config.py:2159 +#: ../src/config.py:2224 msgid "You must create your account before editing your personal information." msgstr "" "Трябва първо да създадете акаунт и след това да редактирате личните данни." -#: ../src/config.py:2166 ../src/dialogs.py:1933 ../src/dialogs.py:2110 -#: ../src/dialogs.py:2289 ../src/disco.py:441 ../src/profile_window.py:317 +#: ../src/config.py:2231 ../src/dialogs.py:2031 ../src/dialogs.py:2220 +#: ../src/dialogs.py:2405 ../src/disco.py:477 ../src/profile_window.py:325 msgid "You are not connected to the server" msgstr "Не сте свързани към сървъра." -#: ../src/config.py:2167 +#: ../src/config.py:2232 msgid "Without a connection, you can not edit your personal information." msgstr "Трябва да сте свързани, за да редактирате личните данни." -#: ../src/config.py:2171 +#: ../src/config.py:2236 msgid "Your server doesn't support Vcard" msgstr "Сървърът ви не поддържа визитки" -#: ../src/config.py:2172 +#: ../src/config.py:2237 msgid "Your server can't save your personal information." msgstr "Сървърът ви не може да запази личната ви информация." -#: ../src/config.py:2284 ../src/config.py:2318 +#: ../src/config.py:2349 ../src/config.py:2383 #, fuzzy msgid "To disable the account, you must be disconnected." msgstr "Трябва да сте изключени, за да смените името на акаунта." -#: ../src/config.py:2289 +#: ../src/config.py:2354 msgid "Account Local already exists." msgstr "Името на акаунта вече се използва." -#: ../src/config.py:2290 +#: ../src/config.py:2355 msgid "Please rename or remove it before enabling link-local messaging." msgstr "" "Преименувайте го или го премахнете преди да активирате съобщения от/за " "локални контакти." -#: ../src/config.py:2438 +#: ../src/config.py:2510 #, python-format msgid "Edit %s" msgstr "Редактиране на %s" -#: ../src/config.py:2440 +#: ../src/config.py:2512 #, python-format msgid "Register to %s" msgstr "Регистриране в %s" #. list at the beginning -#: ../src/config.py:2476 +#: ../src/config.py:2548 msgid "Ban List" msgstr "Списък с отлъчени" -#: ../src/config.py:2477 +#: ../src/config.py:2549 msgid "Member List" msgstr "Списък с членове" -#: ../src/config.py:2478 +#: ../src/config.py:2550 msgid "Owner List" msgstr "Списък със собственици" -#: ../src/config.py:2479 +#: ../src/config.py:2551 msgid "Administrator List" msgstr "Списък с администратори" #. Address column #. holds JID (who said this) -#: ../src/config.py:2528 ../src/disco.py:780 ../src/history_manager.py:208 +#: ../src/config.py:2600 ../src/disco.py:838 ../src/history_manager.py:208 msgid "JID" msgstr "JID" -#: ../src/config.py:2538 +#: ../src/config.py:2610 msgid "Reason" msgstr "Причина" -#: ../src/config.py:2545 +#: ../src/config.py:2617 msgid "Nick" msgstr "Псевдоним" -#: ../src/config.py:2551 +#: ../src/config.py:2623 msgid "Role" msgstr "Роля" -#: ../src/config.py:2578 +#: ../src/config.py:2650 msgid "Banning..." msgstr "Отлъчване…" #. You can move '\n' before user@domain if that line is TOO BIG -#: ../src/config.py:2580 +#: ../src/config.py:2652 msgid "" "Whom do you want to ban?\n" "\n" @@ -6270,11 +6254,11 @@ msgstr "" "Кого искате да отлъчите?\n" "\n" -#: ../src/config.py:2582 +#: ../src/config.py:2654 msgid "Adding Member..." msgstr "Добавяне на член…" -#: ../src/config.py:2583 +#: ../src/config.py:2655 msgid "" "Whom do you want to make a member?\n" "\n" @@ -6282,11 +6266,11 @@ msgstr "" "Кого искате да направите член?\n" "\n" -#: ../src/config.py:2585 +#: ../src/config.py:2657 msgid "Adding Owner..." msgstr "Добавяне на собственик…" -#: ../src/config.py:2586 +#: ../src/config.py:2658 msgid "" "Whom do you want to make an owner?\n" "\n" @@ -6294,11 +6278,11 @@ msgstr "" "Кого искате да направите собственик?\n" "\n" -#: ../src/config.py:2588 +#: ../src/config.py:2660 msgid "Adding Administrator..." msgstr "Добавяне на администратор…" -#: ../src/config.py:2589 +#: ../src/config.py:2661 msgid "" "Whom do you want to make an administrator?\n" "\n" @@ -6306,7 +6290,7 @@ msgstr "" "Кого искате да направите администратор?\n" "\n" -#: ../src/config.py:2590 +#: ../src/config.py:2662 #, fuzzy msgid "" "Can be one of the following:\n" @@ -6323,86 +6307,87 @@ msgstr "" "4. домейн (домейна съвпада, както и всеки потребител@домейн,\n" "домейн/ресурс или адрес, съдържащ под-домейн." -#: ../src/config.py:2687 +#: ../src/config.py:2763 #, python-format msgid "Removing %s account" msgstr "Премахване на акаунт „%s“" -#: ../src/config.py:2709 ../src/gajim.py:1491 ../src/gajim.py:1588 +#: ../src/config.py:2785 ../src/gui_interface.py:1102 +#: ../src/gui_interface.py:1199 msgid "Password Required" msgstr "Необходима е парола" -#: ../src/config.py:2710 ../src/gajim.py:1568 +#: ../src/config.py:2786 ../src/gui_interface.py:1179 #, python-format msgid "Enter your password for account %s" msgstr "Въведете парола за акаунт „%s“" -#: ../src/config.py:2711 ../src/gajim.py:1588 +#: ../src/config.py:2787 ../src/gui_interface.py:1199 msgid "Save password" msgstr "Запазване на паролата" -#: ../src/config.py:2720 +#: ../src/config.py:2796 #, python-format msgid "Account \"%s\" is connected to the server" msgstr "Акаунт „%s“ е свързан към сървъра" -#: ../src/config.py:2721 +#: ../src/config.py:2797 msgid "If you remove it, the connection will be lost." msgstr "Ако го премахнете, връзката ще се разпадне." -#: ../src/config.py:2819 +#: ../src/config.py:2895 msgid "Default" msgstr "По подразбиране" -#: ../src/config.py:2819 +#: ../src/config.py:2895 msgid "?print_status:All" msgstr "Всички" -#: ../src/config.py:2820 +#: ../src/config.py:2896 msgid "Enter and leave only" msgstr "Само влизащи и излизащи" -#: ../src/config.py:2821 +#: ../src/config.py:2897 msgid "?print_status:None" msgstr "Без" -#: ../src/config.py:2889 +#: ../src/config.py:2967 msgid "New Group Chat" msgstr "Нова стая" -#: ../src/config.py:2922 +#: ../src/config.py:3000 msgid "This bookmark has invalid data" msgstr "Тази отметка съдържа невалидни данни" -#: ../src/config.py:2923 +#: ../src/config.py:3001 msgid "" "Please be sure to fill out server and room fields or remove this bookmark." msgstr "Попълнете полетата за сървър и стая или изтрийте тази отметка." #. invalid char -#: ../src/config.py:3041 ../src/dialogs.py:1746 +#: ../src/config.py:3119 ../src/dialogs.py:1829 msgid "Invalid nickname" msgstr "Невалиден псевдоним" -#: ../src/config.py:3042 ../src/config.py:3056 ../src/config.py:3070 +#: ../src/config.py:3120 ../src/config.py:3134 ../src/config.py:3148 #, fuzzy msgid "Character not allowed" msgstr "Псевдонимът не е позволен: %s" -#: ../src/config.py:3055 ../src/config.py:3303 +#: ../src/config.py:3133 ../src/config.py:3382 msgid "Invalid server" msgstr "Невалиден сървър" -#: ../src/config.py:3069 +#: ../src/config.py:3147 #, fuzzy msgid "Invalid room" msgstr "Невалиден формат" -#: ../src/config.py:3220 +#: ../src/config.py:3299 msgid "Account has been added successfully" msgstr "Акаунтът беше добавен успешно" -#: ../src/config.py:3221 ../src/config.py:3227 +#: ../src/config.py:3300 ../src/config.py:3306 #, fuzzy msgid "" "You can set advanced account options by pressing the Advanced button, or " @@ -6412,33 +6397,33 @@ msgstr "" "Може да настроите допълнителните опции, като натиснете бутона „Напреднали“ " "или по-късно от менюто „Редактиране“->„Акаунти“ в основния прозорец." -#: ../src/config.py:3226 +#: ../src/config.py:3305 msgid "Your new account has been created successfully" msgstr "Новият акаунт беше създаден успешно" -#: ../src/config.py:3264 +#: ../src/config.py:3343 msgid "Invalid username" msgstr "Невалидно потребителско име" -#: ../src/config.py:3266 +#: ../src/config.py:3345 msgid "You must provide a username to configure this account." msgstr "Трябва да въведете име на потребител за новия акаунт." -#: ../src/config.py:3304 +#: ../src/config.py:3383 msgid "Please provide a server on which you want to register." msgstr "Задайте сървър, където искате да се регистрирате." -#: ../src/config.py:3360 ../src/gajim.py:2144 +#: ../src/config.py:3439 ../src/gui_interface.py:1857 msgid "Certificate Already in File" msgstr "Сертификатът вече е във файла" -#: ../src/config.py:3361 ../src/gajim.py:2145 +#: ../src/config.py:3440 ../src/gui_interface.py:1858 #, python-format msgid "This certificate is already in file %s, so it's not added again." msgstr "" "Този сертификат вече е във файла „%s“, така че няма да бъде добавен наново." -#: ../src/config.py:3429 +#: ../src/config.py:3510 #, python-format msgid "" "Security Warning\n" @@ -6453,7 +6438,7 @@ msgstr "" "Грешка на SSL: %(error)s\n" "Все още ли искате да се свържете с този сървър?" -#: ../src/config.py:3435 ../src/gajim.py:2169 +#: ../src/config.py:3516 ../src/gui_interface.py:1882 #, python-format msgid "" "Add this certificate to the list of trusted certificates.\n" @@ -6464,63 +6449,63 @@ msgstr "" "Отпечатък тип SHA1 на сертификата:\n" "%s" -#: ../src/config.py:3460 ../src/config.py:3483 +#: ../src/config.py:3543 ../src/config.py:3570 msgid "An error occurred during account creation" msgstr "Възникна грешка при създаването на акаунта" -#: ../src/config.py:3550 +#: ../src/config.py:3637 msgid "Account name is in use" msgstr "Името на акаунта се използва" -#: ../src/config.py:3551 +#: ../src/config.py:3638 msgid "You already have an account using this name." msgstr "Вече има регистриран акаунт с това име." -#: ../src/config.py:3704 +#: ../src/config.py:3791 msgid "Active" msgstr "Активен" -#: ../src/config.py:3712 +#: ../src/config.py:3799 msgid "Event" msgstr "Събитие" -#: ../src/config.py:3747 +#: ../src/config.py:3834 msgid "First Message Received" msgstr "Първо получено съобщение" -#: ../src/config.py:3748 +#: ../src/config.py:3835 msgid "Next Message Received Focused" msgstr "Следващо получено съобщение в прозорец на фокус" -#: ../src/config.py:3750 +#: ../src/config.py:3837 msgid "Next Message Received Unfocused" msgstr "Следващо получено съобщение в прозорец без фокус" -#: ../src/config.py:3751 +#: ../src/config.py:3838 msgid "Contact Connected" msgstr "Включване на контакт" -#: ../src/config.py:3752 +#: ../src/config.py:3839 msgid "Contact Disconnected" msgstr "Изключване на контакт" -#: ../src/config.py:3753 +#: ../src/config.py:3840 msgid "Message Sent" msgstr "Изпратено съобщение" -#: ../src/config.py:3754 +#: ../src/config.py:3841 msgid "Group Chat Message Highlight" msgstr "Осветено съобщение в стая" -#: ../src/config.py:3755 +#: ../src/config.py:3842 msgid "Group Chat Message Received" msgstr "Получено съобщение в стая" -#: ../src/config.py:3756 +#: ../src/config.py:3843 msgid "GMail Email Received" msgstr "Получена поща от Gmail" -#: ../src/conversation_textview.py:592 +#: ../src/conversation_textview.py:599 msgid "" "This icon indicates that this message has not yet\n" "been received by the remote end. If this icon stays\n" @@ -6530,7 +6515,7 @@ msgstr "" "получено от отсрещния контакт. Ако иконата остане\n" "дълго време, най-вероятно съобщението е било изгубено." -#: ../src/conversation_textview.py:611 +#: ../src/conversation_textview.py:618 msgid "" "Text below this line is what has been said since the\n" "last time you paid attention to this group chat" @@ -6538,224 +6523,221 @@ msgstr "" "Текстът под този ред е последното, което е казано откакто\n" "за последен път сте обърнали внимание на тази стая" -#: ../src/conversation_textview.py:724 +#: ../src/conversation_textview.py:737 #, fuzzy msgid "_Quote" msgstr "_Изход" -#: ../src/conversation_textview.py:731 +#: ../src/conversation_textview.py:744 #, python-format msgid "_Actions for \"%s\"" msgstr "_Действия за „%s“" -#: ../src/conversation_textview.py:743 +#: ../src/conversation_textview.py:756 msgid "Read _Wikipedia Article" msgstr "Четене на статия от _Уикипедия" -#: ../src/conversation_textview.py:748 +#: ../src/conversation_textview.py:761 msgid "Look it up in _Dictionary" msgstr "Проверка в _речника" -#: ../src/conversation_textview.py:765 +#: ../src/conversation_textview.py:778 #, python-format msgid "Dictionary URL is missing an \"%s\" and it is not WIKTIONARY" msgstr "Липсва „%s“ в адреса на речника и не е WIKTIONARY" #. we must have %s in the url -#: ../src/conversation_textview.py:778 +#: ../src/conversation_textview.py:791 #, python-format msgid "Web Search URL is missing an \"%s\"" msgstr "Липсва „%s“ в адреса за търсене" -#: ../src/conversation_textview.py:781 +#: ../src/conversation_textview.py:794 msgid "Web _Search for it" msgstr "_Търсене в уеб" -#: ../src/conversation_textview.py:787 +#: ../src/conversation_textview.py:800 msgid "Open as _Link" msgstr "Отваряне като _връзка" -#: ../src/conversation_textview.py:1274 +#. %i is day in year (1-365) +#: ../src/conversation_textview.py:1295 +#, fuzzy, python-format msgid "Yesterday" -msgstr "Вчера" - -#. the number is >= 2 -#. %i is day in year (1-365), %d (1-31) we want %i -#: ../src/conversation_textview.py:1278 -#, python-format -msgid "%i days ago" -msgstr "Преди %i дни" +msgid_plural "%i days ago" +msgstr[0] "Вчера" +msgstr[1] "Вчера" #. if we have subject, show it too! -#: ../src/conversation_textview.py:1312 ../src/history_window.py:464 +#: ../src/conversation_textview.py:1330 ../src/history_window.py:475 #, python-format msgid "Subject: %s\n" msgstr "Тема: %s\n" -#: ../src/dataforms_widget.py:559 +#: ../src/dataforms_widget.py:581 msgid "Jabber ID already in list" msgstr "В списъка вече има такъв Jabber ID" -#: ../src/dataforms_widget.py:560 +#: ../src/dataforms_widget.py:582 msgid "The Jabber ID you entered is already in the list. Choose another one." msgstr "Въведеният Jabber ID вече съществува в списъка. Изберете друг." #. Default jid -#: ../src/dataforms_widget.py:571 +#: ../src/dataforms_widget.py:593 msgid "new@jabber.id" msgstr "new@jabber.id" -#: ../src/dataforms_widget.py:574 ../src/dataforms_widget.py:576 +#: ../src/dataforms_widget.py:596 ../src/dataforms_widget.py:598 #, python-format msgid "new%d@jabber.id" msgstr "new%d@jabber.id" -#: ../src/dialogs.py:75 +#: ../src/dialogs.py:81 #, python-format msgid "Contact name: %s" msgstr "Име на контакта: %s" -#: ../src/dialogs.py:77 +#: ../src/dialogs.py:83 #, python-format msgid "Jabber ID: %s" msgstr "Jabber ID: %s" -#: ../src/dialogs.py:184 +#: ../src/dialogs.py:194 msgid "Group" msgstr "Група" -#: ../src/dialogs.py:191 +#: ../src/dialogs.py:201 msgid "In the group" msgstr "В групата" -#: ../src/dialogs.py:277 +#: ../src/dialogs.py:292 msgid "KeyID" msgstr "Идентификатор на ключ" -#: ../src/dialogs.py:282 +#: ../src/dialogs.py:297 msgid "Contact name" msgstr "Име на контакта" -#: ../src/dialogs.py:454 +#: ../src/dialogs.py:469 msgid "Set Mood" msgstr "Задаване на настроение" -#: ../src/dialogs.py:572 +#: ../src/dialogs.py:589 #, python-format msgid "%s Status Message" msgstr "Съобщение за състояние „%s“" -#: ../src/dialogs.py:586 +#: ../src/dialogs.py:603 msgid "Status Message" msgstr "Съобщение за състояние" -#: ../src/dialogs.py:772 +#: ../src/dialogs.py:793 msgid "Overwrite Status Message?" msgstr "Презаписване на съобщението за състояние?" -#: ../src/dialogs.py:773 +#: ../src/dialogs.py:794 msgid "" "This name is already used. Do you want to overwrite this status message?" msgstr "" "Това име вече се използва. Искате ли да презапишете това съобщение за " "състояние?" -#: ../src/dialogs.py:781 +#: ../src/dialogs.py:802 msgid "Save as Preset Status Message" msgstr "Запазване като настроено съобщение за състояние" -#: ../src/dialogs.py:782 +#: ../src/dialogs.py:803 msgid "Please type a name for this status message" msgstr "Напишете име за това съобщение за състояние" -#: ../src/dialogs.py:807 +#: ../src/dialogs.py:831 msgid "AIM Address:" msgstr "Адрес на AIM:" -#: ../src/dialogs.py:808 +#: ../src/dialogs.py:832 msgid "GG Number:" msgstr "Номер на GG:" -#: ../src/dialogs.py:809 +#: ../src/dialogs.py:833 msgid "ICQ Number:" msgstr "Номер на ICQ:" -#: ../src/dialogs.py:810 +#: ../src/dialogs.py:834 msgid "MSN Address:" msgstr "Адрес на MSN:" -#: ../src/dialogs.py:811 +#: ../src/dialogs.py:835 msgid "Yahoo! Address:" msgstr "Адрес на Yahoo!:" -#: ../src/dialogs.py:847 +#: ../src/dialogs.py:872 #, python-format msgid "Please fill in the data of the contact you want to add in account %s" msgstr "" "Попълнете данните за контакта, който искате да добавите към акаунт „%s“" -#: ../src/dialogs.py:849 +#: ../src/dialogs.py:874 msgid "Please fill in the data of the contact you want to add" msgstr "Попълнете данните за контакта, който искате да добавите" -#: ../src/dialogs.py:1006 ../src/dialogs.py:1012 ../src/dialogs.py:1017 +#: ../src/dialogs.py:1035 ../src/dialogs.py:1041 ../src/dialogs.py:1046 msgid "Invalid User ID" msgstr "Невалиден идентификатор" -#: ../src/dialogs.py:1013 +#: ../src/dialogs.py:1042 msgid "The user ID must not contain a resource." msgstr "Потребителският идентификатор не трябва да съдържа ресурс." -#: ../src/dialogs.py:1018 +#: ../src/dialogs.py:1047 msgid "You cannot add yourself to your roster." msgstr "Не може да добавите себе си към списъка." -#: ../src/dialogs.py:1032 +#: ../src/dialogs.py:1061 msgid "Contact already in roster" msgstr "Контактът вече е в списъка" -#: ../src/dialogs.py:1033 +#: ../src/dialogs.py:1062 msgid "This contact is already listed in your roster." msgstr "Контактът вече съществува в списъка." -#: ../src/dialogs.py:1069 +#: ../src/dialogs.py:1098 msgid "User ID:" msgstr "Идентификатор на потребител:" -#: ../src/dialogs.py:1127 +#: ../src/dialogs.py:1159 msgid "A GTK+ jabber client" msgstr "Джабър клиент за GTK+" -#: ../src/dialogs.py:1128 +#: ../src/dialogs.py:1160 msgid "GTK+ Version:" msgstr "Версия на GTK+:" -#: ../src/dialogs.py:1129 +#: ../src/dialogs.py:1161 msgid "PyGTK Version:" msgstr "Версия на PyGTK:" -#: ../src/dialogs.py:1139 +#: ../src/dialogs.py:1171 msgid "Current Developers:" msgstr "Текущи разработчици:" -#: ../src/dialogs.py:1141 +#: ../src/dialogs.py:1173 msgid "Past Developers:" msgstr "Бивши разработчици:" -#: ../src/dialogs.py:1147 +#: ../src/dialogs.py:1179 msgid "THANKS:" msgstr "БЛАГОДАРНОСТИ:" #. remove one english sentence #. and add it manually as translatable -#: ../src/dialogs.py:1153 +#: ../src/dialogs.py:1185 msgid "Last but not least, we would like to thank all the package maintainers." msgstr "" "И не на последно място, бихме искали да благодарим на всички, които " "поддържат пакетите." #. here you write your name in the form Name FamilyName -#: ../src/dialogs.py:1166 +#: ../src/dialogs.py:1198 msgid "translator-credits" msgstr "" "Явор Доганов \n" @@ -6764,7 +6746,7 @@ msgstr "" "Научете повече за нас на http://gnome.cult.bg\n" "Докладвайте за грешки на http://gnome.cult.bg/bugs" -#: ../src/dialogs.py:1328 +#: ../src/dialogs.py:1366 #, python-format msgid "" "You have to install %s dictionary to use spellchecking, or choose another " @@ -6777,98 +6759,102 @@ msgstr "" "\n" "Функционалността за осветяване на сгрешени думи ще е изключена" -#: ../src/dialogs.py:1747 ../src/dialogs.py:2061 +#: ../src/dialogs.py:1830 ../src/dialogs.py:2171 msgid "The nickname has not allowed characters." msgstr "Псевдонимът съдържа непозволени знаци." -#: ../src/dialogs.py:1859 +#: ../src/dialogs.py:1948 #, python-format msgid "Subscription request for account %(account)s from %(jid)s" msgstr "Искане за записване за акаунт „%(account)s“ от %(jid)s" -#: ../src/dialogs.py:1862 +#: ../src/dialogs.py:1951 #, python-format msgid "Subscription request from %s" msgstr "Искане за записване от %s" -#: ../src/dialogs.py:1928 ../src/gajim.py:2827 +#: ../src/dialogs.py:2026 ../src/gui_interface.py:2592 #, python-format msgid "You are already in group chat %s" msgstr "Вече сте в стая „%s“" -#: ../src/dialogs.py:1934 +#: ../src/dialogs.py:2032 msgid "You can not join a group chat unless you are connected." msgstr "Трябва да сте свързани, за да влезете в стая." -#: ../src/dialogs.py:1970 +#: ../src/dialogs.py:2074 #, python-format msgid "Join Group Chat with account %s" msgstr "Влизане в стая с акаунт „%s“" -#: ../src/dialogs.py:2050 +#: ../src/dialogs.py:2160 #, fuzzy msgid "Invalid Account" msgstr "Невалидно име на акаунт" -#: ../src/dialogs.py:2051 +#: ../src/dialogs.py:2161 #, fuzzy msgid "" "You have to choose an account from which you want to join the groupchat." msgstr "Акаунт, от който искате да влезете в стаята" -#: ../src/dialogs.py:2060 +#: ../src/dialogs.py:2170 msgid "Invalid Nickname" msgstr "Невалиден псевдоним" -#: ../src/dialogs.py:2065 ../src/dialogs.py:2071 -#: ../src/groupchat_control.py:1738 +#: ../src/dialogs.py:2175 ../src/dialogs.py:2181 +#: ../src/groupchat_control.py:1776 msgid "Invalid group chat Jabber ID" msgstr "Невалиден Jabber ID на стая" -#: ../src/dialogs.py:2066 ../src/dialogs.py:2072 -#: ../src/groupchat_control.py:1739 +#: ../src/dialogs.py:2176 +#, fuzzy +msgid "Please enter the group chat Jabber ID as room@server." +msgstr "Jabber ID на стаята съдържа непозволени знаци." + +#: ../src/dialogs.py:2182 ../src/groupchat_control.py:1777 msgid "The group chat Jabber ID has not allowed characters." msgstr "Jabber ID на стаята съдържа непозволени знаци." -#: ../src/dialogs.py:2079 +#: ../src/dialogs.py:2189 msgid "This is not a group chat" msgstr "Това не е стая" -#: ../src/dialogs.py:2080 +#: ../src/dialogs.py:2190 #, python-format msgid "%s is not the name of a group chat." msgstr "%s не е име на стая." -#: ../src/dialogs.py:2111 +#: ../src/dialogs.py:2221 msgid "Without a connection, you can not synchronise your contacts." msgstr "Трябва да сте свързани, за да синхронизирате контактите си." -#: ../src/dialogs.py:2125 +#: ../src/dialogs.py:2235 msgid "Server" msgstr "Сървър" -#: ../src/dialogs.py:2158 +#: ../src/dialogs.py:2270 msgid "This account is not connected to the server" msgstr "Този акаунт не е свързан към сървъра" -#: ../src/dialogs.py:2159 +#: ../src/dialogs.py:2271 msgid "You cannot synchronize with an account unless it is connected." msgstr "Не може да се синхронизирате с акаунт, ако не е свързан." -#: ../src/dialogs.py:2183 +#: ../src/dialogs.py:2295 msgid "Synchronise" msgstr "Синхронизиране" -#: ../src/dialogs.py:2241 +#: ../src/dialogs.py:2355 #, python-format msgid "Start Chat with account %s" msgstr "Започване на разговор с акаунт „%s“" -#: ../src/dialogs.py:2243 +#: ../src/dialogs.py:2357 msgid "Start Chat" msgstr "Започване на разговор" -#: ../src/dialogs.py:2244 +#: ../src/dialogs.py:2358 msgid "" "Fill in the nickname or the Jabber ID of the contact you would like\n" "to send a chat message to:" @@ -6877,302 +6863,331 @@ msgstr "" "искате да изпратите съобщение:" #. if offline or connecting -#: ../src/dialogs.py:2268 ../src/dialogs.py:2651 ../src/dialogs.py:2813 +#: ../src/dialogs.py:2384 ../src/dialogs.py:2767 ../src/dialogs.py:2929 msgid "Connection not available" msgstr "В момента няма връзка" -#: ../src/dialogs.py:2269 ../src/dialogs.py:2652 ../src/dialogs.py:2814 +#: ../src/dialogs.py:2385 ../src/dialogs.py:2768 ../src/dialogs.py:2930 #, python-format msgid "Please make sure you are connected with \"%s\"." msgstr "Уверете се, че сте свързани към „%s“." -#: ../src/dialogs.py:2278 ../src/dialogs.py:2281 +#: ../src/dialogs.py:2394 ../src/dialogs.py:2397 msgid "Invalid JID" msgstr "Невалиден JID" -#: ../src/dialogs.py:2281 +#: ../src/dialogs.py:2397 #, python-format msgid "Unable to parse \"%s\"." msgstr "Неуспех при анализирането на „%s“." -#: ../src/dialogs.py:2290 +#: ../src/dialogs.py:2406 msgid "Without a connection, you can not change your password." msgstr "Трябва да сте свързани, за да променяте паролата." -#: ../src/dialogs.py:2309 +#: ../src/dialogs.py:2425 msgid "Invalid password" msgstr "Невалидна парола" -#: ../src/dialogs.py:2309 +#: ../src/dialogs.py:2425 msgid "You must enter a password." msgstr "Трябва да въведете парола." -#: ../src/dialogs.py:2313 +#: ../src/dialogs.py:2429 msgid "Passwords do not match" msgstr "Паролите не съвпадат" -#: ../src/dialogs.py:2314 +#: ../src/dialogs.py:2430 msgid "The passwords typed in both fields must be identical." msgstr "Паролите, написани в двете полета, трябва да са едни и същи." #. img to display #. default value -#: ../src/dialogs.py:2353 ../src/notify.py:257 ../src/notify.py:491 +#: ../src/dialogs.py:2469 ../src/notify.py:263 ../src/notify.py:504 msgid "Contact Signed In" msgstr "Включи се контакт" -#: ../src/dialogs.py:2355 ../src/notify.py:265 ../src/notify.py:493 +#: ../src/dialogs.py:2471 ../src/notify.py:271 ../src/notify.py:506 msgid "Contact Signed Out" msgstr "Изключи се контакт" #. chat message #. img to display -#: ../src/dialogs.py:2357 ../src/notify.py:288 ../src/notify.py:342 -#: ../src/notify.py:495 +#: ../src/dialogs.py:2473 ../src/notify.py:294 ../src/notify.py:349 +#: ../src/notify.py:508 msgid "New Message" msgstr "Ново съобщение" #. single message -#: ../src/dialogs.py:2357 ../src/notify.py:269 ../src/notify.py:343 -#: ../src/notify.py:495 +#: ../src/dialogs.py:2473 ../src/notify.py:275 ../src/notify.py:350 +#: ../src/notify.py:508 msgid "New Single Message" msgstr "Ново еднократно съобщение" #. private message -#: ../src/dialogs.py:2358 ../src/notify.py:276 ../src/notify.py:343 -#: ../src/notify.py:496 +#: ../src/dialogs.py:2474 ../src/notify.py:282 ../src/notify.py:350 +#: ../src/notify.py:509 msgid "New Private Message" msgstr "Ново лично съобщение" -#: ../src/dialogs.py:2358 ../src/gajim.py:1704 ../src/notify.py:505 +#: ../src/dialogs.py:2474 ../src/gui_interface.py:1315 ../src/notify.py:518 msgid "New E-mail" msgstr "Нова е-поща" -#: ../src/dialogs.py:2360 ../src/gajim.py:1770 ../src/notify.py:498 +#: ../src/dialogs.py:2476 ../src/gui_interface.py:1382 ../src/notify.py:511 msgid "File Transfer Request" msgstr "Запитване за файлов трансфер" -#: ../src/dialogs.py:2362 ../src/gajim.py:1670 ../src/gajim.py:1737 -#: ../src/notify.py:500 +#: ../src/dialogs.py:2478 ../src/gui_interface.py:1281 +#: ../src/gui_interface.py:1349 ../src/notify.py:513 msgid "File Transfer Error" msgstr "Грешка при файловия трансфер" -#: ../src/dialogs.py:2364 ../src/gajim.py:1815 ../src/gajim.py:1837 -#: ../src/gajim.py:1854 ../src/notify.py:502 +#: ../src/dialogs.py:2480 ../src/gui_interface.py:1427 +#: ../src/gui_interface.py:1449 ../src/gui_interface.py:1466 +#: ../src/notify.py:515 msgid "File Transfer Completed" msgstr "Файловият трансфер е приключен" -#: ../src/dialogs.py:2365 ../src/gajim.py:1818 ../src/notify.py:503 +#: ../src/dialogs.py:2481 ../src/gui_interface.py:1430 ../src/notify.py:516 msgid "File Transfer Stopped" msgstr "Файловият трансфер е преустановен" -#: ../src/dialogs.py:2367 ../src/gajim.py:1512 ../src/notify.py:507 +#: ../src/dialogs.py:2483 ../src/gui_interface.py:1123 ../src/notify.py:520 msgid "Groupchat Invitation" msgstr "Покана за разговор в стая" -#: ../src/dialogs.py:2369 ../src/notify.py:249 ../src/notify.py:509 +#: ../src/dialogs.py:2485 ../src/notify.py:255 ../src/notify.py:522 msgid "Contact Changed Status" msgstr "Контактът промени състоянието си" -#: ../src/dialogs.py:2570 +#: ../src/dialogs.py:2686 #, python-format msgid "Single Message using account %s" msgstr "Еднократно съобщение с акаунт „%s“" -#: ../src/dialogs.py:2572 +#: ../src/dialogs.py:2688 #, python-format msgid "Single Message in account %s" msgstr "Еднократно съобщение за акаунт „%s“" -#: ../src/dialogs.py:2574 +#: ../src/dialogs.py:2690 msgid "Single Message" msgstr "Еднократно съобщение" #. prepare UI for Sending -#: ../src/dialogs.py:2577 +#: ../src/dialogs.py:2693 #, python-format msgid "Send %s" msgstr "Изпращане на %s" #. prepare UI for Receiving -#: ../src/dialogs.py:2600 +#: ../src/dialogs.py:2716 #, python-format msgid "Received %s" msgstr "Получено %s" #. prepare UI for Receiving -#: ../src/dialogs.py:2623 +#: ../src/dialogs.py:2739 #, python-format msgid "Form %s" msgstr "От %s" #. we create a new blank window to send and we preset RE: and to jid -#: ../src/dialogs.py:2702 +#: ../src/dialogs.py:2818 #, python-format msgid "RE: %s" msgstr "Относно: %s" -#: ../src/dialogs.py:2703 +#: ../src/dialogs.py:2819 #, python-format msgid "%s wrote:\n" msgstr "%s написа:\n" -#: ../src/dialogs.py:2752 +#: ../src/dialogs.py:2868 #, python-format msgid "XML Console for %s" msgstr "XML конзола за %s" -#: ../src/dialogs.py:2754 +#: ../src/dialogs.py:2870 msgid "XML Console" msgstr "XML конзола" -#. Set labels -#. self.action can be 'add', 'modify' or 'remove' -#: ../src/dialogs.py:2865 +#. Action that can be done with an incoming list of contacts +#: ../src/dialogs.py:2958 +#, fuzzy +msgid "add" +msgstr "Тъжен" + +#: ../src/dialogs.py:2958 +#, fuzzy +msgid "modify" +msgstr "Унил" + +#: ../src/dialogs.py:2959 +#, fuzzy +msgid "remove" +msgstr "П_ремахване" + +#: ../src/dialogs.py:2987 #, fuzzy, python-format -msgid "%s would like you to %s some contacts in your roster." +msgid "" +"%(jid)s would like you to %(action)s some contacts in your " +"roster." msgstr "Бих искал(а) да ви добавя към списъка си." -#: ../src/dialogs.py:2880 ../src/dialogs.py:2928 +#. Change label for accept_button to action name instead of 'OK'. +#: ../src/dialogs.py:3003 ../src/dialogs.py:3049 msgid "Add" msgstr "" -#: ../src/dialogs.py:2882 ../src/dialogs.py:2961 +#. Change label for accept_button to action name instead of 'OK'. +#: ../src/dialogs.py:3005 ../src/dialogs.py:3080 #, fuzzy msgid "Modify" msgstr "Унил" -#: ../src/dialogs.py:2888 +#: ../src/dialogs.py:3011 #, fuzzy msgid "Jabber ID" msgstr "Jabber ID:" -#: ../src/dialogs.py:2894 +#: ../src/dialogs.py:3017 #, fuzzy msgid "Groups" msgstr "Група" #. it is selected -#. remote_jid = model[iter][1].decode('utf-8') -#: ../src/dialogs.py:3008 +#. remote_jid = model[iter_][1].decode('utf-8') +#: ../src/dialogs.py:3125 #, fuzzy, python-format msgid "%s suggested me to add you in my roster." msgstr "" "Бих искал(а) да ви добавя към списъка си. I would like to add you to my " "roster." -#: ../src/dialogs.py:3108 +#: ../src/dialogs.py:3139 +#, fuzzy, python-format +msgid "Added %s contacts" +msgstr "Добавяне на _контакт" + +#: ../src/dialogs.py:3176 +#, fuzzy, python-format +msgid "Removed %s contacts" +msgstr "Премахване на контакт от списъка" + +#: ../src/dialogs.py:3229 #, python-format msgid "Privacy List %s" msgstr "Филтър за уединение %s" -#: ../src/dialogs.py:3112 +#: ../src/dialogs.py:3233 #, python-format msgid "Privacy List for %s" msgstr "Филтър за уединение за %s" -#: ../src/dialogs.py:3168 +#: ../src/dialogs.py:3289 #, python-format msgid "Order: %(order)s, action: %(action)s, type: %(type)s, value: %(value)s" msgstr "" "Ред: %(order)s, действие: %(action)s, вид: %(type)s, стойност: %(value)s" -#: ../src/dialogs.py:3173 +#: ../src/dialogs.py:3294 #, python-format msgid "Order: %(order)s, action: %(action)s" msgstr "Ред: %(order)s, действие: %(action)s" -#: ../src/dialogs.py:3215 +#: ../src/dialogs.py:3338 msgid "Edit a rule" msgstr "Редактиране на правило" -#: ../src/dialogs.py:3326 +#: ../src/dialogs.py:3449 msgid "Add a rule" msgstr "Добавяне на правило" -#: ../src/dialogs.py:3423 +#: ../src/dialogs.py:3549 #, python-format msgid "Privacy Lists for %s" msgstr "Филтри за уединение за %s" -#: ../src/dialogs.py:3425 +#: ../src/dialogs.py:3551 msgid "Privacy Lists" msgstr "Филтри за уединение" -#: ../src/dialogs.py:3495 +#: ../src/dialogs.py:3621 msgid "Invalid List Name" msgstr "Невалидно име на филтър" -#: ../src/dialogs.py:3496 +#: ../src/dialogs.py:3622 msgid "You must enter a name to create a privacy list." msgstr "Трябва да въведете име, за да се създаде филтър за уединение." -#: ../src/dialogs.py:3528 +#: ../src/dialogs.py:3654 msgid "You are invited to a groupchat" msgstr "Поканени сте в стая." -#: ../src/dialogs.py:3531 +#: ../src/dialogs.py:3657 msgid "$Contact has invited you to join a discussion" msgstr "$Contact ви покани да се присъедините към дискусия" -#: ../src/dialogs.py:3533 +#: ../src/dialogs.py:3659 #, python-format msgid "$Contact has invited you to group chat %(room_jid)s" msgstr "$Contact ви покани в стая %(room_jid)s." -#: ../src/dialogs.py:3541 +#: ../src/dialogs.py:3667 #, python-format msgid "Comment: %s" msgstr "Коментар: %s" -#: ../src/dialogs.py:3543 +#: ../src/dialogs.py:3669 msgid "Do you want to accept the invitation?" msgstr "Искате ли да приемете поканата?" -#: ../src/dialogs.py:3599 +#: ../src/dialogs.py:3730 msgid "Choose Sound" msgstr "Избор на звук" -#: ../src/dialogs.py:3609 ../src/dialogs.py:3663 +#: ../src/dialogs.py:3740 ../src/dialogs.py:3796 msgid "All files" msgstr "Всички файлове" -#: ../src/dialogs.py:3614 +#: ../src/dialogs.py:3745 msgid "Wav Sounds" msgstr "Формат WAV" -#: ../src/dialogs.py:3650 +#: ../src/dialogs.py:3783 msgid "Choose Image" msgstr "Избор на изображение" -#: ../src/dialogs.py:3668 +#: ../src/dialogs.py:3801 msgid "Images" msgstr "Изображения" -#: ../src/dialogs.py:3733 +#: ../src/dialogs.py:3868 #, python-format msgid "When %s becomes:" msgstr "Когато %s стане:" -#: ../src/dialogs.py:3735 +#: ../src/dialogs.py:3870 #, python-format msgid "Adding Special Notification for %s" msgstr "Добавяне на специално уведомление за %s" #. # means number -#: ../src/dialogs.py:3804 +#: ../src/dialogs.py:3939 msgid "#" msgstr "№" -#: ../src/dialogs.py:3810 +#: ../src/dialogs.py:3945 msgid "Condition" msgstr "Условие" -#: ../src/dialogs.py:3928 +#: ../src/dialogs.py:4065 msgid "when I am " msgstr "когато съм " -#: ../src/dialogs.py:4400 +#: ../src/dialogs.py:4541 #, python-format msgid "" "Your chat session with %(jid)s is encrypted.\n" @@ -7183,19 +7198,19 @@ msgstr "" "\n" "Краткият удостоверителен низ (SAS) на сесията е %(sas)s." -#: ../src/dialogs.py:4404 +#: ../src/dialogs.py:4545 msgid "You have already verified this contact's identity." msgstr "Вече се проверили идентичността на този контакт." -#: ../src/dialogs.py:4410 ../src/dialogs.py:4497 +#: ../src/dialogs.py:4551 ../src/dialogs.py:4640 msgid "Contact's identity verified" msgstr "Идентичността на контакта проверена" -#: ../src/dialogs.py:4418 +#: ../src/dialogs.py:4559 msgid "Verify again..." msgstr "Проверка наново…" -#: ../src/dialogs.py:4423 +#: ../src/dialogs.py:4564 msgid "" "To be certain that only the expected person can read your messages or " "send you messages, you need to verify their identity by clicking the button " @@ -7205,19 +7220,19 @@ msgstr "" "съобщения или да ви изпраща такива, е необходимо да проверите идентичността " "му като натиснете бутона по-долу." -#: ../src/dialogs.py:4426 ../src/dialogs.py:4478 ../src/dialogs.py:4491 +#: ../src/dialogs.py:4567 ../src/dialogs.py:4621 ../src/dialogs.py:4634 msgid "Contact's identity NOT verified" msgstr "Идентичността на контакта НЕ Е проверена" -#: ../src/dialogs.py:4433 +#: ../src/dialogs.py:4574 msgid "Verify..." msgstr "Проверка…" -#: ../src/dialogs.py:4445 +#: ../src/dialogs.py:4586 msgid "Have you verified the contact's identity?" msgstr "Проверихте ли идентичността на контакта?" -#: ../src/dialogs.py:4446 +#: ../src/dialogs.py:4587 #, python-format msgid "" "To prevent talking to an unknown person, you should speak to %(jid)s " @@ -7232,22 +7247,22 @@ msgstr "" "\n" "Краткият удостоверителен низ на тази сесия е %(sas)s." -#: ../src/dialogs.py:4447 +#: ../src/dialogs.py:4588 msgid "Did you talk to the remote contact and verify the SAS?" msgstr "Говорихте ли с отдалечение контакт за проверка на SAS?" -#: ../src/dialogs.py:4479 +#: ../src/dialogs.py:4622 #, python-format msgid "The contact's key (%s) does not match the key assigned in Gajim." msgstr "Ключът на контакта (%s) не съвпада с този, зададен в Gajim." -#: ../src/dialogs.py:4485 +#: ../src/dialogs.py:4628 msgid "No GPG key is assigned to this contact. So you cannot encrypt messages." msgstr "" "Няма зададен ключ на GPG за този контакт, така че не може да шифрирате " "съобщения." -#: ../src/dialogs.py:4492 +#: ../src/dialogs.py:4635 msgid "" "GPG key is assigned to this contact, but you do not trust his key, so " "message cannot be encrypted. Use your GPG client to trust this key." @@ -7256,7 +7271,7 @@ msgstr "" "така че съобщенията не могат да се шифрират. За да се доверите на " "този ключ, използвайте клиент на GPG." -#: ../src/dialogs.py:4498 +#: ../src/dialogs.py:4641 msgid "" "GPG Key is assigned to this contact, and you trust his key, so messages will " "be encrypted." @@ -7264,6 +7279,25 @@ msgstr "" "Има зададен ключ на GPG за този контакт и вие му се доверявате, така че " "съобщенията ще бъдат шифрирани." +#: ../src/dialogs.py:4708 +msgid "an audio and video" +msgstr "" + +#: ../src/dialogs.py:4710 +msgid "an audio" +msgstr "" + +#: ../src/dialogs.py:4712 +msgid "a video" +msgstr "" + +#: ../src/dialogs.py:4716 +#, python-format +msgid "" +"%(contact)s wants to start %(type)s session with you. Do you want to answer " +"the call?" +msgstr "" + #: ../src/disco.py:118 msgid "Others" msgstr "Други" @@ -7273,24 +7307,24 @@ msgstr "Други" msgid "Conference" msgstr "Стаи за разговор" -#: ../src/disco.py:442 +#: ../src/disco.py:478 msgid "Without a connection, you can not browse available services" msgstr "Трябва да сте свързани, за да разглеждате наличните услуги" -#: ../src/disco.py:516 +#: ../src/disco.py:554 #, python-format msgid "Service Discovery using account %s" msgstr "Откриване на налични услуги за акаунт „%s“" -#: ../src/disco.py:518 +#: ../src/disco.py:556 msgid "Service Discovery" msgstr "Откриване на услуги" -#: ../src/disco.py:659 +#: ../src/disco.py:706 msgid "The service could not be found" msgstr "Услугата не може да бъде намерена" -#: ../src/disco.py:660 +#: ../src/disco.py:707 msgid "" "There is no service at the address you entered, or it is not responding. " "Check the address and try again." @@ -7298,295 +7332,276 @@ msgstr "" "Няма услуга на въведения адрес или не отговаря. Проверете адреса и опитайте " "отново." -#: ../src/disco.py:664 ../src/disco.py:960 +#: ../src/disco.py:711 ../src/disco.py:1047 msgid "The service is not browsable" msgstr "Услугата не е достъпна" -#: ../src/disco.py:665 +#: ../src/disco.py:712 msgid "This type of service does not contain any items to browse." msgstr "Този вид услуга не съдържа обекти за показване." -#: ../src/disco.py:702 ../src/disco.py:712 +#: ../src/disco.py:751 ../src/disco.py:761 msgid "Invalid Server Name" msgstr "Невалидно име на сървър" -#: ../src/disco.py:759 +#: ../src/disco.py:815 #, python-format msgid "Browsing %(address)s using account %(account)s" msgstr "Търсене в %(address)s от акаунт „%(account)s“" -#: ../src/disco.py:799 +#: ../src/disco.py:859 msgid "_Browse" msgstr "_Търсене" -#: ../src/disco.py:961 +#: ../src/disco.py:1048 msgid "This service does not contain any items to browse." msgstr "Тази услуга не съдържа обекти за показване." -#: ../src/disco.py:1183 +#: ../src/disco.py:1288 msgid "_Execute Command" msgstr "_Изпълнение на команда" -#: ../src/disco.py:1193 ../src/disco.py:1359 +#: ../src/disco.py:1298 ../src/disco.py:1469 msgid "Re_gister" msgstr "_Регистриране" -#: ../src/disco.py:1396 +#: ../src/disco.py:1510 #, python-format msgid "Scanning %(current)d / %(total)d.." msgstr "Сканиране на %(current)d / %(total)d…" #. Users column -#: ../src/disco.py:1578 +#: ../src/disco.py:1700 msgid "Users" msgstr "Потребители" #. Description column -#: ../src/disco.py:1586 +#: ../src/disco.py:1708 msgid "Description" msgstr "Описание" #. Id column -#: ../src/disco.py:1594 +#: ../src/disco.py:1716 msgid "Id" msgstr "Идентификатор" -#: ../src/disco.py:1659 ../src/gajim.py:3311 +#: ../src/disco.py:1781 ../src/gui_interface.py:3088 msgid "Bookmark already set" msgstr "Отметката вече е установена" -#: ../src/disco.py:1660 ../src/gajim.py:3312 +#: ../src/disco.py:1782 ../src/gui_interface.py:3089 #, python-format msgid "Group Chat \"%s\" is already in your bookmarks." msgstr "Стаята „%s“ вече присъства в отметките." -#: ../src/disco.py:1669 ../src/gajim.py:3325 +#: ../src/disco.py:1791 ../src/gui_interface.py:3102 msgid "Bookmark has been added successfully" msgstr "Отметката беше добавена успешно" -#: ../src/disco.py:1670 ../src/gajim.py:3326 +#: ../src/disco.py:1792 ../src/gui_interface.py:3103 msgid "You can manage your bookmarks via Actions menu in your roster." msgstr "Може да организирате отметките чрез менюто „Действия“." -#: ../src/disco.py:1863 +#: ../src/disco.py:2001 msgid "Subscribed" msgstr "Записан" -#: ../src/disco.py:1871 +#: ../src/disco.py:2009 msgid "Node" msgstr "Възел" -#: ../src/disco.py:1933 +#: ../src/disco.py:2073 msgid "New post" msgstr "Ново съобщение" -#: ../src/disco.py:1939 +#: ../src/disco.py:2079 msgid "_Subscribe" msgstr "_Записване" -#: ../src/disco.py:1945 +#: ../src/disco.py:2085 msgid "_Unsubscribe" msgstr "_Отписване" -#: ../src/features_window.py:46 +#: ../src/features_window.py:48 #, fuzzy msgid "SSL certificat validation" msgstr "Грешка в сертификата на SSL" -#: ../src/features_window.py:47 +#: ../src/features_window.py:49 msgid "" "A library used to validate server certificates to ensure a secure connection." msgstr "" "Библиотека за проверка на валидността на сертификатите на сървърите. " "Използва се за установяване на сигурна връзка." -#: ../src/features_window.py:48 ../src/features_window.py:49 +#: ../src/features_window.py:50 ../src/features_window.py:51 msgid "Requires python-pyopenssl." msgstr "Изисква python-pyopenssl." -#: ../src/features_window.py:50 +#: ../src/features_window.py:52 msgid "Bonjour / Zeroconf" msgstr "Bonjour / Zeroconf" -#: ../src/features_window.py:51 +#: ../src/features_window.py:53 msgid "Serverless chatting with autodetected clients in a local network." msgstr "" "Разговори с автоматично открити контакти в локалната мрежа (без сървър)." -#: ../src/features_window.py:52 +#: ../src/features_window.py:54 msgid "Requires python-avahi." msgstr "Изисква python-avahi." -#: ../src/features_window.py:53 +#: ../src/features_window.py:55 msgid "Requires pybonjour (http://o2s.csail.mit.edu/o2s-wiki/pybonjour)." msgstr "" -#: ../src/features_window.py:54 +#: ../src/features_window.py:56 #, fuzzy msgid "Command line" msgstr "Команди: %s" -#: ../src/features_window.py:55 +#: ../src/features_window.py:57 msgid "A script to control Gajim via commandline." msgstr "Скрипт за управление на Gajim от командния ред." -#: ../src/features_window.py:56 +#: ../src/features_window.py:58 msgid "Requires python-dbus." msgstr "Изисква python-dbus." -#: ../src/features_window.py:57 ../src/features_window.py:61 -#: ../src/features_window.py:65 ../src/features_window.py:69 -#: ../src/features_window.py:73 ../src/features_window.py:81 -#: ../src/features_window.py:85 +#: ../src/features_window.py:59 ../src/features_window.py:63 +#: ../src/features_window.py:67 ../src/features_window.py:71 +#: ../src/features_window.py:75 ../src/features_window.py:83 +#: ../src/features_window.py:87 ../src/features_window.py:111 msgid "Feature not available under Windows." msgstr "" -#: ../src/features_window.py:58 +#: ../src/features_window.py:60 #, fuzzy msgid "OpenGPG message encryption" msgstr "Избор на ключ на OpenPGP" -#: ../src/features_window.py:59 +#: ../src/features_window.py:61 #, fuzzy msgid "Encrypting chat messages with gpg keys." msgstr "Шифриране на съобщения с ключове на GPG." -#: ../src/features_window.py:60 +#: ../src/features_window.py:62 msgid "Requires gpg and python-GnuPGInterface." msgstr "Изисква gpg и python-GnuPGInterface." -#: ../src/features_window.py:62 +#: ../src/features_window.py:64 #, fuzzy msgid "Network-manager" msgstr "network-manager" -#: ../src/features_window.py:63 +#: ../src/features_window.py:65 msgid "Autodetection of network status." msgstr "Автоматично засичане на състоянието на мрежата." -#: ../src/features_window.py:64 +#: ../src/features_window.py:66 msgid "Requires gnome-network-manager and python-dbus." msgstr "Изисква gnome-network-manager и python-dbus." -#: ../src/features_window.py:66 +#: ../src/features_window.py:68 msgid "Session Management" msgstr "Управление на сесии" -#: ../src/features_window.py:67 +#: ../src/features_window.py:69 msgid "Gajim session is stored on logout and restored on login." msgstr "Запазва сесията на Gajim при излизане и я възстановява при влизане." -#: ../src/features_window.py:68 +#: ../src/features_window.py:70 msgid "Requires python-gnome2." msgstr "Изисква python-gnome2." -#: ../src/features_window.py:70 +#: ../src/features_window.py:72 #, fuzzy msgid "Password encryption" msgstr "Парола за влизане в стаята" -#: ../src/features_window.py:71 +#: ../src/features_window.py:73 msgid "Passwords can be stored securely and not just in plaintext." msgstr "" "Паролите могат да се съхраняват по сигурен начин, вместо в обикновен текст." -#: ../src/features_window.py:72 +#: ../src/features_window.py:74 #, fuzzy msgid "Requires gnome-keyring and python-gnome2-desktop, or kwalletcli." msgstr "Изисква gnome-keyring и python-gnome2-desktop." -#: ../src/features_window.py:74 +#: ../src/features_window.py:76 msgid "SRV" msgstr "SRV" -#: ../src/features_window.py:75 +#: ../src/features_window.py:77 msgid "Ability to connect to servers which are using SRV records." msgstr "Възможност за свързване към сървъри, които използват записи SRV." -#: ../src/features_window.py:76 +#: ../src/features_window.py:78 msgid "Requires dnsutils." msgstr "Изисква dnsutils." -#: ../src/features_window.py:77 +#: ../src/features_window.py:79 msgid "Requires nslookup to use SRV records." msgstr "" -#: ../src/features_window.py:78 +#: ../src/features_window.py:80 msgid "Spell Checker" msgstr "Проверка на правописа" -#: ../src/features_window.py:79 +#: ../src/features_window.py:81 msgid "Spellchecking of composed messages." msgstr "Проверка на изходящите съобщения за правописни грешки." -#: ../src/features_window.py:80 +#: ../src/features_window.py:82 #, fuzzy msgid "Requires libgtkspell." msgstr "Изисква python-sexy." -#: ../src/features_window.py:82 +#: ../src/features_window.py:84 #, fuzzy msgid "Notification" msgstr "Уведомления" -#: ../src/features_window.py:83 +#: ../src/features_window.py:85 msgid "Passive popups notifying for new events." msgstr "Изскачащи прозорци с уведомления за нови събития." -#: ../src/features_window.py:84 +#: ../src/features_window.py:86 msgid "" "Requires python-notify or instead python-dbus in conjunction with " "notification-daemon." msgstr "Изисква python-notify или python-dbus заедно с notification-daemon." -#: ../src/features_window.py:86 -msgid "Trayicon" -msgstr "Икона в областта за уведомяване" - -#: ../src/features_window.py:87 -msgid "A icon in systemtray reflecting the current presence." -msgstr "Икона в областта за уведомяване, отразяваща текущото състояние." - #: ../src/features_window.py:88 -msgid "" -"Requires python-gnome2-extras or compiled trayicon module from Gajim sources." -msgstr "" -"Изисква python-gnome2-extras или компилиран модул „trayicon“ от изходния код " -"на Gajim." - -#: ../src/features_window.py:89 -msgid "Requires PyGTK >= 2.10." -msgstr "" - -#: ../src/features_window.py:90 #, fuzzy msgid "Automatic status" msgstr "_Съгласуване спрямо състоянието" -#: ../src/features_window.py:91 +#: ../src/features_window.py:89 msgid "Ability to measure idle time, in order to set auto status." msgstr "" "Възможност за измерване на времето на бездействие, с цел да се установи " "автоматично съобщение за състояние." -#: ../src/features_window.py:92 +#: ../src/features_window.py:90 msgid "Requires libxss library." msgstr "" -#: ../src/features_window.py:93 +#: ../src/features_window.py:91 #, fuzzy msgid "Requires python2.5." msgstr "Изисква python-gnome2." -#: ../src/features_window.py:94 +#: ../src/features_window.py:92 msgid "LaTeX" msgstr "LaTeX" -#: ../src/features_window.py:95 +#: ../src/features_window.py:93 msgid "Transform LaTeX expressions between $$ $$." msgstr "Трансформира изрази на LaTex, разграничени с $$ $$." -#: ../src/features_window.py:96 +#: ../src/features_window.py:94 msgid "" "Requires texlive-latex-base and dvipng. You have to set 'use_latex' to True " "in the Advanced Configuration Editor." @@ -7594,31 +7609,31 @@ msgstr "" "Изисква texlive-latex-base и dvipng. Трябва да активирате опцията " "„use_latex“ в редактора на настройки за напреднали." -#: ../src/features_window.py:97 +#: ../src/features_window.py:95 msgid "" "Requires texlive-latex-base and dvipng (All is in MikTeX). You have to set " "'use_latex' to True in the Advanced Configuration Editor." msgstr "" -#: ../src/features_window.py:98 +#: ../src/features_window.py:96 #, fuzzy msgid "End to End message encryption" msgstr "Шифриране тип „End to End“" -#: ../src/features_window.py:99 +#: ../src/features_window.py:97 #, fuzzy msgid "Encrypting chat messages." msgstr "Шифриране на разговорите." -#: ../src/features_window.py:100 ../src/features_window.py:101 +#: ../src/features_window.py:98 ../src/features_window.py:99 msgid "Requires python-crypto." msgstr "Изисква python-crypto." -#: ../src/features_window.py:102 +#: ../src/features_window.py:100 msgid "RST Generator" msgstr "Генератор на RST" -#: ../src/features_window.py:103 +#: ../src/features_window.py:101 msgid "" "Generate XHTML output from RST code (see http://docutils.sourceforge.net/" "docs/ref/rst/restructuredtext.html)." @@ -7626,25 +7641,38 @@ msgstr "" "Генериране на изход в XHTML от RST (вижте http://docutils.sourceforge.net/" "docs/ref/rst/restructuredtext.html)." -#: ../src/features_window.py:104 ../src/features_window.py:105 +#: ../src/features_window.py:102 ../src/features_window.py:103 msgid "Requires python-docutils." msgstr "Изисква python-docutils." -#: ../src/features_window.py:106 +#: ../src/features_window.py:104 msgid "Banners and clickable links" msgstr "" -#: ../src/features_window.py:107 +#: ../src/features_window.py:105 msgid "Ability to have clickable URLs in chat and groupchat window banners." msgstr "" "Възможност за натискане с мишката върху адреси в заглавните части на " "прозорците." -#: ../src/features_window.py:108 ../src/features_window.py:109 +#: ../src/features_window.py:106 ../src/features_window.py:107 msgid "Requires python-sexy." msgstr "Изисква python-sexy." -#: ../src/features_window.py:123 +#: ../src/features_window.py:108 +msgid "Audio / Video" +msgstr "" + +#: ../src/features_window.py:109 +msgid "Ability to start audio and video chat." +msgstr "" + +#: ../src/features_window.py:110 +#, fuzzy +msgid "Requires python-farsight." +msgstr "Изисква python-avahi." + +#: ../src/features_window.py:125 msgid "Feature" msgstr "Функционалност" @@ -7660,139 +7688,139 @@ msgstr "Време" msgid "Progress" msgstr "Напредък" -#: ../src/filetransfers_window.py:173 ../src/filetransfers_window.py:227 +#: ../src/filetransfers_window.py:177 ../src/filetransfers_window.py:233 #, python-format msgid "Filename: %s" msgstr "Име на файл: %s" -#: ../src/filetransfers_window.py:174 ../src/filetransfers_window.py:313 +#: ../src/filetransfers_window.py:178 ../src/filetransfers_window.py:323 #, python-format msgid "Size: %s" msgstr "Размер: %s" #. You is a reply of who sent a file #. You is a reply of who received a file -#: ../src/filetransfers_window.py:183 ../src/filetransfers_window.py:193 -#: ../src/history_manager.py:520 +#: ../src/filetransfers_window.py:187 ../src/filetransfers_window.py:197 +#: ../src/history_manager.py:529 msgid "You" msgstr "Вие" -#: ../src/filetransfers_window.py:184 +#: ../src/filetransfers_window.py:188 #, python-format msgid "Sender: %s" msgstr "Изпращач: %s" -#: ../src/filetransfers_window.py:185 ../src/filetransfers_window.py:596 -#: ../src/tooltips.py:670 +#: ../src/filetransfers_window.py:189 ../src/filetransfers_window.py:617 +#: ../src/tooltips.py:651 msgid "Recipient: " msgstr "Получател: " -#: ../src/filetransfers_window.py:196 +#: ../src/filetransfers_window.py:200 #, python-format msgid "Saved in: %s" msgstr "Запазен в: %s" -#: ../src/filetransfers_window.py:198 +#: ../src/filetransfers_window.py:202 msgid "File transfer completed" msgstr "Файловият трансфер завърши" -#: ../src/filetransfers_window.py:212 ../src/filetransfers_window.py:218 +#: ../src/filetransfers_window.py:217 ../src/filetransfers_window.py:224 msgid "File transfer cancelled" msgstr "Файловият трансфер е прекъснат" -#: ../src/filetransfers_window.py:212 ../src/filetransfers_window.py:219 +#: ../src/filetransfers_window.py:217 ../src/filetransfers_window.py:225 msgid "Connection with peer cannot be established." msgstr "Не може да бъде установен контакт с отсрещната машина." -#: ../src/filetransfers_window.py:228 +#: ../src/filetransfers_window.py:234 #, python-format msgid "Recipient: %s" msgstr "Получател: %s" -#: ../src/filetransfers_window.py:230 +#: ../src/filetransfers_window.py:236 #, python-format msgid "Error message: %s" msgstr "Грешка: %s" -#: ../src/filetransfers_window.py:231 +#: ../src/filetransfers_window.py:237 #, fuzzy msgid "File transfer stopped" msgstr "Файловият трансфер е преустановен" -#: ../src/filetransfers_window.py:251 +#: ../src/filetransfers_window.py:257 msgid "Choose File to Send..." msgstr "Избор на файл за изпращане…" -#: ../src/filetransfers_window.py:267 ../src/tooltips.py:708 +#: ../src/filetransfers_window.py:273 ../src/tooltips.py:689 msgid "Description: " msgstr "Описание: " -#: ../src/filetransfers_window.py:278 +#: ../src/filetransfers_window.py:286 msgid "Gajim cannot access this file" msgstr "Неуспех при достъпа до този файл" -#: ../src/filetransfers_window.py:279 +#: ../src/filetransfers_window.py:287 msgid "This file is being used by another process." msgstr "Този файл се използва от друг процес." -#: ../src/filetransfers_window.py:310 +#: ../src/filetransfers_window.py:320 #, python-format msgid "File: %s" msgstr "Файл: %s" -#: ../src/filetransfers_window.py:316 +#: ../src/filetransfers_window.py:326 #, python-format msgid "Type: %s" msgstr "Тип: %s" -#: ../src/filetransfers_window.py:318 +#: ../src/filetransfers_window.py:328 #, python-format msgid "Description: %s" msgstr "Описание: %s" -#: ../src/filetransfers_window.py:319 +#: ../src/filetransfers_window.py:329 #, python-format msgid "%s wants to send you a file:" msgstr "%s иска да ви изпрати файл:" -#: ../src/filetransfers_window.py:332 ../src/gtkgui_helpers.py:812 +#: ../src/filetransfers_window.py:342 ../src/gtkgui_helpers.py:858 #, python-format msgid "Cannot overwrite existing file \"%s\"" msgstr "Неуспех при презаписването на съществуващия файл „%s“" -#: ../src/filetransfers_window.py:333 ../src/gtkgui_helpers.py:814 +#: ../src/filetransfers_window.py:343 ../src/gtkgui_helpers.py:860 msgid "" "A file with this name already exists and you do not have permission to " "overwrite it." msgstr "Вече съществува файл с това име и нямате права да го презапишете." -#: ../src/filetransfers_window.py:349 ../src/gtkgui_helpers.py:818 +#: ../src/filetransfers_window.py:359 ../src/gtkgui_helpers.py:864 msgid "This file already exists" msgstr "Този файл вече съществува" -#: ../src/filetransfers_window.py:349 ../src/gtkgui_helpers.py:818 +#: ../src/filetransfers_window.py:359 ../src/gtkgui_helpers.py:864 msgid "What do you want to do?" msgstr "Какво искате да направите?" #. read-only bit is used to mark special folder under windows, #. not to mark that a folder is read-only. See ticket #3587 -#: ../src/filetransfers_window.py:359 ../src/gtkgui_helpers.py:825 +#: ../src/filetransfers_window.py:369 ../src/gtkgui_helpers.py:871 #, python-format msgid "Directory \"%s\" is not writable" msgstr "Папката „%s“ не е разрешена за запис" -#: ../src/filetransfers_window.py:359 ../src/gtkgui_helpers.py:826 +#: ../src/filetransfers_window.py:369 ../src/gtkgui_helpers.py:872 msgid "You do not have permission to create files in this directory." msgstr "Нямата права да създавате файлове в тази папка." -#: ../src/filetransfers_window.py:369 +#: ../src/filetransfers_window.py:379 msgid "Save File as..." msgstr "Запазване на файла като…" #. Print remaining time in format 00:00:00 #. You can change the places of (hours), (minutes), (seconds) - #. they are not translatable. -#: ../src/filetransfers_window.py:435 +#: ../src/filetransfers_window.py:449 #, python-format msgid "%(hours)02.d:%(minutes)02.d:%(seconds)02.d" msgstr "%(hours)02.d:%(minutes)02.d:%(seconds)02.d" @@ -7800,32 +7828,32 @@ msgstr "%(hours)02.d:%(minutes)02.d:%(seconds)02.d" #. This should make the string Kb/s, #. where 'Kb' part is taken from %s. #. Only the 's' after / (which means second) should be translated. -#: ../src/filetransfers_window.py:526 +#: ../src/filetransfers_window.py:542 #, python-format msgid "(%(filesize_unit)s/s)" msgstr "(%(filesize_unit)s/сек)" -#: ../src/filetransfers_window.py:566 ../src/filetransfers_window.py:569 +#: ../src/filetransfers_window.py:585 ../src/filetransfers_window.py:588 msgid "Invalid File" msgstr "Невалиден файл" -#: ../src/filetransfers_window.py:566 +#: ../src/filetransfers_window.py:585 msgid "File: " msgstr "Файл: " -#: ../src/filetransfers_window.py:570 +#: ../src/filetransfers_window.py:589 msgid "It is not possible to send empty files" msgstr "Не е възможно да бъдат изпращани празни файлове" -#: ../src/filetransfers_window.py:592 ../src/tooltips.py:660 +#: ../src/filetransfers_window.py:613 ../src/tooltips.py:641 msgid "Name: " msgstr "Име: " -#: ../src/filetransfers_window.py:594 ../src/tooltips.py:664 +#: ../src/filetransfers_window.py:615 ../src/tooltips.py:645 msgid "Sender: " msgstr "Изпращач: " -#: ../src/filetransfers_window.py:781 +#: ../src/filetransfers_window.py:809 msgid "Pause" msgstr "Пауза" @@ -7895,11 +7923,11 @@ msgstr "" "Уверете се, че Pywin32 е инсталиран на системата. Може да го изтеглите от %s" #. set the icon to all newly opened wind -#: ../src/gajim.py:354 +#: ../src/gajim.py:328 msgid "Gajim is already running" msgstr "Gajim вече е стартиран" -#: ../src/gajim.py:355 +#: ../src/gajim.py:329 msgid "" "Another instance of Gajim seems to be running\n" "Run anyway?" @@ -7907,462 +7935,28 @@ msgstr "" "Изглежда вече е стартирана друга инстанция на Gajim\n" "Продължаване въпреки това?" -#: ../src/gajim.py:440 -msgid "Passphrase Required" -msgstr "Необходима е парола" - -#: ../src/gajim.py:441 -#, python-format -msgid "Enter GPG key passphrase for key %(keyid)s (account %(account)s)." -msgstr "Въведете парола за ключ на GPG %(keyid)s (акаунт „%(account)s“)." - -#: ../src/gajim.py:455 -#, fuzzy -msgid "GPG key expired" -msgstr "Няма зададен ключ на GPG" - -#: ../src/gajim.py:456 -#, fuzzy, python-format -msgid "Your GPG key has expied, you will be connected to %s without OpenPGP." -msgstr "Ще бъдете свързани към „%s“ без OpenPGP." - -#. ask again -#: ../src/gajim.py:465 -msgid "Wrong Passphrase" -msgstr "Грешна парола" - -#: ../src/gajim.py:466 -msgid "Please retype your GPG passphrase or press Cancel." -msgstr "Въведете паролата за GPG ключа наново или натиснете „Отказване“." - -#: ../src/gajim.py:524 -#, python-format -msgid "" -"Your desired nickname in group chat %s is in use or registered by another " -"occupant.\n" -"Please specify another nickname below:" -msgstr "" -"Желаният от вас псевдоним за стая %s се използва или е регистриран от друг " -"участник.\n" -"Укажете друг псевдоним по-долу:" - -#: ../src/gajim.py:527 -msgid "Always use this nickname when there is a conflict" -msgstr "" - -#: ../src/gajim.py:544 -msgid "Do you accept this request?" -msgstr "Приемате ли това запитване?" - -#: ../src/gajim.py:546 -#, python-format -msgid "Do you accept this request on account %s?" -msgstr "Приемате ли това запитване за акаунт %s?" - -#: ../src/gajim.py:549 -#, python-format -msgid "HTTP (%(method)s) Authorization for %(url)s (id: %(id)s)" -msgstr "Упълномощаване по HTTP (%(method)s) за „%(url)s“ (id: %(id)s)" - -#: ../src/gajim.py:600 ../src/notify.py:511 -msgid "Connection Failed" -msgstr "Неуспех при свързването" - -#: ../src/gajim.py:933 ../src/gajim.py:937 -#, python-format -msgid "Error %(code)s: %(msg)s" -msgstr "Грешка %(code)s: %(msg)s" - -#. ('MSGNOTSENT', account, (jid, ierror_msg, msg, time, session)) -#: ../src/gajim.py:947 ../src/gajim.py:961 -#, python-format -msgid "error while sending %(message)s ( %(error)s )" -msgstr "грешка при изпращане на %(message)s ( %(error)s )" - -#: ../src/gajim.py:988 ../src/notify.py:513 -#, fuzzy -msgid "Subscription request" -msgstr "Искане за записване" - -#: ../src/gajim.py:1013 -msgid "Authorization accepted" -msgstr "Упълномощаването е прието" - -#: ../src/gajim.py:1014 -#, python-format -msgid "The contact \"%s\" has authorized you to see his or her status." -msgstr "Контактът „%s“ ви упълномощи да виждате състоянието му." - -#: ../src/gajim.py:1026 -#, python-format -msgid "Contact \"%s\" removed subscription from you" -msgstr "Контактът „%s“ премахна записването за вас" - -#: ../src/gajim.py:1027 -msgid "" -"You will always see him or her as offline.\n" -"Do you want to remove him or her from your contact list?" -msgstr "" -"Винаги ще го виждате като изключен.\n" -"Искате ли да го премахнете от списъка с контакти?" - -#: ../src/gajim.py:1052 ../src/notify.py:515 -#, fuzzy -msgid "Unsubscribed" -msgstr "_Отписване" - -#: ../src/gajim.py:1093 -#, python-format -msgid "Contact with \"%s\" cannot be established" -msgstr "Неуспех при установяването на контакт с „%s“" - -#: ../src/gajim.py:1283 ../src/groupchat_control.py:1251 -#, python-format -msgid "%(nick)s is now known as %(new_nick)s" -msgstr "%(nick)s вече е познат като %(new_nick)s" - -#: ../src/gajim.py:1308 ../src/groupchat_control.py:1436 -#: ../src/history_window.py:431 ../src/notify.py:244 -#, python-format -msgid "%(nick)s is now %(status)s" -msgstr "%(nick)s вече е %(status)s" - -#: ../src/gajim.py:1375 -#, python-format -msgid "%(jid)s has set the subject to %(subject)s" -msgstr "%(jid)s зададе темата на %(subject)s" - -#. Can be a presence (see chg_contact_status in groupchat_control.py) -#. Can be a message (see handle_event_gc_config_change in gajim.py) -#: ../src/gajim.py:1439 ../src/groupchat_control.py:1191 -msgid "Any occupant is allowed to see your full JID" -msgstr "На всеки участник е позволено да вижда вашия JID" - -#: ../src/gajim.py:1442 -msgid "Room now shows unavailable member" -msgstr "Стаята показва отсъстващ член" - -#: ../src/gajim.py:1444 -msgid "room now does not show unavailable members" -msgstr "Стаята не показва отсъстващи членове" - -#: ../src/gajim.py:1447 -msgid "A non-privacy-related room configuration change has occurred" -msgstr "" -"Възникна промяна в конфигурацията на стаята (не е свързана с настройки за " -"уединение)" - -#. Can be a presence (see chg_contact_status in groupchat_control.py) -#: ../src/gajim.py:1450 -msgid "Room logging is now enabled" -msgstr "Воденето на дневник на стаята е включено" - -#: ../src/gajim.py:1452 -msgid "Room logging is now disabled" -msgstr "Воденето на дневник на стаята е изключено" - -#: ../src/gajim.py:1454 -msgid "Room is now non-anonymous" -msgstr "Стаята не е анонимна" - -#: ../src/gajim.py:1457 -msgid "Room is now semi-anonymous" -msgstr "Стаята е полу-анонимна" - -#: ../src/gajim.py:1460 -msgid "Room is now fully-anonymous" -msgstr "Стаята е напълно анонимна" - -#: ../src/gajim.py:1492 -#, python-format -msgid "A Password is required to join the room %s. Please type it." -msgstr "Необходима е парола за влизане в стаята „%s“. Въведете я." - -#: ../src/gajim.py:1526 -msgid "" -"You configured Gajim to use GPG agent, but there is no GPG agent running or " -"it returned a wrong passphrase.\n" -msgstr "" -"Конфигурирали сте Gajim да използва агент на GPG, но такъв не е стартиран " -"или е предоставил грешна парола.\n" - -#: ../src/gajim.py:1528 ../src/gajim.py:1534 -msgid "You are currently connected without your OpenPGP key." -msgstr "В момента сте свързани без OpenPGP ключ." - -#: ../src/gajim.py:1529 -msgid "Your passphrase is incorrect" -msgstr "Паролата е грешна" - -#: ../src/gajim.py:1533 -#, fuzzy -msgid "OpenGPG Passphrase Incorrect" -msgstr "Паролата е грешна" - -#: ../src/gajim.py:1559 -#, fuzzy -msgid "GPG key not trusted" -msgstr "GPG не е използваем" - -#: ../src/gajim.py:1559 -#, fuzzy -msgid "" -"The GPG key used to encrypt this chat is not trusted. Do you really want to " -"encrypt this message?" -msgstr "" -"Няма зададен ключ на GPG за този контакт, така че не може да шифрирате " -"съобщения." - -#: ../src/gajim.py:1561 ../src/gajim.py:2227 ../src/gajim.py:2262 -#: ../src/groupchat_control.py:1674 ../src/message_window.py:222 -#: ../src/roster_window.py:2667 ../src/roster_window.py:3292 -#: ../src/roster_window.py:3970 -msgid "Do _not ask me again" -msgstr "Да _не се задава този въпрос отново" - -#: ../src/gajim.py:1571 -#, fuzzy -msgid "" -"Gnome Keyring is installed but not \t\t\t\tcorrectly started (environment " -"variable probably not \t\t\t\tcorrectly set)" -msgstr "" -"Наборът с ключове на GNOME е инсталиран, но не е стартиран правилно (навярно " -"променливата на обкръжението не е настроена)" - -#: ../src/gajim.py:1681 -#, python-format -msgid "New mail on %(gmail_mail_address)s" -msgstr "Ново писмо за %(gmail_mail_address)s" - -#: ../src/gajim.py:1683 -#, python-format -msgid "You have %d new mail conversation" -msgid_plural "You have %d new mail conversations" -msgstr[0] "Имате %d ново писмо" -msgstr[1] "Имате %d нови писма" - -#: ../src/gajim.py:1696 -#, python-format -msgid "" -"\n" -"\n" -"From: %(from_address)s\n" -"Subject: %(subject)s\n" -"%(snippet)s" -msgstr "" -"\n" -"\n" -"От: %(from_address)s\n" -"Тема: %(subject)s\n" -"%(snippet)s" - -#: ../src/gajim.py:1767 -#, python-format -msgid "%s wants to send you a file." -msgstr "%s иска да ви изпрати файл." - -#: ../src/gajim.py:1805 ../src/roster_window.py:1851 -#, fuzzy -msgid "Remote contact stopped transfer" -msgstr "Премахване на контакт от списъка" - -#: ../src/gajim.py:1807 ../src/roster_window.py:1853 -#, fuzzy -msgid "Error opening file" -msgstr "Грешка при четене на файл:" - -#: ../src/gajim.py:1838 -#, python-format -msgid "You successfully received %(filename)s from %(name)s." -msgstr "Успешно получихте %(filename)s от %(name)s." - -#. ft stopped -#: ../src/gajim.py:1842 -#, python-format -msgid "File transfer of %(filename)s from %(name)s stopped." -msgstr "Файловият трансфер на %(filename)s от %(name)s прекъсна." - -#: ../src/gajim.py:1855 -#, python-format -msgid "You successfully sent %(filename)s to %(name)s." -msgstr "Успешно изпратихте %(filename)s на %(name)s." - -#. ft stopped -#: ../src/gajim.py:1859 -#, python-format -msgid "File transfer of %(filename)s to %(name)s stopped." -msgstr "Файловият трансфер на %(filename)s до %(name)s прекъсна." - -#: ../src/gajim.py:1961 -#, python-format -msgid "" -"Unable to decrypt message from %s\n" -"It may have been tampered with." -msgstr "" -"Неуспех при дешифрирането на съобщение от %s\n" -"Възможно е да е било фалшифицирано." - -#: ../src/gajim.py:1968 -msgid "Unable to decrypt message" -msgstr "Неуспех при дешифриране на съобщението" - -#: ../src/gajim.py:2042 -msgid "Username Conflict" -msgstr "Конфликт с имената на потребители" - -#: ../src/gajim.py:2043 -msgid "Please type a new username for your local account" -msgstr "Укажете ново потребителско име за локалния ви акаунт" - -#: ../src/gajim.py:2055 -msgid "Ping?" -msgstr "Пинг?" - -#: ../src/gajim.py:2068 -#, python-format -msgid "Pong! (%s s.)" -msgstr "Понг! (%s сек)" - -#: ../src/gajim.py:2079 -msgid "Error." -msgstr "Грешка." - -#: ../src/gajim.py:2106 -msgid "Resource Conflict" -msgstr "Конфликт на ресурсите" - -#: ../src/gajim.py:2107 -msgid "" -"You are already connected to this account with the same resource. Please " -"type a new one" -msgstr "Вече сте свързани към този акаунт със същия ресурс. Въведете нов." - -#: ../src/gajim.py:2166 -msgid "Error verifying SSL certificate" -msgstr "Грешка при проверка на сертификата на SSL" - -#: ../src/gajim.py:2167 -#, python-format -msgid "" -"There was an error verifying the SSL certificate of your jabber server: %" -"(error)s\n" -"Do you still want to connect to this server?" -msgstr "" -"Възникна грешка при проверката на сертификата за вашия сървър на Джабър: %" -"(error)s\n" -"Все още ли искате да се свържете със сървъра?" - -#: ../src/gajim.py:2172 -msgid "Ignore this error for this certificate." -msgstr "Пренебрегване на грешката за този сертификат." - -#: ../src/gajim.py:2192 -msgid "SSL certificate error" -msgstr "Грешка в сертификата на SSL" - -#: ../src/gajim.py:2193 -#, fuzzy, python-format -msgid "" -"It seems the SSL certificate of account %(account)s has changed or your " -"connection is being hacked.\n" -"Old fingerprint: %(old)s\n" -"New fingerprint: %(new)s\n" -"\n" -"Do you still want to connect and update the fingerprint of the certificate?" -msgstr "" -"Изглежда сертификатът на SSL е бил променен или връзката е взломена.\n" -"Стар отпечатък: %(old)s\n" -"Нов отпечатък: %(new)s\n" -"\n" -"Все още ли искате да се свържете и да обновите отпечатъка на сертификата?" - -#: ../src/gajim.py:2223 ../src/gajim.py:2258 -msgid "Insecure connection" -msgstr "Несигурна връзка" - -#: ../src/gajim.py:2224 -msgid "" -"You are about to send your password on an unencrypted connection. Are you " -"sure you want to do that?" -msgstr "" -"На път сте да изпратите паролата си чрез нешифрирана връзка. Сигурни ли сте, " -"че искате да го направите?" - -#: ../src/gajim.py:2226 ../src/gajim.py:2261 -msgid "Yes, I really want to connect insecurely" -msgstr "Да, наистина искам да се свържа по несигурен начин" - -#: ../src/gajim.py:2259 -msgid "" -"You are about to send your password on an insecure connection. You should " -"install PyOpenSSL to prevent that. Are you sure you want to do that?" -msgstr "" -"На път сте да изпратите паролата си чрез несигурна връзка. Трябва да " -"инсталирате PyOpenSSL, за да предотвратите това. Сигурни ли сте, че искате " -"да го направите?" - -#: ../src/gajim.py:2279 -msgid "PEP node was not removed" -msgstr "Възелът на PEP не беше премахнат" - -#: ../src/gajim.py:2280 -#, python-format -msgid "PEP node %(node)s was not removed: %(message)s" -msgstr "Възелът на PEP %(node)s не беше премахнат: %(message)s" - -#. theme doesn't exist, disable emoticons -#: ../src/gajim.py:2784 ../src/gajim.py:2806 -msgid "Emoticons disabled" -msgstr "Емотиконите са изключени" - -#: ../src/gajim.py:2785 -msgid "" -"Your configured emoticons theme has not been found, so emoticons have been " -"disabled." -msgstr "Темата с емотикони не беше намерена, така че са изключени." - -#: ../src/gajim.py:2807 -msgid "" -"Your configured emoticons theme cannot been loaded. You maybe need to update " -"the format of emoticons.py file. See http://trac.gajim.org/wiki/Emoticons " -"for more details." -msgstr "" -"Темата с емотикони не можа да бъде заредена. Навярно трябва да обновите " -"формата на файла emoticons.py. Вижте http://trac.gajim.org/wiki/Emoticons за " -"повече подробности." - -#: ../src/gajim.py:2833 ../src/roster_window.py:3432 -msgid "You cannot join a group chat while you are invisible" -msgstr "Не може да влезете в стая, докато сте невидими." - -#. it is good to notify the user -#. in case he or she cannot see the output of the console -#: ../src/gajim.py:3202 -msgid "Could not save your settings and preferences" -msgstr "Неуспех при запазването на настройките" - -#: ../src/gajim-remote.py:78 +#: ../src/gajim-remote.py:77 msgid "Shows a help on specific command" msgstr "Показва помощ за специфична команда" #. User gets help for the command, specified by this parameter -#: ../src/gajim-remote.py:81 +#: ../src/gajim-remote.py:80 msgid "command" msgstr "команда" -#: ../src/gajim-remote.py:82 +#: ../src/gajim-remote.py:81 msgid "show help on command" msgstr "показване на помощ за команда" -#: ../src/gajim-remote.py:86 +#: ../src/gajim-remote.py:85 msgid "Shows or hides the roster window" msgstr "Показва или скрива списъка" -#: ../src/gajim-remote.py:90 +#: ../src/gajim-remote.py:89 msgid "Pops up a window with the next pending event" msgstr "Показва следващото чакащо събитие в изскачащ прозорец" -#: ../src/gajim-remote.py:94 +#: ../src/gajim-remote.py:93 msgid "" "Prints a list of all contacts in the roster. Each contact appears on a " "separate line" @@ -8370,52 +7964,52 @@ msgstr "" "Показване на списък с всички контакти. Всеки контакт се появява на отделен " "ред" -#: ../src/gajim-remote.py:97 ../src/gajim-remote.py:112 -#: ../src/gajim-remote.py:122 ../src/gajim-remote.py:132 -#: ../src/gajim-remote.py:148 ../src/gajim-remote.py:162 -#: ../src/gajim-remote.py:171 ../src/gajim-remote.py:192 -#: ../src/gajim-remote.py:222 ../src/gajim-remote.py:231 -#: ../src/gajim-remote.py:238 ../src/gajim-remote.py:245 -#: ../src/gajim-remote.py:256 ../src/gajim-remote.py:272 -#: ../src/gajim-remote.py:283 +#: ../src/gajim-remote.py:96 ../src/gajim-remote.py:111 +#: ../src/gajim-remote.py:121 ../src/gajim-remote.py:131 +#: ../src/gajim-remote.py:147 ../src/gajim-remote.py:161 +#: ../src/gajim-remote.py:170 ../src/gajim-remote.py:191 +#: ../src/gajim-remote.py:221 ../src/gajim-remote.py:230 +#: ../src/gajim-remote.py:237 ../src/gajim-remote.py:244 +#: ../src/gajim-remote.py:255 ../src/gajim-remote.py:271 +#: ../src/gajim-remote.py:282 msgid "account" msgstr "акаунт" -#: ../src/gajim-remote.py:97 +#: ../src/gajim-remote.py:96 msgid "show only contacts of the given account" msgstr "показва само контактите на дадения акаунт" -#: ../src/gajim-remote.py:103 +#: ../src/gajim-remote.py:102 msgid "Prints a list of registered accounts" msgstr "Показване на списък с регистрираните акаунти" -#: ../src/gajim-remote.py:107 +#: ../src/gajim-remote.py:106 msgid "Changes the status of account or accounts" msgstr "Промяна на състоянието на акаунта или акаунтите" #. offline, online, chat, away, xa, dnd, invisible should not be translated -#: ../src/gajim-remote.py:110 +#: ../src/gajim-remote.py:109 msgid "status" msgstr "състояние" -#: ../src/gajim-remote.py:110 +#: ../src/gajim-remote.py:109 msgid "one of: offline, online, chat, away, xa, dnd, invisible " msgstr "" "едно от: offline (изключен), online (на линия), chat (свободен за разговор), " "away (отсъствам), xa (не съм на разположение), dnd (зает), invisible " "(невидим)" -#: ../src/gajim-remote.py:111 ../src/gajim-remote.py:134 -#: ../src/gajim-remote.py:145 ../src/gajim-remote.py:159 -#: ../src/gajim-remote.py:170 ../src/gajim-remote.py:274 +#: ../src/gajim-remote.py:110 ../src/gajim-remote.py:133 +#: ../src/gajim-remote.py:144 ../src/gajim-remote.py:158 +#: ../src/gajim-remote.py:169 ../src/gajim-remote.py:273 msgid "message" msgstr "съобщение" -#: ../src/gajim-remote.py:111 +#: ../src/gajim-remote.py:110 msgid "status message" msgstr "съобщение за състояние" -#: ../src/gajim-remote.py:112 +#: ../src/gajim-remote.py:111 msgid "" "change status of account \"account\". If not specified, try to change status " "of all accounts that have \"sync with global status\" option set" @@ -8424,22 +8018,22 @@ msgstr "" "състоянието на всички акаунти, които имат настроена опция „синхронизиране с " "общото състояние“" -#: ../src/gajim-remote.py:118 +#: ../src/gajim-remote.py:117 #, fuzzy msgid "Changes the priority of account or accounts" msgstr "Промяна на състоянието на акаунта или акаунтите" -#: ../src/gajim-remote.py:120 +#: ../src/gajim-remote.py:119 #, fuzzy msgid "priority" msgstr "Приори_тет:" -#: ../src/gajim-remote.py:120 +#: ../src/gajim-remote.py:119 #, fuzzy msgid "priority you want to give to the account" msgstr "_Искам да регистрирам нов акаунт" -#: ../src/gajim-remote.py:122 +#: ../src/gajim-remote.py:121 #, fuzzy msgid "" "change the priority of the given account. If not specified, change status of " @@ -8449,25 +8043,25 @@ msgstr "" "състоянието на всички акаунти, които имат настроена опция „синхронизиране с " "общото състояние“" -#: ../src/gajim-remote.py:128 +#: ../src/gajim-remote.py:127 msgid "Shows the chat dialog so that you can send messages to a contact" msgstr "" "Показване на диалогов прозорец за разговор, за да може да се изпрати " "съобщение до контакта" -#: ../src/gajim-remote.py:130 +#: ../src/gajim-remote.py:129 msgid "JID of the contact that you want to chat with" msgstr "JID на контакта, с който искате да разговаряте" -#: ../src/gajim-remote.py:132 ../src/gajim-remote.py:222 +#: ../src/gajim-remote.py:131 ../src/gajim-remote.py:221 msgid "if specified, contact is taken from the contact list of this account" msgstr "ако е указано, контактът се взима от списъка с контакти на този акаунт" -#: ../src/gajim-remote.py:135 +#: ../src/gajim-remote.py:134 msgid "message content. The account must be specified or \"\"" msgstr "" -#: ../src/gajim-remote.py:140 +#: ../src/gajim-remote.py:139 msgid "" "Sends new chat message to a contact in the roster. Both OpenPGP key and " "account are optional. If you want to set only 'account', without 'OpenPGP " @@ -8477,30 +8071,30 @@ msgstr "" "„OpenPGP key“ са по избор. Ако искате да настроите само „account“ без " "“OpenPGP key“, настройте „OpenPGP key“ на „“." -#: ../src/gajim-remote.py:144 ../src/gajim-remote.py:157 +#: ../src/gajim-remote.py:143 ../src/gajim-remote.py:156 msgid "JID of the contact that will receive the message" msgstr "JID на контакта, който ще получи съобщението" -#: ../src/gajim-remote.py:145 ../src/gajim-remote.py:159 -#: ../src/gajim-remote.py:170 +#: ../src/gajim-remote.py:144 ../src/gajim-remote.py:158 +#: ../src/gajim-remote.py:169 msgid "message contents" msgstr "текст на съобщението" -#: ../src/gajim-remote.py:146 ../src/gajim-remote.py:160 +#: ../src/gajim-remote.py:145 ../src/gajim-remote.py:159 msgid "pgp key" msgstr "ключ на OpenPGP" -#: ../src/gajim-remote.py:146 ../src/gajim-remote.py:160 +#: ../src/gajim-remote.py:145 ../src/gajim-remote.py:159 msgid "if specified, the message will be encrypted using this public key" msgstr "" "ако е указано, съобщението ще се шифрира, използвайки този публичен ключ" -#: ../src/gajim-remote.py:148 ../src/gajim-remote.py:162 -#: ../src/gajim-remote.py:171 +#: ../src/gajim-remote.py:147 ../src/gajim-remote.py:161 +#: ../src/gajim-remote.py:170 msgid "if specified, the message will be sent using this account" msgstr "ако е указано, съобщението ще бъде изпратено от този акаунт" -#: ../src/gajim-remote.py:153 +#: ../src/gajim-remote.py:152 msgid "" "Sends new single message to a contact in the roster. Both OpenPGP key and " "account are optional. If you want to set only 'account', without 'OpenPGP " @@ -8510,136 +8104,136 @@ msgstr "" "„OpenPGP key“ са по избор. Ако искате да настроите само „account“ без " "“OpenPGP key“, настройте „OpenPGP key“ на „“." -#: ../src/gajim-remote.py:158 +#: ../src/gajim-remote.py:157 msgid "subject" msgstr "тема" -#: ../src/gajim-remote.py:158 +#: ../src/gajim-remote.py:157 msgid "message subject" msgstr "тема на съобщението" -#: ../src/gajim-remote.py:167 +#: ../src/gajim-remote.py:166 msgid "Sends new message to a groupchat you've joined." msgstr "Изпраща ново съобщение до стаята, в която сте влезли." -#: ../src/gajim-remote.py:169 +#: ../src/gajim-remote.py:168 msgid "JID of the room that will receive the message" msgstr "JID на стаята, която ще получи съобщението" -#: ../src/gajim-remote.py:176 +#: ../src/gajim-remote.py:175 msgid "Gets detailed info on a contact" msgstr "Получаване на подробна информация за контакта" -#: ../src/gajim-remote.py:178 ../src/gajim-remote.py:191 -#: ../src/gajim-remote.py:221 ../src/gajim-remote.py:230 +#: ../src/gajim-remote.py:177 ../src/gajim-remote.py:190 +#: ../src/gajim-remote.py:220 ../src/gajim-remote.py:229 msgid "JID of the contact" msgstr "JID на контакта" -#: ../src/gajim-remote.py:182 +#: ../src/gajim-remote.py:181 msgid "Gets detailed info on a account" msgstr "Получаване на подробна информация за акаунта" -#: ../src/gajim-remote.py:184 +#: ../src/gajim-remote.py:183 msgid "Name of the account" msgstr "Име на акаунта" -#: ../src/gajim-remote.py:188 +#: ../src/gajim-remote.py:187 msgid "Sends file to a contact" msgstr "Изпращане на файл до контакт" -#: ../src/gajim-remote.py:190 +#: ../src/gajim-remote.py:189 msgid "file" msgstr "файл" -#: ../src/gajim-remote.py:190 +#: ../src/gajim-remote.py:189 msgid "File path" msgstr "Път до файл" -#: ../src/gajim-remote.py:192 +#: ../src/gajim-remote.py:191 msgid "if specified, file will be sent using this account" msgstr "ако е указано, файлът бъде изпратен от този акаунт" -#: ../src/gajim-remote.py:197 +#: ../src/gajim-remote.py:196 msgid "Lists all preferences and their values" msgstr "Показва всички настройки и техните стойности" -#: ../src/gajim-remote.py:201 +#: ../src/gajim-remote.py:200 msgid "Sets value of 'key' to 'value'." msgstr "Настройва стойността на „ключ“ на „стойност“." -#: ../src/gajim-remote.py:203 +#: ../src/gajim-remote.py:202 msgid "key=value" msgstr "ключ=стойност" -#: ../src/gajim-remote.py:203 +#: ../src/gajim-remote.py:202 msgid "'key' is the name of the preference, 'value' is the value to set it to" msgstr "" "„ключ“ е името на настройката, „стойност“ е стойността, която се задава" -#: ../src/gajim-remote.py:208 +#: ../src/gajim-remote.py:207 msgid "Deletes a preference item" msgstr "Изтрива обект от настройките" -#: ../src/gajim-remote.py:210 +#: ../src/gajim-remote.py:209 msgid "key" msgstr "ключ" -#: ../src/gajim-remote.py:210 +#: ../src/gajim-remote.py:209 msgid "name of the preference to be deleted" msgstr "име на настройката за изтриване" -#: ../src/gajim-remote.py:214 +#: ../src/gajim-remote.py:213 msgid "Writes the current state of Gajim preferences to the .config file" msgstr "Запазва текущото състояние на настройките във файла .config" -#: ../src/gajim-remote.py:219 +#: ../src/gajim-remote.py:218 msgid "Removes contact from roster" msgstr "Премахване на контакт от списъка" -#: ../src/gajim-remote.py:228 +#: ../src/gajim-remote.py:227 msgid "Adds contact to roster" msgstr "Добавяне на контакт към списъка" -#: ../src/gajim-remote.py:230 +#: ../src/gajim-remote.py:229 msgid "jid" msgstr "JID" -#: ../src/gajim-remote.py:231 +#: ../src/gajim-remote.py:230 msgid "Adds new contact to this account" msgstr "Добавяне на нов контакт към този акаунт" -#: ../src/gajim-remote.py:236 +#: ../src/gajim-remote.py:235 msgid "Returns current status (the global one unless account is specified)" msgstr "Връща текущото състояние (общото, в случай, че не е указан акаунт)" -#: ../src/gajim-remote.py:243 +#: ../src/gajim-remote.py:242 msgid "" "Returns current status message (the global one unless account is specified)" msgstr "" "Връща текущото съобщение за състояние (общото, в случай, че не е указан " "акаунт)" -#: ../src/gajim-remote.py:250 +#: ../src/gajim-remote.py:249 msgid "Returns number of unread messages" msgstr "Връща броя непрочетени съобщения" -#: ../src/gajim-remote.py:254 +#: ../src/gajim-remote.py:253 msgid "Opens 'Start Chat' dialog" msgstr "Отваря прозореца „Започване на разговор“" -#: ../src/gajim-remote.py:256 +#: ../src/gajim-remote.py:255 msgid "Starts chat, using this account" msgstr "Започване на разговор, като се използва този акаунт" -#: ../src/gajim-remote.py:260 +#: ../src/gajim-remote.py:259 msgid "Sends custom XML" msgstr "Изпраща указан XML" -#: ../src/gajim-remote.py:262 +#: ../src/gajim-remote.py:261 msgid "XML to send" msgstr "XML за изпращане" -#: ../src/gajim-remote.py:263 +#: ../src/gajim-remote.py:262 msgid "" "Account in which the xml will be sent; if not specified, xml will be sent to " "all accounts" @@ -8647,72 +8241,72 @@ msgstr "" "Акаунт, до който да се изпраща XML; ако не е указан, ще се изпрати до всички " "акаунти" -#: ../src/gajim-remote.py:269 +#: ../src/gajim-remote.py:268 msgid "Handle a xmpp:/ uri" msgstr "Обработка на адрес тип xmpp://" -#: ../src/gajim-remote.py:271 +#: ../src/gajim-remote.py:270 msgid "uri" msgstr "адрес" -#: ../src/gajim-remote.py:271 +#: ../src/gajim-remote.py:270 msgid "URI to handle" msgstr "Адрес за обработка" -#: ../src/gajim-remote.py:272 +#: ../src/gajim-remote.py:271 msgid "Account in which you want to handle it" msgstr "Акаунт, за който искате да го обработите" -#: ../src/gajim-remote.py:274 +#: ../src/gajim-remote.py:273 #, fuzzy msgid "Message content" msgstr "текст на съобщението" -#: ../src/gajim-remote.py:278 +#: ../src/gajim-remote.py:277 msgid "Join a MUC room" msgstr "Влизане в стая" -#: ../src/gajim-remote.py:280 +#: ../src/gajim-remote.py:279 msgid "room" msgstr "стая" -#: ../src/gajim-remote.py:280 +#: ../src/gajim-remote.py:279 msgid "Room JID" msgstr "JID на стая" -#: ../src/gajim-remote.py:281 +#: ../src/gajim-remote.py:280 msgid "nick" msgstr "псевдоним" -#: ../src/gajim-remote.py:281 +#: ../src/gajim-remote.py:280 msgid "Nickname to use" msgstr "Псевдоним" -#: ../src/gajim-remote.py:282 +#: ../src/gajim-remote.py:281 msgid "password" msgstr "парола" -#: ../src/gajim-remote.py:282 +#: ../src/gajim-remote.py:281 msgid "Password to enter the room" msgstr "Парола за влизане в стаята" -#: ../src/gajim-remote.py:283 +#: ../src/gajim-remote.py:282 msgid "Account from which you want to enter the room" msgstr "Акаунт, от който искате да влезете в стаята" -#: ../src/gajim-remote.py:288 +#: ../src/gajim-remote.py:287 msgid "Check if Gajim is running" msgstr "Проверка дали Gajim е стартиран" -#: ../src/gajim-remote.py:292 +#: ../src/gajim-remote.py:291 msgid "Shows or hides the ipython window" msgstr "Показва или скрива прозореца на IPython" -#: ../src/gajim-remote.py:319 +#: ../src/gajim-remote.py:318 msgid "Missing argument \"contact_jid\"" msgstr "Липсващ аргумент „contact_jid“" -#: ../src/gajim-remote.py:338 +#: ../src/gajim-remote.py:339 #, python-format msgid "" "'%s' is not in your roster.\n" @@ -8721,16 +8315,16 @@ msgstr "" "„%s“ не е в списъка ви.\n" "Укажете акаунт за изпращането на това съобщение." -#: ../src/gajim-remote.py:341 +#: ../src/gajim-remote.py:342 msgid "You have no active account" msgstr "Нямате активен акаунт" -#: ../src/gajim-remote.py:393 +#: ../src/gajim-remote.py:395 msgid "It seems Gajim is not running. So you can't use gajim-remote." msgstr "" "Изглежда Gajim не е стартиран, така че не може да ползвате gajim-remote." -#: ../src/gajim-remote.py:416 +#: ../src/gajim-remote.py:422 #, python-format msgid "" "Usage: %(basename)s %(command)s %(arguments)s \n" @@ -8739,16 +8333,16 @@ msgstr "" "Употреба: %(basename)s %(command)s %(arguments)s \n" "\t %(help)s" -#: ../src/gajim-remote.py:420 +#: ../src/gajim-remote.py:426 msgid "Arguments:" msgstr "Аргументи:" -#: ../src/gajim-remote.py:424 +#: ../src/gajim-remote.py:430 #, python-format msgid "%s not found" msgstr "%s не е намерен" -#: ../src/gajim-remote.py:428 +#: ../src/gajim-remote.py:436 #, python-format msgid "" "Usage: %s command [arguments]\n" @@ -8757,7 +8351,7 @@ msgstr "" "Употреба: %s команда [аргументи]\n" "Командата е една от:\n" -#: ../src/gajim-remote.py:493 +#: ../src/gajim-remote.py:505 #, python-format msgid "" "Too many arguments. \n" @@ -8766,7 +8360,7 @@ msgstr "" "Твърде много аргументи. \n" "Напишете „%(basename)s help %(command)s“ за повече информация" -#: ../src/gajim-remote.py:498 +#: ../src/gajim-remote.py:510 #, python-format msgid "" "Argument \"%(arg)s\" is not specified. \n" @@ -8775,7 +8369,7 @@ msgstr "" "Не е указан аргумент „%(arg)s“.\n" "Напишете „%(basename)s help %(command)s“ за повече информация" -#: ../src/gajim-remote.py:517 +#: ../src/gajim-remote.py:529 msgid "Wrong uri" msgstr "Грешен адрес" @@ -8804,149 +8398,173 @@ msgstr "Не може да изтриете текущата тема" msgid "Please first choose another for your current theme." msgstr "Първо изберете друга като текуща тема." -#: ../src/groupchat_control.py:162 +#: ../src/groupchat_control.py:167 msgid "Sending private message failed" msgstr "Неуспех при изпращането на лично съобщение" #. in second %s code replaces with nickname -#: ../src/groupchat_control.py:164 +#: ../src/groupchat_control.py:169 #, python-format msgid "You are no longer in group chat \"%(room)s\" or \"%(nick)s\" has left." msgstr "Вече не сте в стая „%(room)s“ или „%(nick)s“ е напуснал(а)." -#: ../src/groupchat_control.py:436 +#: ../src/groupchat_control.py:439 msgid "Insert Nickname" msgstr "Въведете псевдоним" -#: ../src/groupchat_control.py:595 +#: ../src/groupchat_control.py:617 msgid "Conversation with " msgstr "Разговор с " -#: ../src/groupchat_control.py:597 +#: ../src/groupchat_control.py:619 msgid "Continued conversation" msgstr "Продължен разговор" #. Can be a message (see handle_event_gc_config_change in gajim.py) -#: ../src/groupchat_control.py:1194 +#. Can be a presence (see chg_contact_status in groupchat_control.py) +#: ../src/groupchat_control.py:1228 ../src/gui_interface.py:1050 +msgid "Any occupant is allowed to see your full JID" +msgstr "На всеки участник е позволено да вижда вашия JID" + +#. Can be a message (see handle_event_gc_config_change in gajim.py) +#: ../src/groupchat_control.py:1231 msgid "Room logging is enabled" msgstr "Воденето на дневник на стаята е включено" -#: ../src/groupchat_control.py:1196 +#: ../src/groupchat_control.py:1233 msgid "A new room has been created" msgstr "Беше създадена нова стая" -#: ../src/groupchat_control.py:1199 +#: ../src/groupchat_control.py:1236 msgid "The server has assigned or modified your roomnick" msgstr "Сървърът назначи или промени псевдонима ви в стаята" #. do not print 'kicked by None' -#: ../src/groupchat_control.py:1205 +#: ../src/groupchat_control.py:1242 #, python-format msgid "%(nick)s has been kicked: %(reason)s" msgstr "%(nick)s беше изритан: %(reason)s" -#: ../src/groupchat_control.py:1209 +#: ../src/groupchat_control.py:1246 #, python-format msgid "%(nick)s has been kicked by %(who)s: %(reason)s" msgstr "%(nick)s беше изритан от %(who)s: %(reason)s" #. do not print 'banned by None' -#: ../src/groupchat_control.py:1219 +#: ../src/groupchat_control.py:1256 #, python-format msgid "%(nick)s has been banned: %(reason)s" msgstr "%(nick)s беше отлъчен: %(reason)s" -#: ../src/groupchat_control.py:1223 +#: ../src/groupchat_control.py:1260 #, python-format msgid "%(nick)s has been banned by %(who)s: %(reason)s" msgstr "%(nick)s беше отлъчен от %(who)s: %(reason)s" -#: ../src/groupchat_control.py:1235 ../src/groupchat_control.py:1328 +#: ../src/groupchat_control.py:1272 ../src/groupchat_control.py:1365 #, python-format msgid "You are now known as %s" msgstr "Вече сте познати като %s" -#: ../src/groupchat_control.py:1289 ../src/groupchat_control.py:1293 -#: ../src/groupchat_control.py:1298 +#: ../src/groupchat_control.py:1288 ../src/gui_interface.py:894 +#, python-format +msgid "%(nick)s is now known as %(new_nick)s" +msgstr "%(nick)s вече е познат като %(new_nick)s" + +#: ../src/groupchat_control.py:1326 ../src/groupchat_control.py:1330 +#: ../src/groupchat_control.py:1335 #, python-format msgid "%(nick)s has been removed from the room (%(reason)s)" msgstr "%(nick)s беше изритан от стаята (%(reason)s)" -#: ../src/groupchat_control.py:1290 +#: ../src/groupchat_control.py:1327 msgid "affiliation changed" msgstr "рангът е променен" -#: ../src/groupchat_control.py:1295 +#: ../src/groupchat_control.py:1332 msgid "room configuration changed to members-only" msgstr "Конфигурацията на стаята бе променена на „само за членове“" -#: ../src/groupchat_control.py:1300 +#: ../src/groupchat_control.py:1337 msgid "system shutdown" msgstr "Изключване на системата" -#: ../src/groupchat_control.py:1377 +#: ../src/groupchat_control.py:1414 #, python-format msgid "** Affiliation of %(nick)s has been set to %(affiliation)s by %(actor)s" msgstr "** Рангът на %(nick)s бе зададен на %(affiliation)s от %(actor)s" -#: ../src/groupchat_control.py:1381 +#: ../src/groupchat_control.py:1418 #, python-format msgid "** Affiliation of %(nick)s has been set to %(affiliation)s" msgstr "** Рангът на %(nick)s бе зададен на %(affiliation)s" -#: ../src/groupchat_control.py:1396 +#: ../src/groupchat_control.py:1433 #, python-format msgid "** Role of %(nick)s has been set to %(role)s by %(actor)s" msgstr "** Ролята на %(nick)s бе зададена на %(role)s от %(actor)s" -#: ../src/groupchat_control.py:1400 +#: ../src/groupchat_control.py:1437 #, python-format msgid "** Role of %(nick)s has been set to %(role)s" msgstr "** Ролята на %(nick)s бе зададена на %(role)s" -#: ../src/groupchat_control.py:1429 +#: ../src/groupchat_control.py:1466 #, python-format msgid "%s has left" msgstr "%s напусна" -#: ../src/groupchat_control.py:1434 +#: ../src/groupchat_control.py:1471 #, python-format msgid "%s has joined the group chat" msgstr "%s влезе в стаята" -#: ../src/groupchat_control.py:1668 +#: ../src/groupchat_control.py:1473 ../src/gui_interface.py:919 +#: ../src/history_window.py:442 ../src/notify.py:250 +#, python-format +msgid "%(nick)s is now %(status)s" +msgstr "%(nick)s вече е %(status)s" + +#: ../src/groupchat_control.py:1706 #, python-format msgid "Are you sure you want to leave group chat \"%s\"?" msgstr "Сигурни ли сте, че искате да напуснете стаята „%s“?" -#: ../src/groupchat_control.py:1670 +#: ../src/groupchat_control.py:1708 msgid "" "If you close this window, you will be disconnected from this group chat." msgstr "Ако затворите този прозорец, връзката със стаята ще бъде прекъсната." -#: ../src/groupchat_control.py:1707 +#: ../src/groupchat_control.py:1712 ../src/gui_interface.py:1172 +#: ../src/gui_interface.py:1940 ../src/gui_interface.py:1975 +#: ../src/message_window.py:227 ../src/roster_window.py:2658 +#: ../src/roster_window.py:3301 ../src/roster_window.py:3990 +msgid "Do _not ask me again" +msgstr "Да _не се задава този въпрос отново" + +#: ../src/groupchat_control.py:1745 msgid "Changing Subject" msgstr "Промяна на темата" -#: ../src/groupchat_control.py:1708 +#: ../src/groupchat_control.py:1746 msgid "Please specify the new subject:" msgstr "Въведете новата тема:" -#: ../src/groupchat_control.py:1715 +#: ../src/groupchat_control.py:1753 msgid "Changing Nickname" msgstr "Промяна на псевдонима" -#: ../src/groupchat_control.py:1716 +#: ../src/groupchat_control.py:1754 msgid "Please specify the new nickname you want to use:" msgstr "Въведете новия псевдоним, който искате да използвате:" #. Ask for a reason -#: ../src/groupchat_control.py:1745 +#: ../src/groupchat_control.py:1783 #, python-format msgid "Destroying %s" msgstr "Унищожаване на %s" -#: ../src/groupchat_control.py:1746 +#: ../src/groupchat_control.py:1784 msgid "" "You are going to definitively destroy this room.\n" "You may specify a reason below:" @@ -8954,22 +8572,22 @@ msgstr "" "Определено сте на път да унищожите тази стая.\n" "Може да укажете причина по-долу:" -#: ../src/groupchat_control.py:1748 +#: ../src/groupchat_control.py:1786 msgid "You may also enter an alternate venue:" msgstr "Може да въведете и друго място за срещи:" #. ask for reason -#: ../src/groupchat_control.py:1921 +#: ../src/groupchat_control.py:1967 #, python-format msgid "Kicking %s" msgstr "Изритване на %s" -#: ../src/groupchat_control.py:1922 ../src/groupchat_control.py:2227 +#: ../src/groupchat_control.py:1968 ../src/groupchat_control.py:2291 msgid "You may specify a reason below:" msgstr "Може да уточните причина по-долу:" #. ask for reason -#: ../src/groupchat_control.py:2226 +#: ../src/groupchat_control.py:2290 #, python-format msgid "Banning %s" msgstr "Отлъчване на %s" @@ -8994,62 +8612,482 @@ msgid "Details" msgstr "Подробности" #. we talk about file -#: ../src/gtkgui_helpers.py:166 ../src/gtkgui_helpers.py:181 +#: ../src/gtkgui_helpers.py:171 ../src/gtkgui_helpers.py:186 #, python-format msgid "Error: cannot open %s for reading" msgstr "Грешка: %s не може да бъде отворен за четене" -#: ../src/gtkgui_helpers.py:351 +#: ../src/gtkgui_helpers.py:362 msgid "Error reading file:" msgstr "Грешка при четене на файл:" -#: ../src/gtkgui_helpers.py:354 +#: ../src/gtkgui_helpers.py:365 msgid "Error parsing file:" msgstr "Грешка при анализиране на файл:" #. do not traceback (could be a permission problem) #. we talk about a file here -#: ../src/gtkgui_helpers.py:391 +#: ../src/gtkgui_helpers.py:406 #, python-format msgid "Could not write to %s. Session Management support will not work" msgstr "" "Неуспех при запис на %s. Поддръжката за управление на сесиите няма да работи" #. xmpp: is currently handled by another program, so ask the user -#: ../src/gtkgui_helpers.py:728 +#: ../src/gtkgui_helpers.py:770 msgid "Gajim is not the default Jabber client" msgstr "Gajim не е стандартния Джабър клиент" -#: ../src/gtkgui_helpers.py:729 +#: ../src/gtkgui_helpers.py:771 msgid "Would you like to make Gajim the default Jabber client?" msgstr "Искате ли Gajim да бъде стандартния Джабър клиент?" -#: ../src/gtkgui_helpers.py:730 +#: ../src/gtkgui_helpers.py:772 msgid "Always check to see if Gajim is the default Jabber client on startup" msgstr "" "Винаги да се проверява дали Gajim е стандартния Джабър клиент при всяко " "стартиране" -#: ../src/gtkgui_helpers.py:799 +#: ../src/gtkgui_helpers.py:845 msgid "Extension not supported" msgstr "Разширението не се поддържа" -#: ../src/gtkgui_helpers.py:800 +#: ../src/gtkgui_helpers.py:846 #, python-format msgid "Image cannot be saved in %(type)s format. Save as %(new_filename)s?" msgstr "" "Изображението не може да бъде запазено във формат %(type)s. Запазване като %" "(new_filename)s?" -#: ../src/gtkgui_helpers.py:835 +#: ../src/gtkgui_helpers.py:881 msgid "Save Image as..." msgstr "Запазване на изображението като…" -#: ../src/gui_menu_builder.py:89 +#: ../src/gui_interface.py:129 +#, python-format +msgid "" +"Your desired nickname in group chat %s is in use or registered by another " +"occupant.\n" +"Please specify another nickname below:" +msgstr "" +"Желаният от вас псевдоним за стая %s се използва или е регистриран от друг " +"участник.\n" +"Укажете друг псевдоним по-долу:" + +#: ../src/gui_interface.py:132 +msgid "Always use this nickname when there is a conflict" +msgstr "" + +#: ../src/gui_interface.py:149 +msgid "Do you accept this request?" +msgstr "Приемате ли това запитване?" + +#: ../src/gui_interface.py:151 +#, python-format +msgid "Do you accept this request on account %s?" +msgstr "Приемате ли това запитване за акаунт %s?" + +#: ../src/gui_interface.py:154 +#, python-format +msgid "HTTP (%(method)s) Authorization for %(url)s (id: %(id)s)" +msgstr "Упълномощаване по HTTP (%(method)s) за „%(url)s“ (id: %(id)s)" + +#: ../src/gui_interface.py:205 ../src/notify.py:524 +msgid "Connection Failed" +msgstr "Неуспех при свързването" + +#: ../src/gui_interface.py:544 ../src/gui_interface.py:548 +#, python-format +msgid "Error %(code)s: %(msg)s" +msgstr "Грешка %(code)s: %(msg)s" + +#. ('MSGNOTSENT', account, (jid, ierror_msg, msg, time, session)) +#: ../src/gui_interface.py:558 ../src/gui_interface.py:572 +#, python-format +msgid "error while sending %(message)s ( %(error)s )" +msgstr "грешка при изпращане на %(message)s ( %(error)s )" + +#: ../src/gui_interface.py:599 ../src/notify.py:526 +#, fuzzy +msgid "Subscription request" +msgstr "Искане за записване" + +#: ../src/gui_interface.py:624 +msgid "Authorization accepted" +msgstr "Упълномощаването е прието" + +#: ../src/gui_interface.py:625 +#, python-format +msgid "The contact \"%s\" has authorized you to see his or her status." +msgstr "Контактът „%s“ ви упълномощи да виждате състоянието му." + +#: ../src/gui_interface.py:637 +#, python-format +msgid "Contact \"%s\" removed subscription from you" +msgstr "Контактът „%s“ премахна записването за вас" + +#: ../src/gui_interface.py:638 +msgid "" +"You will always see him or her as offline.\n" +"Do you want to remove him or her from your contact list?" +msgstr "" +"Винаги ще го виждате като изключен.\n" +"Искате ли да го премахнете от списъка с контакти?" + +#: ../src/gui_interface.py:663 ../src/notify.py:528 +#, fuzzy +msgid "Unsubscribed" +msgstr "_Отписване" + +#: ../src/gui_interface.py:704 +#, python-format +msgid "Contact with \"%s\" cannot be established" +msgstr "Неуспех при установяването на контакт с „%s“" + +#: ../src/gui_interface.py:986 +#, python-format +msgid "%(jid)s has set the subject to %(subject)s" +msgstr "%(jid)s зададе темата на %(subject)s" + +#: ../src/gui_interface.py:1053 +msgid "Room now shows unavailable member" +msgstr "Стаята показва отсъстващ член" + +#: ../src/gui_interface.py:1055 +msgid "room now does not show unavailable members" +msgstr "Стаята не показва отсъстващи членове" + +#: ../src/gui_interface.py:1058 +msgid "A non-privacy-related room configuration change has occurred" +msgstr "" +"Възникна промяна в конфигурацията на стаята (не е свързана с настройки за " +"уединение)" + +#. Can be a presence (see chg_contact_status in groupchat_control.py) +#: ../src/gui_interface.py:1061 +msgid "Room logging is now enabled" +msgstr "Воденето на дневник на стаята е включено" + +#: ../src/gui_interface.py:1063 +msgid "Room logging is now disabled" +msgstr "Воденето на дневник на стаята е изключено" + +#: ../src/gui_interface.py:1065 +msgid "Room is now non-anonymous" +msgstr "Стаята не е анонимна" + +#: ../src/gui_interface.py:1068 +msgid "Room is now semi-anonymous" +msgstr "Стаята е полу-анонимна" + +#: ../src/gui_interface.py:1071 +msgid "Room is now fully-anonymous" +msgstr "Стаята е напълно анонимна" + +#: ../src/gui_interface.py:1103 +#, python-format +msgid "A Password is required to join the room %s. Please type it." +msgstr "Необходима е парола за влизане в стаята „%s“. Въведете я." + +#: ../src/gui_interface.py:1137 +msgid "" +"You configured Gajim to use GPG agent, but there is no GPG agent running or " +"it returned a wrong passphrase.\n" +msgstr "" +"Конфигурирали сте Gajim да използва агент на GPG, но такъв не е стартиран " +"или е предоставил грешна парола.\n" + +#: ../src/gui_interface.py:1139 ../src/gui_interface.py:1145 +msgid "You are currently connected without your OpenPGP key." +msgstr "В момента сте свързани без OpenPGP ключ." + +#: ../src/gui_interface.py:1140 +msgid "Your passphrase is incorrect" +msgstr "Паролата е грешна" + +#: ../src/gui_interface.py:1144 +#, fuzzy +msgid "OpenGPG Passphrase Incorrect" +msgstr "Паролата е грешна" + +#: ../src/gui_interface.py:1170 +#, fuzzy +msgid "GPG key not trusted" +msgstr "GPG не е използваем" + +#: ../src/gui_interface.py:1170 +#, fuzzy +msgid "" +"The GPG key used to encrypt this chat is not trusted. Do you really want to " +"encrypt this message?" +msgstr "" +"Няма зададен ключ на GPG за този контакт, така че не може да шифрирате " +"съобщения." + +#: ../src/gui_interface.py:1182 +#, fuzzy +msgid "" +"Gnome Keyring is installed but not \t\t\t\tcorrectly started (environment " +"variable probably not \t\t\t\tcorrectly set)" +msgstr "" +"Наборът с ключове на GNOME е инсталиран, но не е стартиран правилно (навярно " +"променливата на обкръжението не е настроена)" + +#: ../src/gui_interface.py:1292 +#, python-format +msgid "New mail on %(gmail_mail_address)s" +msgstr "Ново писмо за %(gmail_mail_address)s" + +#: ../src/gui_interface.py:1294 +#, python-format +msgid "You have %d new mail conversation" +msgid_plural "You have %d new mail conversations" +msgstr[0] "Имате %d ново писмо" +msgstr[1] "Имате %d нови писма" + +#: ../src/gui_interface.py:1307 +#, python-format +msgid "" +"\n" +"\n" +"From: %(from_address)s\n" +"Subject: %(subject)s\n" +"%(snippet)s" +msgstr "" +"\n" +"\n" +"От: %(from_address)s\n" +"Тема: %(subject)s\n" +"%(snippet)s" + +#: ../src/gui_interface.py:1379 +#, python-format +msgid "%s wants to send you a file." +msgstr "%s иска да ви изпрати файл." + +#: ../src/gui_interface.py:1417 ../src/roster_window.py:1814 +#, fuzzy +msgid "Remote contact stopped transfer" +msgstr "Премахване на контакт от списъка" + +#: ../src/gui_interface.py:1419 ../src/roster_window.py:1816 +#, fuzzy +msgid "Error opening file" +msgstr "Грешка при четене на файл:" + +#: ../src/gui_interface.py:1450 +#, python-format +msgid "You successfully received %(filename)s from %(name)s." +msgstr "Успешно получихте %(filename)s от %(name)s." + +#. ft stopped +#: ../src/gui_interface.py:1454 +#, python-format +msgid "File transfer of %(filename)s from %(name)s stopped." +msgstr "Файловият трансфер на %(filename)s от %(name)s прекъсна." + +#: ../src/gui_interface.py:1467 +#, python-format +msgid "You successfully sent %(filename)s to %(name)s." +msgstr "Успешно изпратихте %(filename)s на %(name)s." + +#. ft stopped +#: ../src/gui_interface.py:1471 +#, python-format +msgid "File transfer of %(filename)s to %(name)s stopped." +msgstr "Файловият трансфер на %(filename)s до %(name)s прекъсна." + +#: ../src/gui_interface.py:1576 +#, python-format +msgid "" +"Unable to decrypt message from %s\n" +"It may have been tampered with." +msgstr "" +"Неуспех при дешифрирането на съобщение от %s\n" +"Възможно е да е било фалшифицирано." + +#: ../src/gui_interface.py:1583 +msgid "Unable to decrypt message" +msgstr "Неуспех при дешифриране на съобщението" + +#: ../src/gui_interface.py:1657 +msgid "Username Conflict" +msgstr "Конфликт с имената на потребители" + +#: ../src/gui_interface.py:1658 +msgid "Please type a new username for your local account" +msgstr "Укажете ново потребителско име за локалния ви акаунт" + +#: ../src/gui_interface.py:1670 +msgid "Ping?" +msgstr "Пинг?" + +#: ../src/gui_interface.py:1683 +#, python-format +msgid "Pong! (%s s.)" +msgstr "Понг! (%s сек)" + +#: ../src/gui_interface.py:1694 +msgid "Error." +msgstr "Грешка." + +#: ../src/gui_interface.py:1721 +msgid "Resource Conflict" +msgstr "Конфликт на ресурсите" + +#: ../src/gui_interface.py:1722 +msgid "" +"You are already connected to this account with the same resource. Please " +"type a new one" +msgstr "Вече сте свързани към този акаунт със същия ресурс. Въведете нов." + +#: ../src/gui_interface.py:1771 +#, fuzzy, python-format +msgid "%s wants to start a voice chat." +msgstr "%s иска да ви изпрати файл." + +#: ../src/gui_interface.py:1774 +#, fuzzy +msgid "Voice Chat Request" +msgstr "Запитване за файлов трансфер" + +#: ../src/gui_interface.py:1879 +msgid "Error verifying SSL certificate" +msgstr "Грешка при проверка на сертификата на SSL" + +#: ../src/gui_interface.py:1880 +#, python-format +msgid "" +"There was an error verifying the SSL certificate of your jabber server: %" +"(error)s\n" +"Do you still want to connect to this server?" +msgstr "" +"Възникна грешка при проверката на сертификата за вашия сървър на Джабър: %" +"(error)s\n" +"Все още ли искате да се свържете със сървъра?" + +#: ../src/gui_interface.py:1885 +msgid "Ignore this error for this certificate." +msgstr "Пренебрегване на грешката за този сертификат." + +#: ../src/gui_interface.py:1905 +msgid "SSL certificate error" +msgstr "Грешка в сертификата на SSL" + +#: ../src/gui_interface.py:1906 +#, fuzzy, python-format +msgid "" +"It seems the SSL certificate of account %(account)s has changed or your " +"connection is being hacked.\n" +"Old fingerprint: %(old)s\n" +"New fingerprint: %(new)s\n" +"\n" +"Do you still want to connect and update the fingerprint of the certificate?" +msgstr "" +"Изглежда сертификатът на SSL е бил променен или връзката е взломена.\n" +"Стар отпечатък: %(old)s\n" +"Нов отпечатък: %(new)s\n" +"\n" +"Все още ли искате да се свържете и да обновите отпечатъка на сертификата?" + +#: ../src/gui_interface.py:1936 ../src/gui_interface.py:1971 +msgid "Insecure connection" +msgstr "Несигурна връзка" + +#: ../src/gui_interface.py:1937 +msgid "" +"You are about to send your password on an unencrypted connection. Are you " +"sure you want to do that?" +msgstr "" +"На път сте да изпратите паролата си чрез нешифрирана връзка. Сигурни ли сте, " +"че искате да го направите?" + +#: ../src/gui_interface.py:1939 ../src/gui_interface.py:1974 +msgid "Yes, I really want to connect insecurely" +msgstr "Да, наистина искам да се свържа по несигурен начин" + +#: ../src/gui_interface.py:1972 +msgid "" +"You are about to send your password on an insecure connection. You should " +"install PyOpenSSL to prevent that. Are you sure you want to do that?" +msgstr "" +"На път сте да изпратите паролата си чрез несигурна връзка. Трябва да " +"инсталирате PyOpenSSL, за да предотвратите това. Сигурни ли сте, че искате " +"да го направите?" + +#: ../src/gui_interface.py:1992 +msgid "PEP node was not removed" +msgstr "Възелът на PEP не беше премахнат" + +#: ../src/gui_interface.py:1993 +#, python-format +msgid "PEP node %(node)s was not removed: %(message)s" +msgstr "Възелът на PEP %(node)s не беше премахнат: %(message)s" + +#. theme doesn't exist, disable emoticons +#: ../src/gui_interface.py:2547 ../src/gui_interface.py:2569 +msgid "Emoticons disabled" +msgstr "Емотиконите са изключени" + +#: ../src/gui_interface.py:2548 +msgid "" +"Your configured emoticons theme has not been found, so emoticons have been " +"disabled." +msgstr "Темата с емотикони не беше намерена, така че са изключени." + +#: ../src/gui_interface.py:2570 +msgid "" +"Your configured emoticons theme cannot been loaded. You maybe need to update " +"the format of emoticons.py file. See http://trac.gajim.org/wiki/Emoticons " +"for more details." +msgstr "" +"Темата с емотикони не можа да бъде заредена. Навярно трябва да обновите " +"формата на файла emoticons.py. Вижте http://trac.gajim.org/wiki/Emoticons за " +"повече подробности." + +#: ../src/gui_interface.py:2598 ../src/roster_window.py:3441 +msgid "You cannot join a group chat while you are invisible" +msgstr "Не може да влезете в стая, докато сте невидими." + +#. it is good to notify the user +#. in case he or she cannot see the output of the console +#: ../src/gui_interface.py:2969 +msgid "Could not save your settings and preferences" +msgstr "Неуспех при запазването на настройките" + +#: ../src/gui_interface.py:3462 +msgid "Passphrase Required" +msgstr "Необходима е парола" + +#: ../src/gui_interface.py:3463 +#, python-format +msgid "Enter GPG key passphrase for key %(keyid)s (account %(account)s)." +msgstr "Въведете парола за ключ на GPG %(keyid)s (акаунт „%(account)s“)." + +#: ../src/gui_interface.py:3477 +#, fuzzy +msgid "GPG key expired" +msgstr "Няма зададен ключ на GPG" + +#: ../src/gui_interface.py:3478 +#, fuzzy, python-format +msgid "Your GPG key has expired, you will be connected to %s without OpenPGP." +msgstr "Ще бъдете свързани към „%s“ без OpenPGP." + +#. ask again +#: ../src/gui_interface.py:3487 +msgid "Wrong Passphrase" +msgstr "Грешна парола" + +#: ../src/gui_interface.py:3488 +msgid "Please retype your GPG passphrase or press Cancel." +msgstr "Въведете паролата за GPG ключа наново или натиснете „Отказване“." + +#: ../src/gui_menu_builder.py:93 msgid "_New Group Chat" msgstr "_Нова стая" -#: ../src/gui_menu_builder.py:400 +#: ../src/gui_menu_builder.py:413 msgid "I would like to add you to my roster" msgstr "" "Бих искал(а) да Ви добавя към списъка си. I would like to add you to my " @@ -9066,7 +9104,7 @@ msgstr "Контакти" #. holds time #: ../src/history_manager.py:174 ../src/history_manager.py:214 -#: ../src/history_window.py:95 +#: ../src/history_window.py:97 msgid "Date" msgstr "Дата" @@ -9077,7 +9115,7 @@ msgstr "Псевдоним" #. holds message #: ../src/history_manager.py:188 ../src/history_manager.py:220 -#: ../src/history_window.py:103 +#: ../src/history_window.py:105 msgid "Message" msgstr "Съобщение" @@ -9103,238 +9141,243 @@ msgstr "" "\n" "В случай, че изберете „Да“, изчакайте…" -#: ../src/history_manager.py:458 +#: ../src/history_manager.py:467 msgid "Exporting History Logs..." msgstr "Изнасяне на записите на разговорите…" -#: ../src/history_manager.py:533 +#: ../src/history_manager.py:542 #, python-format msgid "%(who)s on %(time)s said: %(message)s\n" msgstr "%(who)s каза в %(time)s: %(message)s\n" -#: ../src/history_manager.py:570 +#: ../src/history_manager.py:579 msgid "Do you really want to delete logs of the selected contact?" msgid_plural "Do you really want to delete logs of the selected contacts?" msgstr[0] "Наистина ли искате да изтриете дневниците на избрания контакт?" msgstr[1] "Наистина ли искате да изтриете дневниците на избраните контакти?" -#: ../src/history_manager.py:574 ../src/history_manager.py:609 +#: ../src/history_manager.py:583 ../src/history_manager.py:618 msgid "This is an irreversible operation." msgstr "Това е необратима операция." -#: ../src/history_manager.py:606 +#: ../src/history_manager.py:615 msgid "Do you really want to delete the selected message?" msgid_plural "Do you really want to delete the selected messages?" msgstr[0] "Наистина ли искате да изтриете избраното съобщение?" msgstr[1] "Наистина ли искате да изтриете избраните съобщения?" -#: ../src/history_window.py:298 +#: ../src/history_window.py:305 #, python-format msgid "Conversation History with %s" msgstr "История на разговорите с %s" -#: ../src/history_window.py:343 +#: ../src/history_window.py:350 msgid "Disk Error" msgstr "Грешка при запис/четене от диска" -#: ../src/history_window.py:427 +#: ../src/history_window.py:438 #, python-format msgid "%(nick)s is now %(status)s: %(status_msg)s" msgstr "%(nick)s вече е %(status)s: %(status_msg)s" -#: ../src/history_window.py:438 +#: ../src/history_window.py:449 #, fuzzy, python-format msgid "Error: %s" msgstr "Грешка: %s" -#: ../src/history_window.py:440 +#: ../src/history_window.py:451 #, fuzzy msgid "Error" msgstr "Грешка." -#: ../src/history_window.py:442 +#: ../src/history_window.py:453 #, python-format msgid "Status is now: %(status)s: %(status_msg)s" msgstr "Сегашното състояние е: %(status)s: %(status_msg)s" -#: ../src/history_window.py:445 +#: ../src/history_window.py:456 #, python-format msgid "Status is now: %(status)s" msgstr "Сегашното състояние е: %(status)s" -#: ../src/htmltextview.py:512 ../src/htmltextview.py:522 +#: ../src/htmltextview.py:513 ../src/htmltextview.py:523 msgid "Timeout loading image" msgstr "Изтече времето за зареждане на изображението" -#: ../src/htmltextview.py:532 +#: ../src/htmltextview.py:533 msgid "Image is too big" msgstr "Изображението е твърде голямо" -#: ../src/message_window.py:220 +#: ../src/message_window.py:225 #, fuzzy msgid "You are going to close several tabs" msgstr "Не сте свързани към сървъра." -#: ../src/message_window.py:221 +#: ../src/message_window.py:226 #, fuzzy msgid "Do you really want to close them all?" msgstr "Наистина ли искате да изтриете избраното съобщение?" -#: ../src/message_window.py:481 +#: ../src/message_window.py:490 msgid "Chats" msgstr "Разговори" -#: ../src/message_window.py:483 +#: ../src/message_window.py:492 msgid "Group Chats" msgstr "Стаи" -#: ../src/message_window.py:485 +#: ../src/message_window.py:494 msgid "Private Chats" msgstr "Лични разговори" -#: ../src/message_window.py:491 +#: ../src/message_window.py:500 msgid "Messages" msgstr "Съобщения" -#: ../src/negotiation.py:32 +#: ../src/negotiation.py:34 msgid "- messages will be logged" msgstr "— ще бъде воден дневник за съобщенията" -#: ../src/negotiation.py:34 +#: ../src/negotiation.py:36 msgid "- messages will not be logged" msgstr "— няма да бъде воден дневник за съобщенията" -#: ../src/notify.py:242 +#: ../src/notify.py:248 #, python-format msgid "%(nick)s Changed Status" msgstr "%(nick)s промени състоянието си" -#: ../src/notify.py:252 +#: ../src/notify.py:258 #, python-format msgid "%(nickname)s Signed In" msgstr "%(nickname)s се включи" -#: ../src/notify.py:260 +#: ../src/notify.py:266 #, python-format msgid "%(nickname)s Signed Out" msgstr "%(nickname)s се изключи" -#: ../src/notify.py:272 +#: ../src/notify.py:278 #, python-format msgid "New Single Message from %(nickname)s" msgstr "Ново еднократно съобщение от %(nickname)s" -#: ../src/notify.py:280 +#: ../src/notify.py:286 #, python-format msgid "New Private Message from group chat %s" msgstr "Ново лично съобщение от стая „%s“" -#: ../src/notify.py:282 +#: ../src/notify.py:288 #, python-format msgid "%(nickname)s: %(message)s" msgstr "%(nickname)s: %(message)s" -#: ../src/notify.py:285 +#: ../src/notify.py:291 #, python-format msgid "Messaged by %(nickname)s" msgstr "Съобщение от %(nickname)s" -#: ../src/notify.py:291 +#: ../src/notify.py:297 #, python-format msgid "New Message from %(nickname)s" msgstr "Ново съобщение от %(nickname)s" -#: ../src/notify.py:555 +#: ../src/notify.py:568 #, fuzzy msgid "Ignore" msgstr "_Игнориране" -#: ../src/profile_window.py:55 +#: ../src/profile_window.py:57 msgid "Retrieving profile..." msgstr "Извличане на профила…" -#: ../src/profile_window.py:108 ../src/roster_window.py:2852 +#: ../src/profile_window.py:110 ../src/roster_window.py:2845 msgid "File is empty" msgstr "Файлът не съдържа нищо" -#: ../src/profile_window.py:111 ../src/roster_window.py:2855 +#: ../src/profile_window.py:113 ../src/roster_window.py:2848 msgid "File does not exist" msgstr "Файлът не съществува" #. keep identation #. unknown format -#: ../src/profile_window.py:125 ../src/profile_window.py:141 -#: ../src/roster_window.py:2857 ../src/roster_window.py:2868 +#: ../src/profile_window.py:127 ../src/profile_window.py:143 +#: ../src/roster_window.py:2850 ../src/roster_window.py:2861 msgid "Could not load image" msgstr "Неуспех при зареждането на изображението" -#: ../src/profile_window.py:251 +#: ../src/profile_window.py:255 msgid "Information received" msgstr "Получена информация" -#: ../src/profile_window.py:318 +#: ../src/profile_window.py:326 msgid "Without a connection you can not publish your contact information." msgstr "Трябва да сте свързани, за да публикувате визитката." -#: ../src/profile_window.py:332 +#: ../src/profile_window.py:339 msgid "Sending profile..." msgstr "Изпращане на профила…" -#: ../src/profile_window.py:347 +#: ../src/profile_window.py:354 msgid "Information NOT published" msgstr "Информацията НЕ Е публикувана" -#: ../src/profile_window.py:354 +#: ../src/profile_window.py:361 msgid "vCard publication failed" msgstr "Неуспех при публикуването на визитката" -#: ../src/profile_window.py:355 +#: ../src/profile_window.py:362 msgid "" "There was an error while publishing your personal information, try again " "later." msgstr "" "Възникна грешка при публикуване на личните данни, опитайте отново по-късно." -#: ../src/roster_window.py:280 ../src/roster_window.py:1017 +#: ../src/roster_window.py:280 ../src/roster_window.py:1019 msgid "Merged accounts" msgstr "Смесени акаунти" -#: ../src/roster_window.py:1906 +#: ../src/roster_window.py:1871 msgid "Authorization has been sent" msgstr "Упълномощаването беше изпратено" -#: ../src/roster_window.py:1907 +#: ../src/roster_window.py:1872 #, python-format msgid "Now \"%s\" will know your status." msgstr "„%s“ вече ще знае състоянието ви." -#: ../src/roster_window.py:1927 +#: ../src/roster_window.py:1894 msgid "Subscription request has been sent" msgstr "Искането за записване беше изпратено" -#: ../src/roster_window.py:1928 +#: ../src/roster_window.py:1895 #, python-format msgid "If \"%s\" accepts this request you will know his or her status." msgstr "Ако „%s“ приеме това запитване, ще знаете за състоянието му." -#: ../src/roster_window.py:1940 +#: ../src/roster_window.py:1909 msgid "Authorization has been removed" msgstr "Упълномощаването беше прекратено" -#: ../src/roster_window.py:1941 +#: ../src/roster_window.py:1910 #, python-format msgid "Now \"%s\" will always see you as offline." msgstr "„%s“ винаги ще ви вижда като изключен." -#: ../src/roster_window.py:1969 +#: ../src/roster_window.py:1938 msgid "GPG is not usable" msgstr "GPG не е използваем" -#: ../src/roster_window.py:2174 ../src/roster_window.py:3383 +#: ../src/roster_window.py:1939 +#, python-format +msgid "You will be connected to %s without OpenPGP." +msgstr "Ще бъдете свързани към „%s“ без OpenPGP." + +#: ../src/roster_window.py:2148 ../src/roster_window.py:3394 msgid "You are participating in one or more group chats" msgstr "Участвате в една или повече стаи" -#: ../src/roster_window.py:2175 ../src/roster_window.py:3384 +#: ../src/roster_window.py:2149 ../src/roster_window.py:3395 msgid "" "Changing your status to invisible will result in disconnection from those " "group chats. Are you sure you want to go invisible?" @@ -9342,28 +9385,28 @@ msgstr "" "Промяната на състоянието до „Невидим“ ще ви изключи от тези стаи. Сигурни ли " "сте, че искате да станете „Невидим“?" -#: ../src/roster_window.py:2201 +#: ../src/roster_window.py:2175 msgid "desync'ed" msgstr "без синхронизация" -#: ../src/roster_window.py:2257 +#: ../src/roster_window.py:2236 msgid "Really quit Gajim?" msgstr "" -#: ../src/roster_window.py:2258 +#: ../src/roster_window.py:2237 #, fuzzy msgid "Are you sure you want to quit Gajim?" msgstr "Сигурни ли сте, че искате да напуснете стаята „%s“?" -#: ../src/roster_window.py:2259 +#: ../src/roster_window.py:2238 msgid "Always close Gajim" msgstr "" -#: ../src/roster_window.py:2350 ../src/roster_window.py:2587 +#: ../src/roster_window.py:2333 ../src/roster_window.py:2576 msgid "You have unread messages" msgstr "Имате непрочетени съобщения" -#: ../src/roster_window.py:2351 +#: ../src/roster_window.py:2334 msgid "" "Messages will only be available for reading them later if you have history " "enabled and contact is in your roster." @@ -9371,16 +9414,16 @@ msgstr "" "Може да преглеждате съобщенията по-късно само ако е активирана опцията за " "историята и контактът е в списъка." -#: ../src/roster_window.py:2588 +#: ../src/roster_window.py:2577 msgid "You must read them before removing this transport." msgstr "Трябва да ги прочетете преди да премахнете този транспорт." -#: ../src/roster_window.py:2591 +#: ../src/roster_window.py:2580 #, python-format msgid "Transport \"%s\" will be removed" msgstr "Транспортът „%s“ ще бъде премахнат" -#: ../src/roster_window.py:2592 +#: ../src/roster_window.py:2581 msgid "" "You will no longer be able to send and receive messages from contacts using " "this transport." @@ -9388,11 +9431,11 @@ msgstr "" "Вече няма да можете да получавате и изпращате съобщения до контакти чрез " "този транспорт." -#: ../src/roster_window.py:2595 +#: ../src/roster_window.py:2584 msgid "Transports will be removed" msgstr "Ще бъдат премахнати транспорти" -#: ../src/roster_window.py:2600 +#: ../src/roster_window.py:2589 #, python-format msgid "" "You will no longer be able to send and receive messages to contacts from " @@ -9401,70 +9444,70 @@ msgstr "" "Вече няма да можете да получавате и изпращате съобщения до контакти чрез " "тези транспорти: %s" -#: ../src/roster_window.py:2662 +#: ../src/roster_window.py:2653 #, fuzzy msgid "You are about to block a contact. Are you sure you want to continue?" msgstr "" "На път сте да създадете мета-контакт. Сигурни ли сте, че искате да " "продължите?" -#: ../src/roster_window.py:2664 +#: ../src/roster_window.py:2655 msgid "" "This contact will see you offline and you will not receive messages he will " "send you." msgstr "" #. it's jid -#: ../src/roster_window.py:2748 +#: ../src/roster_window.py:2741 msgid "Rename Contact" msgstr "Преименуване на контакт" -#: ../src/roster_window.py:2749 +#: ../src/roster_window.py:2742 #, python-format msgid "Enter a new nickname for contact %s" msgstr "Въведете нов псевдоним за контакт „%s“" -#: ../src/roster_window.py:2756 +#: ../src/roster_window.py:2749 msgid "Rename Group" msgstr "Преименуване на група" -#: ../src/roster_window.py:2757 +#: ../src/roster_window.py:2750 #, python-format msgid "Enter a new name for group %s" msgstr "Въведете ново име за група „%s“" -#: ../src/roster_window.py:2798 +#: ../src/roster_window.py:2791 msgid "Remove Group" msgstr "Премахване на група" -#: ../src/roster_window.py:2799 +#: ../src/roster_window.py:2792 #, python-format msgid "Do you want to remove group %s from the roster?" msgstr "Искате ли да премахнете групата „%s“ от списъка?" -#: ../src/roster_window.py:2800 +#: ../src/roster_window.py:2793 msgid "Also remove all contacts in this group from your roster" msgstr "Премахване от списъка и на всички контакти в тази група" -#: ../src/roster_window.py:2839 +#: ../src/roster_window.py:2832 msgid "Assign OpenPGP Key" msgstr "Задаване на OpenPGP ключ" -#: ../src/roster_window.py:2840 +#: ../src/roster_window.py:2833 msgid "Select a key to apply to the contact" msgstr "Изберете ключ за този контакт" -#: ../src/roster_window.py:3203 +#: ../src/roster_window.py:3210 #, python-format msgid "Contact \"%s\" will be removed from your roster" msgstr "Контактът „%s“ ще бъде премахнат от списъка ви" -#: ../src/roster_window.py:3205 +#: ../src/roster_window.py:3212 #, python-format msgid "You are about to remove \"%(name)s\" (%(jid)s) from your roster.\n" msgstr "" -#: ../src/roster_window.py:3210 +#: ../src/roster_window.py:3217 msgid "" "By removing this contact you also remove authorization resulting in him or " "her always seeing you as offline." @@ -9473,11 +9516,11 @@ msgstr "" "ще ви вижда изключен." #. Contact is not in roster -#: ../src/roster_window.py:3216 +#: ../src/roster_window.py:3223 msgid "Do you want to continue?" msgstr "Искате ли да продължите?" -#: ../src/roster_window.py:3219 +#: ../src/roster_window.py:3226 msgid "" "By removing this contact you also by default remove authorization resulting " "in him or her always seeing you as offline." @@ -9485,16 +9528,16 @@ msgstr "" "Премахвайки този контакт, прекратявате и упълномощаването. Контактът винаги " "ще ви вижда изключен." -#: ../src/roster_window.py:3222 +#: ../src/roster_window.py:3229 msgid "I want this contact to know my status after removal" msgstr "Искам този контакт да вижда състоянието ми след премахването" #. several contact to remove at the same time -#: ../src/roster_window.py:3226 +#: ../src/roster_window.py:3233 msgid "Contacts will be removed from your roster" msgstr "Ще бъдат премахнати контакти от списъка" -#: ../src/roster_window.py:3231 +#: ../src/roster_window.py:3238 #, python-format msgid "" "By removing these contacts:%s\n" @@ -9503,7 +9546,7 @@ msgstr "" "Премахвайки тези контакти: %s\n" "прекратявате и упълномощаването, така че винаги ще ви виждат изключен(а)." -#: ../src/roster_window.py:3286 +#: ../src/roster_window.py:3295 #, fuzzy msgid "" "You are about to send a custom status. Are you sure you want to continue?" @@ -9511,27 +9554,27 @@ msgstr "" "На път сте да създадете мета-контакт. Сигурни ли сте, че искате да " "продължите?" -#: ../src/roster_window.py:3288 +#: ../src/roster_window.py:3297 #, python-format msgid "" "This contact will temporarily see you as %(status)s, but only until you " "change your status. Then he will see your global status." msgstr "" -#: ../src/roster_window.py:3305 +#: ../src/roster_window.py:3316 msgid "No account available" msgstr "Няма наличен акаунт" -#: ../src/roster_window.py:3306 +#: ../src/roster_window.py:3317 msgid "You must create an account before you can chat with other contacts." msgstr "" "За да разговаряте с други контакти, първо трябва да създадете Джабър акаунт." -#: ../src/roster_window.py:3877 +#: ../src/roster_window.py:3897 msgid "Metacontacts storage not supported by your server" msgstr "Сървърът ви няма поддръжка за мета-контакти" -#: ../src/roster_window.py:3879 +#: ../src/roster_window.py:3899 msgid "" "Your server does not support storing metacontacts information. So those " "information will not be saved on next reconnection." @@ -9539,14 +9582,14 @@ msgstr "" "Вашият сървър не поддържа съхраняването на информация за мета-контакти, така " "че тази информация няма да се запази при следващото свързване." -#: ../src/roster_window.py:3964 +#: ../src/roster_window.py:3984 msgid "" "You are about to create a metacontact. Are you sure you want to continue?" msgstr "" "На път сте да създадете мета-контакт. Сигурни ли сте, че искате да " "продължите?" -#: ../src/roster_window.py:3966 +#: ../src/roster_window.py:3986 msgid "" "Metacontacts are a way to regroup several contacts in one line. Generally it " "is used when the same person has several Jabber accounts or transport " @@ -9556,23 +9599,23 @@ msgstr "" "Основно се използва, когато един и същ потребител има няколко акаунта за " "Джабър или акаунти за транспорти." -#: ../src/roster_window.py:4081 +#: ../src/roster_window.py:4101 msgid "Invalid file URI:" msgstr "Невалиден адрес на файл:" -#: ../src/roster_window.py:4092 +#: ../src/roster_window.py:4112 #, python-format msgid "Do you want to send this file to %s:" msgid_plural "Do you want to send these files to %s:" msgstr[0] "Искате ли да изпратите този файл на %s:" msgstr[1] "Искате ли да изпратите тези файлове на %s:" -#: ../src/roster_window.py:4207 +#: ../src/roster_window.py:4227 #, fuzzy, python-format msgid "Send %s to %s" msgstr "Изпращане на %s" -#: ../src/roster_window.py:4213 +#: ../src/roster_window.py:4233 #, fuzzy, python-format msgid "Make %s and %s metacontacts" msgstr "Изпращане на файл до контакт" @@ -9582,157 +9625,157 @@ msgstr "Изпращане на файл до контакт" #. for chat_with #. for single message #. join gc -#: ../src/roster_window.py:4794 ../src/roster_window.py:4865 -#: ../src/roster_window.py:4874 ../src/systray.py:216 ../src/systray.py:263 -#: ../src/systray.py:269 +#: ../src/roster_window.py:4718 ../src/roster_window.py:4789 +#: ../src/roster_window.py:4798 ../src/statusicon.py:248 +#: ../src/statusicon.py:295 ../src/statusicon.py:301 #, python-format msgid "using account %s" msgstr "от акаунт „%s“" #. add -#: ../src/roster_window.py:4881 +#: ../src/roster_window.py:4805 #, python-format msgid "to %s account" msgstr "към акаунт „%s“" #. disco -#: ../src/roster_window.py:4886 +#: ../src/roster_window.py:4810 #, python-format msgid "using %s account" msgstr "за акаунт „%s“" -#: ../src/roster_window.py:4923 ../src/systray.py:279 +#: ../src/roster_window.py:4847 ../src/statusicon.py:311 msgid "_Manage Bookmarks..." msgstr "_Управление на отметките…" #. profile, avatar -#: ../src/roster_window.py:4943 +#: ../src/roster_window.py:4867 #, python-format msgid "of account %s" msgstr "за акаунт „%s“" -#: ../src/roster_window.py:4983 +#: ../src/roster_window.py:4907 #, python-format msgid "for account %s" msgstr "за акаунт „%s“" -#: ../src/roster_window.py:5039 ../src/roster_window.py:5140 +#: ../src/roster_window.py:4963 ../src/roster_window.py:5064 msgid "_Change Status Message" msgstr "Пром_яна на съобщението за състояние" -#: ../src/roster_window.py:5066 +#: ../src/roster_window.py:4990 msgid "Publish Tune" msgstr "Публикуване на мелодия" -#: ../src/roster_window.py:5074 +#: ../src/roster_window.py:4998 msgid "Configure Services..." msgstr "Настройване на услуги…" -#: ../src/roster_window.py:5228 +#: ../src/roster_window.py:5145 msgid "_Maximize All" msgstr "_Максимизиране на всички" #. Send Group Message -#: ../src/roster_window.py:5236 ../src/roster_window.py:5404 +#: ../src/roster_window.py:5153 ../src/roster_window.py:5325 msgid "Send Group M_essage" msgstr "_Изпращане на групово съобщение" -#: ../src/roster_window.py:5244 +#: ../src/roster_window.py:5161 msgid "To all users" msgstr "До всички потребители" -#: ../src/roster_window.py:5248 +#: ../src/roster_window.py:5165 msgid "To all online users" msgstr "До всички включени потребители" #. Manage Transport submenu -#: ../src/roster_window.py:5424 +#: ../src/roster_window.py:5345 msgid "_Manage Contacts" msgstr "_Управление на контакти" #. Edit Groups -#: ../src/roster_window.py:5432 +#: ../src/roster_window.py:5353 msgid "Edit _Groups" msgstr "Редактиране на _групи" #. Send single message -#: ../src/roster_window.py:5485 +#: ../src/roster_window.py:5408 msgid "Send Single Message" msgstr "Изпращане на еднократно съобщение" #. Execute Command -#: ../src/roster_window.py:5531 +#: ../src/roster_window.py:5454 msgid "Execute Command..." msgstr "Изпълнение на команда…" #. Manage Transport submenu -#: ../src/roster_window.py:5541 +#: ../src/roster_window.py:5464 msgid "_Manage Transport" msgstr "Управление на _транспорт" #. Modify Transport -#: ../src/roster_window.py:5549 +#: ../src/roster_window.py:5472 msgid "_Modify Transport" msgstr "Промяна на т_ранспорт" #. Rename -#: ../src/roster_window.py:5558 +#: ../src/roster_window.py:5481 msgid "_Rename" msgstr "_Преименуване" -#: ../src/roster_window.py:5623 +#: ../src/roster_window.py:5546 msgid "_Maximize" msgstr "_Максимизиране" -#: ../src/roster_window.py:5631 +#: ../src/roster_window.py:5554 #, fuzzy msgid "_Reconnect" msgstr "_Изключване" -#: ../src/roster_window.py:5637 +#: ../src/roster_window.py:5560 msgid "_Disconnect" msgstr "_Изключване" #. History manager -#: ../src/roster_window.py:5716 +#: ../src/roster_window.py:5642 msgid "History Manager" msgstr "Мениджър на историята" -#: ../src/roster_window.py:5725 +#: ../src/roster_window.py:5653 msgid "_Join New Group Chat" msgstr "_Влизане в нова стая" -#: ../src/roster_window.py:5881 +#: ../src/roster_window.py:5809 msgid "Change Status Message..." msgstr "Промяна на съобщението за състояние…" -#: ../src/search_window.py:93 +#: ../src/search_window.py:94 msgid "Waiting for results" msgstr "Изчакване на резултатите" -#: ../src/search_window.py:133 ../src/search_window.py:211 +#: ../src/search_window.py:132 ../src/search_window.py:210 msgid "Error in received dataform" msgstr "Грешка в получените данни" #. No result -#: ../src/search_window.py:167 ../src/search_window.py:203 +#: ../src/search_window.py:166 ../src/search_window.py:202 msgid "No result" msgstr "Няма резултати" -#: ../src/session.py:128 +#: ../src/session.py:132 msgid "Disk WriteError" msgstr "Грешка при запис на диска" -#: ../src/session.py:249 +#: ../src/session.py:254 #, python-format msgid "Subject: %s" msgstr "Тема: %s" -#: ../src/session.py:422 ../src/session.py:457 +#: ../src/session.py:429 ../src/session.py:464 msgid "Confirm these session options" msgstr "Потвърждение на тези настройки на сесията" -#: ../src/session.py:424 +#: ../src/session.py:431 #, python-format msgid "" "The remote client wants to negotiate an session with these features:\n" @@ -9747,7 +9790,7 @@ msgstr "" "\n" "\tДопустими ли са тези настройки?" -#: ../src/session.py:458 +#: ../src/session.py:465 #, python-format msgid "" "The remote client selected these options:\n" @@ -9762,116 +9805,116 @@ msgstr "" "\n" "Продължаване с тази сесия?" -#: ../src/systray.py:177 +#: ../src/statusicon.py:209 msgid "_Change Status Message..." msgstr "_Промяна на съобщението за състояние…" -#: ../src/systray.py:293 +#: ../src/statusicon.py:325 msgid "Hide this menu" msgstr "Скриване на това меню" -#: ../src/tooltips.py:326 ../src/tooltips.py:520 +#: ../src/tooltips.py:347 ../src/tooltips.py:544 msgid "Jabber ID: " msgstr "Jabber ID: " -#: ../src/tooltips.py:329 ../src/tooltips.py:524 +#: ../src/tooltips.py:350 ../src/tooltips.py:548 msgid "Resource: " msgstr "Ресурс: " -#: ../src/tooltips.py:334 +#: ../src/tooltips.py:355 #, python-format msgid "%(owner_or_admin_or_member)s of this group chat" msgstr "%(owner_or_admin_or_member)s на тази стая" -#: ../src/tooltips.py:431 +#: ../src/tooltips.py:455 msgid " [blocked]" msgstr " [блокиран]" -#: ../src/tooltips.py:435 +#: ../src/tooltips.py:459 msgid " [minimized]" msgstr " [минимизиран]" -#: ../src/tooltips.py:450 ../src/tooltips.py:705 +#: ../src/tooltips.py:474 ../src/tooltips.py:686 msgid "Status: " msgstr "Състояние: " -#: ../src/tooltips.py:480 +#: ../src/tooltips.py:504 #, python-format msgid "Last status: %s" msgstr "Последно състояние: %s" -#: ../src/tooltips.py:482 +#: ../src/tooltips.py:506 #, python-format msgid " since %s" msgstr " от %s" -#: ../src/tooltips.py:500 +#: ../src/tooltips.py:524 msgid "Connected" msgstr "Свързан" -#: ../src/tooltips.py:502 +#: ../src/tooltips.py:526 msgid "Disconnected" msgstr "Изключен" #. ('both' is the normal sub so we don't show it) -#: ../src/tooltips.py:531 +#: ../src/tooltips.py:555 msgid "Subscription: " msgstr "Записване: " -#: ../src/tooltips.py:541 +#: ../src/tooltips.py:565 msgid "OpenPGP: " msgstr "OpenPGP: " -#: ../src/tooltips.py:637 +#: ../src/tooltips.py:618 msgid "Tune:" msgstr "Песен:" -#: ../src/tooltips.py:663 +#: ../src/tooltips.py:644 msgid "Download" msgstr "Изтегляне" -#: ../src/tooltips.py:669 +#: ../src/tooltips.py:650 msgid "Upload" msgstr "Качване" -#: ../src/tooltips.py:676 +#: ../src/tooltips.py:657 msgid "Type: " msgstr "Тип: " -#: ../src/tooltips.py:680 +#: ../src/tooltips.py:661 msgid "Transferred: " msgstr "Прехвърлени: " -#: ../src/tooltips.py:683 ../src/tooltips.py:704 +#: ../src/tooltips.py:664 ../src/tooltips.py:685 msgid "Not started" msgstr "Не е започнал" -#: ../src/tooltips.py:687 +#: ../src/tooltips.py:668 msgid "Stopped" msgstr "Преустановен" -#: ../src/tooltips.py:689 ../src/tooltips.py:692 +#: ../src/tooltips.py:670 ../src/tooltips.py:673 msgid "Completed" msgstr "Завършил" -#: ../src/tooltips.py:696 +#: ../src/tooltips.py:677 msgid "?transfer status:Paused" msgstr "Временно прекъснат" #. stalled is not paused. it is like 'frozen' it stopped alone -#: ../src/tooltips.py:700 +#: ../src/tooltips.py:681 msgid "Stalled" msgstr "Блокирал" -#: ../src/tooltips.py:702 +#: ../src/tooltips.py:683 msgid "Transferring" msgstr "Прехвърляне" -#: ../src/tooltips.py:738 +#: ../src/tooltips.py:721 msgid "This service has not yet responded with detailed information" msgstr "Тази услуга все още не е отговорила с подробна информация" -#: ../src/tooltips.py:741 +#: ../src/tooltips.py:724 msgid "" "This service could not respond with detailed information.\n" "It is most likely legacy or broken" @@ -9879,29 +9922,29 @@ msgstr "" "Тази услуга не можа да отговори с подробна информация.\n" "Най-вероятно е извън употреба или повредена" -#: ../src/vcard.py:245 +#: ../src/vcard.py:252 msgid "?Client:Unknown" msgstr "Неизвестен" -#: ../src/vcard.py:247 +#: ../src/vcard.py:254 msgid "?OS:Unknown" msgstr "Неизвестна" -#: ../src/vcard.py:268 +#: ../src/vcard.py:275 #, fuzzy msgid "?Time:Unknown" msgstr "Неизвестен" -#: ../src/vcard.py:292 ../src/vcard.py:302 ../src/vcard.py:511 +#: ../src/vcard.py:299 ../src/vcard.py:309 ../src/vcard.py:518 #, python-format msgid "since %s" msgstr "от %s" -#: ../src/vcard.py:331 +#: ../src/vcard.py:336 msgid "Affiliation:" msgstr "Ранг:" -#: ../src/vcard.py:339 +#: ../src/vcard.py:344 msgid "" "This contact is interested in your presence information, but you are not " "interested in his/her presence" @@ -9909,7 +9952,7 @@ msgstr "" "Този контакт се интересува от информацията за вашето състояние, но вие не се " "интересувате от неговото" -#: ../src/vcard.py:341 +#: ../src/vcard.py:346 msgid "" "You are interested in the contact's presence information, but he/she is not " "interested in yours" @@ -9917,13 +9960,13 @@ msgstr "" "Вие с интересувате от информацията за състоянието на този контакт, но той не " "се интересува от вашето" -#: ../src/vcard.py:343 +#: ../src/vcard.py:348 msgid "You and the contact are interested in each other's presence information" msgstr "" "Вие и контакта се интересувате взаимно от информацията за състоянията си" #. None -#: ../src/vcard.py:345 +#: ../src/vcard.py:350 msgid "" "You are not interested in the contact's presence, and neither he/she is " "interested in yours" @@ -9931,18 +9974,70 @@ msgstr "" "Вие не се интересувате от информацията за състоянието на контакта, както и " "той от вашата" -#: ../src/vcard.py:352 +#: ../src/vcard.py:357 msgid "You are waiting contact's answer about your subscription request" msgstr "Чакате отговора на контакта относно запитването ви за записване" -#: ../src/vcard.py:354 +#: ../src/vcard.py:359 msgid "There is no pending subscription request." msgstr "Няма чакащо запитване за записване." -#: ../src/vcard.py:359 ../src/vcard.py:413 ../src/vcard.py:536 +#: ../src/vcard.py:364 ../src/vcard.py:418 ../src/vcard.py:541 msgid " resource with priority " msgstr " ресурс с приоритет " +#~ msgid "_Incoming message:" +#~ msgstr "В_ходящо съобщение:" + +#~ msgid "_Outgoing message:" +#~ msgstr "_Изходящо съобщение:" + +#, fuzzy +#~ msgid "gtk-ok" +#~ msgstr "gtk-close" + +#~ msgid "" +#~ "The host %s you configured as the ft_add_hosts_to_send advanced option is " +#~ "not valid, so ignored." +#~ msgstr "" +#~ "Хостът „%s“, който сте конфигурирали в опцията „ft_add_hosts_to_send“, не " +#~ "е валиден, така че се пренебрегва." + +#~ msgid "OpenPGP passphrase was not given" +#~ msgstr "Не беше зададена парола за OpenPGP" + +#~ msgid "" +#~ "To continue sending and receiving messages, you will need to reconnect." +#~ msgstr "" +#~ "За да продължите да изпращате и получавате съобщения, трябва да се " +#~ "свържете наново." + +#~ msgid "" +#~ "You are not connected or not visible to others. Your message could not be " +#~ "sent." +#~ msgstr "" +#~ "Не сте свързани и не сте видими за другите. Съобщението ви не можа да " +#~ "бъде изпратено." + +#~ msgid "[This message is encrypted]" +#~ msgstr "[Това съобщение е шифрирано]" + +#~ msgid "%i days ago" +#~ msgstr "Преди %i дни" + +#~ msgid "Trayicon" +#~ msgstr "Икона в областта за уведомяване" + +#~ msgid "A icon in systemtray reflecting the current presence." +#~ msgstr "Икона в областта за уведомяване, отразяваща текущото състояние." + +#~ msgid "" +#~ "Requires python-gnome2-extras or compiled trayicon module from Gajim " +#~ "sources." +#~ msgstr "" +#~ "Изисква python-gnome2-extras или компилиран модул „trayicon“ от изходния " +#~ "код на Gajim." + #~ msgid "Add Special _Notification" #~ msgstr "Добавяне на специално _уведомление" diff --git a/po/br.po b/po/br.po index bf24bab46..97e34d828 100644 --- a/po/br.po +++ b/po/br.po @@ -11,7 +11,7 @@ msgid "" msgstr "" "Project-Id-Version: gajim 0.10\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2009-10-28 22:17+0100\n" +"POT-Creation-Date: 2009-11-25 22:20+0100\n" "PO-Revision-Date: 2006-06-05 19:14+0100\n" "Last-Translator: Giulia Fraboulet \n" "Language-Team: \n" @@ -296,9 +296,9 @@ msgstr "Kemmañ an titouroù hiniennel..." #. No configured account #: ../data/glade/account_modification_window.glade.h:16 #: ../data/glade/accounts_window.glade.h:21 -#: ../data/glade/roster_window.glade.h:5 ../src/common/helpers.py:1217 -#: ../src/common/helpers.py:1229 ../src/notify.py:547 ../src/notify.py:568 -#: ../src/notify.py:607 ../src/notify.py:619 +#: ../data/glade/roster_window.glade.h:5 ../src/common/helpers.py:1100 +#: ../src/common/helpers.py:1112 ../src/notify.py:560 ../src/notify.py:581 +#: ../src/notify.py:620 ../src/notify.py:632 msgid "Gajim" msgstr "Gajim" @@ -307,9 +307,9 @@ msgstr "Gajim" #. General group cannot be changed #: ../data/glade/account_modification_window.glade.h:17 #: ../data/glade/accounts_window.glade.h:22 -#: ../data/glade/preferences_window.glade.h:50 ../src/common/contacts.py:98 -#: ../src/dialogs.py:103 ../src/dialogs.py:111 ../src/roster_window.py:2753 -#: ../src/roster_window.py:5351 +#: ../data/glade/preferences_window.glade.h:52 ../src/common/contacts.py:135 +#: ../src/dialogs.py:111 ../src/dialogs.py:121 ../src/roster_window.py:2746 +#: ../src/roster_window.py:5268 msgid "General" msgstr "Hollek" @@ -370,21 +370,21 @@ msgid "Information about you, as stored in the server" msgstr "Titouroù diwar ho penn, miret war ar servijer" #: ../data/glade/account_modification_window.glade.h:27 -#: ../data/glade/accounts_window.glade.h:35 ../src/config.py:1585 -#: ../src/config.py:2131 +#: ../data/glade/accounts_window.glade.h:35 ../src/config.py:1646 +#: ../src/config.py:2196 msgid "No key selected" msgstr "Alc'hwez ebet diuzet" #. None means no proxy profile selected #: ../data/glade/account_modification_window.glade.h:29 #: ../data/glade/accounts_window.glade.h:37 -#: ../data/glade/change_mood_dialog.glade.h:3 ../src/config.py:1106 -#: ../src/config.py:1209 ../src/config.py:1489 ../src/config.py:1494 -#: ../src/config.py:2038 ../src/config.py:2117 ../src/config.py:2130 -#: ../src/config.py:3317 ../src/config.py:3390 ../src/dialogs.py:293 -#: ../src/dialogs.py:295 ../src/dialogs.py:498 ../src/dialogs.py:511 -#: ../src/roster_window.py:2807 ../src/roster_window.py:2813 -#: ../src/roster_window.py:2818 +#: ../data/glade/change_mood_dialog.glade.h:3 ../src/config.py:1158 +#: ../src/config.py:1261 ../src/config.py:1550 ../src/config.py:1555 +#: ../src/config.py:2103 ../src/config.py:2182 ../src/config.py:2195 +#: ../src/config.py:3396 ../src/config.py:3469 ../src/dialogs.py:308 +#: ../src/dialogs.py:310 ../src/dialogs.py:513 ../src/dialogs.py:526 +#: ../src/roster_window.py:2800 ../src/roster_window.py:2806 +#: ../src/roster_window.py:2811 msgid "None" msgstr "Hini ebet" @@ -534,8 +534,8 @@ msgid "" msgstr "" #: ../data/glade/accounts_window.glade.h:32 -#: ../data/glade/zeroconf_information_window.glade.h:4 ../src/config.py:1612 -#: ../src/dialogs.py:806 +#: ../data/glade/zeroconf_information_window.glade.h:4 ../src/config.py:1673 +#: ../src/dialogs.py:830 msgid "Jabber ID:" msgstr "ID Jabber:" @@ -551,7 +551,7 @@ msgid "Mer_ge accounts" msgstr "_Strollañ ar c'hontoù" #. Rename -#: ../data/glade/accounts_window.glade.h:42 ../src/roster_window.py:5302 +#: ../data/glade/accounts_window.glade.h:42 ../src/roster_window.py:5219 msgid "Re_name" msgstr "_Adenvel" @@ -972,7 +972,7 @@ msgstr "Anv:" msgid "New entry received" msgstr "Pa resever un darvoud nevez" -#: ../data/glade/atom_entry_window.glade.h:5 ../src/atom_window.py:114 +#: ../data/glade/atom_entry_window.glade.h:5 ../src/atom_window.py:124 msgid "You have received new entry:" msgstr "" @@ -1020,12 +1020,12 @@ msgstr "Roit ur ger-kuzh nevez:" msgid "Type your new status message" msgstr "Roit un titour-stad nevez" -#: ../data/glade/change_status_message_dialog.glade.h:2 ../src/tooltips.py:601 +#: ../data/glade/change_status_message_dialog.glade.h:2 ../src/tooltips.py:613 #, fuzzy msgid "Activity:" msgstr "Oberiant" -#: ../data/glade/change_status_message_dialog.glade.h:3 ../src/tooltips.py:586 +#: ../data/glade/change_status_message_dialog.glade.h:3 ../src/tooltips.py:608 #, fuzzy msgid "Mood:" msgstr "Webgaoz:" @@ -1122,8 +1122,8 @@ msgstr "Kemmañ ar _strolladoù" #. Invite to #. Invite to Groupchat -#: ../data/glade/contact_context_menu.glade.h:6 ../src/roster_window.py:5257 -#: ../src/roster_window.py:5412 +#: ../data/glade/contact_context_menu.glade.h:6 ../src/roster_window.py:5174 +#: ../src/roster_window.py:5333 msgid "In_vite to" msgstr "" @@ -1138,8 +1138,8 @@ msgid "Remo_ve" msgstr "_Dilemel" #. Send Custom Status -#: ../data/glade/contact_context_menu.glade.h:9 ../src/roster_window.py:5267 -#: ../src/roster_window.py:5497 +#: ../data/glade/contact_context_menu.glade.h:9 ../src/roster_window.py:5184 +#: ../src/roster_window.py:5420 #, fuzzy msgid "Send Cus_tom Status" msgstr "Goulenn evit gwelet e/he stad" @@ -1175,8 +1175,8 @@ msgid "_Allow him/her to see my status" msgstr "He/E aotren da welet ma stad" #: ../data/glade/contact_context_menu.glade.h:18 -#: ../data/glade/gc_occupants_menu.glade.h:7 ../src/roster_window.py:5330 -#: ../src/roster_window.py:5449 ../src/roster_window.py:5578 +#: ../data/glade/gc_occupants_menu.glade.h:7 ../src/roster_window.py:5247 +#: ../src/roster_window.py:5370 ../src/roster_window.py:5501 msgid "_Block" msgstr "" @@ -1188,7 +1188,7 @@ msgstr "Difenn dezhañ/dezhi gwelet ma stad" #: ../data/glade/contact_context_menu.glade.h:20 #: ../data/glade/gc_control_popup_menu.glade.h:6 #: ../data/glade/gc_occupants_menu.glade.h:8 -#: ../data/glade/roster_window.glade.h:21 ../src/roster_window.py:5647 +#: ../data/glade/roster_window.glade.h:21 ../src/roster_window.py:5570 msgid "_History" msgstr "_Istoradur" @@ -1211,8 +1211,8 @@ msgid "_Subscription" msgstr "_Koumanant" #: ../data/glade/contact_context_menu.glade.h:25 -#: ../data/glade/gc_occupants_menu.glade.h:13 ../src/roster_window.py:5324 -#: ../src/roster_window.py:5443 ../src/roster_window.py:5575 +#: ../data/glade/gc_occupants_menu.glade.h:13 ../src/roster_window.py:5241 +#: ../src/roster_window.py:5364 ../src/roster_window.py:5498 msgid "_Unblock" msgstr "" @@ -1306,7 +1306,7 @@ msgstr "" msgid "When a file transfer is complete show a popup notification" msgstr "P'eo echu un treuzkas, diskouez ur gemennadenn gelaouiñ difoupus" -#: ../data/glade/filetransfers.glade.h:13 ../src/filetransfers_window.py:792 +#: ../data/glade/filetransfers.glade.h:13 ../src/filetransfers_window.py:820 msgid "_Continue" msgstr "_Kenderc'hel" @@ -1314,7 +1314,7 @@ msgstr "_Kenderc'hel" msgid "_Notify me when a file transfer is complete" msgstr "_Kelaouiñ ac'hanon p'eo echu un treuzkas" -#: ../data/glade/filetransfers.glade.h:15 ../src/filetransfers_window.py:200 +#: ../data/glade/filetransfers.glade.h:15 ../src/filetransfers_window.py:204 msgid "_Open Containing Folder" msgstr "_Digeriñ ar renkell pal" @@ -1343,7 +1343,7 @@ msgstr "" "Darempred\n" "Titl" -#: ../data/glade/gajim_themes_window.glade.h:6 ../src/chat_control.py:818 +#: ../data/glade/gajim_themes_window.glade.h:6 ../src/chat_control.py:859 msgid "Bold" msgstr "Tev" @@ -1363,11 +1363,11 @@ msgstr "Personelaat gwiskadurioù Gajim" msgid "Gone" msgstr "Aet kuit" -#: ../data/glade/gajim_themes_window.glade.h:11 ../src/common/pep.py:153 +#: ../data/glade/gajim_themes_window.glade.h:11 ../src/common/pep.py:150 msgid "Inactive" msgstr "Dizoberiant" -#: ../data/glade/gajim_themes_window.glade.h:12 ../src/chat_control.py:819 +#: ../data/glade/gajim_themes_window.glade.h:12 ../src/chat_control.py:860 msgid "Italic" msgstr "Stouet" @@ -1419,7 +1419,7 @@ msgstr "Kemmañ ar _sujed" msgid "Configure _Room..." msgstr "Ke_fluniañ ar flap" -#: ../data/glade/gc_control_popup_menu.glade.h:4 ../src/disco.py:1624 +#: ../data/glade/gc_control_popup_menu.glade.h:4 ../src/disco.py:1746 #, fuzzy msgid "_Bookmark" msgstr "_Ouzhpennañ ar webgaoz d'ar sinedoù" @@ -1508,8 +1508,9 @@ msgstr "" msgid "Welcome to Gajim History Logs Manager" msgstr "Merour istoradur Gajim" -#: ../data/glade/history_manager.glade.h:4 ../src/dialogs.py:2884 -#: ../src/dialogs.py:2987 +#. Change label for accept_button to action name instead of 'OK'. +#: ../data/glade/history_manager.glade.h:4 ../src/dialogs.py:3007 +#: ../src/dialogs.py:3104 msgid "Delete" msgstr "Dilemel" @@ -1534,7 +1535,7 @@ msgstr "" msgid "_Search Database" msgstr "_Klask en titourva" -#: ../data/glade/history_window.glade.h:1 ../src/history_window.py:316 +#: ../data/glade/history_window.glade.h:1 ../src/history_window.py:323 msgid "Conversation History" msgstr "Istoradur ar gaoz" @@ -1560,7 +1561,7 @@ msgstr "_Istoradur flapiñ" msgid "Bookmark this room" msgstr "_Ouzhpennañ ar webgaoz d'ar sinedoù" -#: ../data/glade/join_groupchat_window.glade.h:3 ../src/dialogs.py:1972 +#: ../data/glade/join_groupchat_window.glade.h:3 ../src/dialogs.py:2076 msgid "Join Group Chat" msgstr "Ebarzhiñ ur sal-flapiñ" @@ -1588,8 +1589,8 @@ msgstr "Nevez 'zo:" msgid "Room:" msgstr "Webgaoz:" -#: ../data/glade/join_groupchat_window.glade.h:9 ../src/disco.py:1201 -#: ../src/disco.py:1628 +#: ../data/glade/join_groupchat_window.glade.h:9 ../src/disco.py:1306 +#: ../src/disco.py:1750 msgid "_Join" msgstr "E_barzhiñ" @@ -1618,7 +1619,7 @@ msgstr "" msgid "Print status:" msgstr "Diskouez an eur:" -#: ../data/glade/manage_bookmarks_window.glade.h:9 ../src/config.py:1602 +#: ../data/glade/manage_bookmarks_window.glade.h:9 ../src/config.py:1663 msgid "Server:" msgstr "Servijer:" @@ -1742,17 +1743,26 @@ msgid "Show a list of formattings" msgstr "Klikit evit enlakaat ur boulomell (Alt+M)" #: ../data/glade/message_window.glade.h:10 -msgid "Show a menu of advanced functions (Alt+A)" -msgstr "" +#, fuzzy +msgid "Show a menu of advanced functions (Alt+D)" +msgstr "Klikit evit enlakaat ur boulomell (Alt+M)" #: ../data/glade/message_window.glade.h:11 msgid "Show the contact's profile (Ctrl+I)" msgstr "" -#. Make sure the character after "_" is not M/m (conflicts with Alt+M that is supposed to show the Emoticon Selector) +#: ../data/glade/message_window.glade.h:12 +msgid "Toggle audio session" +msgstr "" + #: ../data/glade/message_window.glade.h:13 +msgid "Toggle video session" +msgstr "" + +#. Make sure the character after "_" is not M/m (conflicts with Alt+M that is supposed to show the Emoticon Selector) +#: ../data/glade/message_window.glade.h:15 #: ../data/glade/xml_console_window.glade.h:11 -#: ../src/filetransfers_window.py:260 +#: ../src/filetransfers_window.py:266 msgid "_Send" msgstr "_Kas" @@ -1893,6 +1903,16 @@ msgid "Configure color and font of the interface" msgstr "" #: ../data/glade/preferences_window.glade.h:36 +#, fuzzy +msgid "Contact's message:" +msgstr "_Titour-stad:" + +#: ../data/glade/preferences_window.glade.h:37 +#, fuzzy +msgid "Contact's nickname:" +msgstr "Anv an darempred" + +#: ../data/glade/preferences_window.glade.h:38 msgid "" "Detached roster with detached chats\n" "Detached roster with single chat\n" @@ -1901,34 +1921,34 @@ msgid "" "Detached roster with chat grouped by type" msgstr "" -#: ../data/glade/preferences_window.glade.h:41 +#: ../data/glade/preferences_window.glade.h:43 #, fuzzy msgid "Display _activity of contacts in roster" msgstr "Diskouez _skeudennigoù an darempredoù er roll" -#: ../data/glade/preferences_window.glade.h:42 +#: ../data/glade/preferences_window.glade.h:44 msgid "Display _extra email details" msgstr "" -#: ../data/glade/preferences_window.glade.h:43 +#: ../data/glade/preferences_window.glade.h:45 #, fuzzy msgid "Display _tunes of contacts in roster" msgstr "Diskouez _skeudennigoù an darempredoù er roll" -#: ../data/glade/preferences_window.glade.h:44 +#: ../data/glade/preferences_window.glade.h:46 msgid "Display a_vatars of contacts in roster" msgstr "Diskouez _skeudennigoù an darempredoù er roll" -#: ../data/glade/preferences_window.glade.h:45 +#: ../data/glade/preferences_window.glade.h:47 #, fuzzy msgid "Display m_ood of contacts in roster" msgstr "Diskouez _skeudennigoù an darempredoù er roll" -#: ../data/glade/preferences_window.glade.h:46 +#: ../data/glade/preferences_window.glade.h:48 msgid "Display status _messages of contacts in roster" msgstr "Diskouez titouroù-stad an darempredoù e-barzh ar roll" -#: ../data/glade/preferences_window.glade.h:47 +#: ../data/glade/preferences_window.glade.h:49 #, fuzzy msgid "" "Gajim can send and receive meta-information related to a conversation you " @@ -1939,7 +1959,7 @@ msgstr "" "conversations que vous pouvez avoir avec un contact. Vous pouvez ici " "spécifier quel état de conversation vous voulez envoyer à vos contacts" -#: ../data/glade/preferences_window.glade.h:48 +#: ../data/glade/preferences_window.glade.h:50 msgid "" "Gajim can send and receive meta-information related to a conversation you " "may have with a contact. Here you can specify which chatstates you want to " @@ -1949,7 +1969,7 @@ msgstr "" "conversations que vous pouvez avoir avec un contact. Vous pouvez ici " "spécifier quel état de conversation vous voulez envoyer à vos contacts" -#: ../data/glade/preferences_window.glade.h:49 +#: ../data/glade/preferences_window.glade.h:51 msgid "" "Gajim will notify you via a popup window in the bottom right of the screen " "about contacts that just signed out" @@ -1957,25 +1977,25 @@ msgstr "" "Gajim vous signalera par une fenêtre de notification en bas à droite de " "l'écran qu'un contact s'est déconnecté" -#: ../data/glade/preferences_window.glade.h:51 +#: ../data/glade/preferences_window.glade.h:53 #, fuzzy msgid "Hide all buttons in chat windows" msgstr "A guzha an nozelennoù er prenestroù webgaoz" -#: ../data/glade/preferences_window.glade.h:52 +#: ../data/glade/preferences_window.glade.h:54 #, fuzzy msgid "" "If checked, Gajim will allow others to detect the operation system you are " "using" msgstr "Si cette case est cochée, Gajim se connectera à ce salon au démarrage" -#: ../data/glade/preferences_window.glade.h:53 +#: ../data/glade/preferences_window.glade.h:55 msgid "" "If checked, Gajim will also include information about the sender of the new " "emails" msgstr "" -#: ../data/glade/preferences_window.glade.h:54 +#: ../data/glade/preferences_window.glade.h:56 #, fuzzy msgid "" "If checked, Gajim will change status to Away when the computer is unused." @@ -1983,13 +2003,13 @@ msgstr "" "Si cette case est cochée, Gajim placera une icône dans la zone de " "notification" -#: ../data/glade/preferences_window.glade.h:55 +#: ../data/glade/preferences_window.glade.h:57 msgid "" "If checked, Gajim will change status to Not Available when the computer has " "not been used even longer" msgstr "" -#: ../data/glade/preferences_window.glade.h:56 +#: ../data/glade/preferences_window.glade.h:58 msgid "" "If checked, Gajim will display avatars of contacts in roster window and in " "group chats" @@ -1997,7 +2017,7 @@ msgstr "" "Si cette case est cochée, Gajim affichera l'avatar de chaque contact dans la " "fenêtre principale et les salons" -#: ../data/glade/preferences_window.glade.h:57 +#: ../data/glade/preferences_window.glade.h:59 msgid "" "If checked, Gajim will display status messages of contacts under the contact " "name in roster window and in group chats" @@ -2005,7 +2025,7 @@ msgstr "" "Si cette case est cochée, Gajim affichera le message d'état, sous le nom de " "chaque contact dans la fenêtre principale et les salons" -#: ../data/glade/preferences_window.glade.h:58 +#: ../data/glade/preferences_window.glade.h:60 #, fuzzy msgid "" "If checked, Gajim will display the activity of contacts in the roster window" @@ -2013,7 +2033,7 @@ msgstr "" "Si cette case est cochée, Gajim affichera l'avatar de chaque contact dans la " "fenêtre principale et les salons" -#: ../data/glade/preferences_window.glade.h:59 +#: ../data/glade/preferences_window.glade.h:61 #, fuzzy msgid "" "If checked, Gajim will display the mood of contacts in the roster window" @@ -2021,7 +2041,7 @@ msgstr "" "Si cette case est cochée, Gajim affichera l'avatar de chaque contact dans la " "fenêtre principale et les salons" -#: ../data/glade/preferences_window.glade.h:60 +#: ../data/glade/preferences_window.glade.h:62 #, fuzzy msgid "" "If checked, Gajim will display the tunes of contacts in the roster window" @@ -2029,14 +2049,14 @@ msgstr "" "Si cette case est cochée, Gajim affichera l'avatar de chaque contact dans la " "fenêtre principale et les salons" -#: ../data/glade/preferences_window.glade.h:61 +#: ../data/glade/preferences_window.glade.h:63 msgid "" "If checked, Gajim will highlight spelling errors in input fields of chat " "windows. If no language is explicitly set via right click on the input " "field, the default language will be used for this contact or group chat." msgstr "" -#: ../data/glade/preferences_window.glade.h:62 +#: ../data/glade/preferences_window.glade.h:64 #, fuzzy msgid "" "If checked, Gajim will ignore incoming events from unauthorized contacts. " @@ -2047,20 +2067,20 @@ msgstr "" "vous spamme/ennuie. Utilisez la avec précaution, car elle bloque tous les " "messages des contacts qui ne sont pas dans votre liste" -#: ../data/glade/preferences_window.glade.h:63 +#: ../data/glade/preferences_window.glade.h:65 msgid "" "If checked, Gajim will keep logs for encrypted messages. Please note that " "when using E2E encryption the remote party has to agree on logging, else the " "messages will not be logged." msgstr "" -#: ../data/glade/preferences_window.glade.h:64 +#: ../data/glade/preferences_window.glade.h:66 msgid "" "If checked, Gajim will show a notification when a new e-mail is received via " "GMail" msgstr "" -#: ../data/glade/preferences_window.glade.h:65 +#: ../data/glade/preferences_window.glade.h:67 msgid "" "If checked, Gajim will use protocol-specific status icons. (eg. A contact " "from MSN will have the equivalent msn icon for status online, away, busy, " @@ -2070,13 +2090,13 @@ msgstr "" "protocoles. (Par ex. un contact MSN aura les icônes de MSN pour les états " "disponible, absent, occupé, etc)" -#: ../data/glade/preferences_window.glade.h:66 +#: ../data/glade/preferences_window.glade.h:68 msgid "" "If enabled, Gajim will not ask for a status message. The specified default " "message will be used instead." msgstr "" -#: ../data/glade/preferences_window.glade.h:67 +#: ../data/glade/preferences_window.glade.h:69 msgid "" "If not disabled, Gajim will replace ascii smilies like ':)' with equivalent " "animated or static graphical emoticons" @@ -2084,108 +2104,108 @@ msgstr "" "M'eo lazhet, ne vo ket erlec'hiet ar voulomelloù ascii doare ':)' gant " "boulomelloù grafikel fiñv pe difiñv" -#: ../data/glade/preferences_window.glade.h:68 +#: ../data/glade/preferences_window.glade.h:70 msgid "Log _encrypted chat session" msgstr "" -#: ../data/glade/preferences_window.glade.h:69 +#: ../data/glade/preferences_window.glade.h:71 #, fuzzy msgid "Ma_ke message windows compact" msgstr "Ur prenestr-flapiñ:" -#: ../data/glade/preferences_window.glade.h:70 +#: ../data/glade/preferences_window.glade.h:72 msgid "Ma_nage..." msgstr "Me_rañ..." -#: ../data/glade/preferences_window.glade.h:71 +#: ../data/glade/preferences_window.glade.h:73 msgid "" "Never\n" "Only when pending events\n" "Always" msgstr "" -#: ../data/glade/preferences_window.glade.h:74 +#: ../data/glade/preferences_window.glade.h:76 #, fuzzy msgid "Notifications" msgstr "Kemmañ ar gont" -#: ../data/glade/preferences_window.glade.h:75 +#: ../data/glade/preferences_window.glade.h:77 #, fuzzy msgid "Notify me about contacts that sign _in" msgstr "Ma c'helaouiñ pa c'hoarvez gant un darempred:" -#: ../data/glade/preferences_window.glade.h:76 +#: ../data/glade/preferences_window.glade.h:78 #, fuzzy msgid "Notify me about contacts that sign _out" msgstr "Ma c'helaouiñ pa c'hoarvez gant un darempred:" -#: ../data/glade/preferences_window.glade.h:77 +#: ../data/glade/preferences_window.glade.h:79 #, fuzzy msgid "Notify on new _GMail email" msgstr "Ma c'helaouiñ evit ar c'hemennadennoù _Gmail nevez" -#: ../data/glade/preferences_window.glade.h:78 +#: ../data/glade/preferences_window.glade.h:80 #, fuzzy msgid "Personal Events" msgstr "Titouroù hiniennel" -#: ../data/glade/preferences_window.glade.h:79 +#: ../data/glade/preferences_window.glade.h:81 msgid "Play _sounds" msgstr "_Seniñ" -#: ../data/glade/preferences_window.glade.h:80 +#: ../data/glade/preferences_window.glade.h:82 msgid "" "Pop it up\n" "Notify me about it\n" "Show only in roster" msgstr "" -#: ../data/glade/preferences_window.glade.h:83 +#: ../data/glade/preferences_window.glade.h:85 msgid "Preferences" msgstr "Penndibaboù" -#: ../data/glade/preferences_window.glade.h:84 +#: ../data/glade/preferences_window.glade.h:86 #, fuzzy msgid "Show systray:" msgstr "Diskouez er _roll hepken" -#: ../data/glade/preferences_window.glade.h:85 +#: ../data/glade/preferences_window.glade.h:87 msgid "Sign _in" msgstr "_Lugañ" -#: ../data/glade/preferences_window.glade.h:86 +#: ../data/glade/preferences_window.glade.h:88 msgid "Sign _out" msgstr "_Dilugañ" -#: ../data/glade/preferences_window.glade.h:87 +#: ../data/glade/preferences_window.glade.h:89 msgid "" "Some messages may include rich content (formatting, colors etc). If checked, " "Gajim will just display the raw message text." msgstr "" -#: ../data/glade/preferences_window.glade.h:88 +#: ../data/glade/preferences_window.glade.h:90 #, fuzzy msgid "Sort contacts by status" msgstr "_Urzhiañ an darempredoù hervez o stad" -#: ../data/glade/preferences_window.glade.h:89 ../src/config.py:390 +#: ../data/glade/preferences_window.glade.h:91 ../src/config.py:377 msgid "Status" msgstr "Stad" -#: ../data/glade/preferences_window.glade.h:90 +#: ../data/glade/preferences_window.glade.h:92 #, fuzzy msgid "Status _iconset:" msgstr "_Arlunioù-stad dre-ziouer:" -#: ../data/glade/preferences_window.glade.h:91 +#: ../data/glade/preferences_window.glade.h:93 msgid "Style" msgstr "" -#: ../data/glade/preferences_window.glade.h:92 +#: ../data/glade/preferences_window.glade.h:94 msgid "T_heme:" msgstr "_Gwiskadur:" -#: ../data/glade/preferences_window.glade.h:93 +#: ../data/glade/preferences_window.glade.h:95 msgid "" "The auto away status message. If empty, Gajim will not change the current " "status message\n" @@ -2193,7 +2213,7 @@ msgid "" "$T will be replaced by auto-away timeout" msgstr "" -#: ../data/glade/preferences_window.glade.h:96 +#: ../data/glade/preferences_window.glade.h:98 msgid "" "The auto not available status message. If empty, Gajim will not change the " "current status message\n" @@ -2201,112 +2221,114 @@ msgid "" "$T will be replaced by auto-not-available timeout" msgstr "" -#: ../data/glade/preferences_window.glade.h:99 +#: ../data/glade/preferences_window.glade.h:101 #, fuzzy msgid "Use _transports icons" msgstr "Implij arlunioù an _dorioù" -#: ../data/glade/preferences_window.glade.h:100 +#: ../data/glade/preferences_window.glade.h:102 msgid "Use system _default" msgstr "" -#: ../data/glade/preferences_window.glade.h:101 +#: ../data/glade/preferences_window.glade.h:103 #, fuzzy msgid "When new event is received:" msgstr "Pa resever un darvoud nevez" -#: ../data/glade/preferences_window.glade.h:102 +#: ../data/glade/preferences_window.glade.h:104 +#, fuzzy +msgid "Your message:" +msgstr "Fazi en ur lenn ar restr:" + +#: ../data/glade/preferences_window.glade.h:105 +#, fuzzy +msgid "Your nickname:" +msgstr "_A-raok al lesanv:" + +#: ../data/glade/preferences_window.glade.h:106 #, fuzzy msgid "_Away after:" msgstr "Bezañ lakaet da _ezvezant war-lerc'h:" -#: ../data/glade/preferences_window.glade.h:103 +#: ../data/glade/preferences_window.glade.h:107 msgid "_Browser:" msgstr "_Furcher web:" -#: ../data/glade/preferences_window.glade.h:104 +#: ../data/glade/preferences_window.glade.h:108 #, fuzzy msgid "_Display chat state notifications:" msgstr "Titou_roù-stad ar flap:" -#: ../data/glade/preferences_window.glade.h:105 +#: ../data/glade/preferences_window.glade.h:109 #, fuzzy msgid "_Emoticons:" msgstr "Boulomelloù:" -#: ../data/glade/preferences_window.glade.h:106 +#: ../data/glade/preferences_window.glade.h:110 msgid "_File manager:" msgstr "Merour _restroù:" -#: ../data/glade/preferences_window.glade.h:107 +#: ../data/glade/preferences_window.glade.h:111 msgid "_Highlight misspelled words" msgstr "_Islinennañ ar fazioù reizhskrivañ" -#: ../data/glade/preferences_window.glade.h:108 +#: ../data/glade/preferences_window.glade.h:112 msgid "_Ignore events from contacts not in the roster" msgstr "_Chom hep teurel pled eus ar c'hemennadennoù kaset gant tud dianav" -#: ../data/glade/preferences_window.glade.h:109 +#: ../data/glade/preferences_window.glade.h:113 msgid "_Ignore rich content in incoming messages" msgstr "" -#: ../data/glade/preferences_window.glade.h:110 -msgid "_Incoming message:" -msgstr "Kemennadenn o _tegouezhout:" - -#: ../data/glade/preferences_window.glade.h:111 +#: ../data/glade/preferences_window.glade.h:114 msgid "_Log status changes of contacts" msgstr "_Menegiñ kemmoù stad an darempredoù e-barzh an istoradur" -#: ../data/glade/preferences_window.glade.h:112 +#: ../data/glade/preferences_window.glade.h:115 msgid "_Mail client:" msgstr "_Meziant posteliñ:" -#: ../data/glade/preferences_window.glade.h:113 +#: ../data/glade/preferences_window.glade.h:116 #, fuzzy msgid "_Not available after:" msgstr "Bezañ lakaet evel _dihegerz war-lerc'h:" -#: ../data/glade/preferences_window.glade.h:114 +#: ../data/glade/preferences_window.glade.h:117 msgid "_Open..." msgstr "_Digeriñ..." -#: ../data/glade/preferences_window.glade.h:115 -msgid "_Outgoing message:" -msgstr "Kemennadenn o _vont 'maez:" - -#: ../data/glade/preferences_window.glade.h:116 +#: ../data/glade/preferences_window.glade.h:118 msgid "_Reset to Default Colors" msgstr "_Distreiñ gant al livioù dre-ziouer" -#: ../data/glade/preferences_window.glade.h:117 +#: ../data/glade/preferences_window.glade.h:119 #, fuzzy msgid "_Send chat state notifications:" msgstr "Titou_roù-stad ar flap:" -#: ../data/glade/preferences_window.glade.h:118 +#: ../data/glade/preferences_window.glade.h:120 msgid "_Status message:" msgstr "_Titour-stad:" -#: ../data/glade/preferences_window.glade.h:119 +#: ../data/glade/preferences_window.glade.h:121 msgid "_URL highlight:" msgstr "" -#: ../data/glade/preferences_window.glade.h:120 +#: ../data/glade/preferences_window.glade.h:122 msgid "_Window behavior:" msgstr "" -#: ../data/glade/preferences_window.glade.h:121 +#: ../data/glade/preferences_window.glade.h:123 #, fuzzy msgid "in _group chats" msgstr "Ebarzhiñ ur _webgaoz" -#: ../data/glade/preferences_window.glade.h:122 +#: ../data/glade/preferences_window.glade.h:124 #, fuzzy msgid "in _roster" msgstr "Ket er roll" -#: ../data/glade/preferences_window.glade.h:123 +#: ../data/glade/preferences_window.glade.h:125 msgid "minutes" msgstr "munutenn" @@ -2364,7 +2386,7 @@ msgstr "ID Jabber:" msgid "Order:" msgstr "Servijer:" -#: ../data/glade/privacy_list_window.glade.h:12 ../src/dialogs.py:3114 +#: ../data/glade/privacy_list_window.glade.h:12 ../src/dialogs.py:3235 #, fuzzy msgid "Privacy List" msgstr "Roll argas" @@ -2530,7 +2552,7 @@ msgid "Prefix:" msgstr "Perzhioù" #: ../data/glade/profile_window.glade.h:25 -#: ../data/glade/vcard_information_window.glade.h:30 ../src/vcard.py:327 +#: ../data/glade/vcard_information_window.glade.h:30 ../src/vcard.py:332 #, fuzzy msgid "Role:" msgstr "Sonioù" @@ -2595,8 +2617,8 @@ msgstr "Dilemel ar gont diwar Gajim ha diwar ar _servijer" #. Remove group #. Remove -#: ../data/glade/remove_account_window.glade.h:4 ../src/roster_window.py:5339 -#: ../src/roster_window.py:5459 ../src/roster_window.py:5588 +#: ../data/glade/remove_account_window.glade.h:4 ../src/roster_window.py:5256 +#: ../src/roster_window.py:5380 ../src/roster_window.py:5511 msgid "_Remove" msgstr "_Dilemel" @@ -2615,14 +2637,14 @@ msgid "Roster Item Exchange" msgstr "" #: ../data/glade/roster_item_exchange_window.glade.h:4 -#, fuzzy -msgid "gtk-cancel" -msgstr "Dilemel" +#: ../data/glade/service_registration_window.glade.h:3 +msgid "_OK" +msgstr "_Mat eo" #: ../data/glade/roster_item_exchange_window.glade.h:5 #, fuzzy -msgid "gtk-ok" -msgstr "gtk+" +msgid "gtk-cancel" +msgstr "Dilemel" #: ../data/glade/roster_window.glade.h:1 #, fuzzy @@ -2685,7 +2707,7 @@ msgstr "_Oberoù" msgid "_Contents" msgstr "_Endalc'hadoù" -#: ../data/glade/roster_window.glade.h:18 ../src/disco.py:1357 +#: ../data/glade/roster_window.glade.h:18 ../src/disco.py:1467 msgid "_Edit" msgstr "_Aozañ" @@ -2729,12 +2751,12 @@ msgid "_Add contact" msgstr "Ouzhpennañ un _darempred" #. Information -#: ../data/glade/search_window.glade.h:4 ../src/roster_window.py:5600 +#: ../data/glade/search_window.glade.h:4 ../src/roster_window.py:5523 #, fuzzy msgid "_Information" msgstr "Titouroù" -#: ../data/glade/search_window.glade.h:5 ../src/disco.py:1213 +#: ../data/glade/search_window.glade.h:5 ../src/disco.py:1318 msgid "_Search" msgstr "_Klask" @@ -2754,10 +2776,6 @@ msgstr "En em enrollañ war" msgid "_Cancel" msgstr "_Nullañ" -#: ../data/glade/service_registration_window.glade.h:3 -msgid "_OK" -msgstr "_Mat eo" - #: ../data/glade/single_message_window.glade.h:1 msgid "0" msgstr "0" @@ -2981,337 +2999,324 @@ msgstr "" msgid "Status:" msgstr "Stad:" -#: ../src/adhoc_commands.py:268 +#: ../src/adhoc_commands.py:295 #, fuzzy msgid "Cancel confirmation" msgstr "Titouroù" -#: ../src/adhoc_commands.py:269 +#: ../src/adhoc_commands.py:296 msgid "" "You are in process of executing command. Do you really want to cancel it?" msgstr "" -#: ../src/adhoc_commands.py:301 ../src/adhoc_commands.py:324 +#: ../src/adhoc_commands.py:328 ../src/adhoc_commands.py:351 msgid "Service sent malformed data" msgstr "" -#: ../src/adhoc_commands.py:310 +#: ../src/adhoc_commands.py:337 msgid "Service changed the session identifier." msgstr "" #. when stanza doesn't have error description -#: ../src/adhoc_commands.py:405 +#: ../src/adhoc_commands.py:436 msgid "Service returned an error." msgstr "" #. For i18n -#: ../src/advanced_configuration_window.py:89 +#: ../src/advanced_configuration_window.py:91 #, fuzzy msgid "Activated" msgstr "Oberiant" -#: ../src/advanced_configuration_window.py:89 +#: ../src/advanced_configuration_window.py:91 #, fuzzy msgid "Deactivated" msgstr "Dizoberiant" -#: ../src/advanced_configuration_window.py:91 +#: ../src/advanced_configuration_window.py:93 msgid "Boolean" msgstr "" -#: ../src/advanced_configuration_window.py:92 +#: ../src/advanced_configuration_window.py:94 #, fuzzy msgid "Integer" msgstr "Er strollad" -#: ../src/advanced_configuration_window.py:93 +#: ../src/advanced_configuration_window.py:95 msgid "Text" msgstr "Texte" -#: ../src/advanced_configuration_window.py:94 ../src/chat_control.py:838 +#: ../src/advanced_configuration_window.py:96 ../src/chat_control.py:879 msgid "Color" msgstr "" -#: ../src/advanced_configuration_window.py:105 +#: ../src/advanced_configuration_window.py:107 msgid "Preference Name" msgstr "Dibab" -#: ../src/advanced_configuration_window.py:111 +#: ../src/advanced_configuration_window.py:113 msgid "Value" msgstr "Talvoud" -#: ../src/advanced_configuration_window.py:119 +#: ../src/advanced_configuration_window.py:121 msgid "Type" msgstr "Doare" #. we talk about option description in advanced configuration editor -#: ../src/advanced_configuration_window.py:172 +#: ../src/advanced_configuration_window.py:176 msgid "(None)" msgstr "(Hini ebet)" -#: ../src/advanced_configuration_window.py:255 +#: ../src/advanced_configuration_window.py:259 msgid "Hidden" msgstr "Elfennoù kuzh" -#: ../src/atom_window.py:110 +#: ../src/atom_window.py:119 #, python-format -msgid "You have received new entries (and %(count)d not displayed):" -msgstr "" +msgid "You have received new entries (and %d not displayed):" +msgid_plural "You have received new entries (and %d not displayed):" +msgstr[0] "" +msgstr[1] "" #. the next script, executed in the "po" directory, #. generates the following list. #. #!/bin/sh #. LANG=$(for i in *.po; do j=${i/.po/}; echo -n "_('"$j"')":" '"$j"', " ; done) #. echo "{_('en'):'en'",$LANG"}" -#: ../src/chat_control.py:74 +#: ../src/chat_control.py:75 msgid "English" msgstr "" -#: ../src/chat_control.py:74 +#: ../src/chat_control.py:75 msgid "Belarusian" msgstr "" -#: ../src/chat_control.py:74 +#: ../src/chat_control.py:75 msgid "Bulgarian" msgstr "" -#: ../src/chat_control.py:74 +#: ../src/chat_control.py:75 msgid "Breton" msgstr "" -#: ../src/chat_control.py:74 +#: ../src/chat_control.py:75 msgid "Czech" msgstr "" -#: ../src/chat_control.py:74 +#: ../src/chat_control.py:75 #, fuzzy msgid "German" msgstr "Hollek" -#: ../src/chat_control.py:74 +#: ../src/chat_control.py:75 #, fuzzy msgid "Greek" msgstr "Glas" -#: ../src/chat_control.py:74 +#: ../src/chat_control.py:75 msgid "British" msgstr "" -#: ../src/chat_control.py:74 +#: ../src/chat_control.py:75 msgid "Esperanto" msgstr "" -#: ../src/chat_control.py:74 +#: ../src/chat_control.py:75 msgid "Spanish" msgstr "" -#: ../src/chat_control.py:74 +#: ../src/chat_control.py:75 msgid "Basque" msgstr "" -#: ../src/chat_control.py:74 +#: ../src/chat_control.py:75 msgid "French" msgstr "" -#: ../src/chat_control.py:74 +#: ../src/chat_control.py:75 #, fuzzy msgid "Croatian" msgstr "Chomlec'h" -#: ../src/chat_control.py:74 +#: ../src/chat_control.py:75 #, fuzzy msgid "Italian" msgstr "Stouet" -#: ../src/chat_control.py:74 +#: ../src/chat_control.py:75 msgid "Norwegian (b)" msgstr "" -#: ../src/chat_control.py:74 +#: ../src/chat_control.py:75 msgid "Dutch" msgstr "" -#: ../src/chat_control.py:74 +#: ../src/chat_control.py:75 msgid "Norwegian" msgstr "" -#: ../src/chat_control.py:74 +#: ../src/chat_control.py:75 #, fuzzy msgid "Polish" msgstr "_Embann" -#: ../src/chat_control.py:74 +#: ../src/chat_control.py:75 msgid "Portuguese" msgstr "" -#: ../src/chat_control.py:74 +#: ../src/chat_control.py:75 msgid "Brazilian Portuguese" msgstr "" -#: ../src/chat_control.py:74 +#: ../src/chat_control.py:75 msgid "Russian" msgstr "" -#: ../src/chat_control.py:74 +#: ../src/chat_control.py:75 #, fuzzy msgid "Serbian" msgstr "Hollek" -#: ../src/chat_control.py:74 +#: ../src/chat_control.py:75 msgid "Slovak" msgstr "" -#: ../src/chat_control.py:74 +#: ../src/chat_control.py:75 msgid "Swedish" msgstr "" -#: ../src/chat_control.py:74 +#: ../src/chat_control.py:75 msgid "Chinese (Ch)" msgstr "" -#: ../src/chat_control.py:426 +#: ../src/chat_control.py:446 msgid "Spelling language" msgstr "" #. we are not connected -#: ../src/chat_control.py:454 ../src/chat_control.py:642 +#: ../src/chat_control.py:478 ../src/chat_control.py:670 msgid "A connection is not available" msgstr "N'eus ket tu da gevreañ" -#: ../src/chat_control.py:455 ../src/chat_control.py:643 +#: ../src/chat_control.py:479 ../src/chat_control.py:671 msgid "Your message can not be sent until you are connected." msgstr "N'eus ket tu da gas ho kemennadenn keit ha ma n'oc'h ket luget." -#: ../src/chat_control.py:820 +#: ../src/chat_control.py:861 #, fuzzy msgid "Underline" msgstr "Islinennañ" -#: ../src/chat_control.py:821 +#: ../src/chat_control.py:862 #, fuzzy msgid "Strike" msgstr "Lesanv" -#: ../src/chat_control.py:844 +#: ../src/chat_control.py:885 #, fuzzy msgid "Font" msgstr "_Nodrezh:" -#: ../src/chat_control.py:853 +#: ../src/chat_control.py:894 #, fuzzy msgid "Clear formating" msgstr "Titouroù" -#: ../src/chat_control.py:925 +#: ../src/chat_control.py:972 msgid "Really send file?" msgstr "" -#: ../src/chat_control.py:926 +#: ../src/chat_control.py:973 #, python-format msgid "If you send a file to %s, he/she will know your real Jabber ID." msgstr "" -#: ../src/chat_control.py:1317 ../src/chat_control.py:1718 +#: ../src/chat_control.py:1411 ../src/chat_control.py:1864 #, fuzzy msgid "GPG encryption enabled" msgstr "War enaou emañ ar sifrañ" #. Add to roster -#: ../src/chat_control.py:1346 ../src/common/contacts.py:113 -#: ../src/common/helpers.py:55 ../src/common/helpers.py:231 -#: ../src/conversation_textview.py:903 ../src/dialogs.py:1031 -#: ../src/dialogs.py:1882 ../src/dialogs.py:1907 ../src/gajim.py:999 -#: ../src/gajim.py:1750 ../src/gui_menu_builder.py:243 -#: ../src/gui_menu_builder.py:385 ../src/roster_window.py:988 -#: ../src/roster_window.py:1622 ../src/roster_window.py:1624 -#: ../src/roster_window.py:1926 ../src/roster_window.py:3187 -#: ../src/roster_window.py:3213 +#: ../src/chat_control.py:1436 ../src/common/contacts.py:150 +#: ../src/common/contacts.py:253 ../src/common/helpers.py:55 +#: ../src/common/helpers.py:231 ../src/conversation_textview.py:916 +#: ../src/dialogs.py:1060 ../src/dialogs.py:1973 ../src/dialogs.py:2002 +#: ../src/gui_interface.py:610 ../src/gui_menu_builder.py:255 +#: ../src/gui_menu_builder.py:398 ../src/roster_window.py:1576 +#: ../src/roster_window.py:1578 ../src/roster_window.py:1893 +#: ../src/roster_window.py:3194 ../src/roster_window.py:3220 msgid "Not in Roster" msgstr "Ket er roll" -#: ../src/chat_control.py:1359 +#: ../src/chat_control.py:1480 #, fuzzy msgid "This contact does not support file transfer." msgstr "Ur roll eus an treuzkasoù oberiant, echu pe arsavet" -#: ../src/chat_control.py:1362 +#: ../src/chat_control.py:1483 msgid "You need to know the real JID of the contact to send him or her a file." msgstr "" -#: ../src/chat_control.py:1469 ../src/tooltips.py:626 -msgid "Unknown Artist" -msgstr "" - -#: ../src/chat_control.py:1471 ../src/tooltips.py:631 -msgid "Unknown Title" -msgstr "" - -#: ../src/chat_control.py:1473 ../src/tooltips.py:636 -msgid "Unknown Source" -msgstr "" - -#: ../src/chat_control.py:1476 ../src/tooltips.py:638 +#: ../src/chat_control.py:1555 #, python-format -msgid "" -"\"%(title)s\" by %(artist)s\n" -"from %(source)s" +msgid "%(type)s state : %(state)s, reason: %(reason)s" msgstr "" -#: ../src/chat_control.py:1613 +#: ../src/chat_control.py:1720 #, fuzzy, python-format msgid "%(nickname)s from group chat %(room_name)s" msgstr "%(nickname)s : %(message)s" #. No key assigned nor a key is used by remote contact -#: ../src/chat_control.py:1698 ../src/dialogs.py:4484 +#: ../src/chat_control.py:1844 ../src/dialogs.py:4627 msgid "No GPG key assigned" msgstr "" -#: ../src/chat_control.py:1699 +#: ../src/chat_control.py:1845 msgid "" "No GPG key is assigned to this contact. So you cannot encrypt messages with " "GPG." msgstr "" -#: ../src/chat_control.py:1708 +#: ../src/chat_control.py:1854 #, fuzzy msgid "GPG encryption disabled" msgstr "Lazhet eo ar sifrañ" -#: ../src/chat_control.py:1734 +#: ../src/chat_control.py:1880 msgid "Session WILL be logged" msgstr "" -#: ../src/chat_control.py:1736 +#: ../src/chat_control.py:1882 msgid "Session WILL NOT be logged" msgstr "" #. encryption %s active -#: ../src/chat_control.py:1750 +#: ../src/chat_control.py:1899 msgid "is" msgstr "" -#: ../src/chat_control.py:1750 +#: ../src/chat_control.py:1899 msgid "is NOT" msgstr "" #. chat session %s be logged -#: ../src/chat_control.py:1752 +#: ../src/chat_control.py:1901 msgid "will" msgstr "" -#: ../src/chat_control.py:1752 +#: ../src/chat_control.py:1901 msgid "will NOT" msgstr "" #. About encrypted chat session -#: ../src/chat_control.py:1756 +#: ../src/chat_control.py:1905 #, fuzzy msgid "and authenticated" msgstr "Implij an diskleriañ" #. About encrypted chat session -#: ../src/chat_control.py:1760 +#: ../src/chat_control.py:1909 #, fuzzy msgid "and NOT authenticated" msgstr "Implij an diskleriañ" @@ -3319,58 +3324,58 @@ msgstr "Implij an diskleriañ" #. status will become 'is' or 'is not', authentificaed will become #. 'and authentificated' or 'and not authentificated', logged will become #. 'will' or 'will not' -#: ../src/chat_control.py:1766 +#: ../src/chat_control.py:1915 #, python-format msgid "" "%(type)s encryption %(status)s active %(authenticated)s.\n" "Your chat session %(logged)s be logged." msgstr "" -#: ../src/chat_control.py:1906 +#: ../src/chat_control.py:2055 msgid "Session negotiation cancelled" msgstr "" -#: ../src/chat_control.py:1913 +#: ../src/chat_control.py:2064 #, fuzzy msgid "This session is encrypted" msgstr "[Sifret eo ar gemennadenn-mañ]" -#: ../src/chat_control.py:1916 +#: ../src/chat_control.py:2067 msgid " and WILL be logged" msgstr "" -#: ../src/chat_control.py:1918 +#: ../src/chat_control.py:2069 msgid " and WILL NOT be logged" msgstr "" -#: ../src/chat_control.py:1923 +#: ../src/chat_control.py:2074 msgid "" "Remote contact's identity not verified. Click the shield button for more " "details." msgstr "" -#: ../src/chat_control.py:1925 +#: ../src/chat_control.py:2076 #, fuzzy msgid "E2E encryption disabled" msgstr "Lazhet eo ar sifrañ" -#: ../src/chat_control.py:1959 ../src/chat_control.py:1972 +#: ../src/chat_control.py:2113 ../src/chat_control.py:2126 #, fuzzy msgid "The following message was NOT encrypted" msgstr "[Sifret eo ar gemennadenn-mañ]" -#: ../src/chat_control.py:1965 +#: ../src/chat_control.py:2119 #, fuzzy msgid "The following message was encrypted" msgstr "[Sifret eo ar gemennadenn-mañ]" #. %s is being replaced in the code with JID -#: ../src/chat_control.py:2235 +#: ../src/chat_control.py:2388 #, python-format msgid "You just received a new message from \"%s\"" msgstr "O paouez resev ur gemennadenn nevez digant \"%s\" emaoc'h" -#: ../src/chat_control.py:2236 +#: ../src/chat_control.py:2389 msgid "" "If you close this tab and you have history disabled, this message will be " "lost." @@ -3378,22 +3383,22 @@ msgstr "" "Ma serrit ar prenestr-mañ ha n'eo ket enaouet an istoradur, e vo kollet ar " "gemennadenn." -#: ../src/chat_control.py:2391 ../src/common/connection_handlers.py:2073 -#: ../src/common/connection_handlers.py:2119 -#: ../src/common/connection_handlers.py:2347 -#: ../src/common/connection_handlers.py:2489 ../src/common/connection.py:1368 -#: ../src/gajim.py:154 ../src/session.py:130 +#: ../src/chat_control.py:2542 ../src/common/connection_handlers.py:2100 +#: ../src/common/connection_handlers.py:2146 +#: ../src/common/connection_handlers.py:2338 +#: ../src/common/connection_handlers.py:2483 ../src/common/connection.py:420 +#: ../src/gajim.py:154 ../src/session.py:134 msgid "Database Error" msgstr "" -#: ../src/chat_control.py:2392 +#: ../src/chat_control.py:2543 #, python-format msgid "" "The database file (%s) cannot be read. Try to repair it or remove it (all " "history will be lost)." msgstr "" -#: ../src/chat_control.py:2622 +#: ../src/chat_control.py:2784 #, fuzzy, python-format msgid "%(name)s is now %(status)s" msgstr "%(nick)s a zo bremañ %(status)s" @@ -3402,23 +3407,23 @@ msgstr "%(nick)s a zo bremañ %(status)s" msgid "creating logs database" msgstr "o krouiñ titourva an istoradur" -#: ../src/common/check_paths.py:128 ../src/common/check_paths.py:139 -#: ../src/common/check_paths.py:146 +#: ../src/common/check_paths.py:129 ../src/common/check_paths.py:140 +#: ../src/common/check_paths.py:147 #, fuzzy, python-format msgid "%s is a file but it should be a directory" msgstr "ur restr eo %s met rankout a rafe bezañ ur renkell" -#: ../src/common/check_paths.py:129 ../src/common/check_paths.py:140 -#: ../src/common/check_paths.py:147 ../src/common/check_paths.py:155 +#: ../src/common/check_paths.py:130 ../src/common/check_paths.py:141 +#: ../src/common/check_paths.py:148 ../src/common/check_paths.py:156 msgid "Gajim will now exit" msgstr "Emañ Gajim o vont da guitaat diouzhtu" -#: ../src/common/check_paths.py:154 +#: ../src/common/check_paths.py:155 #, fuzzy, python-format msgid "%s is a directory but should be a file" msgstr "ur renkell eo %s met rankout a rafe bezañ ur restr" -#: ../src/common/check_paths.py:170 +#: ../src/common/check_paths.py:171 #, python-format msgid "creating %s directory" msgstr "a grou ar renkell %s" @@ -3488,10 +3493,10 @@ msgid "Choose the groupchats you want to leave" msgstr "" #. Make special context menu if group is Groupchats -#: ../src/common/commands.py:205 ../src/common/contacts.py:94 -#: ../src/common/helpers.py:55 ../src/roster_window.py:812 -#: ../src/roster_window.py:1626 ../src/roster_window.py:1628 -#: ../src/roster_window.py:5227 +#: ../src/common/commands.py:205 ../src/common/contacts.py:131 +#: ../src/common/helpers.py:55 ../src/roster_window.py:809 +#: ../src/roster_window.py:1580 ../src/roster_window.py:1582 +#: ../src/roster_window.py:5144 #, fuzzy msgid "Groupchats" msgstr "Flapoù a-stroll" @@ -3605,9 +3610,9 @@ msgid "" msgstr "" #. sorted alphanum -#: ../src/common/config.py:106 ../src/common/config.py:483 -#: ../src/common/optparser.py:245 ../src/common/optparser.py:463 -#: ../src/common/optparser.py:497 ../src/gajim.py:3471 +#: ../src/common/config.py:106 ../src/common/config.py:482 +#: ../src/common/optparser.py:288 ../src/common/optparser.py:465 +#: ../src/common/optparser.py:499 ../src/gui_interface.py:3251 #, fuzzy msgid "default" msgstr "Dilemel" @@ -4181,245 +4186,244 @@ msgstr "" msgid "Jabberd2 workaround" msgstr "" -#: ../src/common/config.py:331 +#: ../src/common/config.py:330 msgid "" "If checked, Gajim will use your IP and proxies defined in " "file_transfer_proxies option for file transfer." msgstr "" -#: ../src/common/config.py:345 +#: ../src/common/config.py:344 msgid "Answer to receipt requests" msgstr "" -#: ../src/common/config.py:346 +#: ../src/common/config.py:345 msgid "Sent receipt requests" msgstr "" -#: ../src/common/config.py:354 +#: ../src/common/config.py:353 msgid "" "When negotiating an encrypted session, should Gajim assume you want your " "messages to be logged?" msgstr "" -#: ../src/common/config.py:417 +#: ../src/common/config.py:416 #, fuzzy msgid "Is OpenPGP enabled for this contact?" msgstr "N'eus ket tu da implij OpenPGP war an urzhiataer-mañ" -#: ../src/common/config.py:418 +#: ../src/common/config.py:417 msgid "" "Should Gajim automatically start an encrypted session with this contact when " "possible?" msgstr "" -#: ../src/common/config.py:419 ../src/common/config.py:422 +#: ../src/common/config.py:418 ../src/common/config.py:421 msgid "Language for which we want to check misspelled words" msgstr "" -#: ../src/common/config.py:428 +#: ../src/common/config.py:427 msgid "all or space separated status" msgstr "" -#: ../src/common/config.py:429 +#: ../src/common/config.py:428 msgid "'yes', 'no', or 'both'" msgstr "" -#: ../src/common/config.py:430 ../src/common/config.py:432 -#: ../src/common/config.py:433 ../src/common/config.py:436 -#: ../src/common/config.py:437 +#: ../src/common/config.py:429 ../src/common/config.py:431 +#: ../src/common/config.py:432 ../src/common/config.py:435 +#: ../src/common/config.py:436 msgid "'yes', 'no' or ''" msgstr "" -#: ../src/common/config.py:443 ../src/common/pep.py:160 +#: ../src/common/config.py:442 ../src/common/pep.py:157 msgid "Sleeping" msgstr "O kousket" -#: ../src/common/config.py:444 +#: ../src/common/config.py:443 msgid "Back soon" msgstr "Distro 'benn nebeut" -#: ../src/common/config.py:444 +#: ../src/common/config.py:443 msgid "Back in some minutes." msgstr "Distro 'vin a-benn un nebeut munutennoù.." -#: ../src/common/config.py:445 ../src/common/pep.py:130 +#: ../src/common/config.py:444 ../src/common/pep.py:127 msgid "Eating" msgstr "O tebriñ" -#: ../src/common/config.py:445 +#: ../src/common/config.py:444 msgid "I'm eating, so leave me a message." msgstr "O tebriñ 'maon, neuze laoskit ur gemennadenn." -#: ../src/common/config.py:446 +#: ../src/common/config.py:445 msgid "Movie" msgstr "Film" -#: ../src/common/config.py:446 +#: ../src/common/config.py:445 msgid "I'm watching a movie." msgstr "O sellout ouzh ur film 'maon." -#: ../src/common/config.py:447 ../src/common/pep.py:189 +#: ../src/common/config.py:446 ../src/common/pep.py:186 msgid "Working" msgstr "O labourat" -#: ../src/common/config.py:447 +#: ../src/common/config.py:446 msgid "I'm working." msgstr "O labourat 'maon." -#: ../src/common/config.py:448 +#: ../src/common/config.py:447 msgid "Phone" msgstr "Pellgomz" -#: ../src/common/config.py:448 +#: ../src/common/config.py:447 msgid "I'm on the phone." msgstr "Ouzh ar pellgomz emaon." -#: ../src/common/config.py:449 +#: ../src/common/config.py:448 msgid "Out" msgstr "Er-maez" -#: ../src/common/config.py:449 +#: ../src/common/config.py:448 #, fuzzy msgid "I'm out enjoying life." msgstr "Er-maez emaon o profitañ eus ar vuhez" -#: ../src/common/config.py:460 +#: ../src/common/config.py:459 #, fuzzy msgid "I'm available." msgstr "Hegerz" -#: ../src/common/config.py:461 +#: ../src/common/config.py:460 #, fuzzy msgid "I'm free for chat." msgstr "Prest da flapiñ" -#: ../src/common/config.py:462 ../src/config.py:1419 +#: ../src/common/config.py:461 ../src/config.py:1478 msgid "Be right back." msgstr "Distro a-benn nebeut." -#: ../src/common/config.py:463 +#: ../src/common/config.py:462 #, fuzzy msgid "I'm not available." msgstr "Dihegerz" -#: ../src/common/config.py:464 +#: ../src/common/config.py:463 msgid "Do not disturb." msgstr "" -#: ../src/common/config.py:465 ../src/common/config.py:466 +#: ../src/common/config.py:464 ../src/common/config.py:465 msgid "Bye!" msgstr "" -#: ../src/common/config.py:476 +#: ../src/common/config.py:475 msgid "" "Sound to play when a group chat message contains one of the words in " "muc_highlight_words, or when a group chat message contains your nickname." msgstr "" -#: ../src/common/config.py:477 +#: ../src/common/config.py:476 msgid "Sound to play when any MUC message arrives." msgstr "" -#: ../src/common/config.py:486 ../src/common/optparser.py:259 +#: ../src/common/config.py:485 ../src/common/optparser.py:302 msgid "green" msgstr "Glas" -#: ../src/common/config.py:490 ../src/common/optparser.py:245 +#: ../src/common/config.py:489 ../src/common/optparser.py:288 msgid "grocery" msgstr "" -#: ../src/common/config.py:494 +#: ../src/common/config.py:493 msgid "human" msgstr "Mab-den" -#: ../src/common/config.py:498 +#: ../src/common/config.py:497 msgid "marine" msgstr "Glas-mor" -#: ../src/common/connection_handlers.py:76 -#: ../src/common/zeroconf/connection_handlers_zeroconf.py:52 +#: ../src/common/connection_handlers.py:83 +#: ../src/common/zeroconf/connection_handlers_zeroconf.py:53 #, fuzzy msgid "Unable to load idle module" msgstr "Impossible de rejoindre le salon" -#: ../src/common/connection_handlers.py:244 -#: ../src/common/zeroconf/connection_handlers_zeroconf.py:94 +#: ../src/common/connection_handlers.py:251 #, fuzzy msgid "Wrong host" msgstr "Ger-kuzh faos" -#: ../src/common/connection_handlers.py:245 +#: ../src/common/connection_handlers.py:252 msgid "Invalid local address? :-O" msgstr "" -#: ../src/common/connection_handlers.py:678 +#: ../src/common/connection_handlers.py:696 #, python-format msgid "Registration information for transport %s has not arrived in time" msgstr "" "L'information d'enregistrement pour la passerelle %s n'est pas arrivée à " "temps" -#: ../src/common/connection_handlers.py:685 +#: ../src/common/connection_handlers.py:703 #, fuzzy msgid "Registration succeeded" msgstr "Gant berzh eo bet embannet ar vCard" -#: ../src/common/connection_handlers.py:686 +#: ../src/common/connection_handlers.py:704 #, python-format msgid "Registration with agent %s succeeded" msgstr "" -#: ../src/common/connection_handlers.py:688 +#: ../src/common/connection_handlers.py:706 #, fuzzy msgid "Registration failed" msgstr "échec lors de la publication de votre vCard" -#: ../src/common/connection_handlers.py:688 +#: ../src/common/connection_handlers.py:706 #, python-format msgid "" "Registration with agent %(agent)s failed with error %(error)s: %(error_msg)s" msgstr "" -#: ../src/common/connection_handlers.py:990 -#: ../src/common/connection_handlers.py:2071 -#: ../src/common/connection_handlers.py:2117 -#: ../src/common/connection_handlers.py:2345 -#: ../src/common/connection_handlers.py:2487 ../src/common/connection.py:1366 -#: ../src/gajim.py:380 +#: ../src/common/connection_handlers.py:1008 +#: ../src/common/connection_handlers.py:2098 +#: ../src/common/connection_handlers.py:2144 +#: ../src/common/connection_handlers.py:2336 +#: ../src/common/connection_handlers.py:2481 ../src/common/connection.py:418 +#: ../src/gajim.py:354 msgid "Disk Write Error" msgstr "" -#: ../src/common/connection_handlers.py:1207 ../src/common/connection.py:935 +#: ../src/common/connection_handlers.py:1225 ../src/common/connection.py:1373 msgid "Invisibility not supported" msgstr "" -#: ../src/common/connection_handlers.py:1208 ../src/common/connection.py:936 +#: ../src/common/connection_handlers.py:1226 ../src/common/connection.py:1374 #, python-format msgid "Account %s doesn't support invisibility." msgstr "" -#: ../src/common/connection_handlers.py:1892 ../src/common/connection.py:1181 -#: ../src/config.py:1875 ../src/config.py:1884 ../src/config.py:1943 -#: ../src/config.py:3281 ../src/dataforms_widget.py:555 ../src/dialogs.py:2665 +#: ../src/common/connection_handlers.py:1919 ../src/common/connection.py:233 +#: ../src/config.py:1940 ../src/config.py:1949 ../src/config.py:2008 +#: ../src/config.py:3360 ../src/dataforms_widget.py:577 ../src/dialogs.py:2781 msgid "Invalid Jabber ID" msgstr "ID jabber direizh" -#: ../src/common/connection_handlers.py:1893 +#: ../src/common/connection_handlers.py:1920 msgid "A message from a non-valid JID arrived, it has been ignored." msgstr "" -#: ../src/common/connection_handlers.py:2074 -#: ../src/common/connection_handlers.py:2120 -#: ../src/common/connection_handlers.py:2348 -#: ../src/common/connection_handlers.py:2490 ../src/common/connection.py:1369 -#: ../src/gajim.py:155 ../src/session.py:131 +#: ../src/common/connection_handlers.py:2101 +#: ../src/common/connection_handlers.py:2147 +#: ../src/common/connection_handlers.py:2339 +#: ../src/common/connection_handlers.py:2484 ../src/common/connection.py:421 +#: ../src/gajim.py:155 ../src/session.py:135 #, python-format msgid "" "The database file (%s) cannot be read. Try to repair it (see http://trac." "gajim.org/wiki/DatabaseBackup) or remove it (all history will be lost)." msgstr "" -#: ../src/common/connection_handlers.py:2200 +#: ../src/common/connection_handlers.py:2191 #, fuzzy, python-format msgid "Nickname not allowed: %s" msgstr "N'eus ket bet kavet al lesanv : %s" @@ -4427,79 +4431,79 @@ msgstr "N'eus ket bet kavet al lesanv : %s" #. maximum user number reached #. we are banned #. group chat does not exist -#: ../src/common/connection_handlers.py:2295 +#: ../src/common/connection_handlers.py:2286 +#: ../src/common/connection_handlers.py:2294 +#: ../src/common/connection_handlers.py:2300 #: ../src/common/connection_handlers.py:2303 -#: ../src/common/connection_handlers.py:2309 -#: ../src/common/connection_handlers.py:2312 -#: ../src/common/connection_handlers.py:2315 -#: ../src/common/connection_handlers.py:2319 ../src/gajim.py:523 +#: ../src/common/connection_handlers.py:2306 +#: ../src/common/connection_handlers.py:2310 ../src/gui_interface.py:128 #, fuzzy msgid "Unable to join group chat" msgstr "Impossible de rejoindre le salon" -#: ../src/common/connection_handlers.py:2296 +#: ../src/common/connection_handlers.py:2287 #, python-format msgid "Maximum number of users for %s has been reached" msgstr "" -#: ../src/common/connection_handlers.py:2304 +#: ../src/common/connection_handlers.py:2295 #, fuzzy, python-format msgid "You are banned from group chat %s." msgstr "Vous êtes banni de ce salon." -#: ../src/common/connection_handlers.py:2310 +#: ../src/common/connection_handlers.py:2301 #, fuzzy, python-format msgid "Group chat %s does not exist." msgstr "Ce salon n'existe pas." -#: ../src/common/connection_handlers.py:2313 +#: ../src/common/connection_handlers.py:2304 #, fuzzy msgid "Group chat creation is restricted." msgstr "La création de salon est réservée aux administrateurs." -#: ../src/common/connection_handlers.py:2316 +#: ../src/common/connection_handlers.py:2307 #, fuzzy, python-format msgid "Your registered nickname must be used in group chat %s." msgstr "Vous devez utiliser le surnom donné lors de l'enregistrement." -#: ../src/common/connection_handlers.py:2320 +#: ../src/common/connection_handlers.py:2311 #, fuzzy, python-format msgid "You are not in the members list in groupchat %s." msgstr "Vous n'êtes pas dans la liste des membres." #. Room has been destroyed. see #. http://www.xmpp.org/extensions/xep-0045.html#destroyroom -#: ../src/common/connection_handlers.py:2363 +#: ../src/common/connection_handlers.py:2354 #, fuzzy msgid "Room has been destroyed" msgstr "Dilamet eo bet an aotre" -#: ../src/common/connection_handlers.py:2371 +#: ../src/common/connection_handlers.py:2362 #, python-format msgid "You can join this room instead: %s" msgstr "" -#: ../src/common/connection_handlers.py:2402 +#: ../src/common/connection_handlers.py:2393 msgid "I would like to add you to my roster." msgstr "Laouen 'vefen d'ho ouzhpennañ em roll-darempredoù." #. BE CAREFUL: no con.updateRosterItem() in a callback -#: ../src/common/connection_handlers.py:2423 +#: ../src/common/connection_handlers.py:2414 #, python-format msgid "we are now subscribed to %s" msgstr "nous sommes maintenant inscrits chez %s" -#: ../src/common/connection_handlers.py:2425 +#: ../src/common/connection_handlers.py:2416 #, python-format msgid "unsubscribe request from %s" msgstr "Requête de désinscription de la part de %s" -#: ../src/common/connection_handlers.py:2427 +#: ../src/common/connection_handlers.py:2418 #, python-format msgid "we are now unsubscribed from %s" msgstr "nous ne sommes plus dans la liste de %s" -#: ../src/common/connection_handlers.py:2619 +#: ../src/common/connection_handlers.py:2613 #, fuzzy, python-format msgid "" "JID %s is not RFC compliant. It will not be added to your roster. Use roster " @@ -4639,141 +4643,28 @@ msgstr "" msgid "Application verification failure" msgstr "" -#: ../src/common/connection.py:278 -#: ../src/common/zeroconf/connection_zeroconf.py:215 -#, python-format -msgid "Connection with account \"%s\" has been lost" -msgstr "Kollet eo bet al lugadenn gant ar gont \"%s\"" - -#: ../src/common/connection.py:279 -msgid "Reconnect manually." -msgstr "" - -#: ../src/common/connection.py:290 -#, fuzzy, python-format -msgid "Server %(name)s answered wrongly to register request: %(error)s" -msgstr "Respontet fall he deus an nor %s d'ar goulenn emezelañ." - -#: ../src/common/connection.py:324 -#, python-format -msgid "Server %s provided a different registration form" -msgstr "" - -#: ../src/common/connection.py:337 -#, fuzzy, python-format -msgid "Unknown SSL error: %d" -msgstr "Aozadur D-Bus dianav: %s" - -#. wrong answer -#: ../src/common/connection.py:352 -msgid "Invalid answer" -msgstr "Respont direizh" - -#: ../src/common/connection.py:353 -#, fuzzy, python-format -msgid "Transport %(name)s answered wrongly to register request: %(error)s" -msgstr "Respontet fall he deus an nor %s d'ar goulenn emezelañ." - -#: ../src/common/connection.py:636 ../src/common/connection.py:765 -#: ../src/common/connection.py:1526 -#: ../src/common/zeroconf/connection_zeroconf.py:249 -#, python-format -msgid "Could not connect to \"%s\"" -msgstr "Dibosupl eo en em lugañ da \"%s\"" - -#: ../src/common/connection.py:637 ../src/gajim.py:1094 -msgid "Check your connection or try again later." -msgstr "Gwiriekait ho lugadenn pe klaskit diwezhatoc'h." - -#: ../src/common/connection.py:642 -#, fuzzy, python-format -msgid "Server replied: %s" -msgstr "Enrollet e-barzh: %s" - -#: ../src/common/connection.py:655 -#, fuzzy -msgid "Connection to proxy failed" -msgstr "Kevreadenn" - -#: ../src/common/connection.py:686 ../src/common/connection.py:745 -#, fuzzy, python-format -msgid "Could not connect to account %s" -msgstr "Dibosupl eo en em lugañ da \"%s\"" - -#: ../src/common/connection.py:687 ../src/common/connection.py:746 -#, fuzzy, python-format -msgid "Connection with account %s has been lost. Retry connecting." -msgstr "Kollet eo bet al lugadenn gant ar gont \"%s\"" - -#: ../src/common/connection.py:712 -#, python-format -msgid "The authenticity of the %s certificate could be invalid." -msgstr "" - -#: ../src/common/connection.py:715 -#, python-format -msgid "" -"\n" -"SSL Error: %s" -msgstr "" - -#: ../src/common/connection.py:717 -#, fuzzy, python-format -msgid "" -"\n" -"Unknown SSL error: %d" -msgstr "Aozadur D-Bus dianav: %s" - -#: ../src/common/connection.py:766 -msgid "Check your connection or try again later" -msgstr "Gwiriekait ho lugadenn pe klaskit en-dro diwezhatoc'h" - -#: ../src/common/connection.py:794 -#, python-format -msgid "Authentication failed with \"%s\"" -msgstr "C'hwitet an diskleriadenn gant \"%s\"" - -#: ../src/common/connection.py:796 -msgid "Please check your login and password for correctness." -msgstr "Gwiriekait ho ker-kuzh hag anv-lugañ." - -#: ../src/common/connection.py:862 -#, fuzzy -msgid "Error while removing privacy list" -msgstr "fazi en ur gas %s ( %s )" - -#: ../src/common/connection.py:863 -#, python-format -msgid "" -"Privacy list %s has not been removed. It is maybe active in one of your " -"connected resources. Deactivate it and try again." -msgstr "" - -#: ../src/common/connection.py:1182 ../src/dialogs.py:2666 +#: ../src/common/connection.py:234 ../src/dialogs.py:2782 #, fuzzy, python-format msgid "It is not possible to send a message to %s, this JID is not valid." msgstr "N'eus ket tu da gas restroù goullo" -#: ../src/common/connection.py:1204 -#: ../src/common/zeroconf/connection_zeroconf.py:389 +#: ../src/common/connection.py:256 msgid "Neither the remote presence is signed, nor a key was assigned." msgstr "" -#: ../src/common/connection.py:1206 -#: ../src/common/zeroconf/connection_zeroconf.py:391 +#: ../src/common/connection.py:259 #, python-format msgid "The contact's key (%s) does not match the key assigned in Gajim." msgstr "" #. we're not english #. one in locale and one en -#: ../src/common/connection.py:1254 +#: ../src/common/connection.py:307 #, fuzzy msgid "[This message is *encrypted* (See :XEP:`27`]" msgstr "[Sifret eo ar gemennadenn-mañ]" -#: ../src/common/connection.py:1356 -#: ../src/common/zeroconf/connection_zeroconf.py:468 +#: ../src/common/connection.py:408 #, fuzzy, python-format msgid "" "Subject: %(subject)s\n" @@ -4782,44 +4673,154 @@ msgstr "" "Titl : %s\n" "%s" -#: ../src/common/connection.py:1383 +#: ../src/common/connection.py:721 +#, python-format +msgid "Connection with account \"%s\" has been lost" +msgstr "Kollet eo bet al lugadenn gant ar gont \"%s\"" + +#: ../src/common/connection.py:722 +msgid "Reconnect manually." +msgstr "" + +#: ../src/common/connection.py:734 +#, fuzzy, python-format +msgid "Server %(name)s answered wrongly to register request: %(error)s" +msgstr "Respontet fall he deus an nor %s d'ar goulenn emezelañ." + +#: ../src/common/connection.py:768 +#, python-format +msgid "Server %s provided a different registration form" +msgstr "" + +#: ../src/common/connection.py:781 +#, fuzzy, python-format +msgid "Unknown SSL error: %d" +msgstr "Aozadur D-Bus dianav: %s" + +#. wrong answer +#: ../src/common/connection.py:796 +msgid "Invalid answer" +msgstr "Respont direizh" + +#: ../src/common/connection.py:797 +#, fuzzy, python-format +msgid "Transport %(name)s answered wrongly to register request: %(error)s" +msgstr "Respontet fall he deus an nor %s d'ar goulenn emezelañ." + +#: ../src/common/connection.py:1075 ../src/common/connection.py:1204 +#: ../src/common/connection.py:1673 +#: ../src/common/zeroconf/connection_zeroconf.py:189 +#, python-format +msgid "Could not connect to \"%s\"" +msgstr "Dibosupl eo en em lugañ da \"%s\"" + +#: ../src/common/connection.py:1076 ../src/gui_interface.py:705 +msgid "Check your connection or try again later." +msgstr "Gwiriekait ho lugadenn pe klaskit diwezhatoc'h." + +#: ../src/common/connection.py:1081 +#, fuzzy, python-format +msgid "Server replied: %s" +msgstr "Enrollet e-barzh: %s" + +#: ../src/common/connection.py:1094 +#, fuzzy +msgid "Connection to proxy failed" +msgstr "Kevreadenn" + +#: ../src/common/connection.py:1125 ../src/common/connection.py:1184 +#, fuzzy, python-format +msgid "Could not connect to account %s" +msgstr "Dibosupl eo en em lugañ da \"%s\"" + +#: ../src/common/connection.py:1126 ../src/common/connection.py:1185 +#, fuzzy, python-format +msgid "Connection with account %s has been lost. Retry connecting." +msgstr "Kollet eo bet al lugadenn gant ar gont \"%s\"" + +#: ../src/common/connection.py:1151 +#, python-format +msgid "The authenticity of the %s certificate could be invalid." +msgstr "" + +#: ../src/common/connection.py:1154 +#, python-format +msgid "" +"\n" +"SSL Error: %s" +msgstr "" + +#: ../src/common/connection.py:1156 +#, fuzzy, python-format +msgid "" +"\n" +"Unknown SSL error: %d" +msgstr "Aozadur D-Bus dianav: %s" + +#: ../src/common/connection.py:1205 +msgid "Check your connection or try again later" +msgstr "Gwiriekait ho lugadenn pe klaskit en-dro diwezhatoc'h" + +#: ../src/common/connection.py:1236 +#, python-format +msgid "Authentication failed with \"%s\"" +msgstr "C'hwitet an diskleriadenn gant \"%s\"" + +#: ../src/common/connection.py:1238 +msgid "Please check your login and password for correctness." +msgstr "Gwiriekait ho ker-kuzh hag anv-lugañ." + +#: ../src/common/connection.py:1300 +#, fuzzy +msgid "Error while removing privacy list" +msgstr "fazi en ur gas %s ( %s )" + +#: ../src/common/connection.py:1301 +#, python-format +msgid "" +"Privacy list %s has not been removed. It is maybe active in one of your " +"connected resources. Deactivate it and try again." +msgstr "" + +#: ../src/common/connection.py:1541 #, python-format msgid "Sent contact: \"%s\" (%s)" msgstr "" -#: ../src/common/connection.py:1386 +#: ../src/common/connection.py:1544 #, fuzzy msgid "Sent contacts:" msgstr "Darempredoù" -#: ../src/common/connection.py:1559 ../src/common/connection.py:1580 +#: ../src/common/connection.py:1703 ../src/common/connection.py:1724 msgid "Not fetched because of invisible status" msgstr "" -#: ../src/common/connection.py:1982 +#: ../src/common/connection.py:2106 #, fuzzy msgid "Unregister failed" msgstr "échec lors de la publication de votre vCard" -#: ../src/common/connection.py:1983 +#: ../src/common/connection.py:2107 #, python-format msgid "Unregistration with server %(server)s failed: %(error)s" msgstr "" -#: ../src/common/contacts.py:92 ../src/common/helpers.py:55 -#: ../src/gajim.py:999 +#: ../src/common/contacts.py:129 ../src/common/helpers.py:55 +#: ../src/gui_interface.py:610 msgid "Observers" msgstr "Sellerien" -#: ../src/common/contacts.py:96 ../src/common/contacts.py:348 +#: ../src/common/contacts.py:133 ../src/common/contacts.py:335 #: ../src/common/helpers.py:55 ../src/disco.py:119 ../src/disco.py:120 -#: ../src/disco.py:1354 ../src/gajim.py:802 ../src/roster_window.py:847 -#: ../src/roster_window.py:1549 ../src/roster_window.py:1618 -#: ../src/roster_window.py:1620 ../src/roster_window.py:1773 +#: ../src/disco.py:1464 ../src/gui_interface.py:413 +#: ../src/roster_window.py:848 ../src/roster_window.py:1501 +#: ../src/roster_window.py:1572 ../src/roster_window.py:1574 +#: ../src/roster_window.py:1732 msgid "Transports" msgstr "Dorioù" -#: ../src/common/contacts.py:356 +#: ../src/common/contacts.py:343 #, fuzzy msgid "Not in roster" msgstr "Ket er roll" @@ -5081,7 +5082,7 @@ msgstr "Prest da flapiñ" msgid "_Available" msgstr "_Hegerz" -#: ../src/common/helpers.py:212 ../src/features_window.py:116 +#: ../src/common/helpers.py:212 ../src/features_window.py:118 msgid "Available" msgstr "Hegerz" @@ -5203,77 +5204,77 @@ msgid "has closed the chat window or tab" msgstr "he/en deus serret ar prenestr-flapiñ pe an ivinell" #. GiB means gibibyte -#: ../src/common/helpers.py:658 +#: ../src/common/helpers.py:588 #, python-format msgid "%s GiB" msgstr "%s Go" #. GB means gigabyte -#: ../src/common/helpers.py:661 +#: ../src/common/helpers.py:591 #, python-format msgid "%s GB" msgstr "%s Go" #. MiB means mibibyte -#: ../src/common/helpers.py:665 +#: ../src/common/helpers.py:595 #, python-format msgid "%s MiB" msgstr "%s Mo" #. MB means megabyte -#: ../src/common/helpers.py:668 +#: ../src/common/helpers.py:598 #, python-format msgid "%s MB" msgstr "%s Mo" #. KiB means kibibyte -#: ../src/common/helpers.py:672 +#: ../src/common/helpers.py:602 #, python-format msgid "%s KiB" msgstr "%s Ko" #. KB means kilo bytes -#: ../src/common/helpers.py:675 +#: ../src/common/helpers.py:605 #, python-format msgid "%s KB" msgstr "%s Ko" #. B means bytes -#: ../src/common/helpers.py:678 +#: ../src/common/helpers.py:608 #, python-format msgid "%s B" msgstr "%s o" -#: ../src/common/helpers.py:1166 ../src/common/helpers.py:1173 +#: ../src/common/helpers.py:1049 ../src/common/helpers.py:1056 #, fuzzy, python-format msgid "%d message pending" msgid_plural "%d messages pending" msgstr[0] "Kas ur gemennadenn" msgstr[1] "Kas ur gemennadenn" -#: ../src/common/helpers.py:1179 +#: ../src/common/helpers.py:1062 #, fuzzy, python-format msgid " from room %s" msgstr "De %s" -#: ../src/common/helpers.py:1182 ../src/common/helpers.py:1201 +#: ../src/common/helpers.py:1065 ../src/common/helpers.py:1084 #, fuzzy, python-format msgid " from user %s" msgstr "De %s" -#: ../src/common/helpers.py:1184 +#: ../src/common/helpers.py:1067 #, fuzzy, python-format msgid " from %s" msgstr "De %s" -#: ../src/common/helpers.py:1191 ../src/common/helpers.py:1198 +#: ../src/common/helpers.py:1074 ../src/common/helpers.py:1081 #, python-format msgid "%d event pending" msgid_plural "%d events pending" msgstr[0] "" msgstr[1] "" -#: ../src/common/helpers.py:1231 +#: ../src/common/helpers.py:1114 #, python-format msgid "Gajim - %s" msgstr "Gajim - %s" @@ -5289,16 +5290,16 @@ msgid "%s is not a valid loglevel" msgstr "" #. we talk about a file -#: ../src/common/optparser.py:57 +#: ../src/common/optparser.py:59 #, python-format msgid "error: cannot open %s for reading" msgstr "fazi: dibosupl eo digeriñ %s evit lenn" -#: ../src/common/optparser.py:254 ../src/common/optparser.py:255 +#: ../src/common/optparser.py:297 ../src/common/optparser.py:298 msgid "cyan" msgstr "Cyan" -#: ../src/common/optparser.py:371 +#: ../src/common/optparser.py:373 #, fuzzy msgid "migrating logs database to indices" msgstr "o krouiñ titourva an istoradur" @@ -5308,698 +5309,717 @@ msgstr "o krouiñ titourva an istoradur" msgid "XMPP account %s@%s" msgstr "eus ar gont %s" -#: ../src/common/pep.py:30 +#: ../src/common/pep.py:27 msgid "Afraid" msgstr "" -#: ../src/common/pep.py:31 +#: ../src/common/pep.py:28 msgid "Amazed" msgstr "" -#: ../src/common/pep.py:32 +#: ../src/common/pep.py:29 msgid "Amorous" msgstr "" -#: ../src/common/pep.py:33 +#: ../src/common/pep.py:30 msgid "Angry" msgstr "" -#: ../src/common/pep.py:34 +#: ../src/common/pep.py:31 msgid "Annoyed" msgstr "" -#: ../src/common/pep.py:35 +#: ../src/common/pep.py:32 msgid "Anxious" msgstr "" -#: ../src/common/pep.py:36 +#: ../src/common/pep.py:33 #, fuzzy msgid "Aroused" msgstr "Ehan" -#: ../src/common/pep.py:37 +#: ../src/common/pep.py:34 msgid "Ashamed" msgstr "" -#: ../src/common/pep.py:38 +#: ../src/common/pep.py:35 #, fuzzy msgid "Bored" msgstr "Tev" -#: ../src/common/pep.py:39 +#: ../src/common/pep.py:36 msgid "Brave" msgstr "" -#: ../src/common/pep.py:40 +#: ../src/common/pep.py:37 msgid "Calm" msgstr "" -#: ../src/common/pep.py:41 +#: ../src/common/pep.py:38 #, fuzzy msgid "Cautious" msgstr "Flapoù" -#: ../src/common/pep.py:42 +#: ../src/common/pep.py:39 #, fuzzy msgid "Cold" msgstr "Tev" -#: ../src/common/pep.py:43 +#: ../src/common/pep.py:40 #, fuzzy msgid "Confident" msgstr "_Endalc'hadoù" -#: ../src/common/pep.py:44 +#: ../src/common/pep.py:41 msgid "Confused" msgstr "" -#: ../src/common/pep.py:45 +#: ../src/common/pep.py:42 #, fuzzy msgid "Contemplative" msgstr "Echu" -#: ../src/common/pep.py:46 +#: ../src/common/pep.py:43 #, fuzzy msgid "Contented" msgstr "_Endalc'hadoù" -#: ../src/common/pep.py:47 +#: ../src/common/pep.py:44 msgid "Cranky" msgstr "" -#: ../src/common/pep.py:48 +#: ../src/common/pep.py:45 msgid "Crazy" msgstr "" -#: ../src/common/pep.py:49 +#: ../src/common/pep.py:46 #, fuzzy msgid "Creative" msgstr "Dizoberiant" -#: ../src/common/pep.py:50 +#: ../src/common/pep.py:47 msgid "Curious" msgstr "" -#: ../src/common/pep.py:51 +#: ../src/common/pep.py:48 #, fuzzy msgid "Dejected" msgstr "Dilemel" -#: ../src/common/pep.py:52 +#: ../src/common/pep.py:49 msgid "Depressed" msgstr "" -#: ../src/common/pep.py:53 +#: ../src/common/pep.py:50 #, fuzzy msgid "Disappointed" msgstr "Dizoberiant" -#: ../src/common/pep.py:54 +#: ../src/common/pep.py:51 msgid "Disgusted" msgstr "" -#: ../src/common/pep.py:55 +#: ../src/common/pep.py:52 #, fuzzy msgid "Dismayed" msgstr "Dizoberiant" -#: ../src/common/pep.py:56 +#: ../src/common/pep.py:53 #, fuzzy msgid "Distracted" msgstr "Dizoberiant" -#: ../src/common/pep.py:57 +#: ../src/common/pep.py:54 msgid "Embarrassed" msgstr "" -#: ../src/common/pep.py:58 +#: ../src/common/pep.py:55 msgid "Envious" msgstr "" -#: ../src/common/pep.py:59 +#: ../src/common/pep.py:56 msgid "Excited" msgstr "" -#: ../src/common/pep.py:60 +#: ../src/common/pep.py:57 msgid "Flirtatious" msgstr "" -#: ../src/common/pep.py:61 +#: ../src/common/pep.py:58 msgid "Frustrated" msgstr "" -#: ../src/common/pep.py:62 +#: ../src/common/pep.py:59 msgid "Grateful" msgstr "" -#: ../src/common/pep.py:63 +#: ../src/common/pep.py:60 msgid "Grieving" msgstr "" -#: ../src/common/pep.py:64 +#: ../src/common/pep.py:61 #, fuzzy msgid "Grumpy" msgstr "Strollad" -#: ../src/common/pep.py:65 +#: ../src/common/pep.py:62 msgid "Guilty" msgstr "" -#: ../src/common/pep.py:66 +#: ../src/common/pep.py:63 msgid "Happy" msgstr "" -#: ../src/common/pep.py:67 +#: ../src/common/pep.py:64 msgid "Hopeful" msgstr "" -#: ../src/common/pep.py:68 +#: ../src/common/pep.py:65 #, fuzzy msgid "Hot" msgstr "_Ostiz:" -#: ../src/common/pep.py:69 +#: ../src/common/pep.py:66 msgid "Humbled" msgstr "" -#: ../src/common/pep.py:70 +#: ../src/common/pep.py:67 msgid "Humiliated" msgstr "" -#: ../src/common/pep.py:71 +#: ../src/common/pep.py:68 msgid "Hungry" msgstr "" -#: ../src/common/pep.py:72 +#: ../src/common/pep.py:69 msgid "Hurt" msgstr "" -#: ../src/common/pep.py:73 +#: ../src/common/pep.py:70 #, fuzzy msgid "Impressed" msgstr "kemennadenn" -#: ../src/common/pep.py:74 +#: ../src/common/pep.py:71 msgid "In Awe" msgstr "" -#: ../src/common/pep.py:75 +#: ../src/common/pep.py:72 msgid "In Love" msgstr "" -#: ../src/common/pep.py:76 +#: ../src/common/pep.py:73 msgid "Indignant" msgstr "" -#: ../src/common/pep.py:77 +#: ../src/common/pep.py:74 msgid "Interested" msgstr "" -#: ../src/common/pep.py:78 +#: ../src/common/pep.py:75 msgid "Intoxicated" msgstr "" -#: ../src/common/pep.py:79 +#: ../src/common/pep.py:76 #, fuzzy msgid "Invincible" msgstr "Diwelus" -#: ../src/common/pep.py:80 +#: ../src/common/pep.py:77 msgid "Jealous" msgstr "" -#: ../src/common/pep.py:81 +#: ../src/common/pep.py:78 #, fuzzy msgid "Lonely" msgstr "Hini ebet" -#: ../src/common/pep.py:82 +#: ../src/common/pep.py:79 #, fuzzy msgid "Lost" msgstr "_Ostiz:" -#: ../src/common/pep.py:83 +#: ../src/common/pep.py:80 msgid "Lucky" msgstr "" -#: ../src/common/pep.py:84 +#: ../src/common/pep.py:81 #, fuzzy msgid "Mean" msgstr "Hollek" -#: ../src/common/pep.py:85 +#: ../src/common/pep.py:82 #, fuzzy msgid "Moody" msgstr "_Kemmañ" -#: ../src/common/pep.py:86 +#: ../src/common/pep.py:83 msgid "Nervous" msgstr "" -#: ../src/common/pep.py:87 +#: ../src/common/pep.py:84 msgid "Neutral" msgstr "" -#: ../src/common/pep.py:88 +#: ../src/common/pep.py:85 #, fuzzy msgid "Offended" msgstr "Ezlinenn" -#: ../src/common/pep.py:89 +#: ../src/common/pep.py:86 msgid "Outraged" msgstr "" -#: ../src/common/pep.py:90 +#: ../src/common/pep.py:87 msgid "Playful" msgstr "" -#: ../src/common/pep.py:91 +#: ../src/common/pep.py:88 #, fuzzy msgid "Proud" msgstr "Strollad" -#: ../src/common/pep.py:92 +#: ../src/common/pep.py:89 msgid "Relaxed" msgstr "" -#: ../src/common/pep.py:93 +#: ../src/common/pep.py:90 #, fuzzy msgid "Relieved" msgstr "Dilemel" -#: ../src/common/pep.py:94 +#: ../src/common/pep.py:91 msgid "Remorseful" msgstr "" -#: ../src/common/pep.py:95 +#: ../src/common/pep.py:92 msgid "Restless" msgstr "" -#: ../src/common/pep.py:96 +#: ../src/common/pep.py:93 msgid "Sad" msgstr "" -#: ../src/common/pep.py:97 +#: ../src/common/pep.py:94 msgid "Sarcastic" msgstr "" -#: ../src/common/pep.py:98 +#: ../src/common/pep.py:95 #, fuzzy msgid "Satisfied" msgstr "Anv:" -#: ../src/common/pep.py:99 +#: ../src/common/pep.py:96 msgid "Serious" msgstr "" -#: ../src/common/pep.py:100 +#: ../src/common/pep.py:97 msgid "Shocked" msgstr "" -#: ../src/common/pep.py:101 +#: ../src/common/pep.py:98 msgid "Shy" msgstr "" -#: ../src/common/pep.py:102 +#: ../src/common/pep.py:99 #, fuzzy msgid "Sick" msgstr "Lesanv" -#: ../src/common/pep.py:103 +#: ../src/common/pep.py:100 #, fuzzy msgid "Sleepy" msgstr "O kousket" -#: ../src/common/pep.py:104 +#: ../src/common/pep.py:101 msgid "Spontaneous" msgstr "" -#: ../src/common/pep.py:105 +#: ../src/common/pep.py:102 #, fuzzy msgid "Stressed" msgstr "Straed:" -#: ../src/common/pep.py:106 +#: ../src/common/pep.py:103 msgid "Strong" msgstr "" -#: ../src/common/pep.py:107 +#: ../src/common/pep.py:104 #, fuzzy msgid "Surprised" msgstr "Emezelañ" -#: ../src/common/pep.py:108 +#: ../src/common/pep.py:105 msgid "Thankful" msgstr "" -#: ../src/common/pep.py:109 +#: ../src/common/pep.py:106 msgid "Thirsty" msgstr "" -#: ../src/common/pep.py:110 +#: ../src/common/pep.py:107 #, fuzzy msgid "Tired" msgstr "Mare" -#: ../src/common/pep.py:111 +#: ../src/common/pep.py:108 #, fuzzy msgid "Undefined" msgstr "Islinennañ" -#: ../src/common/pep.py:112 +#: ../src/common/pep.py:109 msgid "Weak" msgstr "" -#: ../src/common/pep.py:113 +#: ../src/common/pep.py:110 msgid "Worried" msgstr "" -#: ../src/common/pep.py:116 +#: ../src/common/pep.py:113 #, fuzzy msgid "Doing Chores" msgstr "Ger-kuzh faos" -#: ../src/common/pep.py:117 +#: ../src/common/pep.py:114 msgid "Buying Groceries" msgstr "" -#: ../src/common/pep.py:118 +#: ../src/common/pep.py:115 #, fuzzy msgid "Cleaning" msgstr "Darvoud" -#: ../src/common/pep.py:119 +#: ../src/common/pep.py:116 #, fuzzy msgid "Cooking" msgstr "O skrivañ" -#: ../src/common/pep.py:120 +#: ../src/common/pep.py:117 msgid "Doing Maintenance" msgstr "" -#: ../src/common/pep.py:121 +#: ../src/common/pep.py:118 msgid "Doing the Dishes" msgstr "" -#: ../src/common/pep.py:122 +#: ../src/common/pep.py:119 msgid "Doing the Laundry" msgstr "" -#: ../src/common/pep.py:123 +#: ../src/common/pep.py:120 #, fuzzy msgid "Gardening" msgstr "O labourat" -#: ../src/common/pep.py:124 +#: ../src/common/pep.py:121 msgid "Running an Errand" msgstr "" -#: ../src/common/pep.py:125 +#: ../src/common/pep.py:122 #, fuzzy msgid "Walking the Dog" msgstr "Er strollad" -#: ../src/common/pep.py:126 +#: ../src/common/pep.py:123 #, fuzzy msgid "Drinking" msgstr "O labourat" -#: ../src/common/pep.py:127 +#: ../src/common/pep.py:124 msgid "Having a Beer" msgstr "" -#: ../src/common/pep.py:128 +#: ../src/common/pep.py:125 msgid "Having Coffee" msgstr "" -#: ../src/common/pep.py:129 +#: ../src/common/pep.py:126 msgid "Having Tea" msgstr "" -#: ../src/common/pep.py:131 +#: ../src/common/pep.py:128 msgid "Having a Snack" msgstr "" -#: ../src/common/pep.py:132 +#: ../src/common/pep.py:129 msgid "Having Breakfast" msgstr "" -#: ../src/common/pep.py:133 +#: ../src/common/pep.py:130 msgid "Having Dinner" msgstr "" -#: ../src/common/pep.py:134 +#: ../src/common/pep.py:131 msgid "Having Lunch" msgstr "" -#: ../src/common/pep.py:135 +#: ../src/common/pep.py:132 msgid "Exercising" msgstr "" -#: ../src/common/pep.py:136 ../src/common/pep.py:181 +#: ../src/common/pep.py:133 ../src/common/pep.py:178 msgid "Cycling" msgstr "" -#: ../src/common/pep.py:137 +#: ../src/common/pep.py:134 #, fuzzy msgid "Dancing" msgstr "Darvoud" -#: ../src/common/pep.py:138 +#: ../src/common/pep.py:135 #, fuzzy msgid "Hiking" msgstr "Skarzhañ %s" -#: ../src/common/pep.py:139 +#: ../src/common/pep.py:136 #, fuzzy msgid "Jogging" msgstr "E_barzhiñ" -#: ../src/common/pep.py:140 +#: ../src/common/pep.py:137 msgid "Playing Sports" msgstr "" -#: ../src/common/pep.py:141 +#: ../src/common/pep.py:138 msgid "Running" msgstr "" -#: ../src/common/pep.py:142 +#: ../src/common/pep.py:139 #, fuzzy msgid "Skiing" msgstr "O labourat" -#: ../src/common/pep.py:143 +#: ../src/common/pep.py:140 msgid "Swimming" msgstr "" -#: ../src/common/pep.py:144 +#: ../src/common/pep.py:141 #, fuzzy msgid "Working out" msgstr "O labourat" -#: ../src/common/pep.py:145 +#: ../src/common/pep.py:142 msgid "Grooming" msgstr "" -#: ../src/common/pep.py:146 +#: ../src/common/pep.py:143 msgid "At the Spa" msgstr "" -#: ../src/common/pep.py:147 +#: ../src/common/pep.py:144 msgid "Brushing Teeth" msgstr "" -#: ../src/common/pep.py:148 +#: ../src/common/pep.py:145 msgid "Getting a Haircut" msgstr "" -#: ../src/common/pep.py:149 +#: ../src/common/pep.py:146 #, fuzzy msgid "Shaving" msgstr "O tebriñ" -#: ../src/common/pep.py:150 +#: ../src/common/pep.py:147 msgid "Taking a Bath" msgstr "" -#: ../src/common/pep.py:151 +#: ../src/common/pep.py:148 msgid "Taking a Shower" msgstr "" -#: ../src/common/pep.py:152 +#: ../src/common/pep.py:149 msgid "Having an Appointment" msgstr "" -#: ../src/common/pep.py:154 +#: ../src/common/pep.py:151 msgid "Day Off" msgstr "" -#: ../src/common/pep.py:155 +#: ../src/common/pep.py:152 #, fuzzy msgid "Hanging out" msgstr "Cheñch ar sujed" -#: ../src/common/pep.py:156 +#: ../src/common/pep.py:153 #, fuzzy msgid "Hiding" msgstr "Skarzhañ %s" -#: ../src/common/pep.py:157 +#: ../src/common/pep.py:154 msgid "On Vacation" msgstr "" -#: ../src/common/pep.py:158 +#: ../src/common/pep.py:155 #, fuzzy msgid "Praying" msgstr "O tebriñ" -#: ../src/common/pep.py:159 +#: ../src/common/pep.py:156 msgid "Scheduled Holiday" msgstr "" -#: ../src/common/pep.py:161 +#: ../src/common/pep.py:158 #, fuzzy msgid "Thinking" msgstr "O labourat" -#: ../src/common/pep.py:162 +#: ../src/common/pep.py:159 #, fuzzy msgid "Relaxing" msgstr "Standard" -#: ../src/common/pep.py:163 +#: ../src/common/pep.py:160 #, fuzzy msgid "Fishing" msgstr "Skarzhañ %s" -#: ../src/common/pep.py:164 +#: ../src/common/pep.py:161 #, fuzzy msgid "Gaming" msgstr "O tebriñ" -#: ../src/common/pep.py:165 +#: ../src/common/pep.py:162 #, fuzzy msgid "Going out" msgstr "_Dilugañ" -#: ../src/common/pep.py:166 +#: ../src/common/pep.py:163 #, fuzzy msgid "Partying" msgstr "O tebriñ" -#: ../src/common/pep.py:167 +#: ../src/common/pep.py:164 #, fuzzy msgid "Reading" msgstr "Abeg" -#: ../src/common/pep.py:168 +#: ../src/common/pep.py:165 #, fuzzy msgid "Rehearsing" msgstr "Abeg" -#: ../src/common/pep.py:169 +#: ../src/common/pep.py:166 #, fuzzy msgid "Shopping" msgstr "O kousket" -#: ../src/common/pep.py:170 +#: ../src/common/pep.py:167 #, fuzzy msgid "Smoking" msgstr "O labourat" -#: ../src/common/pep.py:171 +#: ../src/common/pep.py:168 msgid "Socializing" msgstr "" -#: ../src/common/pep.py:172 +#: ../src/common/pep.py:169 #, fuzzy msgid "Sunbathing" msgstr "O tebriñ" -#: ../src/common/pep.py:173 +#: ../src/common/pep.py:170 msgid "Watching TV" msgstr "" -#: ../src/common/pep.py:174 +#: ../src/common/pep.py:171 #, fuzzy msgid "Watching a Movie" msgstr "O sellout ouzh ur film 'maon." -#: ../src/common/pep.py:175 +#: ../src/common/pep.py:172 #, fuzzy msgid "Talking" msgstr "O tebriñ" -#: ../src/common/pep.py:176 +#: ../src/common/pep.py:173 msgid "In Real Life" msgstr "" -#: ../src/common/pep.py:177 +#: ../src/common/pep.py:174 #, fuzzy msgid "On the Phone" msgstr "Ouzh ar pellgomz emaon." -#: ../src/common/pep.py:178 +#: ../src/common/pep.py:175 msgid "On Video Phone" msgstr "" -#: ../src/common/pep.py:179 +#: ../src/common/pep.py:176 #, fuzzy msgid "Traveling" msgstr "O treuzkas" -#: ../src/common/pep.py:180 +#: ../src/common/pep.py:177 #, fuzzy msgid "Commuting" msgstr "O skrivañ" -#: ../src/common/pep.py:182 +#: ../src/common/pep.py:179 msgid "Driving" msgstr "" -#: ../src/common/pep.py:183 +#: ../src/common/pep.py:180 msgid "In a Car" msgstr "" -#: ../src/common/pep.py:184 +#: ../src/common/pep.py:181 msgid "On a Bus" msgstr "" -#: ../src/common/pep.py:185 +#: ../src/common/pep.py:182 msgid "On a Plane" msgstr "" -#: ../src/common/pep.py:186 +#: ../src/common/pep.py:183 msgid "On a Train" msgstr "" -#: ../src/common/pep.py:187 +#: ../src/common/pep.py:184 msgid "On a Trip" msgstr "" -#: ../src/common/pep.py:188 +#: ../src/common/pep.py:185 #, fuzzy msgid "Walking" msgstr "O labourat" -#: ../src/common/pep.py:190 +#: ../src/common/pep.py:187 #, fuzzy msgid "Coding" msgstr "O skrivañ" -#: ../src/common/pep.py:191 +#: ../src/common/pep.py:188 msgid "In a Meeting" msgstr "" -#: ../src/common/pep.py:192 +#: ../src/common/pep.py:189 msgid "Studying" msgstr "" -#: ../src/common/pep.py:193 +#: ../src/common/pep.py:190 #, fuzzy msgid "Writing" msgstr "O labourat" +#: ../src/common/pep.py:335 +msgid "Unknown Artist" +msgstr "" + +#: ../src/common/pep.py:338 +msgid "Unknown Title" +msgstr "" + +#: ../src/common/pep.py:341 +msgid "Unknown Source" +msgstr "" + +#: ../src/common/pep.py:344 +#, python-format +msgid "" +"\"%(title)s\" by %(artist)s\n" +"from %(source)s" +msgstr "" + #. We cannot bind port, call error callback and fail #: ../src/common/socks5.py:86 #, fuzzy, python-format @@ -6019,88 +6039,57 @@ msgid "" "went wrong.]" msgstr "" -#: ../src/common/zeroconf/connection_handlers_zeroconf.py:94 -#, python-format -msgid "" -"The host %s you configured as the ft_add_hosts_to_send advanced option is " -"not valid, so ignored." -msgstr "" - -#. We didn't set a passphrase -#: ../src/common/zeroconf/connection_zeroconf.py:173 -msgid "OpenPGP passphrase was not given" -msgstr "N'eo ket bet roet ar ger-kuzh OpenPGP" - -#. %s is the account name here -#: ../src/common/zeroconf/connection_zeroconf.py:175 -#: ../src/roster_window.py:1970 -#, python-format -msgid "You will be connected to %s without OpenPGP." -msgstr "Luget e voc'h da %s hep OpenPGP." - -#: ../src/common/zeroconf/connection_zeroconf.py:216 -msgid "To continue sending and receiving messages, you will need to reconnect." -msgstr "" -"Evit kenderc'hel da gas ha da resev kemennadennoù, e rankit lugañ en-dro." - -#: ../src/common/zeroconf/connection_zeroconf.py:239 +#: ../src/common/zeroconf/connection_zeroconf.py:178 msgid "Avahi error" msgstr "" -#: ../src/common/zeroconf/connection_zeroconf.py:239 +#: ../src/common/zeroconf/connection_zeroconf.py:179 #, python-format msgid "" "%s\n" "Link-local messaging might not work properly." msgstr "" -#: ../src/common/zeroconf/connection_zeroconf.py:250 +#: ../src/common/zeroconf/connection_zeroconf.py:190 msgid "Please check if Avahi or Bonjour is installed." msgstr "" -#: ../src/common/zeroconf/connection_zeroconf.py:259 -#: ../src/common/zeroconf/connection_zeroconf.py:263 +#: ../src/common/zeroconf/connection_zeroconf.py:199 +#: ../src/common/zeroconf/connection_zeroconf.py:203 #, fuzzy msgid "Could not start local service" msgstr "Dibosupl eo kargañ ar skeudenn" -#: ../src/common/zeroconf/connection_zeroconf.py:260 +#: ../src/common/zeroconf/connection_zeroconf.py:200 #, fuzzy, python-format msgid "Unable to bind to port %d." msgstr "Impossible de rejoindre le salon" -#: ../src/common/zeroconf/connection_zeroconf.py:264 -#: ../src/common/zeroconf/connection_zeroconf.py:359 +#: ../src/common/zeroconf/connection_zeroconf.py:204 +#: ../src/common/zeroconf/connection_zeroconf.py:283 +#: ../src/common/zeroconf/connection_zeroconf.py:294 +#: ../src/common/zeroconf/connection_zeroconf.py:308 msgid "Please check if avahi-daemon is running." msgstr "" -#: ../src/common/zeroconf/connection_zeroconf.py:358 +#: ../src/common/zeroconf/connection_zeroconf.py:282 +#: ../src/common/zeroconf/connection_zeroconf.py:293 +#: ../src/common/zeroconf/connection_zeroconf.py:307 #, fuzzy, python-format msgid "Could not change status of account \"%s\"" msgstr "Dibosupl eo en em lugañ da \"%s\"" -#: ../src/common/zeroconf/connection_zeroconf.py:381 -msgid "" -"You are not connected or not visible to others. Your message could not be " -"sent." -msgstr "" - -#. we're not english -#: ../src/common/zeroconf/connection_zeroconf.py:399 -msgid "[This message is encrypted]" -msgstr "[Sifret eo ar gemennadenn-mañ]" - -#: ../src/common/zeroconf/connection_zeroconf.py:483 +#: ../src/common/zeroconf/connection_zeroconf.py:324 #, fuzzy msgid "Your message could not be sent." msgstr "N'eus ket tu da gas ho kemennadenn keit ha ma n'oc'h ket luget." #. Contact Offline -#: ../src/common/zeroconf/connection_zeroconf.py:489 +#: ../src/common/zeroconf/connection_zeroconf.py:334 msgid "Contact is offline. Your message could not be sent." msgstr "" -#: ../src/common/zeroconf/connection_zeroconf.py:593 +#: ../src/common/zeroconf/connection_zeroconf.py:359 msgid "" "Connection to host could not be established: Timeout while sending data." msgstr "" @@ -6111,95 +6100,95 @@ msgstr "" msgid "Error while adding service. %s" msgstr "fazi en ur gas %s ( %s )" -#: ../src/config.py:151 ../src/config.py:597 +#: ../src/config.py:157 ../src/config.py:586 msgid "Disabled" msgstr "Dizoberiant" -#: ../src/config.py:396 +#: ../src/config.py:383 #, fuzzy msgid "Default Message" msgstr "Titour-stad" -#: ../src/config.py:405 +#: ../src/config.py:392 #, fuzzy msgid "Enabled" msgstr "Enaouiñ" -#: ../src/config.py:663 ../src/dialogs.py:1327 +#: ../src/config.py:654 ../src/dialogs.py:1365 #, fuzzy, python-format msgid "Dictionary for lang %s not available" msgstr "N'eus ket tu da gevreañ" -#: ../src/config.py:664 +#: ../src/config.py:655 #, python-format msgid "" "You have to install %s dictionary to use spellchecking, or choose another " "language by setting the speller_language option." msgstr "" -#: ../src/config.py:1040 +#: ../src/config.py:1092 msgid "status message title" msgstr "titl ar gemennadenn stad" -#: ../src/config.py:1040 +#: ../src/config.py:1092 msgid "status message text" msgstr "korf ar gemennadenn stad" #. Name column -#: ../src/config.py:1339 ../src/dialogs.py:2122 ../src/dialogs.py:2186 -#: ../src/dialogs.py:2891 ../src/disco.py:773 ../src/disco.py:1568 -#: ../src/disco.py:1854 ../src/history_window.py:87 +#: ../src/config.py:1394 ../src/dialogs.py:2232 ../src/dialogs.py:2298 +#: ../src/dialogs.py:3014 ../src/disco.py:831 ../src/disco.py:1690 +#: ../src/disco.py:1992 ../src/history_window.py:89 msgid "Name" msgstr "Anv" -#: ../src/config.py:1428 +#: ../src/config.py:1487 msgid "Relogin now?" msgstr "Adlugañ bremañ?" -#: ../src/config.py:1429 +#: ../src/config.py:1488 msgid "If you want all the changes to apply instantly, you must relogin." msgstr "Ret eo deoc'h adlugañ evit ma vo sevenet an holl gemmoù diouzhtu." -#: ../src/config.py:1559 ../src/config.py:1684 +#: ../src/config.py:1620 ../src/config.py:1745 #, fuzzy msgid "OpenPGP is not usable on this computer" msgstr "N'eus ket tu da implij OpenPGP war an urzhiataer-mañ" -#: ../src/config.py:1720 ../src/config.py:1764 +#: ../src/config.py:1785 ../src/config.py:1829 msgid "Unread events" msgstr "Darvoudoù chomet dilenn" -#: ../src/config.py:1721 +#: ../src/config.py:1786 msgid "Read all pending events before removing this account." msgstr "Lennit an holl zarvoudoù a-raok lemel ar gont-mañ." -#: ../src/config.py:1747 +#: ../src/config.py:1812 #, fuzzy, python-format msgid "You have opened chat in account %s" msgstr "N'ho peus kont bev ebet" -#: ../src/config.py:1748 +#: ../src/config.py:1813 msgid "All chat and groupchat windows will be closed. Do you want to continue?" msgstr "" -#: ../src/config.py:1760 ../src/config.py:2283 ../src/config.py:2317 +#: ../src/config.py:1825 ../src/config.py:2348 ../src/config.py:2382 msgid "You are currently connected to the server" msgstr "Luget oc'h d'ar servijer" -#: ../src/config.py:1761 +#: ../src/config.py:1826 msgid "To change the account name, you must be disconnected." msgstr "Rankout a rit bezañ diluget evit cheñch anv ar gont." -#: ../src/config.py:1765 +#: ../src/config.py:1830 msgid "To change the account name, you must read all pending events." msgstr "" "Rankout a rit lenn an holl zarvoudoù-mañ evit gellout cheñch anv ar gont." -#: ../src/config.py:1771 +#: ../src/config.py:1836 msgid "Account Name Already Used" msgstr "Anv-kont implijet dija" -#: ../src/config.py:1772 +#: ../src/config.py:1837 msgid "" "This name is already used by another of your accounts. Please choose another " "name." @@ -6207,148 +6196,148 @@ msgstr "" "Implijet e vez an anv-mañ gant unan eus ho kontoù dija. Dibabit un anv all " "marplij." -#: ../src/config.py:1776 ../src/config.py:1780 +#: ../src/config.py:1841 ../src/config.py:1845 msgid "Invalid account name" msgstr "Anv-kont direizh" -#: ../src/config.py:1777 +#: ../src/config.py:1842 msgid "Account name cannot be empty." msgstr "N'hell ket anv ar gont chom goullo." -#: ../src/config.py:1781 +#: ../src/config.py:1846 msgid "Account name cannot contain spaces." msgstr "N'hell ket anv ar gont kaout esaouennoù." -#: ../src/config.py:1856 +#: ../src/config.py:1921 #, fuzzy msgid "Rename Account" msgstr "Merañ ar c'hontoù" -#: ../src/config.py:1857 +#: ../src/config.py:1922 #, fuzzy, python-format msgid "Enter a new name for account %s" msgstr "Roit ho ker-kuzh GPG evit ar gont %s." -#: ../src/config.py:1885 +#: ../src/config.py:1950 msgid "A Jabber ID must be in the form \"user@servername\"." msgstr "Un ID Jabber a rank bezañ er stumm \"anv@anvservijer\"." -#: ../src/config.py:2093 ../src/config.py:3327 +#: ../src/config.py:2158 ../src/config.py:3406 msgid "Invalid entry" msgstr "Road direizh" -#: ../src/config.py:2094 ../src/config.py:3328 +#: ../src/config.py:2159 ../src/config.py:3407 msgid "Custom port must be a port number." msgstr "Ar porzh personelaet a rank bezañ un niverenn borzh" -#: ../src/config.py:2115 +#: ../src/config.py:2180 msgid "Failed to get secret keys" msgstr "Fazi en ur dapout an alc'hwezhioù kuzh" -#: ../src/config.py:2116 +#: ../src/config.py:2181 #, fuzzy msgid "There is no OpenPGP secret key available." msgstr "Bez ez eus bet ur gudenn en ur gargañ hoc'h alc'hwezhioù-kuzh OpenPGP." -#: ../src/config.py:2150 +#: ../src/config.py:2215 msgid "OpenPGP Key Selection" msgstr "Dibab un alc'hwezh OpenPGP" -#: ../src/config.py:2151 +#: ../src/config.py:2216 msgid "Choose your OpenPGP key" msgstr "Dibabit hoc'h alc'hwezh OpenPGP" -#: ../src/config.py:2158 +#: ../src/config.py:2223 msgid "No such account available" msgstr "Kont dihegerz" -#: ../src/config.py:2159 +#: ../src/config.py:2224 msgid "You must create your account before editing your personal information." msgstr "Rankout a rit krouiñ ho kont a-raok kemmañ an titouroù hiniennel." -#: ../src/config.py:2166 ../src/dialogs.py:1933 ../src/dialogs.py:2110 -#: ../src/dialogs.py:2289 ../src/disco.py:441 ../src/profile_window.py:317 +#: ../src/config.py:2231 ../src/dialogs.py:2031 ../src/dialogs.py:2220 +#: ../src/dialogs.py:2405 ../src/disco.py:477 ../src/profile_window.py:325 msgid "You are not connected to the server" msgstr "N'oc'h ket luget d'ar servijer" -#: ../src/config.py:2167 +#: ../src/config.py:2232 msgid "Without a connection, you can not edit your personal information." msgstr "Rankout a rit bezañ luget evit kemmañ ho titouroù hiniennel." -#: ../src/config.py:2171 +#: ../src/config.py:2236 msgid "Your server doesn't support Vcard" msgstr "" -#: ../src/config.py:2172 +#: ../src/config.py:2237 #, fuzzy msgid "Your server can't save your personal information." msgstr "Rankout a rit krouiñ ho kont a-raok kemmañ an titouroù hiniennel." -#: ../src/config.py:2284 ../src/config.py:2318 +#: ../src/config.py:2349 ../src/config.py:2383 #, fuzzy msgid "To disable the account, you must be disconnected." msgstr "Rankout a rit bezañ diluget evit cheñch anv ar gont." -#: ../src/config.py:2289 +#: ../src/config.py:2354 #, fuzzy msgid "Account Local already exists." msgstr "Anv-kont implijet dija" -#: ../src/config.py:2290 +#: ../src/config.py:2355 msgid "Please rename or remove it before enabling link-local messaging." msgstr "" -#: ../src/config.py:2438 +#: ../src/config.py:2510 #, python-format msgid "Edit %s" msgstr "Kemmañ %s" -#: ../src/config.py:2440 +#: ../src/config.py:2512 #, python-format msgid "Register to %s" msgstr "Emezelañ war %s" #. list at the beginning -#: ../src/config.py:2476 +#: ../src/config.py:2548 msgid "Ban List" msgstr "Roll argas" -#: ../src/config.py:2477 +#: ../src/config.py:2549 msgid "Member List" msgstr "Roll an izili" -#: ../src/config.py:2478 +#: ../src/config.py:2550 msgid "Owner List" msgstr "Roll ar perc'hennerien" -#: ../src/config.py:2479 +#: ../src/config.py:2551 msgid "Administrator List" msgstr "Roll ar verourien" #. Address column #. holds JID (who said this) -#: ../src/config.py:2528 ../src/disco.py:780 ../src/history_manager.py:208 +#: ../src/config.py:2600 ../src/disco.py:838 ../src/history_manager.py:208 msgid "JID" msgstr "JID" -#: ../src/config.py:2538 +#: ../src/config.py:2610 msgid "Reason" msgstr "Abeg" -#: ../src/config.py:2545 +#: ../src/config.py:2617 msgid "Nick" msgstr "Lesanv" -#: ../src/config.py:2551 +#: ../src/config.py:2623 msgid "Role" msgstr "Perzh" -#: ../src/config.py:2578 +#: ../src/config.py:2650 msgid "Banning..." msgstr "Oc'h argas..." #. You can move '\n' before user@domain if that line is TOO BIG -#: ../src/config.py:2580 +#: ../src/config.py:2652 msgid "" "Whom do you want to ban?\n" "\n" @@ -6356,11 +6345,11 @@ msgstr "" "Piv a fell deoc'h argas ?\n" "\n" -#: ../src/config.py:2582 +#: ../src/config.py:2654 msgid "Adding Member..." msgstr "Oc'h ouzhpennañ un ezel..." -#: ../src/config.py:2583 +#: ../src/config.py:2655 msgid "" "Whom do you want to make a member?\n" "\n" @@ -6368,11 +6357,11 @@ msgstr "" "Piv a fell deoc'h lakaat da ezel ?\n" "\n" -#: ../src/config.py:2585 +#: ../src/config.py:2657 msgid "Adding Owner..." msgstr "Oc'h ouzhpennañ ur perc'henn..." -#: ../src/config.py:2586 +#: ../src/config.py:2658 #, fuzzy msgid "" "Whom do you want to make an owner?\n" @@ -6381,11 +6370,11 @@ msgstr "" "Piv a fell deoc'h lakaat da berc'henn ?\n" "\n" -#: ../src/config.py:2588 +#: ../src/config.py:2660 msgid "Adding Administrator..." msgstr "Oc'h ouzhpennañ ur v-merour-ez..." -#: ../src/config.py:2589 +#: ../src/config.py:2661 msgid "" "Whom do you want to make an administrator?\n" "\n" @@ -6393,7 +6382,7 @@ msgstr "" "Piv a fell deoc'h lakaat da verour-ez ?\n" "\n" -#: ../src/config.py:2590 +#: ../src/config.py:2662 #, fuzzy msgid "" "Can be one of the following:\n" @@ -6411,62 +6400,63 @@ msgstr "" "pseudo@domaine,\n" "domaine/ressource, ou les adresses comprenant un sous-domaine)." -#: ../src/config.py:2687 +#: ../src/config.py:2763 #, python-format msgid "Removing %s account" msgstr "Lemel ar gont %s" -#: ../src/config.py:2709 ../src/gajim.py:1491 ../src/gajim.py:1588 +#: ../src/config.py:2785 ../src/gui_interface.py:1102 +#: ../src/gui_interface.py:1199 msgid "Password Required" msgstr "Ger-kuzh ret" -#: ../src/config.py:2710 ../src/gajim.py:1568 +#: ../src/config.py:2786 ../src/gui_interface.py:1179 #, python-format msgid "Enter your password for account %s" msgstr "Roit ho ker-kuzh evit ar gont %s" -#: ../src/config.py:2711 ../src/gajim.py:1588 +#: ../src/config.py:2787 ../src/gui_interface.py:1199 msgid "Save password" msgstr "Enrollañ ar ger-kuzh" -#: ../src/config.py:2720 +#: ../src/config.py:2796 #, python-format msgid "Account \"%s\" is connected to the server" msgstr "Luget eo ar gont \"%s\" d'ar servijer" -#: ../src/config.py:2721 +#: ../src/config.py:2797 msgid "If you remove it, the connection will be lost." msgstr "Ma tilamit anezhañ, e voc'h diluget." -#: ../src/config.py:2819 +#: ../src/config.py:2895 #, fuzzy msgid "Default" msgstr "Dilemel" -#: ../src/config.py:2819 +#: ../src/config.py:2895 #, fuzzy msgid "?print_status:All" msgstr "Diskouez an eur:" -#: ../src/config.py:2820 +#: ../src/config.py:2896 msgid "Enter and leave only" msgstr "" -#: ../src/config.py:2821 +#: ../src/config.py:2897 #, fuzzy msgid "?print_status:None" msgstr "Diskouez an eur:" -#: ../src/config.py:2889 +#: ../src/config.py:2967 #, fuzzy msgid "New Group Chat" msgstr "Flap a-stroll" -#: ../src/config.py:2922 +#: ../src/config.py:3000 msgid "This bookmark has invalid data" msgstr "Bez ez eus titouroù direizh er sined-mañ" -#: ../src/config.py:2923 +#: ../src/config.py:3001 msgid "" "Please be sure to fill out server and room fields or remove this bookmark." msgstr "" @@ -6474,31 +6464,31 @@ msgstr "" "sined-mañ." #. invalid char -#: ../src/config.py:3041 ../src/dialogs.py:1746 +#: ../src/config.py:3119 ../src/dialogs.py:1829 #, fuzzy msgid "Invalid nickname" msgstr "Anv-arveriad-ez direizh" -#: ../src/config.py:3042 ../src/config.py:3056 ../src/config.py:3070 +#: ../src/config.py:3120 ../src/config.py:3134 ../src/config.py:3148 #, fuzzy msgid "Character not allowed" msgstr "N'eus ket bet kavet al lesanv : %s" -#: ../src/config.py:3055 ../src/config.py:3303 +#: ../src/config.py:3133 ../src/config.py:3382 #, fuzzy msgid "Invalid server" msgstr "Anv-arveriad-ez direizh" -#: ../src/config.py:3069 +#: ../src/config.py:3147 #, fuzzy msgid "Invalid room" msgstr "Road direizh" -#: ../src/config.py:3220 +#: ../src/config.py:3299 msgid "Account has been added successfully" msgstr "Gant berzh eo bet ouzhpennet ar gont!" -#: ../src/config.py:3221 ../src/config.py:3227 +#: ../src/config.py:3300 ../src/config.py:3306 #, fuzzy msgid "" "You can set advanced account options by pressing the Advanced button, or " @@ -6509,34 +6499,34 @@ msgstr "" "Araoket, pe hen ober diwezhatoc'h en ur glikañ war Kontoù er meuziad Aozañ " "eus ar prenestr pennañ." -#: ../src/config.py:3226 +#: ../src/config.py:3305 msgid "Your new account has been created successfully" msgstr "Gant berzh eo bet krouet ho kont nevez!" -#: ../src/config.py:3264 +#: ../src/config.py:3343 msgid "Invalid username" msgstr "Anv-arveriad-ez direizh" -#: ../src/config.py:3266 +#: ../src/config.py:3345 msgid "You must provide a username to configure this account." msgstr "Rankout a rit reiñ un anv-arveriad-ez evit kefluniañ ar gont-mañ." -#: ../src/config.py:3304 +#: ../src/config.py:3383 #, fuzzy msgid "Please provide a server on which you want to register." msgstr "Skrivit al lesanv nevez a fell deoc'h implij:" -#: ../src/config.py:3360 ../src/gajim.py:2144 +#: ../src/config.py:3439 ../src/gui_interface.py:1857 #, fuzzy msgid "Certificate Already in File" msgstr "Darempred er roll dija" -#: ../src/config.py:3361 ../src/gajim.py:2145 +#: ../src/config.py:3440 ../src/gui_interface.py:1858 #, python-format msgid "This certificate is already in file %s, so it's not added again." msgstr "" -#: ../src/config.py:3429 +#: ../src/config.py:3510 #, python-format msgid "" "Security Warning\n" @@ -6546,7 +6536,7 @@ msgid "" "Do you still want to connect to this server?" msgstr "" -#: ../src/config.py:3435 ../src/gajim.py:2169 +#: ../src/config.py:3516 ../src/gui_interface.py:1882 #, python-format msgid "" "Add this certificate to the list of trusted certificates.\n" @@ -6554,74 +6544,74 @@ msgid "" "%s" msgstr "" -#: ../src/config.py:3460 ../src/config.py:3483 +#: ../src/config.py:3543 ../src/config.py:3570 #, fuzzy msgid "An error occurred during account creation" msgstr "Bez ez eus bet ur fazi en ur grouiñ ar gont" -#: ../src/config.py:3550 +#: ../src/config.py:3637 msgid "Account name is in use" msgstr "Implijet eo an anv-kont dija" -#: ../src/config.py:3551 +#: ../src/config.py:3638 msgid "You already have an account using this name." msgstr "Bez ho peus ur gont gant an anv-se dija." -#: ../src/config.py:3704 +#: ../src/config.py:3791 msgid "Active" msgstr "Oberiant" -#: ../src/config.py:3712 +#: ../src/config.py:3799 msgid "Event" msgstr "Darvoud" -#: ../src/config.py:3747 +#: ../src/config.py:3834 msgid "First Message Received" msgstr "Kemennadenn gentañ" -#: ../src/config.py:3748 +#: ../src/config.py:3835 #, fuzzy msgid "Next Message Received Focused" msgstr "Kemennadenn da-heul" -#: ../src/config.py:3750 +#: ../src/config.py:3837 #, fuzzy msgid "Next Message Received Unfocused" msgstr "Kemennadenn da-heul" -#: ../src/config.py:3751 +#: ../src/config.py:3838 msgid "Contact Connected" msgstr "Darempred luget" -#: ../src/config.py:3752 +#: ../src/config.py:3839 msgid "Contact Disconnected" msgstr "Darempred diluget" -#: ../src/config.py:3753 +#: ../src/config.py:3840 msgid "Message Sent" msgstr "Kemennadenn gaset" -#: ../src/config.py:3754 +#: ../src/config.py:3841 msgid "Group Chat Message Highlight" msgstr "Message d'un Salon mis en Sur-brillance" -#: ../src/config.py:3755 +#: ../src/config.py:3842 msgid "Group Chat Message Received" msgstr "Kemennadenn digant ur sal-flapiñ" -#: ../src/config.py:3756 +#: ../src/config.py:3843 #, fuzzy msgid "GMail Email Received" msgstr "Resevet ar bedadenn" -#: ../src/conversation_textview.py:592 +#: ../src/conversation_textview.py:599 msgid "" "This icon indicates that this message has not yet\n" "been received by the remote end. If this icon stays\n" "for a long time, it's likely the message got lost." msgstr "" -#: ../src/conversation_textview.py:611 +#: ../src/conversation_textview.py:618 #, fuzzy msgid "" "Text below this line is what has been said since the\n" @@ -6630,126 +6620,123 @@ msgstr "" "Dindan al linenn e welit ar pezh a zo bet lâret er sal-flapiñ dibaoe ar wech " "diwezhañ ho peus taolet ur sell ennañ." -#: ../src/conversation_textview.py:724 +#: ../src/conversation_textview.py:737 #, fuzzy msgid "_Quote" msgstr "_Kuitaat" -#: ../src/conversation_textview.py:731 +#: ../src/conversation_textview.py:744 #, fuzzy, python-format msgid "_Actions for \"%s\"" msgstr "Oberoù evit \"%s\"" -#: ../src/conversation_textview.py:743 +#: ../src/conversation_textview.py:756 msgid "Read _Wikipedia Article" msgstr "Lenn pennad _Wikipedia" -#: ../src/conversation_textview.py:748 +#: ../src/conversation_textview.py:761 msgid "Look it up in _Dictionary" msgstr "Klask er _geriadur" -#: ../src/conversation_textview.py:765 +#: ../src/conversation_textview.py:778 #, python-format msgid "Dictionary URL is missing an \"%s\" and it is not WIKTIONARY" msgstr "" "Mankout a ra un \"%s\" e-barzh URL ar geriaoueg, ha n'eo ket WIKTIONARY" #. we must have %s in the url -#: ../src/conversation_textview.py:778 +#: ../src/conversation_textview.py:791 #, python-format msgid "Web Search URL is missing an \"%s\"" msgstr "Mankout a ra un \"%s\" e-barzh URL ar webklask" -#: ../src/conversation_textview.py:781 +#: ../src/conversation_textview.py:794 msgid "Web _Search for it" msgstr "Web_klask" -#: ../src/conversation_textview.py:787 +#: ../src/conversation_textview.py:800 msgid "Open as _Link" msgstr "" -#: ../src/conversation_textview.py:1274 +#. %i is day in year (1-365) +#: ../src/conversation_textview.py:1295 +#, fuzzy, python-format msgid "Yesterday" -msgstr "Dec'h" - -#. the number is >= 2 -#. %i is day in year (1-365), %d (1-31) we want %i -#: ../src/conversation_textview.py:1278 -#, python-format -msgid "%i days ago" -msgstr "%i devezh 'zo" +msgid_plural "%i days ago" +msgstr[0] "Dec'h" +msgstr[1] "Dec'h" #. if we have subject, show it too! -#: ../src/conversation_textview.py:1312 ../src/history_window.py:464 +#: ../src/conversation_textview.py:1330 ../src/history_window.py:475 #, python-format msgid "Subject: %s\n" msgstr "Sujed: %s\n" -#: ../src/dataforms_widget.py:559 +#: ../src/dataforms_widget.py:581 #, fuzzy msgid "Jabber ID already in list" msgstr "Flaperez Jabber" -#: ../src/dataforms_widget.py:560 +#: ../src/dataforms_widget.py:582 msgid "The Jabber ID you entered is already in the list. Choose another one." msgstr "" #. Default jid -#: ../src/dataforms_widget.py:571 +#: ../src/dataforms_widget.py:593 msgid "new@jabber.id" msgstr "" -#: ../src/dataforms_widget.py:574 ../src/dataforms_widget.py:576 +#: ../src/dataforms_widget.py:596 ../src/dataforms_widget.py:598 #, python-format msgid "new%d@jabber.id" msgstr "" -#: ../src/dialogs.py:75 +#: ../src/dialogs.py:81 #, fuzzy, python-format msgid "Contact name: %s" msgstr "Anv an darempred: %s" -#: ../src/dialogs.py:77 +#: ../src/dialogs.py:83 #, fuzzy, python-format msgid "Jabber ID: %s" msgstr "JID: %s" -#: ../src/dialogs.py:184 +#: ../src/dialogs.py:194 msgid "Group" msgstr "Strollad" -#: ../src/dialogs.py:191 +#: ../src/dialogs.py:201 msgid "In the group" msgstr "Er strollad" -#: ../src/dialogs.py:277 +#: ../src/dialogs.py:292 msgid "KeyID" msgstr "KeyID" -#: ../src/dialogs.py:282 +#: ../src/dialogs.py:297 msgid "Contact name" msgstr "Anv an darempred" -#: ../src/dialogs.py:454 +#: ../src/dialogs.py:469 #, fuzzy msgid "Set Mood" msgstr "Lakaat MOTD" -#: ../src/dialogs.py:572 +#: ../src/dialogs.py:589 #, python-format msgid "%s Status Message" msgstr "Titour-stad %s" -#: ../src/dialogs.py:586 +#: ../src/dialogs.py:603 msgid "Status Message" msgstr "Titour-stad" -#: ../src/dialogs.py:772 +#: ../src/dialogs.py:793 #, fuzzy msgid "Overwrite Status Message?" msgstr "Titour-stad" -#: ../src/dialogs.py:773 +#: ../src/dialogs.py:794 #, fuzzy msgid "" "This name is already used. Do you want to overwrite this status message?" @@ -6757,111 +6744,111 @@ msgstr "" "Implijet e vez an anv-mañ gant unan eus ho kontoù dija. Dibabit un anv all " "marplij." -#: ../src/dialogs.py:781 +#: ../src/dialogs.py:802 msgid "Save as Preset Status Message" msgstr "Enrollañ evel titour-stad rakenrollet" -#: ../src/dialogs.py:782 +#: ../src/dialogs.py:803 msgid "Please type a name for this status message" msgstr "Roit un anv d'an titour-stad-mañ" -#: ../src/dialogs.py:807 +#: ../src/dialogs.py:831 #, fuzzy msgid "AIM Address:" msgstr "_Chomlec'h:" -#: ../src/dialogs.py:808 +#: ../src/dialogs.py:832 msgid "GG Number:" msgstr "" -#: ../src/dialogs.py:809 +#: ../src/dialogs.py:833 msgid "ICQ Number:" msgstr "" -#: ../src/dialogs.py:810 +#: ../src/dialogs.py:834 #, fuzzy msgid "MSN Address:" msgstr "_Chomlec'h:" -#: ../src/dialogs.py:811 +#: ../src/dialogs.py:835 #, fuzzy msgid "Yahoo! Address:" msgstr "Chomlec'h 2:" -#: ../src/dialogs.py:847 +#: ../src/dialogs.py:872 #, python-format msgid "Please fill in the data of the contact you want to add in account %s" msgstr "Leuniit titouroù an darempred a zo da vezañ ouzhpennet er gont %s" -#: ../src/dialogs.py:849 +#: ../src/dialogs.py:874 msgid "Please fill in the data of the contact you want to add" msgstr "Leuniit an titouroù diwar-benn an darempred da ouzhpennañ" -#: ../src/dialogs.py:1006 ../src/dialogs.py:1012 ../src/dialogs.py:1017 +#: ../src/dialogs.py:1035 ../src/dialogs.py:1041 ../src/dialogs.py:1046 msgid "Invalid User ID" msgstr "ID-arveriad-ez direizh" -#: ../src/dialogs.py:1013 +#: ../src/dialogs.py:1042 msgid "The user ID must not contain a resource." msgstr "" -#: ../src/dialogs.py:1018 +#: ../src/dialogs.py:1047 #, fuzzy msgid "You cannot add yourself to your roster." msgstr "Laouen 'vefen d'ho ouzhpennañ em roll-darempredoù." -#: ../src/dialogs.py:1032 +#: ../src/dialogs.py:1061 msgid "Contact already in roster" msgstr "Darempred er roll dija" -#: ../src/dialogs.py:1033 +#: ../src/dialogs.py:1062 msgid "This contact is already listed in your roster." msgstr "Emañ an darempred en ho roll-darempredoù dija." -#: ../src/dialogs.py:1069 +#: ../src/dialogs.py:1098 #, fuzzy msgid "User ID:" msgstr "ID arveriad-ez:" -#: ../src/dialogs.py:1127 +#: ../src/dialogs.py:1159 msgid "A GTK+ jabber client" msgstr "Ur flaperez jabber e GTK+" -#: ../src/dialogs.py:1128 +#: ../src/dialogs.py:1160 msgid "GTK+ Version:" msgstr "" -#: ../src/dialogs.py:1129 +#: ../src/dialogs.py:1161 msgid "PyGTK Version:" msgstr "" -#: ../src/dialogs.py:1139 +#: ../src/dialogs.py:1171 #, fuzzy msgid "Current Developers:" msgstr "Diorroerien kent:" -#: ../src/dialogs.py:1141 +#: ../src/dialogs.py:1173 msgid "Past Developers:" msgstr "Diorroerien kent:" -#: ../src/dialogs.py:1147 +#: ../src/dialogs.py:1179 msgid "THANKS:" msgstr "TRUGAREZ DA:" #. remove one english sentence #. and add it manually as translatable -#: ../src/dialogs.py:1153 +#: ../src/dialogs.py:1185 msgid "Last but not least, we would like to thank all the package maintainers." msgstr "Evit echuiñ, e fell deomp trugarekaat holl gempennerien ar pakad." #. here you write your name in the form Name FamilyName -#: ../src/dialogs.py:1166 +#: ../src/dialogs.py:1198 msgid "translator-credits" msgstr "" "Troet e brezhoneg gant\n" "Giulia Fraboulet " -#: ../src/dialogs.py:1328 +#: ../src/dialogs.py:1366 #, python-format msgid "" "You have to install %s dictionary to use spellchecking, or choose another " @@ -6870,105 +6857,109 @@ msgid "" "Highlighting misspelled words feature will not be used" msgstr "" -#: ../src/dialogs.py:1747 ../src/dialogs.py:2061 +#: ../src/dialogs.py:1830 ../src/dialogs.py:2171 #, fuzzy msgid "The nickname has not allowed characters." msgstr "Bez ez eus arouezioù difennet en anv ar sal pe hini ar servijer." -#: ../src/dialogs.py:1859 +#: ../src/dialogs.py:1948 #, fuzzy, python-format msgid "Subscription request for account %(account)s from %(jid)s" msgstr "Goulenn enskrivañ evit ar gont %s digant %s" -#: ../src/dialogs.py:1862 +#: ../src/dialogs.py:1951 #, python-format msgid "Subscription request from %s" msgstr "Goulenn enskrivañ digant %s" -#: ../src/dialogs.py:1928 ../src/gajim.py:2827 +#: ../src/dialogs.py:2026 ../src/gui_interface.py:2592 #, fuzzy, python-format msgid "You are already in group chat %s" msgstr "Emaoc'h er webgaoz %s dija" -#: ../src/dialogs.py:1934 +#: ../src/dialogs.py:2032 msgid "You can not join a group chat unless you are connected." msgstr "N'hellit ket ebarzhiñ ur sal-flapiñ keit ha ma n'oc'h ket luget." -#: ../src/dialogs.py:1970 +#: ../src/dialogs.py:2074 #, python-format msgid "Join Group Chat with account %s" msgstr "Ebarzhiñ ur sal-flapiñ gant ar gont %s" -#: ../src/dialogs.py:2050 +#: ../src/dialogs.py:2160 #, fuzzy msgid "Invalid Account" msgstr "Anv-kont direizh" -#: ../src/dialogs.py:2051 +#: ../src/dialogs.py:2161 #, fuzzy msgid "" "You have to choose an account from which you want to join the groupchat." msgstr "Rankout a rit krouiñ ur gont a-raok gellout flapiñ gant tud all." -#: ../src/dialogs.py:2060 +#: ../src/dialogs.py:2170 #, fuzzy msgid "Invalid Nickname" msgstr "Anv-arveriad-ez direizh" -#: ../src/dialogs.py:2065 ../src/dialogs.py:2071 -#: ../src/groupchat_control.py:1738 +#: ../src/dialogs.py:2175 ../src/dialogs.py:2181 +#: ../src/groupchat_control.py:1776 #, fuzzy msgid "Invalid group chat Jabber ID" msgstr "ID jabber direizh" -#: ../src/dialogs.py:2066 ../src/dialogs.py:2072 -#: ../src/groupchat_control.py:1739 +#: ../src/dialogs.py:2176 +#, fuzzy +msgid "Please enter the group chat Jabber ID as room@server." +msgstr "Bez ez eus arouezioù difennet en anv ar sal pe hini ar servijer." + +#: ../src/dialogs.py:2182 ../src/groupchat_control.py:1777 #, fuzzy msgid "The group chat Jabber ID has not allowed characters." msgstr "Bez ez eus arouezioù difennet en anv ar sal pe hini ar servijer." -#: ../src/dialogs.py:2079 +#: ../src/dialogs.py:2189 msgid "This is not a group chat" msgstr "" -#: ../src/dialogs.py:2080 +#: ../src/dialogs.py:2190 #, fuzzy, python-format msgid "%s is not the name of a group chat." msgstr "A guzha an nozelennoù er prenestr flapiñ" -#: ../src/dialogs.py:2111 +#: ../src/dialogs.py:2221 #, fuzzy msgid "Without a connection, you can not synchronise your contacts." msgstr "Rankout a rit bezañ luget evit cheñch ger-kuzh." -#: ../src/dialogs.py:2125 +#: ../src/dialogs.py:2235 msgid "Server" msgstr "Servijer" -#: ../src/dialogs.py:2158 +#: ../src/dialogs.py:2270 #, fuzzy msgid "This account is not connected to the server" msgstr "Luget eo ar gont \"%s\" d'ar servijer" -#: ../src/dialogs.py:2159 +#: ../src/dialogs.py:2271 #, fuzzy msgid "You cannot synchronize with an account unless it is connected." msgstr "N'hellit ket ebarzhiñ ur sal-flapiñ keit ha ma n'oc'h ket luget." -#: ../src/dialogs.py:2183 +#: ../src/dialogs.py:2295 msgid "Synchronise" msgstr "" -#: ../src/dialogs.py:2241 +#: ../src/dialogs.py:2355 #, python-format msgid "Start Chat with account %s" msgstr "Kregiñ da flapiñ gant ar gont %s" -#: ../src/dialogs.py:2243 +#: ../src/dialogs.py:2357 msgid "Start Chat" msgstr "Kregiñ da flapiñ" -#: ../src/dialogs.py:2244 +#: ../src/dialogs.py:2358 #, fuzzy msgid "" "Fill in the nickname or the Jabber ID of the contact you would like\n" @@ -6978,310 +6969,339 @@ msgstr "" "dezhañ:" #. if offline or connecting -#: ../src/dialogs.py:2268 ../src/dialogs.py:2651 ../src/dialogs.py:2813 +#: ../src/dialogs.py:2384 ../src/dialogs.py:2767 ../src/dialogs.py:2929 msgid "Connection not available" msgstr "N'eus ket tu en em lugañ" -#: ../src/dialogs.py:2269 ../src/dialogs.py:2652 ../src/dialogs.py:2814 +#: ../src/dialogs.py:2385 ../src/dialogs.py:2768 ../src/dialogs.py:2930 #, python-format msgid "Please make sure you are connected with \"%s\"." msgstr "Gwiriekait oc'h luget gant \"%s\"." -#: ../src/dialogs.py:2278 ../src/dialogs.py:2281 +#: ../src/dialogs.py:2394 ../src/dialogs.py:2397 #, fuzzy msgid "Invalid JID" msgstr "ID jabber direizh" -#: ../src/dialogs.py:2281 +#: ../src/dialogs.py:2397 #, python-format msgid "Unable to parse \"%s\"." msgstr "" -#: ../src/dialogs.py:2290 +#: ../src/dialogs.py:2406 msgid "Without a connection, you can not change your password." msgstr "Rankout a rit bezañ luget evit cheñch ger-kuzh." -#: ../src/dialogs.py:2309 +#: ../src/dialogs.py:2425 msgid "Invalid password" msgstr "Ger-kuzh direizh" -#: ../src/dialogs.py:2309 +#: ../src/dialogs.py:2425 msgid "You must enter a password." msgstr "Rankout a rit reiñ ur ger-kuzh." -#: ../src/dialogs.py:2313 +#: ../src/dialogs.py:2429 msgid "Passwords do not match" msgstr "Ne glot ket ar gerioù-kuzh" -#: ../src/dialogs.py:2314 +#: ../src/dialogs.py:2430 msgid "The passwords typed in both fields must be identical." msgstr "Rankout a ra an daou c'her-kuzh bezañ heñvel en daou dakad." #. img to display #. default value -#: ../src/dialogs.py:2353 ../src/notify.py:257 ../src/notify.py:491 +#: ../src/dialogs.py:2469 ../src/notify.py:263 ../src/notify.py:504 msgid "Contact Signed In" msgstr "Darempred luget" -#: ../src/dialogs.py:2355 ../src/notify.py:265 ../src/notify.py:493 +#: ../src/dialogs.py:2471 ../src/notify.py:271 ../src/notify.py:506 msgid "Contact Signed Out" msgstr "Darempred diluget" #. chat message #. img to display -#: ../src/dialogs.py:2357 ../src/notify.py:288 ../src/notify.py:342 -#: ../src/notify.py:495 +#: ../src/dialogs.py:2473 ../src/notify.py:294 ../src/notify.py:349 +#: ../src/notify.py:508 msgid "New Message" msgstr "Kemennadenn nevez" #. single message -#: ../src/dialogs.py:2357 ../src/notify.py:269 ../src/notify.py:343 -#: ../src/notify.py:495 +#: ../src/dialogs.py:2473 ../src/notify.py:275 ../src/notify.py:350 +#: ../src/notify.py:508 msgid "New Single Message" msgstr "Kemennadenn simpl nevez" #. private message -#: ../src/dialogs.py:2358 ../src/notify.py:276 ../src/notify.py:343 -#: ../src/notify.py:496 +#: ../src/dialogs.py:2474 ../src/notify.py:282 ../src/notify.py:350 +#: ../src/notify.py:509 msgid "New Private Message" msgstr "Kemennadenn hiniennel nevez" -#: ../src/dialogs.py:2358 ../src/gajim.py:1704 ../src/notify.py:505 +#: ../src/dialogs.py:2474 ../src/gui_interface.py:1315 ../src/notify.py:518 msgid "New E-mail" msgstr "Postel nevez" -#: ../src/dialogs.py:2360 ../src/gajim.py:1770 ../src/notify.py:498 +#: ../src/dialogs.py:2476 ../src/gui_interface.py:1382 ../src/notify.py:511 msgid "File Transfer Request" msgstr "Goulenn treuzkas" -#: ../src/dialogs.py:2362 ../src/gajim.py:1670 ../src/gajim.py:1737 -#: ../src/notify.py:500 +#: ../src/dialogs.py:2478 ../src/gui_interface.py:1281 +#: ../src/gui_interface.py:1349 ../src/notify.py:513 msgid "File Transfer Error" msgstr "Fazi treuzkas" -#: ../src/dialogs.py:2364 ../src/gajim.py:1815 ../src/gajim.py:1837 -#: ../src/gajim.py:1854 ../src/notify.py:502 +#: ../src/dialogs.py:2480 ../src/gui_interface.py:1427 +#: ../src/gui_interface.py:1449 ../src/gui_interface.py:1466 +#: ../src/notify.py:515 msgid "File Transfer Completed" msgstr "Echu an treuzkasadenn" -#: ../src/dialogs.py:2365 ../src/gajim.py:1818 ../src/notify.py:503 +#: ../src/dialogs.py:2481 ../src/gui_interface.py:1430 ../src/notify.py:516 msgid "File Transfer Stopped" msgstr "Sac'het an treuzkas" -#: ../src/dialogs.py:2367 ../src/gajim.py:1512 ../src/notify.py:507 +#: ../src/dialogs.py:2483 ../src/gui_interface.py:1123 ../src/notify.py:520 msgid "Groupchat Invitation" msgstr "Pedadenn evit ur sal-flapiñ" -#: ../src/dialogs.py:2369 ../src/notify.py:249 ../src/notify.py:509 +#: ../src/dialogs.py:2485 ../src/notify.py:255 ../src/notify.py:522 #, fuzzy msgid "Contact Changed Status" msgstr "Darempred diluget" -#: ../src/dialogs.py:2570 +#: ../src/dialogs.py:2686 #, fuzzy, python-format msgid "Single Message using account %s" msgstr "Kemennadenn simpl gant ar gont %s" -#: ../src/dialogs.py:2572 +#: ../src/dialogs.py:2688 #, fuzzy, python-format msgid "Single Message in account %s" msgstr "Kemennadenn simpl gant ar gont %s" -#: ../src/dialogs.py:2574 +#: ../src/dialogs.py:2690 msgid "Single Message" msgstr "Kemennadenn simpl" #. prepare UI for Sending -#: ../src/dialogs.py:2577 +#: ../src/dialogs.py:2693 #, python-format msgid "Send %s" msgstr "Kas %s" #. prepare UI for Receiving -#: ../src/dialogs.py:2600 +#: ../src/dialogs.py:2716 #, python-format msgid "Received %s" msgstr "%s resevet" #. prepare UI for Receiving -#: ../src/dialogs.py:2623 +#: ../src/dialogs.py:2739 #, fuzzy, python-format msgid "Form %s" msgstr "De %s" #. we create a new blank window to send and we preset RE: and to jid -#: ../src/dialogs.py:2702 +#: ../src/dialogs.py:2818 #, python-format msgid "RE: %s" msgstr "RE: %s" -#: ../src/dialogs.py:2703 +#: ../src/dialogs.py:2819 #, python-format msgid "%s wrote:\n" msgstr "%s a skrivas:\n" -#: ../src/dialogs.py:2752 +#: ../src/dialogs.py:2868 #, python-format msgid "XML Console for %s" msgstr "" -#: ../src/dialogs.py:2754 +#: ../src/dialogs.py:2870 msgid "XML Console" msgstr "" -#. Set labels -#. self.action can be 'add', 'modify' or 'remove' -#: ../src/dialogs.py:2865 +#. Action that can be done with an incoming list of contacts +#: ../src/dialogs.py:2958 +#, fuzzy +msgid "add" +msgstr "Chomlec'h" + +#: ../src/dialogs.py:2958 +#, fuzzy +msgid "modify" +msgstr "_Kemmañ" + +#: ../src/dialogs.py:2959 +#, fuzzy +msgid "remove" +msgstr "_Dilemel" + +#: ../src/dialogs.py:2987 #, fuzzy, python-format -msgid "%s would like you to %s some contacts in your roster." +msgid "" +"%(jid)s would like you to %(action)s some contacts in your " +"roster." msgstr "Me blijfe din ouzhpennañ ac'hanoc'h em roll-darempredoù." -#: ../src/dialogs.py:2880 ../src/dialogs.py:2928 +#. Change label for accept_button to action name instead of 'OK'. +#: ../src/dialogs.py:3003 ../src/dialogs.py:3049 #, fuzzy msgid "Add" msgstr "Chomlec'h" -#: ../src/dialogs.py:2882 ../src/dialogs.py:2961 +#. Change label for accept_button to action name instead of 'OK'. +#: ../src/dialogs.py:3005 ../src/dialogs.py:3080 #, fuzzy msgid "Modify" msgstr "_Kemmañ" -#: ../src/dialogs.py:2888 +#: ../src/dialogs.py:3011 #, fuzzy msgid "Jabber ID" msgstr "ID Jabber:" -#: ../src/dialogs.py:2894 +#: ../src/dialogs.py:3017 #, fuzzy msgid "Groups" msgstr "Strollad" #. it is selected -#. remote_jid = model[iter][1].decode('utf-8') -#: ../src/dialogs.py:3008 +#. remote_jid = model[iter_][1].decode('utf-8') +#: ../src/dialogs.py:3125 #, fuzzy, python-format msgid "%s suggested me to add you in my roster." msgstr "Laouen 'vefen d'ho ouzhpennañ em roll-darempredoù." -#: ../src/dialogs.py:3108 +#: ../src/dialogs.py:3139 +#, fuzzy, python-format +msgid "Added %s contacts" +msgstr "Ouzhpennañ un _darempred" + +#: ../src/dialogs.py:3176 +#, fuzzy, python-format +msgid "Removed %s contacts" +msgstr "Dilemel an darempred diouzh ar roll" + +#: ../src/dialogs.py:3229 #, python-format msgid "Privacy List %s" msgstr "" -#: ../src/dialogs.py:3112 +#: ../src/dialogs.py:3233 #, python-format msgid "Privacy List for %s" msgstr "" -#: ../src/dialogs.py:3168 +#: ../src/dialogs.py:3289 #, python-format msgid "Order: %(order)s, action: %(action)s, type: %(type)s, value: %(value)s" msgstr "" -#: ../src/dialogs.py:3173 +#: ../src/dialogs.py:3294 #, fuzzy, python-format msgid "Order: %(order)s, action: %(action)s" msgstr "Taolennadur: %s" -#: ../src/dialogs.py:3215 +#: ../src/dialogs.py:3338 #, fuzzy msgid "Edit a rule" msgstr "Furmad ul linenn" -#: ../src/dialogs.py:3326 +#: ../src/dialogs.py:3449 #, fuzzy msgid "Add a rule" msgstr "Furmad ul linenn" -#: ../src/dialogs.py:3423 +#: ../src/dialogs.py:3549 #, python-format msgid "Privacy Lists for %s" msgstr "" -#: ../src/dialogs.py:3425 +#: ../src/dialogs.py:3551 #, fuzzy msgid "Privacy Lists" msgstr "Flapoù prevez" -#: ../src/dialogs.py:3495 +#: ../src/dialogs.py:3621 #, fuzzy msgid "Invalid List Name" msgstr "Anv-arveriad-ez direizh" -#: ../src/dialogs.py:3496 +#: ../src/dialogs.py:3622 #, fuzzy msgid "You must enter a name to create a privacy list." msgstr "Rankout a rit reiñ ur ger-kuzh evit enrollañ ar gont nevez." -#: ../src/dialogs.py:3528 +#: ../src/dialogs.py:3654 #, fuzzy msgid "You are invited to a groupchat" msgstr "Vous êtes banni de ce salon." -#: ../src/dialogs.py:3531 +#: ../src/dialogs.py:3657 #, fuzzy msgid "$Contact has invited you to join a discussion" msgstr "Pedet oc'h bet gant %(contact_jid)s er sal-flapiñ %(room_jid)s" -#: ../src/dialogs.py:3533 +#: ../src/dialogs.py:3659 #, fuzzy, python-format msgid "$Contact has invited you to group chat %(room_jid)s" msgstr "Pedet oc'h bet gant %(contact_jid)s er sal-flapiñ %(room_jid)s" -#: ../src/dialogs.py:3541 +#: ../src/dialogs.py:3667 #, python-format msgid "Comment: %s" msgstr "Evezhiadenn: %s" -#: ../src/dialogs.py:3543 +#: ../src/dialogs.py:3669 msgid "Do you want to accept the invitation?" msgstr "" -#: ../src/dialogs.py:3599 +#: ../src/dialogs.py:3730 msgid "Choose Sound" msgstr "Dibabit ur son" -#: ../src/dialogs.py:3609 ../src/dialogs.py:3663 +#: ../src/dialogs.py:3740 ../src/dialogs.py:3796 msgid "All files" msgstr "An holl restroù" -#: ../src/dialogs.py:3614 +#: ../src/dialogs.py:3745 msgid "Wav Sounds" msgstr "Sonioù wav" -#: ../src/dialogs.py:3650 +#: ../src/dialogs.py:3783 msgid "Choose Image" msgstr "Dibabit ur skeudenn" -#: ../src/dialogs.py:3668 +#: ../src/dialogs.py:3801 msgid "Images" msgstr "Skeudennoù" -#: ../src/dialogs.py:3733 +#: ../src/dialogs.py:3868 #, python-format msgid "When %s becomes:" msgstr "Pa teu %s da vezañ:" -#: ../src/dialogs.py:3735 +#: ../src/dialogs.py:3870 #, python-format msgid "Adding Special Notification for %s" msgstr "Oc'h ouzhpennañ ur gelaouenn nevez evit %s" #. # means number -#: ../src/dialogs.py:3804 +#: ../src/dialogs.py:3939 msgid "#" msgstr "" -#: ../src/dialogs.py:3810 +#: ../src/dialogs.py:3945 #, fuzzy msgid "Condition" msgstr "Kevreadenn" -#: ../src/dialogs.py:3928 +#: ../src/dialogs.py:4065 msgid "when I am " msgstr "" -#: ../src/dialogs.py:4400 +#: ../src/dialogs.py:4541 #, python-format msgid "" "Your chat session with %(jid)s is encrypted.\n" @@ -7289,38 +7309,38 @@ msgid "" "This session's Short Authentication String is %(sas)s." msgstr "" -#: ../src/dialogs.py:4404 +#: ../src/dialogs.py:4545 msgid "You have already verified this contact's identity." msgstr "" -#: ../src/dialogs.py:4410 ../src/dialogs.py:4497 +#: ../src/dialogs.py:4551 ../src/dialogs.py:4640 msgid "Contact's identity verified" msgstr "" -#: ../src/dialogs.py:4418 +#: ../src/dialogs.py:4559 msgid "Verify again..." msgstr "" -#: ../src/dialogs.py:4423 +#: ../src/dialogs.py:4564 msgid "" "To be certain that only the expected person can read your messages or " "send you messages, you need to verify their identity by clicking the button " "below." msgstr "" -#: ../src/dialogs.py:4426 ../src/dialogs.py:4478 ../src/dialogs.py:4491 +#: ../src/dialogs.py:4567 ../src/dialogs.py:4621 ../src/dialogs.py:4634 msgid "Contact's identity NOT verified" msgstr "" -#: ../src/dialogs.py:4433 +#: ../src/dialogs.py:4574 msgid "Verify..." msgstr "" -#: ../src/dialogs.py:4445 +#: ../src/dialogs.py:4586 msgid "Have you verified the contact's identity?" msgstr "" -#: ../src/dialogs.py:4446 +#: ../src/dialogs.py:4587 #, python-format msgid "" "To prevent talking to an unknown person, you should speak to %(jid)s " @@ -7330,31 +7350,50 @@ msgid "" "This session's Short Authentication String is %(sas)s." msgstr "" -#: ../src/dialogs.py:4447 +#: ../src/dialogs.py:4588 msgid "Did you talk to the remote contact and verify the SAS?" msgstr "" -#: ../src/dialogs.py:4479 +#: ../src/dialogs.py:4622 #, python-format msgid "The contact's key (%s) does not match the key assigned in Gajim." msgstr "" -#: ../src/dialogs.py:4485 +#: ../src/dialogs.py:4628 msgid "No GPG key is assigned to this contact. So you cannot encrypt messages." msgstr "" -#: ../src/dialogs.py:4492 +#: ../src/dialogs.py:4635 msgid "" "GPG key is assigned to this contact, but you do not trust his key, so " "message cannot be encrypted. Use your GPG client to trust this key." msgstr "" -#: ../src/dialogs.py:4498 +#: ../src/dialogs.py:4641 msgid "" "GPG Key is assigned to this contact, and you trust his key, so messages will " "be encrypted." msgstr "" +#: ../src/dialogs.py:4708 +msgid "an audio and video" +msgstr "" + +#: ../src/dialogs.py:4710 +msgid "an audio" +msgstr "" + +#: ../src/dialogs.py:4712 +msgid "a video" +msgstr "" + +#: ../src/dialogs.py:4716 +#, python-format +msgid "" +"%(contact)s wants to start %(type)s session with you. Do you want to answer " +"the call?" +msgstr "" + #: ../src/disco.py:118 msgid "Others" msgstr "Traoù all" @@ -7364,24 +7403,24 @@ msgstr "Traoù all" msgid "Conference" msgstr "Kendiviz" -#: ../src/disco.py:442 +#: ../src/disco.py:478 msgid "Without a connection, you can not browse available services" msgstr "Rankout a rit bezañ luget evit gellout furchal er servijoù hegerz" -#: ../src/disco.py:516 +#: ../src/disco.py:554 #, python-format msgid "Service Discovery using account %s" msgstr "Merañ servijoù ar gont %s" -#: ../src/disco.py:518 +#: ../src/disco.py:556 msgid "Service Discovery" msgstr "Merañ ar servijoù" -#: ../src/disco.py:659 +#: ../src/disco.py:706 msgid "The service could not be found" msgstr "N'eo ket bet kavet ar servij" -#: ../src/disco.py:660 +#: ../src/disco.py:707 msgid "" "There is no service at the address you entered, or it is not responding. " "Check the address and try again." @@ -7389,343 +7428,338 @@ msgstr "" "N'eus servij ebet er chomlec'h roet, pe ne respont ket. Gwiriekait ar " "chomlec'h ha klaskit en-dro." -#: ../src/disco.py:664 ../src/disco.py:960 +#: ../src/disco.py:711 ../src/disco.py:1047 msgid "The service is not browsable" msgstr "N'eus ket tu furchal er servij" -#: ../src/disco.py:665 +#: ../src/disco.py:712 msgid "This type of service does not contain any items to browse." msgstr "N'eus elfenn ebet da furchal e seurt servijoù." -#: ../src/disco.py:702 ../src/disco.py:712 +#: ../src/disco.py:751 ../src/disco.py:761 #, fuzzy msgid "Invalid Server Name" msgstr "Anv-arveriad-ez direizh" -#: ../src/disco.py:759 +#: ../src/disco.py:815 #, fuzzy, python-format msgid "Browsing %(address)s using account %(account)s" msgstr "O furchal e-barzh %s oc'h implij ar gont %s" -#: ../src/disco.py:799 +#: ../src/disco.py:859 msgid "_Browse" msgstr "_Furchal" -#: ../src/disco.py:961 +#: ../src/disco.py:1048 msgid "This service does not contain any items to browse." msgstr "N'eus elfenn ebet da furchal er servij-mañ." -#: ../src/disco.py:1183 +#: ../src/disco.py:1288 #, fuzzy msgid "_Execute Command" msgstr "urzhiad" -#: ../src/disco.py:1193 ../src/disco.py:1359 +#: ../src/disco.py:1298 ../src/disco.py:1469 msgid "Re_gister" msgstr "_Emezelañ" -#: ../src/disco.py:1396 +#: ../src/disco.py:1510 #, python-format msgid "Scanning %(current)d / %(total)d.." msgstr "" #. Users column -#: ../src/disco.py:1578 +#: ../src/disco.py:1700 msgid "Users" msgstr "Arveridi" #. Description column -#: ../src/disco.py:1586 +#: ../src/disco.py:1708 msgid "Description" msgstr "Taolennadur" #. Id column -#: ../src/disco.py:1594 +#: ../src/disco.py:1716 msgid "Id" msgstr "" -#: ../src/disco.py:1659 ../src/gajim.py:3311 +#: ../src/disco.py:1781 ../src/gui_interface.py:3088 msgid "Bookmark already set" msgstr "Sined lakaet dija" -#: ../src/disco.py:1660 ../src/gajim.py:3312 +#: ../src/disco.py:1782 ../src/gui_interface.py:3089 #, fuzzy, python-format msgid "Group Chat \"%s\" is already in your bookmarks." msgstr "Emañ ar flap \"%s\" en ho sinedoù dija." -#: ../src/disco.py:1669 ../src/gajim.py:3325 +#: ../src/disco.py:1791 ../src/gui_interface.py:3102 msgid "Bookmark has been added successfully" msgstr "Gant berzh eo bet ouzhpennet ar sined" -#: ../src/disco.py:1670 ../src/gajim.py:3326 +#: ../src/disco.py:1792 ../src/gui_interface.py:3103 msgid "You can manage your bookmarks via Actions menu in your roster." msgstr "" "Bez e c'hellit merañ ho sinedoù dre ar meuziad Oberoù er roll-darempredoù." -#: ../src/disco.py:1863 +#: ../src/disco.py:2001 #, fuzzy msgid "Subscribed" msgstr "Emezelañ" -#: ../src/disco.py:1871 +#: ../src/disco.py:2009 #, fuzzy msgid "Node" msgstr "Hini ebet" -#: ../src/disco.py:1933 +#: ../src/disco.py:2073 msgid "New post" msgstr "" -#: ../src/disco.py:1939 +#: ../src/disco.py:2079 msgid "_Subscribe" msgstr "_Koumanantiñ" -#: ../src/disco.py:1945 +#: ../src/disco.py:2085 #, fuzzy msgid "_Unsubscribe" msgstr "_Koumanantiñ" -#: ../src/features_window.py:46 +#: ../src/features_window.py:48 msgid "SSL certificat validation" msgstr "" -#: ../src/features_window.py:47 +#: ../src/features_window.py:49 msgid "" "A library used to validate server certificates to ensure a secure connection." msgstr "" -#: ../src/features_window.py:48 ../src/features_window.py:49 +#: ../src/features_window.py:50 ../src/features_window.py:51 msgid "Requires python-pyopenssl." msgstr "" -#: ../src/features_window.py:50 +#: ../src/features_window.py:52 msgid "Bonjour / Zeroconf" msgstr "" -#: ../src/features_window.py:51 +#: ../src/features_window.py:53 msgid "Serverless chatting with autodetected clients in a local network." msgstr "" -#: ../src/features_window.py:52 +#: ../src/features_window.py:54 msgid "Requires python-avahi." msgstr "" -#: ../src/features_window.py:53 +#: ../src/features_window.py:55 msgid "Requires pybonjour (http://o2s.csail.mit.edu/o2s-wiki/pybonjour)." msgstr "" -#: ../src/features_window.py:54 +#: ../src/features_window.py:56 #, fuzzy msgid "Command line" msgstr "Urzhioù: %s" -#: ../src/features_window.py:55 +#: ../src/features_window.py:57 msgid "A script to control Gajim via commandline." msgstr "" -#: ../src/features_window.py:56 +#: ../src/features_window.py:58 msgid "Requires python-dbus." msgstr "" -#: ../src/features_window.py:57 ../src/features_window.py:61 -#: ../src/features_window.py:65 ../src/features_window.py:69 -#: ../src/features_window.py:73 ../src/features_window.py:81 -#: ../src/features_window.py:85 +#: ../src/features_window.py:59 ../src/features_window.py:63 +#: ../src/features_window.py:67 ../src/features_window.py:71 +#: ../src/features_window.py:75 ../src/features_window.py:83 +#: ../src/features_window.py:87 ../src/features_window.py:111 msgid "Feature not available under Windows." msgstr "" -#: ../src/features_window.py:58 +#: ../src/features_window.py:60 #, fuzzy msgid "OpenGPG message encryption" msgstr "Encryption OpenPGP" -#: ../src/features_window.py:59 +#: ../src/features_window.py:61 #, fuzzy msgid "Encrypting chat messages with gpg keys." msgstr "Kemennadenn o _tegouezhout:" -#: ../src/features_window.py:60 +#: ../src/features_window.py:62 msgid "Requires gpg and python-GnuPGInterface." msgstr "" -#: ../src/features_window.py:62 +#: ../src/features_window.py:64 #, fuzzy msgid "Network-manager" msgstr "Merour an istoradur" -#: ../src/features_window.py:63 +#: ../src/features_window.py:65 msgid "Autodetection of network status." msgstr "" -#: ../src/features_window.py:64 +#: ../src/features_window.py:66 msgid "Requires gnome-network-manager and python-dbus." msgstr "" -#: ../src/features_window.py:66 +#: ../src/features_window.py:68 #, fuzzy msgid "Session Management" msgstr "Kemennadenn gaset" -#: ../src/features_window.py:67 +#: ../src/features_window.py:69 msgid "Gajim session is stored on logout and restored on login." msgstr "" -#: ../src/features_window.py:68 +#: ../src/features_window.py:70 msgid "Requires python-gnome2." msgstr "" -#: ../src/features_window.py:70 +#: ../src/features_window.py:72 #, fuzzy msgid "Password encryption" msgstr "Ne glot ket ar gerioù-kuzh" -#: ../src/features_window.py:71 +#: ../src/features_window.py:73 msgid "Passwords can be stored securely and not just in plaintext." msgstr "" -#: ../src/features_window.py:72 +#: ../src/features_window.py:74 msgid "Requires gnome-keyring and python-gnome2-desktop, or kwalletcli." msgstr "" -#: ../src/features_window.py:74 +#: ../src/features_window.py:76 msgid "SRV" msgstr "" -#: ../src/features_window.py:75 +#: ../src/features_window.py:77 msgid "Ability to connect to servers which are using SRV records." msgstr "" -#: ../src/features_window.py:76 +#: ../src/features_window.py:78 msgid "Requires dnsutils." msgstr "" -#: ../src/features_window.py:77 +#: ../src/features_window.py:79 msgid "Requires nslookup to use SRV records." msgstr "" -#: ../src/features_window.py:78 +#: ../src/features_window.py:80 msgid "Spell Checker" msgstr "" -#: ../src/features_window.py:79 +#: ../src/features_window.py:81 msgid "Spellchecking of composed messages." msgstr "" -#: ../src/features_window.py:80 +#: ../src/features_window.py:82 msgid "Requires libgtkspell." msgstr "" -#: ../src/features_window.py:82 +#: ../src/features_window.py:84 #, fuzzy msgid "Notification" msgstr "Kemmañ ar gont" -#: ../src/features_window.py:83 +#: ../src/features_window.py:85 msgid "Passive popups notifying for new events." msgstr "" -#: ../src/features_window.py:84 +#: ../src/features_window.py:86 msgid "" "Requires python-notify or instead python-dbus in conjunction with " "notification-daemon." msgstr "" -#: ../src/features_window.py:86 -msgid "Trayicon" -msgstr "" - -#: ../src/features_window.py:87 -msgid "A icon in systemtray reflecting the current presence." -msgstr "" - #: ../src/features_window.py:88 -msgid "" -"Requires python-gnome2-extras or compiled trayicon module from Gajim sources." -msgstr "" - -#: ../src/features_window.py:89 -msgid "Requires PyGTK >= 2.10." -msgstr "" - -#: ../src/features_window.py:90 #, fuzzy msgid "Automatic status" msgstr "Goulenn evit gwelet e/he stad" -#: ../src/features_window.py:91 +#: ../src/features_window.py:89 msgid "Ability to measure idle time, in order to set auto status." msgstr "" -#: ../src/features_window.py:92 +#: ../src/features_window.py:90 msgid "Requires libxss library." msgstr "" -#: ../src/features_window.py:93 +#: ../src/features_window.py:91 msgid "Requires python2.5." msgstr "" -#: ../src/features_window.py:94 +#: ../src/features_window.py:92 msgid "LaTeX" msgstr "" -#: ../src/features_window.py:95 +#: ../src/features_window.py:93 msgid "Transform LaTeX expressions between $$ $$." msgstr "" -#: ../src/features_window.py:96 +#: ../src/features_window.py:94 msgid "" "Requires texlive-latex-base and dvipng. You have to set 'use_latex' to True " "in the Advanced Configuration Editor." msgstr "" -#: ../src/features_window.py:97 +#: ../src/features_window.py:95 msgid "" "Requires texlive-latex-base and dvipng (All is in MikTeX). You have to set " "'use_latex' to True in the Advanced Configuration Editor." msgstr "" -#: ../src/features_window.py:98 +#: ../src/features_window.py:96 #, fuzzy msgid "End to End message encryption" msgstr "Encryption OpenPGP" -#: ../src/features_window.py:99 +#: ../src/features_window.py:97 #, fuzzy msgid "Encrypting chat messages." msgstr "Kemennadenn o _tegouezhout:" -#: ../src/features_window.py:100 ../src/features_window.py:101 +#: ../src/features_window.py:98 ../src/features_window.py:99 msgid "Requires python-crypto." msgstr "" -#: ../src/features_window.py:102 +#: ../src/features_window.py:100 #, fuzzy msgid "RST Generator" msgstr "Hollek" -#: ../src/features_window.py:103 +#: ../src/features_window.py:101 msgid "" "Generate XHTML output from RST code (see http://docutils.sourceforge.net/" "docs/ref/rst/restructuredtext.html)." msgstr "" -#: ../src/features_window.py:104 ../src/features_window.py:105 +#: ../src/features_window.py:102 ../src/features_window.py:103 msgid "Requires python-docutils." msgstr "" -#: ../src/features_window.py:106 +#: ../src/features_window.py:104 msgid "Banners and clickable links" msgstr "" -#: ../src/features_window.py:107 +#: ../src/features_window.py:105 msgid "Ability to have clickable URLs in chat and groupchat window banners." msgstr "" -#: ../src/features_window.py:108 ../src/features_window.py:109 +#: ../src/features_window.py:106 ../src/features_window.py:107 msgid "Requires python-sexy." msgstr "" -#: ../src/features_window.py:123 +#: ../src/features_window.py:108 +msgid "Audio / Video" +msgstr "" + +#: ../src/features_window.py:109 +msgid "Ability to start audio and video chat." +msgstr "" + +#: ../src/features_window.py:110 +msgid "Requires python-farsight." +msgstr "" + +#: ../src/features_window.py:125 #, fuzzy msgid "Feature" msgstr "Perzhioù ar servijerien" @@ -7742,141 +7776,141 @@ msgstr "Mare" msgid "Progress" msgstr "Araokadur" -#: ../src/filetransfers_window.py:173 ../src/filetransfers_window.py:227 +#: ../src/filetransfers_window.py:177 ../src/filetransfers_window.py:233 #, python-format msgid "Filename: %s" msgstr "Anv ar restr: %s" -#: ../src/filetransfers_window.py:174 ../src/filetransfers_window.py:313 +#: ../src/filetransfers_window.py:178 ../src/filetransfers_window.py:323 #, python-format msgid "Size: %s" msgstr "Ment: %s" #. You is a reply of who sent a file #. You is a reply of who received a file -#: ../src/filetransfers_window.py:183 ../src/filetransfers_window.py:193 -#: ../src/history_manager.py:520 +#: ../src/filetransfers_window.py:187 ../src/filetransfers_window.py:197 +#: ../src/history_manager.py:529 msgid "You" msgstr "C'hwi" -#: ../src/filetransfers_window.py:184 +#: ../src/filetransfers_window.py:188 #, python-format msgid "Sender: %s" msgstr "Kaser: %s" -#: ../src/filetransfers_window.py:185 ../src/filetransfers_window.py:596 -#: ../src/tooltips.py:670 +#: ../src/filetransfers_window.py:189 ../src/filetransfers_window.py:617 +#: ../src/tooltips.py:651 msgid "Recipient: " msgstr "Resever:" -#: ../src/filetransfers_window.py:196 +#: ../src/filetransfers_window.py:200 #, python-format msgid "Saved in: %s" msgstr "Enrollet e-barzh: %s" -#: ../src/filetransfers_window.py:198 +#: ../src/filetransfers_window.py:202 msgid "File transfer completed" msgstr "Echu eo an treuzkas" -#: ../src/filetransfers_window.py:212 ../src/filetransfers_window.py:218 +#: ../src/filetransfers_window.py:217 ../src/filetransfers_window.py:224 #, fuzzy msgid "File transfer cancelled" msgstr "Nullet eo bet an treuzkas" -#: ../src/filetransfers_window.py:212 ../src/filetransfers_window.py:219 +#: ../src/filetransfers_window.py:217 ../src/filetransfers_window.py:225 msgid "Connection with peer cannot be established." msgstr "N'eus ket tu seveniñ al lugadenn gant an darempred." -#: ../src/filetransfers_window.py:228 +#: ../src/filetransfers_window.py:234 #, fuzzy, python-format msgid "Recipient: %s" msgstr "Resever:" -#: ../src/filetransfers_window.py:230 +#: ../src/filetransfers_window.py:236 #, fuzzy, python-format msgid "Error message: %s" msgstr "Fazi en ur lenn ar restr:" -#: ../src/filetransfers_window.py:231 +#: ../src/filetransfers_window.py:237 #, fuzzy msgid "File transfer stopped" msgstr "Sac'het an treuzkas" -#: ../src/filetransfers_window.py:251 +#: ../src/filetransfers_window.py:257 msgid "Choose File to Send..." msgstr "Dibabit ur restr da gas..." -#: ../src/filetransfers_window.py:267 ../src/tooltips.py:708 +#: ../src/filetransfers_window.py:273 ../src/tooltips.py:689 #, fuzzy msgid "Description: " msgstr "Taolennadur: %s" -#: ../src/filetransfers_window.py:278 +#: ../src/filetransfers_window.py:286 msgid "Gajim cannot access this file" msgstr "N'hell ket Gajim tizhout ar restr-mañ" -#: ../src/filetransfers_window.py:279 +#: ../src/filetransfers_window.py:287 msgid "This file is being used by another process." msgstr "Implijet eo ar restr-mañ gant ur poellad all." -#: ../src/filetransfers_window.py:310 +#: ../src/filetransfers_window.py:320 #, python-format msgid "File: %s" msgstr "Restr: %s" -#: ../src/filetransfers_window.py:316 +#: ../src/filetransfers_window.py:326 #, python-format msgid "Type: %s" msgstr "Doare: %s" -#: ../src/filetransfers_window.py:318 +#: ../src/filetransfers_window.py:328 #, python-format msgid "Description: %s" msgstr "Taolennadur: %s" -#: ../src/filetransfers_window.py:319 +#: ../src/filetransfers_window.py:329 #, python-format msgid "%s wants to send you a file:" msgstr "Fellout a ra da %s kas deoc'h ur restr:" -#: ../src/filetransfers_window.py:332 ../src/gtkgui_helpers.py:812 +#: ../src/filetransfers_window.py:342 ../src/gtkgui_helpers.py:858 #, python-format msgid "Cannot overwrite existing file \"%s\"" msgstr "" -#: ../src/filetransfers_window.py:333 ../src/gtkgui_helpers.py:814 +#: ../src/filetransfers_window.py:343 ../src/gtkgui_helpers.py:860 msgid "" "A file with this name already exists and you do not have permission to " "overwrite it." msgstr "" -#: ../src/filetransfers_window.py:349 ../src/gtkgui_helpers.py:818 +#: ../src/filetransfers_window.py:359 ../src/gtkgui_helpers.py:864 msgid "This file already exists" msgstr "Bez ez eus eus ar restr-mañ dija" -#: ../src/filetransfers_window.py:349 ../src/gtkgui_helpers.py:818 +#: ../src/filetransfers_window.py:359 ../src/gtkgui_helpers.py:864 msgid "What do you want to do?" msgstr "Petra a fell deoc'h ober?" #. read-only bit is used to mark special folder under windows, #. not to mark that a folder is read-only. See ticket #3587 -#: ../src/filetransfers_window.py:359 ../src/gtkgui_helpers.py:825 +#: ../src/filetransfers_window.py:369 ../src/gtkgui_helpers.py:871 #, python-format msgid "Directory \"%s\" is not writable" msgstr "" -#: ../src/filetransfers_window.py:359 ../src/gtkgui_helpers.py:826 +#: ../src/filetransfers_window.py:369 ../src/gtkgui_helpers.py:872 msgid "You do not have permission to create files in this directory." msgstr "" -#: ../src/filetransfers_window.py:369 +#: ../src/filetransfers_window.py:379 msgid "Save File as..." msgstr "Enrollañ ar restr dindan..." #. Print remaining time in format 00:00:00 #. You can change the places of (hours), (minutes), (seconds) - #. they are not translatable. -#: ../src/filetransfers_window.py:435 +#: ../src/filetransfers_window.py:449 #, python-format msgid "%(hours)02.d:%(minutes)02.d:%(seconds)02.d" msgstr "%(hours)02.d:%(minutes)02.d:%(seconds)02.d" @@ -7884,32 +7918,32 @@ msgstr "%(hours)02.d:%(minutes)02.d:%(seconds)02.d" #. This should make the string Kb/s, #. where 'Kb' part is taken from %s. #. Only the 's' after / (which means second) should be translated. -#: ../src/filetransfers_window.py:526 +#: ../src/filetransfers_window.py:542 #, python-format msgid "(%(filesize_unit)s/s)" msgstr "(%(filesize_unit)s/s)" -#: ../src/filetransfers_window.py:566 ../src/filetransfers_window.py:569 +#: ../src/filetransfers_window.py:585 ../src/filetransfers_window.py:588 msgid "Invalid File" msgstr "Restr direizh" -#: ../src/filetransfers_window.py:566 +#: ../src/filetransfers_window.py:585 msgid "File: " msgstr "Restr:" -#: ../src/filetransfers_window.py:570 +#: ../src/filetransfers_window.py:589 msgid "It is not possible to send empty files" msgstr "N'eus ket tu da gas restroù goullo" -#: ../src/filetransfers_window.py:592 ../src/tooltips.py:660 +#: ../src/filetransfers_window.py:613 ../src/tooltips.py:641 msgid "Name: " msgstr "Anv:" -#: ../src/filetransfers_window.py:594 ../src/tooltips.py:664 +#: ../src/filetransfers_window.py:615 ../src/tooltips.py:645 msgid "Sender: " msgstr "Kaser:" -#: ../src/filetransfers_window.py:781 +#: ../src/filetransfers_window.py:809 msgid "Pause" msgstr "Ehan" @@ -7980,444 +8014,40 @@ msgid "" msgstr "" #. set the icon to all newly opened wind -#: ../src/gajim.py:354 +#: ../src/gajim.py:328 msgid "Gajim is already running" msgstr "" -#: ../src/gajim.py:355 +#: ../src/gajim.py:329 msgid "" "Another instance of Gajim seems to be running\n" "Run anyway?" msgstr "" -#: ../src/gajim.py:440 -msgid "Passphrase Required" -msgstr "Ger-kuzh ret" - -#: ../src/gajim.py:441 -#, fuzzy, python-format -msgid "Enter GPG key passphrase for key %(keyid)s (account %(account)s)." -msgstr "Roit ho ker-kuzh GPG evit ar gont %s." - -#: ../src/gajim.py:455 -msgid "GPG key expired" -msgstr "" - -#: ../src/gajim.py:456 -#, fuzzy, python-format -msgid "Your GPG key has expied, you will be connected to %s without OpenPGP." -msgstr "Luget e voc'h da %s hep OpenPGP." - -#. ask again -#: ../src/gajim.py:465 -msgid "Wrong Passphrase" -msgstr "Ger-kuzh faos" - -#: ../src/gajim.py:466 -msgid "Please retype your GPG passphrase or press Cancel." -msgstr "Adroit ho ker-kuzh GPG pe pouezit war Nullañ." - -#: ../src/gajim.py:524 -#, fuzzy, python-format -msgid "" -"Your desired nickname in group chat %s is in use or registered by another " -"occupant.\n" -"Please specify another nickname below:" -msgstr "" -"Le surnom que vous vouliez utiliser est actuellement utilisé ou enregistré " -"par un autre occupant.\n" -"Veuillez entrer un autre surnom ci-dessous :" - -#: ../src/gajim.py:527 -msgid "Always use this nickname when there is a conflict" -msgstr "" - -#: ../src/gajim.py:544 -msgid "Do you accept this request?" -msgstr "Degemer a rit ar goulenn-mañ?" - -#: ../src/gajim.py:546 -#, fuzzy, python-format -msgid "Do you accept this request on account %s?" -msgstr "Degemer a rit ar goulenn-mañ?" - -#: ../src/gajim.py:549 -#, fuzzy, python-format -msgid "HTTP (%(method)s) Authorization for %(url)s (id: %(id)s)" -msgstr "Aotre HTTP (%s) evit %s (id : %s)" - -#: ../src/gajim.py:600 ../src/notify.py:511 -#, fuzzy -msgid "Connection Failed" -msgstr "Kevreadenn" - -#: ../src/gajim.py:933 ../src/gajim.py:937 -#, fuzzy, python-format -msgid "Error %(code)s: %(msg)s" -msgstr "%(nickname)s : %(message)s" - -#. ('MSGNOTSENT', account, (jid, ierror_msg, msg, time, session)) -#: ../src/gajim.py:947 ../src/gajim.py:961 -#, fuzzy, python-format -msgid "error while sending %(message)s ( %(error)s )" -msgstr "fazi en ur gas %s ( %s )" - -#: ../src/gajim.py:988 ../src/notify.py:513 -#, fuzzy -msgid "Subscription request" -msgstr "Goulenn koumanantiñ" - -#: ../src/gajim.py:1013 -msgid "Authorization accepted" -msgstr "Aotre degmeret" - -#: ../src/gajim.py:1014 -#, python-format -msgid "The contact \"%s\" has authorized you to see his or her status." -msgstr "Aotreet oc'h bet gant \"%s\" da welet e stad." - -#: ../src/gajim.py:1026 -#, python-format -msgid "Contact \"%s\" removed subscription from you" -msgstr "Dilamet eo bet ho aotre digant \"%s\"" - -#: ../src/gajim.py:1027 -msgid "" -"You will always see him or her as offline.\n" -"Do you want to remove him or her from your contact list?" -msgstr "" - -#: ../src/gajim.py:1052 ../src/notify.py:515 -#, fuzzy -msgid "Unsubscribed" -msgstr "_Koumanantiñ" - -#: ../src/gajim.py:1093 -#, python-format -msgid "Contact with \"%s\" cannot be established" -msgstr "N'eus ket tu da dizhout \"%s\"" - -#: ../src/gajim.py:1283 ../src/groupchat_control.py:1251 -#, fuzzy, python-format -msgid "%(nick)s is now known as %(new_nick)s" -msgstr "%s a zo bremañ %s" - -#: ../src/gajim.py:1308 ../src/groupchat_control.py:1436 -#: ../src/history_window.py:431 ../src/notify.py:244 -#, python-format -msgid "%(nick)s is now %(status)s" -msgstr "%(nick)s a zo bremañ %(status)s" - -#: ../src/gajim.py:1375 -#, python-format -msgid "%(jid)s has set the subject to %(subject)s" -msgstr "" - -#. Can be a presence (see chg_contact_status in groupchat_control.py) -#. Can be a message (see handle_event_gc_config_change in gajim.py) -#: ../src/gajim.py:1439 ../src/groupchat_control.py:1191 -msgid "Any occupant is allowed to see your full JID" -msgstr "" - -#: ../src/gajim.py:1442 -msgid "Room now shows unavailable member" -msgstr "" - -#: ../src/gajim.py:1444 -msgid "room now does not show unavailable members" -msgstr "" - -#: ../src/gajim.py:1447 -msgid "A non-privacy-related room configuration change has occurred" -msgstr "" - -#. Can be a presence (see chg_contact_status in groupchat_control.py) -#: ../src/gajim.py:1450 -msgid "Room logging is now enabled" -msgstr "" - -#: ../src/gajim.py:1452 -msgid "Room logging is now disabled" -msgstr "" - -#: ../src/gajim.py:1454 -msgid "Room is now non-anonymous" -msgstr "" - -#: ../src/gajim.py:1457 -msgid "Room is now semi-anonymous" -msgstr "" - -#: ../src/gajim.py:1460 -msgid "Room is now fully-anonymous" -msgstr "" - -#: ../src/gajim.py:1492 -#, fuzzy, python-format -msgid "A Password is required to join the room %s. Please type it." -msgstr "Un mot de passe est requis pour rejoindre ce salon." - -#: ../src/gajim.py:1526 -msgid "" -"You configured Gajim to use GPG agent, but there is no GPG agent running or " -"it returned a wrong passphrase.\n" -msgstr "" - -#: ../src/gajim.py:1528 ../src/gajim.py:1534 -msgid "You are currently connected without your OpenPGP key." -msgstr "Luget oc'h hep hoc'h alc'hwezh OpenPGP." - -#: ../src/gajim.py:1529 -msgid "Your passphrase is incorrect" -msgstr "Direizh eo ho ker-kuzh" - -#: ../src/gajim.py:1533 -#, fuzzy -msgid "OpenGPG Passphrase Incorrect" -msgstr "Direizh eo ho ker-kuzh" - -#: ../src/gajim.py:1559 -msgid "GPG key not trusted" -msgstr "" - -#: ../src/gajim.py:1559 -msgid "" -"The GPG key used to encrypt this chat is not trusted. Do you really want to " -"encrypt this message?" -msgstr "" - -#: ../src/gajim.py:1561 ../src/gajim.py:2227 ../src/gajim.py:2262 -#: ../src/groupchat_control.py:1674 ../src/message_window.py:222 -#: ../src/roster_window.py:2667 ../src/roster_window.py:3292 -#: ../src/roster_window.py:3970 -msgid "Do _not ask me again" -msgstr "_Chom hep goulenn ket" - -#: ../src/gajim.py:1571 -msgid "" -"Gnome Keyring is installed but not \t\t\t\tcorrectly started (environment " -"variable probably not \t\t\t\tcorrectly set)" -msgstr "" - -#: ../src/gajim.py:1681 -#, fuzzy, python-format -msgid "New mail on %(gmail_mail_address)s" -msgstr "Postel nevez war %(gmail_mail_address)s" - -#: ../src/gajim.py:1683 -#, fuzzy, python-format -msgid "You have %d new mail conversation" -msgid_plural "You have %d new mail conversations" -msgstr[0] "Bez ho peus %d postel nevez" -msgstr[1] "Bez ho peus %d postel nevez" - -#: ../src/gajim.py:1696 -#, python-format -msgid "" -"\n" -"\n" -"From: %(from_address)s\n" -"Subject: %(subject)s\n" -"%(snippet)s" -msgstr "" - -#: ../src/gajim.py:1767 -#, python-format -msgid "%s wants to send you a file." -msgstr "Fellout a ra da %s kas deoc'h ur restr." - -#: ../src/gajim.py:1805 ../src/roster_window.py:1851 -#, fuzzy -msgid "Remote contact stopped transfer" -msgstr "Dilemel an darempred diouzh ar roll" - -#: ../src/gajim.py:1807 ../src/roster_window.py:1853 -#, fuzzy -msgid "Error opening file" -msgstr "Fazi en ur lenn ar restr:" - -#: ../src/gajim.py:1838 -#, python-format -msgid "You successfully received %(filename)s from %(name)s." -msgstr "Gant berzh ho peus resevet %(filename)s digant %(name)s." - -#. ft stopped -#: ../src/gajim.py:1842 -#, python-format -msgid "File transfer of %(filename)s from %(name)s stopped." -msgstr "Arsavet eo an treuskas eus %(filename)s digant %(name)s." - -#: ../src/gajim.py:1855 -#, python-format -msgid "You successfully sent %(filename)s to %(name)s." -msgstr "Gant berzh ho peus kaset %(filename)s da %(name)s." - -#. ft stopped -#: ../src/gajim.py:1859 -#, python-format -msgid "File transfer of %(filename)s to %(name)s stopped." -msgstr "Arsavet eo an treuzkas eus %(filename)s da %(name)s." - -#: ../src/gajim.py:1961 -#, python-format -msgid "" -"Unable to decrypt message from %s\n" -"It may have been tampered with." -msgstr "" - -#: ../src/gajim.py:1968 -#, fuzzy -msgid "Unable to decrypt message" -msgstr "Da _bep kemennadenn:" - -#: ../src/gajim.py:2042 -msgid "Username Conflict" -msgstr "" - -#: ../src/gajim.py:2043 -#, fuzzy -msgid "Please type a new username for your local account" -msgstr "Leuniit an titouroù evit ho kont nevez" - -#: ../src/gajim.py:2055 -msgid "Ping?" -msgstr "" - -#: ../src/gajim.py:2068 -#, python-format -msgid "Pong! (%s s.)" -msgstr "" - -#: ../src/gajim.py:2079 -msgid "Error." -msgstr "" - -#: ../src/gajim.py:2106 -msgid "Resource Conflict" -msgstr "" - -#: ../src/gajim.py:2107 -msgid "" -"You are already connected to this account with the same resource. Please " -"type a new one" -msgstr "" - -#: ../src/gajim.py:2166 -msgid "Error verifying SSL certificate" -msgstr "" - -#: ../src/gajim.py:2167 -#, python-format -msgid "" -"There was an error verifying the SSL certificate of your jabber server: %" -"(error)s\n" -"Do you still want to connect to this server?" -msgstr "" - -#: ../src/gajim.py:2172 -msgid "Ignore this error for this certificate." -msgstr "" - -#: ../src/gajim.py:2192 -msgid "SSL certificate error" -msgstr "" - -#: ../src/gajim.py:2193 -#, python-format -msgid "" -"It seems the SSL certificate of account %(account)s has changed or your " -"connection is being hacked.\n" -"Old fingerprint: %(old)s\n" -"New fingerprint: %(new)s\n" -"\n" -"Do you still want to connect and update the fingerprint of the certificate?" -msgstr "" - -#: ../src/gajim.py:2223 ../src/gajim.py:2258 -#, fuzzy -msgid "Insecure connection" -msgstr "Kevreadenn" - -#: ../src/gajim.py:2224 -#, fuzzy -msgid "" -"You are about to send your password on an unencrypted connection. Are you " -"sure you want to do that?" -msgstr "Rankout a rit krouiñ ur gont a-raok gellout flapiñ gant tud all." - -#: ../src/gajim.py:2226 ../src/gajim.py:2261 -msgid "Yes, I really want to connect insecurely" -msgstr "" - -#: ../src/gajim.py:2259 -msgid "" -"You are about to send your password on an insecure connection. You should " -"install PyOpenSSL to prevent that. Are you sure you want to do that?" -msgstr "" - -#: ../src/gajim.py:2279 -msgid "PEP node was not removed" -msgstr "" - -#: ../src/gajim.py:2280 -#, python-format -msgid "PEP node %(node)s was not removed: %(message)s" -msgstr "" - -#. theme doesn't exist, disable emoticons -#: ../src/gajim.py:2784 ../src/gajim.py:2806 -#, fuzzy -msgid "Emoticons disabled" -msgstr "Lazhet eo ar sifrañ" - -#: ../src/gajim.py:2785 -msgid "" -"Your configured emoticons theme has not been found, so emoticons have been " -"disabled." -msgstr "" - -#: ../src/gajim.py:2807 -msgid "" -"Your configured emoticons theme cannot been loaded. You maybe need to update " -"the format of emoticons.py file. See http://trac.gajim.org/wiki/Emoticons " -"for more details." -msgstr "" - -#: ../src/gajim.py:2833 ../src/roster_window.py:3432 -#, fuzzy -msgid "You cannot join a group chat while you are invisible" -msgstr "N'hellit ket ebarzhiñ ur webgaoz keit ha m'emaoc'h diwelus." - -#. it is good to notify the user -#. in case he or she cannot see the output of the console -#: ../src/gajim.py:3202 -msgid "Could not save your settings and preferences" -msgstr "Dibosupl eo enrollañ ho tibarzhioù ha dibaboù" - -#: ../src/gajim-remote.py:78 +#: ../src/gajim-remote.py:77 #, fuzzy msgid "Shows a help on specific command" msgstr "diskouez ar skoazell evit un urzhiad resis" #. User gets help for the command, specified by this parameter -#: ../src/gajim-remote.py:81 +#: ../src/gajim-remote.py:80 msgid "command" msgstr "urzhiad" -#: ../src/gajim-remote.py:82 +#: ../src/gajim-remote.py:81 msgid "show help on command" msgstr "diskouez ar skoazell evit an urzhiad" -#: ../src/gajim-remote.py:86 +#: ../src/gajim-remote.py:85 msgid "Shows or hides the roster window" msgstr "Diskouez pe kuzhat ar prenestr pennañ" -#: ../src/gajim-remote.py:90 +#: ../src/gajim-remote.py:89 #, fuzzy msgid "Pops up a window with the next pending event" msgstr "A zifoup ur prenestr gant ar gemennadenn dilenn da-heul" -#: ../src/gajim-remote.py:94 +#: ../src/gajim-remote.py:93 #, fuzzy msgid "" "Prints a list of all contacts in the roster. Each contact appears on a " @@ -8425,49 +8055,49 @@ msgid "" msgstr "" "A ziskouez ur roll eus an holl zarempredoù, pep darempred war ul linenn." -#: ../src/gajim-remote.py:97 ../src/gajim-remote.py:112 -#: ../src/gajim-remote.py:122 ../src/gajim-remote.py:132 -#: ../src/gajim-remote.py:148 ../src/gajim-remote.py:162 -#: ../src/gajim-remote.py:171 ../src/gajim-remote.py:192 -#: ../src/gajim-remote.py:222 ../src/gajim-remote.py:231 -#: ../src/gajim-remote.py:238 ../src/gajim-remote.py:245 -#: ../src/gajim-remote.py:256 ../src/gajim-remote.py:272 -#: ../src/gajim-remote.py:283 +#: ../src/gajim-remote.py:96 ../src/gajim-remote.py:111 +#: ../src/gajim-remote.py:121 ../src/gajim-remote.py:131 +#: ../src/gajim-remote.py:147 ../src/gajim-remote.py:161 +#: ../src/gajim-remote.py:170 ../src/gajim-remote.py:191 +#: ../src/gajim-remote.py:221 ../src/gajim-remote.py:230 +#: ../src/gajim-remote.py:237 ../src/gajim-remote.py:244 +#: ../src/gajim-remote.py:255 ../src/gajim-remote.py:271 +#: ../src/gajim-remote.py:282 msgid "account" msgstr "kont" -#: ../src/gajim-remote.py:97 +#: ../src/gajim-remote.py:96 msgid "show only contacts of the given account" msgstr "diskouez darempredoù ar gont roet hepken" -#: ../src/gajim-remote.py:103 +#: ../src/gajim-remote.py:102 msgid "Prints a list of registered accounts" msgstr "A ziskouez roll ar c'hontoù enrollet" -#: ../src/gajim-remote.py:107 +#: ../src/gajim-remote.py:106 msgid "Changes the status of account or accounts" msgstr "A cheñch stad ar gont pe ar c'hontoù" #. offline, online, chat, away, xa, dnd, invisible should not be translated -#: ../src/gajim-remote.py:110 +#: ../src/gajim-remote.py:109 msgid "status" msgstr "stad" -#: ../src/gajim-remote.py:110 +#: ../src/gajim-remote.py:109 msgid "one of: offline, online, chat, away, xa, dnd, invisible " msgstr "unan eus: offline, online, chat, away, xa, dnd, invisible " -#: ../src/gajim-remote.py:111 ../src/gajim-remote.py:134 -#: ../src/gajim-remote.py:145 ../src/gajim-remote.py:159 -#: ../src/gajim-remote.py:170 ../src/gajim-remote.py:274 +#: ../src/gajim-remote.py:110 ../src/gajim-remote.py:133 +#: ../src/gajim-remote.py:144 ../src/gajim-remote.py:158 +#: ../src/gajim-remote.py:169 ../src/gajim-remote.py:273 msgid "message" msgstr "kemennadenn" -#: ../src/gajim-remote.py:111 +#: ../src/gajim-remote.py:110 msgid "status message" msgstr "titour stad" -#: ../src/gajim-remote.py:112 +#: ../src/gajim-remote.py:111 msgid "" "change status of account \"account\". If not specified, try to change status " "of all accounts that have \"sync with global status\" option set" @@ -8475,21 +8105,21 @@ msgstr "" "A cheñch stad ar gont \"kont\". Ma n'eus hini ebet roet, klaskit cheñch stad " "an holl gontoù o deus an dibab \"sync with global status\" enaouet" -#: ../src/gajim-remote.py:118 +#: ../src/gajim-remote.py:117 #, fuzzy msgid "Changes the priority of account or accounts" msgstr "A cheñch stad ar gont pe ar c'hontoù" -#: ../src/gajim-remote.py:120 +#: ../src/gajim-remote.py:119 msgid "priority" msgstr "" -#: ../src/gajim-remote.py:120 +#: ../src/gajim-remote.py:119 #, fuzzy msgid "priority you want to give to the account" msgstr "Fellout a ra din emezelañ evit krouiñ ur gont" -#: ../src/gajim-remote.py:122 +#: ../src/gajim-remote.py:121 #, fuzzy msgid "" "change the priority of the given account. If not specified, change status of " @@ -8498,25 +8128,25 @@ msgstr "" "A cheñch stad ar gont \"kont\". Ma n'eus hini ebet roet, klaskit cheñch stad " "an holl gontoù o deus an dibab \"sync with global status\" enaouet" -#: ../src/gajim-remote.py:128 +#: ../src/gajim-remote.py:127 msgid "Shows the chat dialog so that you can send messages to a contact" msgstr "" "A ziskouez ar prenestr flapiñ evit ma c'hellfec'h kas ur gemennadenn d'un " "darempred" -#: ../src/gajim-remote.py:130 +#: ../src/gajim-remote.py:129 msgid "JID of the contact that you want to chat with" msgstr "JID an darempred ho peus c'hoant flapiñ gantañ" -#: ../src/gajim-remote.py:132 ../src/gajim-remote.py:222 +#: ../src/gajim-remote.py:131 ../src/gajim-remote.py:221 msgid "if specified, contact is taken from the contact list of this account" msgstr "Si spécifié, le contact est pris dans la liste de contact de ce compte" -#: ../src/gajim-remote.py:135 +#: ../src/gajim-remote.py:134 msgid "message content. The account must be specified or \"\"" msgstr "" -#: ../src/gajim-remote.py:140 +#: ../src/gajim-remote.py:139 #, fuzzy msgid "" "Sends new chat message to a contact in the roster. Both OpenPGP key and " @@ -8527,29 +8157,29 @@ msgstr "" "compte sont facultatifs. Si vous voulez renseigner seulement le paramètre " "'compte' sans 'clé pgp', mettez simple la valeur '' pour 'clé pgp'." -#: ../src/gajim-remote.py:144 ../src/gajim-remote.py:157 +#: ../src/gajim-remote.py:143 ../src/gajim-remote.py:156 msgid "JID of the contact that will receive the message" msgstr "JID an darempred hag a resevo ar gemennadenn" -#: ../src/gajim-remote.py:145 ../src/gajim-remote.py:159 -#: ../src/gajim-remote.py:170 +#: ../src/gajim-remote.py:144 ../src/gajim-remote.py:158 +#: ../src/gajim-remote.py:169 msgid "message contents" msgstr "korf ar gemennadenn" -#: ../src/gajim-remote.py:146 ../src/gajim-remote.py:160 +#: ../src/gajim-remote.py:145 ../src/gajim-remote.py:159 msgid "pgp key" msgstr "alc'hwezh pgp" -#: ../src/gajim-remote.py:146 ../src/gajim-remote.py:160 +#: ../src/gajim-remote.py:145 ../src/gajim-remote.py:159 msgid "if specified, the message will be encrypted using this public key" msgstr "" -#: ../src/gajim-remote.py:148 ../src/gajim-remote.py:162 -#: ../src/gajim-remote.py:171 +#: ../src/gajim-remote.py:147 ../src/gajim-remote.py:161 +#: ../src/gajim-remote.py:170 msgid "if specified, the message will be sent using this account" msgstr "Ma vez resisaet, e vo kaset ar gemennadenn en ur implij ar gont-mañ" -#: ../src/gajim-remote.py:153 +#: ../src/gajim-remote.py:152 #, fuzzy msgid "" "Sends new single message to a contact in the roster. Both OpenPGP key and " @@ -8560,221 +8190,221 @@ msgstr "" "compte sont facultatifs. Si vous voulez renseigner seulement le paramètre " "'compte' sans 'clé pgp', mettez simple la valeur '' pour 'clé pgp'." -#: ../src/gajim-remote.py:158 +#: ../src/gajim-remote.py:157 #, fuzzy msgid "subject" msgstr "Titl" -#: ../src/gajim-remote.py:158 +#: ../src/gajim-remote.py:157 #, fuzzy msgid "message subject" msgstr "Kemennadenn gaset" -#: ../src/gajim-remote.py:167 +#: ../src/gajim-remote.py:166 msgid "Sends new message to a groupchat you've joined." msgstr "" -#: ../src/gajim-remote.py:169 +#: ../src/gajim-remote.py:168 #, fuzzy msgid "JID of the room that will receive the message" msgstr "JID an darempred hag a resevo ar gemennadenn" -#: ../src/gajim-remote.py:176 +#: ../src/gajim-remote.py:175 msgid "Gets detailed info on a contact" msgstr "Evit kargañ titouroù-munut un darempred" -#: ../src/gajim-remote.py:178 ../src/gajim-remote.py:191 -#: ../src/gajim-remote.py:221 ../src/gajim-remote.py:230 +#: ../src/gajim-remote.py:177 ../src/gajim-remote.py:190 +#: ../src/gajim-remote.py:220 ../src/gajim-remote.py:229 msgid "JID of the contact" msgstr "JID an darempred" -#: ../src/gajim-remote.py:182 +#: ../src/gajim-remote.py:181 msgid "Gets detailed info on a account" msgstr "Evit kargañ titouroù-munut ur gont" -#: ../src/gajim-remote.py:184 +#: ../src/gajim-remote.py:183 msgid "Name of the account" msgstr "Anv ar gont" -#: ../src/gajim-remote.py:188 +#: ../src/gajim-remote.py:187 msgid "Sends file to a contact" msgstr "Kas ur restr d'un darempred" -#: ../src/gajim-remote.py:190 +#: ../src/gajim-remote.py:189 msgid "file" msgstr "restr" -#: ../src/gajim-remote.py:190 +#: ../src/gajim-remote.py:189 msgid "File path" msgstr "Treug ar restr" -#: ../src/gajim-remote.py:192 +#: ../src/gajim-remote.py:191 msgid "if specified, file will be sent using this account" msgstr "m'eo resisaet, e vo kaset ar rest en ur implij ar gont-mañ" -#: ../src/gajim-remote.py:197 +#: ../src/gajim-remote.py:196 msgid "Lists all preferences and their values" msgstr "Roll an holl zibaboù hag o zalvoudoù" -#: ../src/gajim-remote.py:201 +#: ../src/gajim-remote.py:200 msgid "Sets value of 'key' to 'value'." msgstr "A laka talvoud an 'alc'hwezh' da 'dalvoud'." -#: ../src/gajim-remote.py:203 +#: ../src/gajim-remote.py:202 msgid "key=value" msgstr "alc'hwezh=talvoud" -#: ../src/gajim-remote.py:203 +#: ../src/gajim-remote.py:202 msgid "'key' is the name of the preference, 'value' is the value to set it to" msgstr "'alc'hwezh' eo anv an dibab, 'talvoud' eo an talvoud da lakaat dezhañ" -#: ../src/gajim-remote.py:208 +#: ../src/gajim-remote.py:207 msgid "Deletes a preference item" msgstr "A zilam un elfenn dibab" -#: ../src/gajim-remote.py:210 +#: ../src/gajim-remote.py:209 msgid "key" msgstr "touchenn" -#: ../src/gajim-remote.py:210 +#: ../src/gajim-remote.py:209 msgid "name of the preference to be deleted" msgstr "anv an dibab da zilemel" -#: ../src/gajim-remote.py:214 +#: ../src/gajim-remote.py:213 msgid "Writes the current state of Gajim preferences to the .config file" msgstr "A skriv stad red dibaboù Gajim er restr .config" -#: ../src/gajim-remote.py:219 +#: ../src/gajim-remote.py:218 msgid "Removes contact from roster" msgstr "Dilemel an darempred diouzh ar roll" -#: ../src/gajim-remote.py:228 +#: ../src/gajim-remote.py:227 msgid "Adds contact to roster" msgstr "Ouzhennañ an darempred d'ar roll" -#: ../src/gajim-remote.py:230 +#: ../src/gajim-remote.py:229 msgid "jid" msgstr "" -#: ../src/gajim-remote.py:231 +#: ../src/gajim-remote.py:230 #, fuzzy msgid "Adds new contact to this account" msgstr "Ouzhpennañ un darempred nevez d'ar gont-mañ." -#: ../src/gajim-remote.py:236 +#: ../src/gajim-remote.py:235 msgid "Returns current status (the global one unless account is specified)" msgstr "" "A ro ar stad red (an hini hollek, nemet ez eus bet resisaet ur gont bennak)" -#: ../src/gajim-remote.py:243 +#: ../src/gajim-remote.py:242 msgid "" "Returns current status message (the global one unless account is specified)" msgstr "" "A gas an titour-stad red (an hini hollek, nemet ez eus bet resisaet ur gont " "bennak)" -#: ../src/gajim-remote.py:250 +#: ../src/gajim-remote.py:249 #, fuzzy msgid "Returns number of unread messages" msgstr "A ro an niver a gemennadennoù chomet dilenn" -#: ../src/gajim-remote.py:254 +#: ../src/gajim-remote.py:253 msgid "Opens 'Start Chat' dialog" msgstr "" -#: ../src/gajim-remote.py:256 +#: ../src/gajim-remote.py:255 #, fuzzy msgid "Starts chat, using this account" msgstr "Kregiñ da flapiñ gant ar gont %s" -#: ../src/gajim-remote.py:260 +#: ../src/gajim-remote.py:259 msgid "Sends custom XML" msgstr "" -#: ../src/gajim-remote.py:262 +#: ../src/gajim-remote.py:261 msgid "XML to send" msgstr "" -#: ../src/gajim-remote.py:263 +#: ../src/gajim-remote.py:262 msgid "" "Account in which the xml will be sent; if not specified, xml will be sent to " "all accounts" msgstr "" -#: ../src/gajim-remote.py:269 +#: ../src/gajim-remote.py:268 msgid "Handle a xmpp:/ uri" msgstr "" -#: ../src/gajim-remote.py:271 +#: ../src/gajim-remote.py:270 msgid "uri" msgstr "" -#: ../src/gajim-remote.py:271 +#: ../src/gajim-remote.py:270 msgid "URI to handle" msgstr "" -#: ../src/gajim-remote.py:272 +#: ../src/gajim-remote.py:271 msgid "Account in which you want to handle it" msgstr "" -#: ../src/gajim-remote.py:274 +#: ../src/gajim-remote.py:273 #, fuzzy msgid "Message content" msgstr "korf ar gemennadenn" -#: ../src/gajim-remote.py:278 +#: ../src/gajim-remote.py:277 #, fuzzy msgid "Join a MUC room" msgstr "_Ebarzhiñ ur webgaoz nevez" -#: ../src/gajim-remote.py:280 +#: ../src/gajim-remote.py:279 #, fuzzy msgid "room" msgstr "Digant" -#: ../src/gajim-remote.py:280 +#: ../src/gajim-remote.py:279 #, fuzzy msgid "Room JID" msgstr "Webgaoz:" -#: ../src/gajim-remote.py:281 +#: ../src/gajim-remote.py:280 #, fuzzy msgid "nick" msgstr "Lesanv" -#: ../src/gajim-remote.py:281 +#: ../src/gajim-remote.py:280 #, fuzzy msgid "Nickname to use" msgstr "N'eus ket bet kavet al lesanv : %s" -#: ../src/gajim-remote.py:282 +#: ../src/gajim-remote.py:281 #, fuzzy msgid "password" msgstr "Ger-kuzh:" -#: ../src/gajim-remote.py:282 +#: ../src/gajim-remote.py:281 #, fuzzy msgid "Password to enter the room" msgstr "Ne glot ket ar gerioù-kuzh" -#: ../src/gajim-remote.py:283 +#: ../src/gajim-remote.py:282 msgid "Account from which you want to enter the room" msgstr "" -#: ../src/gajim-remote.py:288 +#: ../src/gajim-remote.py:287 msgid "Check if Gajim is running" msgstr "" -#: ../src/gajim-remote.py:292 +#: ../src/gajim-remote.py:291 #, fuzzy msgid "Shows or hides the ipython window" msgstr "Diskouez pe kuzhat ar prenestr pennañ" -#: ../src/gajim-remote.py:319 +#: ../src/gajim-remote.py:318 msgid "Missing argument \"contact_jid\"" msgstr "" -#: ../src/gajim-remote.py:338 +#: ../src/gajim-remote.py:339 #, python-format msgid "" "'%s' is not in your roster.\n" @@ -8783,31 +8413,31 @@ msgstr "" "N'emañ ket '%s' en hor roll darempredoù.\n" "Resisait ar gont evit kas ur gemennadenn." -#: ../src/gajim-remote.py:341 +#: ../src/gajim-remote.py:342 msgid "You have no active account" msgstr "N'ho peus kont bev ebet" -#: ../src/gajim-remote.py:393 +#: ../src/gajim-remote.py:395 msgid "It seems Gajim is not running. So you can't use gajim-remote." msgstr "" -#: ../src/gajim-remote.py:416 +#: ../src/gajim-remote.py:422 #, python-format msgid "" "Usage: %(basename)s %(command)s %(arguments)s \n" "\t %(help)s" msgstr "" -#: ../src/gajim-remote.py:420 +#: ../src/gajim-remote.py:426 msgid "Arguments:" msgstr "Arguments :" -#: ../src/gajim-remote.py:424 +#: ../src/gajim-remote.py:430 #, python-format msgid "%s not found" msgstr "N'eo ket bet kavet %s" -#: ../src/gajim-remote.py:428 +#: ../src/gajim-remote.py:436 #, python-format msgid "" "Usage: %s command [arguments]\n" @@ -8816,21 +8446,21 @@ msgstr "" "Implij: %s urzhiad [arguments]\n" "urzhiad eo unan eus :\n" -#: ../src/gajim-remote.py:493 +#: ../src/gajim-remote.py:505 #, python-format msgid "" "Too many arguments. \n" "Type \"%(basename)s help %(command)s\" for more info" msgstr "" -#: ../src/gajim-remote.py:498 +#: ../src/gajim-remote.py:510 #, python-format msgid "" "Argument \"%(arg)s\" is not specified. \n" "Type \"%(basename)s help %(command)s\" for more info" msgstr "" -#: ../src/gajim-remote.py:517 +#: ../src/gajim-remote.py:529 #, fuzzy msgid "Wrong uri" msgstr "Ger-kuzh faos" @@ -8861,175 +8491,199 @@ msgstr "N'hellit ket dilemel ar gwiskadur red" msgid "Please first choose another for your current theme." msgstr "Dibabit ur gwiskadur all da gentañ." -#: ../src/groupchat_control.py:162 +#: ../src/groupchat_control.py:167 msgid "Sending private message failed" msgstr "Kas ar gemennadenn brevez c'hwitet" #. in second %s code replaces with nickname -#: ../src/groupchat_control.py:164 +#: ../src/groupchat_control.py:169 #, fuzzy, python-format msgid "You are no longer in group chat \"%(room)s\" or \"%(nick)s\" has left." msgstr "N'emaoc'h ket er webgaoz \"%s\" ken, pe neuze eo aet kuit \"%s\"." -#: ../src/groupchat_control.py:436 +#: ../src/groupchat_control.py:439 #, fuzzy msgid "Insert Nickname" msgstr "Cheñch _lesanv" -#: ../src/groupchat_control.py:595 +#: ../src/groupchat_control.py:617 #, fuzzy msgid "Conversation with " msgstr "Istoradur ar gaoz" -#: ../src/groupchat_control.py:597 +#: ../src/groupchat_control.py:619 #, fuzzy msgid "Continued conversation" msgstr "Kevreadenn" #. Can be a message (see handle_event_gc_config_change in gajim.py) -#: ../src/groupchat_control.py:1194 +#. Can be a presence (see chg_contact_status in groupchat_control.py) +#: ../src/groupchat_control.py:1228 ../src/gui_interface.py:1050 +msgid "Any occupant is allowed to see your full JID" +msgstr "" + +#. Can be a message (see handle_event_gc_config_change in gajim.py) +#: ../src/groupchat_control.py:1231 msgid "Room logging is enabled" msgstr "" -#: ../src/groupchat_control.py:1196 +#: ../src/groupchat_control.py:1233 #, fuzzy msgid "A new room has been created" msgstr "Gant berzh eo bet krouet ho kont nevez!" -#: ../src/groupchat_control.py:1199 +#: ../src/groupchat_control.py:1236 msgid "The server has assigned or modified your roomnick" msgstr "" #. do not print 'kicked by None' -#: ../src/groupchat_control.py:1205 +#: ../src/groupchat_control.py:1242 #, python-format msgid "%(nick)s has been kicked: %(reason)s" msgstr "%(nick)s a zo bet skarzhet : %(reason)s" -#: ../src/groupchat_control.py:1209 +#: ../src/groupchat_control.py:1246 #, python-format msgid "%(nick)s has been kicked by %(who)s: %(reason)s" msgstr "%(nick)s a zo bet skarzhet gant %(who)s : %(reason)s" #. do not print 'banned by None' -#: ../src/groupchat_control.py:1219 +#: ../src/groupchat_control.py:1256 #, python-format msgid "%(nick)s has been banned: %(reason)s" msgstr "%(nick)s a zo argaset : %(reason)s" -#: ../src/groupchat_control.py:1223 +#: ../src/groupchat_control.py:1260 #, python-format msgid "%(nick)s has been banned by %(who)s: %(reason)s" msgstr "%(nick)s a zo argaset gant %(who)s : %(reason)s" -#: ../src/groupchat_control.py:1235 ../src/groupchat_control.py:1328 +#: ../src/groupchat_control.py:1272 ../src/groupchat_control.py:1365 #, python-format msgid "You are now known as %s" msgstr "Anavezet oc'h bremañ gant an anv %s" -#: ../src/groupchat_control.py:1289 ../src/groupchat_control.py:1293 -#: ../src/groupchat_control.py:1298 +#: ../src/groupchat_control.py:1288 ../src/gui_interface.py:894 +#, fuzzy, python-format +msgid "%(nick)s is now known as %(new_nick)s" +msgstr "%s a zo bremañ %s" + +#: ../src/groupchat_control.py:1326 ../src/groupchat_control.py:1330 +#: ../src/groupchat_control.py:1335 #, fuzzy, python-format msgid "%(nick)s has been removed from the room (%(reason)s)" msgstr "%(nick)s a zo bet skarzhet gant %(who)s : %(reason)s" -#: ../src/groupchat_control.py:1290 +#: ../src/groupchat_control.py:1327 msgid "affiliation changed" msgstr "" -#: ../src/groupchat_control.py:1295 +#: ../src/groupchat_control.py:1332 msgid "room configuration changed to members-only" msgstr "" -#: ../src/groupchat_control.py:1300 +#: ../src/groupchat_control.py:1337 msgid "system shutdown" msgstr "" -#: ../src/groupchat_control.py:1377 +#: ../src/groupchat_control.py:1414 #, python-format msgid "** Affiliation of %(nick)s has been set to %(affiliation)s by %(actor)s" msgstr "" -#: ../src/groupchat_control.py:1381 +#: ../src/groupchat_control.py:1418 #, python-format msgid "** Affiliation of %(nick)s has been set to %(affiliation)s" msgstr "" -#: ../src/groupchat_control.py:1396 +#: ../src/groupchat_control.py:1433 #, fuzzy, python-format msgid "** Role of %(nick)s has been set to %(role)s by %(actor)s" msgstr "%(nick)s a zo bet skarzhet gant %(who)s : %(reason)s" -#: ../src/groupchat_control.py:1400 +#: ../src/groupchat_control.py:1437 #, fuzzy, python-format msgid "** Role of %(nick)s has been set to %(role)s" msgstr "%(nick)s a zo bet skarzhet : %(reason)s" -#: ../src/groupchat_control.py:1429 +#: ../src/groupchat_control.py:1466 #, python-format msgid "%s has left" msgstr "Aet eo kuit %s" -#: ../src/groupchat_control.py:1434 +#: ../src/groupchat_control.py:1471 #, fuzzy, python-format msgid "%s has joined the group chat" msgstr "Er strollad" -#: ../src/groupchat_control.py:1668 +#: ../src/groupchat_control.py:1473 ../src/gui_interface.py:919 +#: ../src/history_window.py:442 ../src/notify.py:250 +#, python-format +msgid "%(nick)s is now %(status)s" +msgstr "%(nick)s a zo bremañ %(status)s" + +#: ../src/groupchat_control.py:1706 #, fuzzy, python-format msgid "Are you sure you want to leave group chat \"%s\"?" msgstr "Ha sur oc'h e fell deoc'h kuitaat ar flap \"%s\"?" -#: ../src/groupchat_control.py:1670 +#: ../src/groupchat_control.py:1708 #, fuzzy msgid "" "If you close this window, you will be disconnected from this group chat." msgstr "Ma serrit ar prenestr-mañ, e tigevreoc'h diouzh ar flap-mañ." -#: ../src/groupchat_control.py:1707 +#: ../src/groupchat_control.py:1712 ../src/gui_interface.py:1172 +#: ../src/gui_interface.py:1940 ../src/gui_interface.py:1975 +#: ../src/message_window.py:227 ../src/roster_window.py:2658 +#: ../src/roster_window.py:3301 ../src/roster_window.py:3990 +msgid "Do _not ask me again" +msgstr "_Chom hep goulenn ket" + +#: ../src/groupchat_control.py:1745 msgid "Changing Subject" msgstr "Cheñch ar sujed" -#: ../src/groupchat_control.py:1708 +#: ../src/groupchat_control.py:1746 msgid "Please specify the new subject:" msgstr "Skrivit ar sujed nevez:" -#: ../src/groupchat_control.py:1715 +#: ../src/groupchat_control.py:1753 msgid "Changing Nickname" msgstr "Cheñch lesanv" -#: ../src/groupchat_control.py:1716 +#: ../src/groupchat_control.py:1754 msgid "Please specify the new nickname you want to use:" msgstr "Skrivit al lesanv nevez a fell deoc'h implij:" #. Ask for a reason -#: ../src/groupchat_control.py:1745 +#: ../src/groupchat_control.py:1783 #, fuzzy, python-format msgid "Destroying %s" msgstr "Taolennadur: %s" -#: ../src/groupchat_control.py:1746 +#: ../src/groupchat_control.py:1784 msgid "" "You are going to definitively destroy this room.\n" "You may specify a reason below:" msgstr "" -#: ../src/groupchat_control.py:1748 +#: ../src/groupchat_control.py:1786 msgid "You may also enter an alternate venue:" msgstr "" #. ask for reason -#: ../src/groupchat_control.py:1921 +#: ../src/groupchat_control.py:1967 #, python-format msgid "Kicking %s" msgstr "Skarzhañ %s" -#: ../src/groupchat_control.py:1922 ../src/groupchat_control.py:2227 +#: ../src/groupchat_control.py:1968 ../src/groupchat_control.py:2291 msgid "You may specify a reason below:" msgstr "Bez e c'hellit reiñ un abeg amañ dindan:" #. ask for reason -#: ../src/groupchat_control.py:2226 +#: ../src/groupchat_control.py:2290 #, python-format msgid "Banning %s" msgstr "Argas %s" @@ -9053,60 +8707,450 @@ msgid "Details" msgstr "Munudoù" #. we talk about file -#: ../src/gtkgui_helpers.py:166 ../src/gtkgui_helpers.py:181 +#: ../src/gtkgui_helpers.py:171 ../src/gtkgui_helpers.py:186 #, python-format msgid "Error: cannot open %s for reading" msgstr "Fazi: dibosupl eo digeriñ %s evit e lenn" -#: ../src/gtkgui_helpers.py:351 +#: ../src/gtkgui_helpers.py:362 msgid "Error reading file:" msgstr "Fazi en ur lenn ar restr:" -#: ../src/gtkgui_helpers.py:354 +#: ../src/gtkgui_helpers.py:365 msgid "Error parsing file:" msgstr "" #. do not traceback (could be a permission problem) #. we talk about a file here -#: ../src/gtkgui_helpers.py:391 +#: ../src/gtkgui_helpers.py:406 #, fuzzy, python-format msgid "Could not write to %s. Session Management support will not work" msgstr "N'eus ket bet tu skrivañ e-barzh %s." #. xmpp: is currently handled by another program, so ask the user -#: ../src/gtkgui_helpers.py:728 +#: ../src/gtkgui_helpers.py:770 msgid "Gajim is not the default Jabber client" msgstr "" -#: ../src/gtkgui_helpers.py:729 +#: ../src/gtkgui_helpers.py:771 #, fuzzy msgid "Would you like to make Gajim the default Jabber client?" msgstr "Voulez-vous l'écraser ?" -#: ../src/gtkgui_helpers.py:730 +#: ../src/gtkgui_helpers.py:772 msgid "Always check to see if Gajim is the default Jabber client on startup" msgstr "" -#: ../src/gtkgui_helpers.py:799 +#: ../src/gtkgui_helpers.py:845 msgid "Extension not supported" msgstr "" -#: ../src/gtkgui_helpers.py:800 +#: ../src/gtkgui_helpers.py:846 #, python-format msgid "Image cannot be saved in %(type)s format. Save as %(new_filename)s?" msgstr "" -#: ../src/gtkgui_helpers.py:835 +#: ../src/gtkgui_helpers.py:881 #, fuzzy msgid "Save Image as..." msgstr "Enrollañ ar restr dindan..." -#: ../src/gui_menu_builder.py:89 +#: ../src/gui_interface.py:129 +#, fuzzy, python-format +msgid "" +"Your desired nickname in group chat %s is in use or registered by another " +"occupant.\n" +"Please specify another nickname below:" +msgstr "" +"Le surnom que vous vouliez utiliser est actuellement utilisé ou enregistré " +"par un autre occupant.\n" +"Veuillez entrer un autre surnom ci-dessous :" + +#: ../src/gui_interface.py:132 +msgid "Always use this nickname when there is a conflict" +msgstr "" + +#: ../src/gui_interface.py:149 +msgid "Do you accept this request?" +msgstr "Degemer a rit ar goulenn-mañ?" + +#: ../src/gui_interface.py:151 +#, fuzzy, python-format +msgid "Do you accept this request on account %s?" +msgstr "Degemer a rit ar goulenn-mañ?" + +#: ../src/gui_interface.py:154 +#, fuzzy, python-format +msgid "HTTP (%(method)s) Authorization for %(url)s (id: %(id)s)" +msgstr "Aotre HTTP (%s) evit %s (id : %s)" + +#: ../src/gui_interface.py:205 ../src/notify.py:524 +#, fuzzy +msgid "Connection Failed" +msgstr "Kevreadenn" + +#: ../src/gui_interface.py:544 ../src/gui_interface.py:548 +#, fuzzy, python-format +msgid "Error %(code)s: %(msg)s" +msgstr "%(nickname)s : %(message)s" + +#. ('MSGNOTSENT', account, (jid, ierror_msg, msg, time, session)) +#: ../src/gui_interface.py:558 ../src/gui_interface.py:572 +#, fuzzy, python-format +msgid "error while sending %(message)s ( %(error)s )" +msgstr "fazi en ur gas %s ( %s )" + +#: ../src/gui_interface.py:599 ../src/notify.py:526 +#, fuzzy +msgid "Subscription request" +msgstr "Goulenn koumanantiñ" + +#: ../src/gui_interface.py:624 +msgid "Authorization accepted" +msgstr "Aotre degmeret" + +#: ../src/gui_interface.py:625 +#, python-format +msgid "The contact \"%s\" has authorized you to see his or her status." +msgstr "Aotreet oc'h bet gant \"%s\" da welet e stad." + +#: ../src/gui_interface.py:637 +#, python-format +msgid "Contact \"%s\" removed subscription from you" +msgstr "Dilamet eo bet ho aotre digant \"%s\"" + +#: ../src/gui_interface.py:638 +msgid "" +"You will always see him or her as offline.\n" +"Do you want to remove him or her from your contact list?" +msgstr "" + +#: ../src/gui_interface.py:663 ../src/notify.py:528 +#, fuzzy +msgid "Unsubscribed" +msgstr "_Koumanantiñ" + +#: ../src/gui_interface.py:704 +#, python-format +msgid "Contact with \"%s\" cannot be established" +msgstr "N'eus ket tu da dizhout \"%s\"" + +#: ../src/gui_interface.py:986 +#, python-format +msgid "%(jid)s has set the subject to %(subject)s" +msgstr "" + +#: ../src/gui_interface.py:1053 +msgid "Room now shows unavailable member" +msgstr "" + +#: ../src/gui_interface.py:1055 +msgid "room now does not show unavailable members" +msgstr "" + +#: ../src/gui_interface.py:1058 +msgid "A non-privacy-related room configuration change has occurred" +msgstr "" + +#. Can be a presence (see chg_contact_status in groupchat_control.py) +#: ../src/gui_interface.py:1061 +msgid "Room logging is now enabled" +msgstr "" + +#: ../src/gui_interface.py:1063 +msgid "Room logging is now disabled" +msgstr "" + +#: ../src/gui_interface.py:1065 +msgid "Room is now non-anonymous" +msgstr "" + +#: ../src/gui_interface.py:1068 +msgid "Room is now semi-anonymous" +msgstr "" + +#: ../src/gui_interface.py:1071 +msgid "Room is now fully-anonymous" +msgstr "" + +#: ../src/gui_interface.py:1103 +#, fuzzy, python-format +msgid "A Password is required to join the room %s. Please type it." +msgstr "Un mot de passe est requis pour rejoindre ce salon." + +#: ../src/gui_interface.py:1137 +msgid "" +"You configured Gajim to use GPG agent, but there is no GPG agent running or " +"it returned a wrong passphrase.\n" +msgstr "" + +#: ../src/gui_interface.py:1139 ../src/gui_interface.py:1145 +msgid "You are currently connected without your OpenPGP key." +msgstr "Luget oc'h hep hoc'h alc'hwezh OpenPGP." + +#: ../src/gui_interface.py:1140 +msgid "Your passphrase is incorrect" +msgstr "Direizh eo ho ker-kuzh" + +#: ../src/gui_interface.py:1144 +#, fuzzy +msgid "OpenGPG Passphrase Incorrect" +msgstr "Direizh eo ho ker-kuzh" + +#: ../src/gui_interface.py:1170 +msgid "GPG key not trusted" +msgstr "" + +#: ../src/gui_interface.py:1170 +msgid "" +"The GPG key used to encrypt this chat is not trusted. Do you really want to " +"encrypt this message?" +msgstr "" + +#: ../src/gui_interface.py:1182 +msgid "" +"Gnome Keyring is installed but not \t\t\t\tcorrectly started (environment " +"variable probably not \t\t\t\tcorrectly set)" +msgstr "" + +#: ../src/gui_interface.py:1292 +#, fuzzy, python-format +msgid "New mail on %(gmail_mail_address)s" +msgstr "Postel nevez war %(gmail_mail_address)s" + +#: ../src/gui_interface.py:1294 +#, fuzzy, python-format +msgid "You have %d new mail conversation" +msgid_plural "You have %d new mail conversations" +msgstr[0] "Bez ho peus %d postel nevez" +msgstr[1] "Bez ho peus %d postel nevez" + +#: ../src/gui_interface.py:1307 +#, python-format +msgid "" +"\n" +"\n" +"From: %(from_address)s\n" +"Subject: %(subject)s\n" +"%(snippet)s" +msgstr "" + +#: ../src/gui_interface.py:1379 +#, python-format +msgid "%s wants to send you a file." +msgstr "Fellout a ra da %s kas deoc'h ur restr." + +#: ../src/gui_interface.py:1417 ../src/roster_window.py:1814 +#, fuzzy +msgid "Remote contact stopped transfer" +msgstr "Dilemel an darempred diouzh ar roll" + +#: ../src/gui_interface.py:1419 ../src/roster_window.py:1816 +#, fuzzy +msgid "Error opening file" +msgstr "Fazi en ur lenn ar restr:" + +#: ../src/gui_interface.py:1450 +#, python-format +msgid "You successfully received %(filename)s from %(name)s." +msgstr "Gant berzh ho peus resevet %(filename)s digant %(name)s." + +#. ft stopped +#: ../src/gui_interface.py:1454 +#, python-format +msgid "File transfer of %(filename)s from %(name)s stopped." +msgstr "Arsavet eo an treuskas eus %(filename)s digant %(name)s." + +#: ../src/gui_interface.py:1467 +#, python-format +msgid "You successfully sent %(filename)s to %(name)s." +msgstr "Gant berzh ho peus kaset %(filename)s da %(name)s." + +#. ft stopped +#: ../src/gui_interface.py:1471 +#, python-format +msgid "File transfer of %(filename)s to %(name)s stopped." +msgstr "Arsavet eo an treuzkas eus %(filename)s da %(name)s." + +#: ../src/gui_interface.py:1576 +#, python-format +msgid "" +"Unable to decrypt message from %s\n" +"It may have been tampered with." +msgstr "" + +#: ../src/gui_interface.py:1583 +#, fuzzy +msgid "Unable to decrypt message" +msgstr "Da _bep kemennadenn:" + +#: ../src/gui_interface.py:1657 +msgid "Username Conflict" +msgstr "" + +#: ../src/gui_interface.py:1658 +#, fuzzy +msgid "Please type a new username for your local account" +msgstr "Leuniit an titouroù evit ho kont nevez" + +#: ../src/gui_interface.py:1670 +msgid "Ping?" +msgstr "" + +#: ../src/gui_interface.py:1683 +#, python-format +msgid "Pong! (%s s.)" +msgstr "" + +#: ../src/gui_interface.py:1694 +msgid "Error." +msgstr "" + +#: ../src/gui_interface.py:1721 +msgid "Resource Conflict" +msgstr "" + +#: ../src/gui_interface.py:1722 +msgid "" +"You are already connected to this account with the same resource. Please " +"type a new one" +msgstr "" + +#: ../src/gui_interface.py:1771 +#, fuzzy, python-format +msgid "%s wants to start a voice chat." +msgstr "Fellout a ra da %s kas deoc'h ur restr." + +#: ../src/gui_interface.py:1774 +#, fuzzy +msgid "Voice Chat Request" +msgstr "Goulenn treuzkas" + +#: ../src/gui_interface.py:1879 +msgid "Error verifying SSL certificate" +msgstr "" + +#: ../src/gui_interface.py:1880 +#, python-format +msgid "" +"There was an error verifying the SSL certificate of your jabber server: %" +"(error)s\n" +"Do you still want to connect to this server?" +msgstr "" + +#: ../src/gui_interface.py:1885 +msgid "Ignore this error for this certificate." +msgstr "" + +#: ../src/gui_interface.py:1905 +msgid "SSL certificate error" +msgstr "" + +#: ../src/gui_interface.py:1906 +#, python-format +msgid "" +"It seems the SSL certificate of account %(account)s has changed or your " +"connection is being hacked.\n" +"Old fingerprint: %(old)s\n" +"New fingerprint: %(new)s\n" +"\n" +"Do you still want to connect and update the fingerprint of the certificate?" +msgstr "" + +#: ../src/gui_interface.py:1936 ../src/gui_interface.py:1971 +#, fuzzy +msgid "Insecure connection" +msgstr "Kevreadenn" + +#: ../src/gui_interface.py:1937 +#, fuzzy +msgid "" +"You are about to send your password on an unencrypted connection. Are you " +"sure you want to do that?" +msgstr "Rankout a rit krouiñ ur gont a-raok gellout flapiñ gant tud all." + +#: ../src/gui_interface.py:1939 ../src/gui_interface.py:1974 +msgid "Yes, I really want to connect insecurely" +msgstr "" + +#: ../src/gui_interface.py:1972 +msgid "" +"You are about to send your password on an insecure connection. You should " +"install PyOpenSSL to prevent that. Are you sure you want to do that?" +msgstr "" + +#: ../src/gui_interface.py:1992 +msgid "PEP node was not removed" +msgstr "" + +#: ../src/gui_interface.py:1993 +#, python-format +msgid "PEP node %(node)s was not removed: %(message)s" +msgstr "" + +#. theme doesn't exist, disable emoticons +#: ../src/gui_interface.py:2547 ../src/gui_interface.py:2569 +#, fuzzy +msgid "Emoticons disabled" +msgstr "Lazhet eo ar sifrañ" + +#: ../src/gui_interface.py:2548 +msgid "" +"Your configured emoticons theme has not been found, so emoticons have been " +"disabled." +msgstr "" + +#: ../src/gui_interface.py:2570 +msgid "" +"Your configured emoticons theme cannot been loaded. You maybe need to update " +"the format of emoticons.py file. See http://trac.gajim.org/wiki/Emoticons " +"for more details." +msgstr "" + +#: ../src/gui_interface.py:2598 ../src/roster_window.py:3441 +#, fuzzy +msgid "You cannot join a group chat while you are invisible" +msgstr "N'hellit ket ebarzhiñ ur webgaoz keit ha m'emaoc'h diwelus." + +#. it is good to notify the user +#. in case he or she cannot see the output of the console +#: ../src/gui_interface.py:2969 +msgid "Could not save your settings and preferences" +msgstr "Dibosupl eo enrollañ ho tibarzhioù ha dibaboù" + +#: ../src/gui_interface.py:3462 +msgid "Passphrase Required" +msgstr "Ger-kuzh ret" + +#: ../src/gui_interface.py:3463 +#, fuzzy, python-format +msgid "Enter GPG key passphrase for key %(keyid)s (account %(account)s)." +msgstr "Roit ho ker-kuzh GPG evit ar gont %s." + +#: ../src/gui_interface.py:3477 +msgid "GPG key expired" +msgstr "" + +#: ../src/gui_interface.py:3478 +#, fuzzy, python-format +msgid "Your GPG key has expired, you will be connected to %s without OpenPGP." +msgstr "Luget e voc'h da %s hep OpenPGP." + +#. ask again +#: ../src/gui_interface.py:3487 +msgid "Wrong Passphrase" +msgstr "Ger-kuzh faos" + +#: ../src/gui_interface.py:3488 +msgid "Please retype your GPG passphrase or press Cancel." +msgstr "Adroit ho ker-kuzh GPG pe pouezit war Nullañ." + +#: ../src/gui_menu_builder.py:93 #, fuzzy msgid "_New Group Chat" msgstr "Flap a-stroll" -#: ../src/gui_menu_builder.py:400 +#: ../src/gui_menu_builder.py:413 msgid "I would like to add you to my roster" msgstr "Laouen 'vefen d'az ouzhpennañ em roll-darempredoù" @@ -9121,7 +9165,7 @@ msgstr "Darempredoù" #. holds time #: ../src/history_manager.py:174 ../src/history_manager.py:214 -#: ../src/history_window.py:95 +#: ../src/history_window.py:97 msgid "Date" msgstr "Deiziad" @@ -9132,7 +9176,7 @@ msgstr "Lesanv" #. holds message #: ../src/history_manager.py:188 ../src/history_manager.py:220 -#: ../src/history_window.py:103 +#: ../src/history_window.py:105 msgid "Message" msgstr "Kemennadenn" @@ -9153,196 +9197,196 @@ msgid "" "In case you click YES, please wait..." msgstr "" -#: ../src/history_manager.py:458 +#: ../src/history_manager.py:467 msgid "Exporting History Logs..." msgstr "Oc'h ezporzhiañ an istoradur..." -#: ../src/history_manager.py:533 +#: ../src/history_manager.py:542 #, python-format msgid "%(who)s on %(time)s said: %(message)s\n" msgstr "%(time)s e lâras %(who)s: %(message)s\n" -#: ../src/history_manager.py:570 +#: ../src/history_manager.py:579 msgid "Do you really want to delete logs of the selected contact?" msgid_plural "Do you really want to delete logs of the selected contacts?" msgstr[0] "Ha sur oc'h e fell deoc'h diverkañ istoradur an darempred-mañ?" msgstr[1] "Ha sur oc'h e fell deoc'h diverkañ istoradur an darempredoù-mañ?" -#: ../src/history_manager.py:574 ../src/history_manager.py:609 +#: ../src/history_manager.py:583 ../src/history_manager.py:618 #, fuzzy msgid "This is an irreversible operation." msgstr "Setu un ober n'eus ket tu da vont war e giz." -#: ../src/history_manager.py:606 +#: ../src/history_manager.py:615 msgid "Do you really want to delete the selected message?" msgid_plural "Do you really want to delete the selected messages?" msgstr[0] "Ha fellout a ra deoc'h da vat diverkañ ar gemennadenn ziuzet?" msgstr[1] "Ha fellout a ra deoc'h da vat diverkañ ar c'hemennadennoù diuzet?" -#: ../src/history_window.py:298 +#: ../src/history_window.py:305 #, python-format msgid "Conversation History with %s" msgstr "Istoradur flapiñ gant %s" -#: ../src/history_window.py:343 +#: ../src/history_window.py:350 msgid "Disk Error" msgstr "" -#: ../src/history_window.py:427 +#: ../src/history_window.py:438 #, python-format msgid "%(nick)s is now %(status)s: %(status_msg)s" msgstr "%(nick)s a zo bremañ %(status)s : %(status_msg)s" -#: ../src/history_window.py:438 +#: ../src/history_window.py:449 #, fuzzy, python-format msgid "Error: %s" msgstr "Fazi en ur lenn ar restr:" -#: ../src/history_window.py:440 +#: ../src/history_window.py:451 msgid "Error" msgstr "" -#: ../src/history_window.py:442 +#: ../src/history_window.py:453 #, python-format msgid "Status is now: %(status)s: %(status_msg)s" msgstr "Ar stad a zo bremañ: %(status)s: %(status_msg)s" -#: ../src/history_window.py:445 +#: ../src/history_window.py:456 #, python-format msgid "Status is now: %(status)s" msgstr "Ar stad a zo bremañ: %(status)s" -#: ../src/htmltextview.py:512 ../src/htmltextview.py:522 +#: ../src/htmltextview.py:513 ../src/htmltextview.py:523 #, fuzzy msgid "Timeout loading image" msgstr "Dibosupl eo kargañ ar skeudenn" -#: ../src/htmltextview.py:532 +#: ../src/htmltextview.py:533 msgid "Image is too big" msgstr "L'image est trop grande" -#: ../src/message_window.py:220 +#: ../src/message_window.py:225 #, fuzzy msgid "You are going to close several tabs" msgstr "N'oc'h ket luget d'ar servijer" -#: ../src/message_window.py:221 +#: ../src/message_window.py:226 #, fuzzy msgid "Do you really want to close them all?" msgstr "Ha fellout a ra deoc'h da vat diverkañ ar gemennadenn ziuzet?" -#: ../src/message_window.py:481 +#: ../src/message_window.py:490 msgid "Chats" msgstr "Flapoù" -#: ../src/message_window.py:483 +#: ../src/message_window.py:492 msgid "Group Chats" msgstr "Flapoù a-stroll" -#: ../src/message_window.py:485 +#: ../src/message_window.py:494 msgid "Private Chats" msgstr "Flapoù prevez" -#: ../src/message_window.py:491 +#: ../src/message_window.py:500 msgid "Messages" msgstr "Kemennadennoù" -#: ../src/negotiation.py:32 +#: ../src/negotiation.py:34 msgid "- messages will be logged" msgstr "" -#: ../src/negotiation.py:34 +#: ../src/negotiation.py:36 msgid "- messages will not be logged" msgstr "" -#: ../src/notify.py:242 +#: ../src/notify.py:248 #, fuzzy, python-format msgid "%(nick)s Changed Status" msgstr "%(nick)s a zo bremañ %(status)s" -#: ../src/notify.py:252 +#: ../src/notify.py:258 #, python-format msgid "%(nickname)s Signed In" msgstr "Emañ %(nickname)s o paouez lugañ" -#: ../src/notify.py:260 +#: ../src/notify.py:266 #, python-format msgid "%(nickname)s Signed Out" msgstr "Emañ %(nickname)s o paouez dilugañ" -#: ../src/notify.py:272 +#: ../src/notify.py:278 #, python-format msgid "New Single Message from %(nickname)s" msgstr "Kemennadenn simpl nevez digant %(nickname)s" -#: ../src/notify.py:280 +#: ../src/notify.py:286 #, fuzzy, python-format msgid "New Private Message from group chat %s" msgstr "Kemennadenn hiniennel nevez digant ar sal %s" -#: ../src/notify.py:282 +#: ../src/notify.py:288 #, python-format msgid "%(nickname)s: %(message)s" msgstr "%(nickname)s : %(message)s" -#: ../src/notify.py:285 +#: ../src/notify.py:291 #, fuzzy, python-format msgid "Messaged by %(nickname)s" msgstr "Kemennadenn nevez digant %(nickname)s" -#: ../src/notify.py:291 +#: ../src/notify.py:297 #, python-format msgid "New Message from %(nickname)s" msgstr "Kemennadenn nevez digant %(nickname)s" -#: ../src/notify.py:555 +#: ../src/notify.py:568 #, fuzzy msgid "Ignore" msgstr "_Kenderc'hel" -#: ../src/profile_window.py:55 +#: ../src/profile_window.py:57 msgid "Retrieving profile..." msgstr "" -#: ../src/profile_window.py:108 ../src/roster_window.py:2852 +#: ../src/profile_window.py:110 ../src/roster_window.py:2845 #, fuzzy msgid "File is empty" msgstr "Treug ar restr" -#: ../src/profile_window.py:111 ../src/roster_window.py:2855 +#: ../src/profile_window.py:113 ../src/roster_window.py:2848 #, fuzzy msgid "File does not exist" msgstr "Ce salon n'existe pas." #. keep identation #. unknown format -#: ../src/profile_window.py:125 ../src/profile_window.py:141 -#: ../src/roster_window.py:2857 ../src/roster_window.py:2868 +#: ../src/profile_window.py:127 ../src/profile_window.py:143 +#: ../src/roster_window.py:2850 ../src/roster_window.py:2861 msgid "Could not load image" msgstr "Dibosupl eo kargañ ar skeudenn" -#: ../src/profile_window.py:251 +#: ../src/profile_window.py:255 #, fuzzy msgid "Information received" msgstr "Resevet ar bedadenn" -#: ../src/profile_window.py:318 +#: ../src/profile_window.py:326 msgid "Without a connection you can not publish your contact information." msgstr "Rankout a rit bezaén luget evit embann ho titouroù hiniennel." -#: ../src/profile_window.py:332 +#: ../src/profile_window.py:339 msgid "Sending profile..." msgstr "" -#: ../src/profile_window.py:347 +#: ../src/profile_window.py:354 msgid "Information NOT published" msgstr "" -#: ../src/profile_window.py:354 +#: ../src/profile_window.py:361 msgid "vCard publication failed" msgstr "C'hwitet eo embannadur ar vCard" -#: ../src/profile_window.py:355 +#: ../src/profile_window.py:362 msgid "" "There was an error while publishing your personal information, try again " "later." @@ -9350,46 +9394,51 @@ msgstr "" "Bez ez eus bet ur fazi en ur embann ho titouroù hiniennel, klaskit en-dro " "diwezhatoc'h." -#: ../src/roster_window.py:280 ../src/roster_window.py:1017 +#: ../src/roster_window.py:280 ../src/roster_window.py:1019 msgid "Merged accounts" msgstr "Kontoù strollet" -#: ../src/roster_window.py:1906 +#: ../src/roster_window.py:1871 msgid "Authorization has been sent" msgstr "Kaset eo bet an aotre" -#: ../src/roster_window.py:1907 +#: ../src/roster_window.py:1872 #, python-format msgid "Now \"%s\" will know your status." msgstr "Anavezout a raio \"%s\" ho stad adalek bremañ." -#: ../src/roster_window.py:1927 +#: ../src/roster_window.py:1894 msgid "Subscription request has been sent" msgstr "Kaset eo bet ar goulenn goumanantiñ" -#: ../src/roster_window.py:1928 +#: ../src/roster_window.py:1895 #, python-format msgid "If \"%s\" accepts this request you will know his or her status." msgstr "Ma asant \"%s\" ar c'houmanant e weloc'h he/e stad." -#: ../src/roster_window.py:1940 +#: ../src/roster_window.py:1909 msgid "Authorization has been removed" msgstr "Dilamet eo bet an aotre" -#: ../src/roster_window.py:1941 +#: ../src/roster_window.py:1910 #, python-format msgid "Now \"%s\" will always see you as offline." msgstr "Adalek bremañ e welo ac'hanoc'h \"%s\" atav evel pa vefec'h ezlinenn." -#: ../src/roster_window.py:1969 +#: ../src/roster_window.py:1938 msgid "GPG is not usable" msgstr "" -#: ../src/roster_window.py:2174 ../src/roster_window.py:3383 +#: ../src/roster_window.py:1939 +#, python-format +msgid "You will be connected to %s without OpenPGP." +msgstr "Luget e voc'h da %s hep OpenPGP." + +#: ../src/roster_window.py:2148 ../src/roster_window.py:3394 msgid "You are participating in one or more group chats" msgstr "Kemer a rit perzh e unan pe meur a webgaoz" -#: ../src/roster_window.py:2175 ../src/roster_window.py:3384 +#: ../src/roster_window.py:2149 ../src/roster_window.py:3395 msgid "" "Changing your status to invisible will result in disconnection from those " "group chats. Are you sure you want to go invisible?" @@ -9397,28 +9446,28 @@ msgstr "" "Tremen d'ar stad diwelus a lakao ac'hanoc'h da zilugañ diouzh ar webkaozioù-" "se. Ha sur oc'h e fell deoc'h bezañ diwelus?" -#: ../src/roster_window.py:2201 +#: ../src/roster_window.py:2175 msgid "desync'ed" msgstr "" -#: ../src/roster_window.py:2257 +#: ../src/roster_window.py:2236 msgid "Really quit Gajim?" msgstr "" -#: ../src/roster_window.py:2258 +#: ../src/roster_window.py:2237 #, fuzzy msgid "Are you sure you want to quit Gajim?" msgstr "Êtes-vous sûr de vouloir quitter les salons \"%s\" ?" -#: ../src/roster_window.py:2259 +#: ../src/roster_window.py:2238 msgid "Always close Gajim" msgstr "" -#: ../src/roster_window.py:2350 ../src/roster_window.py:2587 +#: ../src/roster_window.py:2333 ../src/roster_window.py:2576 msgid "You have unread messages" msgstr "Kemennadennoù nevez ho peus" -#: ../src/roster_window.py:2351 +#: ../src/roster_window.py:2334 #, fuzzy msgid "" "Messages will only be available for reading them later if you have history " @@ -9426,17 +9475,17 @@ msgid "" msgstr "" "Posubl e vo lenn ar gemennadennoù diwezhatoc'h m'emañ an istoradur war enaou." -#: ../src/roster_window.py:2588 +#: ../src/roster_window.py:2577 #, fuzzy msgid "You must read them before removing this transport." msgstr "Lennit an holl zarvoudoù a-raok lemel ar gont-mañ." -#: ../src/roster_window.py:2591 +#: ../src/roster_window.py:2580 #, python-format msgid "Transport \"%s\" will be removed" msgstr "Dilamet e vo an nor \"%s\"" -#: ../src/roster_window.py:2592 +#: ../src/roster_window.py:2581 #, fuzzy msgid "" "You will no longer be able to send and receive messages from contacts using " @@ -9445,12 +9494,12 @@ msgstr "" "N'helloc'h ket mui kas pe resev kemennadennoù d'an darempredoù liammet gant " "an nor-mañ." -#: ../src/roster_window.py:2595 +#: ../src/roster_window.py:2584 #, fuzzy msgid "Transports will be removed" msgstr "Dilamet e vo an nor \"%s\"" -#: ../src/roster_window.py:2600 +#: ../src/roster_window.py:2589 #, fuzzy, python-format msgid "" "You will no longer be able to send and receive messages to contacts from " @@ -9459,73 +9508,73 @@ msgstr "" "N'helloc'h ket mui kas pe resev kemennadennoù d'an darempredoù liammet gant " "an nor-mañ." -#: ../src/roster_window.py:2662 +#: ../src/roster_window.py:2653 #, fuzzy msgid "You are about to block a contact. Are you sure you want to continue?" msgstr "Rankout a rit krouiñ ur gont a-raok gellout flapiñ gant tud all." -#: ../src/roster_window.py:2664 +#: ../src/roster_window.py:2655 msgid "" "This contact will see you offline and you will not receive messages he will " "send you." msgstr "" #. it's jid -#: ../src/roster_window.py:2748 +#: ../src/roster_window.py:2741 #, fuzzy msgid "Rename Contact" msgstr "Darempredoù" -#: ../src/roster_window.py:2749 +#: ../src/roster_window.py:2742 #, fuzzy, python-format msgid "Enter a new nickname for contact %s" msgstr "Roit ho ker-kuzh GPG evit ar gont %s." -#: ../src/roster_window.py:2756 +#: ../src/roster_window.py:2749 #, fuzzy msgid "Rename Group" msgstr "_Adenvel" -#: ../src/roster_window.py:2757 +#: ../src/roster_window.py:2750 #, fuzzy, python-format msgid "Enter a new name for group %s" msgstr "Roit ho ker-kuzh GPG evit ar gont %s." -#: ../src/roster_window.py:2798 +#: ../src/roster_window.py:2791 #, fuzzy msgid "Remove Group" msgstr "_Dilemel" -#: ../src/roster_window.py:2799 +#: ../src/roster_window.py:2792 #, python-format msgid "Do you want to remove group %s from the roster?" msgstr "" -#: ../src/roster_window.py:2800 +#: ../src/roster_window.py:2793 #, fuzzy msgid "Also remove all contacts in this group from your roster" msgstr "Dilemel an darempred diouzh ar roll" -#: ../src/roster_window.py:2839 +#: ../src/roster_window.py:2832 msgid "Assign OpenPGP Key" msgstr "Assigner une clé OpenPGP" -#: ../src/roster_window.py:2840 +#: ../src/roster_window.py:2833 #, fuzzy msgid "Select a key to apply to the contact" msgstr "Dibabit un alc'hwezh da" -#: ../src/roster_window.py:3203 +#: ../src/roster_window.py:3210 #, python-format msgid "Contact \"%s\" will be removed from your roster" msgstr "Dilamet e vo an darempred \"%s\" diouzh ar roll" -#: ../src/roster_window.py:3205 +#: ../src/roster_window.py:3212 #, python-format msgid "You are about to remove \"%(name)s\" (%(jid)s) from your roster.\n" msgstr "" -#: ../src/roster_window.py:3210 +#: ../src/roster_window.py:3217 msgid "" "By removing this contact you also remove authorization resulting in him or " "her always seeing you as offline." @@ -9534,12 +9583,12 @@ msgstr "" "ac'hanoc'h evel pa vefec'h ezlinenn." #. Contact is not in roster -#: ../src/roster_window.py:3216 +#: ../src/roster_window.py:3223 #, fuzzy msgid "Do you want to continue?" msgstr "Petra a fell deoc'h ober?" -#: ../src/roster_window.py:3219 +#: ../src/roster_window.py:3226 msgid "" "By removing this contact you also by default remove authorization resulting " "in him or her always seeing you as offline." @@ -9547,17 +9596,17 @@ msgstr "" "En ur zilemel an darempred-mañ, e tilamit dre-ziouer he/e aotre. Atav e welo " "ac'hanoc'h evel pa vefec'h ezlinenn." -#: ../src/roster_window.py:3222 +#: ../src/roster_window.py:3229 msgid "I want this contact to know my status after removal" msgstr "Aotreañ an darempred-mañ da welout ma stad war-lerc'h e zilam" #. several contact to remove at the same time -#: ../src/roster_window.py:3226 +#: ../src/roster_window.py:3233 #, fuzzy msgid "Contacts will be removed from your roster" msgstr "Dilamet e vo an darempred \"%s\" diouzh ar roll" -#: ../src/roster_window.py:3231 +#: ../src/roster_window.py:3238 #, fuzzy, python-format msgid "" "By removing these contacts:%s\n" @@ -9566,68 +9615,68 @@ msgstr "" "En ur zilemel an darempred-mañ, e tilamit ivez e/he aotre. Atav e welo " "ac'hanoc'h evel pa vefec'h ezlinenn." -#: ../src/roster_window.py:3286 +#: ../src/roster_window.py:3295 #, fuzzy msgid "" "You are about to send a custom status. Are you sure you want to continue?" msgstr "Rankout a rit krouiñ ur gont a-raok gellout flapiñ gant tud all." -#: ../src/roster_window.py:3288 +#: ../src/roster_window.py:3297 #, python-format msgid "" "This contact will temporarily see you as %(status)s, but only until you " "change your status. Then he will see your global status." msgstr "" -#: ../src/roster_window.py:3305 +#: ../src/roster_window.py:3316 msgid "No account available" msgstr "Kont ebet hegerz" -#: ../src/roster_window.py:3306 +#: ../src/roster_window.py:3317 msgid "You must create an account before you can chat with other contacts." msgstr "Rankout a rit krouiñ ur gont a-raok gellout flapiñ gant tud all." -#: ../src/roster_window.py:3877 +#: ../src/roster_window.py:3897 msgid "Metacontacts storage not supported by your server" msgstr "" -#: ../src/roster_window.py:3879 +#: ../src/roster_window.py:3899 msgid "" "Your server does not support storing metacontacts information. So those " "information will not be saved on next reconnection." msgstr "" -#: ../src/roster_window.py:3964 +#: ../src/roster_window.py:3984 #, fuzzy msgid "" "You are about to create a metacontact. Are you sure you want to continue?" msgstr "Rankout a rit krouiñ ur gont a-raok gellout flapiñ gant tud all." -#: ../src/roster_window.py:3966 +#: ../src/roster_window.py:3986 msgid "" "Metacontacts are a way to regroup several contacts in one line. Generally it " "is used when the same person has several Jabber accounts or transport " "accounts." msgstr "" -#: ../src/roster_window.py:4081 +#: ../src/roster_window.py:4101 #, fuzzy msgid "Invalid file URI:" msgstr "Restr direizh" -#: ../src/roster_window.py:4092 +#: ../src/roster_window.py:4112 #, fuzzy, python-format msgid "Do you want to send this file to %s:" msgid_plural "Do you want to send these files to %s:" msgstr[0] "Fellout a ra da %s kas deoc'h ur restr:" msgstr[1] "Fellout a ra da %s kas deoc'h ur restr:" -#: ../src/roster_window.py:4207 +#: ../src/roster_window.py:4227 #, fuzzy, python-format msgid "Send %s to %s" msgstr "Kas %s" -#: ../src/roster_window.py:4213 +#: ../src/roster_window.py:4233 #, python-format msgid "Make %s and %s metacontacts" msgstr "Strollañ %s ha %s" @@ -9637,168 +9686,168 @@ msgstr "Strollañ %s ha %s" #. for chat_with #. for single message #. join gc -#: ../src/roster_window.py:4794 ../src/roster_window.py:4865 -#: ../src/roster_window.py:4874 ../src/systray.py:216 ../src/systray.py:263 -#: ../src/systray.py:269 +#: ../src/roster_window.py:4718 ../src/roster_window.py:4789 +#: ../src/roster_window.py:4798 ../src/statusicon.py:248 +#: ../src/statusicon.py:295 ../src/statusicon.py:301 #, python-format msgid "using account %s" msgstr "en ur implij ar gont %s" #. add -#: ../src/roster_window.py:4881 +#: ../src/roster_window.py:4805 #, python-format msgid "to %s account" msgstr "d'ar gont %s" #. disco -#: ../src/roster_window.py:4886 +#: ../src/roster_window.py:4810 #, python-format msgid "using %s account" msgstr "en ur implij ar gont %s" -#: ../src/roster_window.py:4923 ../src/systray.py:279 +#: ../src/roster_window.py:4847 ../src/statusicon.py:311 #, fuzzy msgid "_Manage Bookmarks..." msgstr "Merañ ar sinedoù..." #. profile, avatar -#: ../src/roster_window.py:4943 +#: ../src/roster_window.py:4867 #, python-format msgid "of account %s" msgstr "eus ar gont %s" -#: ../src/roster_window.py:4983 +#: ../src/roster_window.py:4907 #, python-format msgid "for account %s" msgstr "evit ar gont %s" -#: ../src/roster_window.py:5039 ../src/roster_window.py:5140 +#: ../src/roster_window.py:4963 ../src/roster_window.py:5064 msgid "_Change Status Message" msgstr "_Kemmañ an titour-stad" -#: ../src/roster_window.py:5066 +#: ../src/roster_window.py:4990 #, fuzzy msgid "Publish Tune" msgstr "_Embann" -#: ../src/roster_window.py:5074 +#: ../src/roster_window.py:4998 #, fuzzy msgid "Configure Services..." msgstr "_Dizoleiñ ar servijoù..." -#: ../src/roster_window.py:5228 +#: ../src/roster_window.py:5145 msgid "_Maximize All" msgstr "" #. Send Group Message -#: ../src/roster_window.py:5236 ../src/roster_window.py:5404 +#: ../src/roster_window.py:5153 ../src/roster_window.py:5325 #, fuzzy msgid "Send Group M_essage" msgstr "_Kas ur gemennadenn d'ar servijer" -#: ../src/roster_window.py:5244 +#: ../src/roster_window.py:5161 msgid "To all users" msgstr "" -#: ../src/roster_window.py:5248 +#: ../src/roster_window.py:5165 #, fuzzy msgid "To all online users" msgstr "Utilisateurs En _Ligne" #. Manage Transport submenu -#: ../src/roster_window.py:5424 +#: ../src/roster_window.py:5345 #, fuzzy msgid "_Manage Contacts" msgstr "Darempredoù" #. Edit Groups -#: ../src/roster_window.py:5432 +#: ../src/roster_window.py:5353 msgid "Edit _Groups" msgstr "Kemmañ ar _strolladoù" #. Send single message -#: ../src/roster_window.py:5485 +#: ../src/roster_window.py:5408 #, fuzzy msgid "Send Single Message" msgstr "_Kas ur gemennadenn simpl" #. Execute Command -#: ../src/roster_window.py:5531 +#: ../src/roster_window.py:5454 msgid "Execute Command..." msgstr "" #. Manage Transport submenu -#: ../src/roster_window.py:5541 +#: ../src/roster_window.py:5464 #, fuzzy msgid "_Manage Transport" msgstr "Dorioù" #. Modify Transport -#: ../src/roster_window.py:5549 +#: ../src/roster_window.py:5472 #, fuzzy msgid "_Modify Transport" msgstr "Dorioù" #. Rename -#: ../src/roster_window.py:5558 +#: ../src/roster_window.py:5481 msgid "_Rename" msgstr "_Adenvel" -#: ../src/roster_window.py:5623 +#: ../src/roster_window.py:5546 msgid "_Maximize" msgstr "" -#: ../src/roster_window.py:5631 +#: ../src/roster_window.py:5554 #, fuzzy msgid "_Reconnect" msgstr "Darempred diluget" -#: ../src/roster_window.py:5637 +#: ../src/roster_window.py:5560 #, fuzzy msgid "_Disconnect" msgstr "Darempred diluget" #. History manager -#: ../src/roster_window.py:5716 +#: ../src/roster_window.py:5642 msgid "History Manager" msgstr "Merour an istoradur" -#: ../src/roster_window.py:5725 +#: ../src/roster_window.py:5653 #, fuzzy msgid "_Join New Group Chat" msgstr "Ebarzhiñ ur sal-flapiñ" -#: ../src/roster_window.py:5881 +#: ../src/roster_window.py:5809 msgid "Change Status Message..." msgstr "Kemmañ an titour-stad..." -#: ../src/search_window.py:93 +#: ../src/search_window.py:94 msgid "Waiting for results" msgstr "" -#: ../src/search_window.py:133 ../src/search_window.py:211 +#: ../src/search_window.py:132 ../src/search_window.py:210 msgid "Error in received dataform" msgstr "" #. No result -#: ../src/search_window.py:167 ../src/search_window.py:203 +#: ../src/search_window.py:166 ../src/search_window.py:202 msgid "No result" msgstr "" -#: ../src/session.py:128 +#: ../src/session.py:132 msgid "Disk WriteError" msgstr "" -#: ../src/session.py:249 +#: ../src/session.py:254 #, fuzzy, python-format msgid "Subject: %s" msgstr "Sujed: %s\n" -#: ../src/session.py:422 ../src/session.py:457 +#: ../src/session.py:429 ../src/session.py:464 msgid "Confirm these session options" msgstr "" -#: ../src/session.py:424 +#: ../src/session.py:431 #, python-format msgid "" "The remote client wants to negotiate an session with these features:\n" @@ -9808,7 +9857,7 @@ msgid "" "\tAre these options acceptable?" msgstr "" -#: ../src/session.py:458 +#: ../src/session.py:465 #, python-format msgid "" "The remote client selected these options:\n" @@ -9818,120 +9867,120 @@ msgid "" "Continue with the session?" msgstr "" -#: ../src/systray.py:177 +#: ../src/statusicon.py:209 msgid "_Change Status Message..." msgstr "_Kemmañ an titour-stad..." -#: ../src/systray.py:293 +#: ../src/statusicon.py:325 msgid "Hide this menu" msgstr "Kuzhat ar meuziad-mañ" -#: ../src/tooltips.py:326 ../src/tooltips.py:520 +#: ../src/tooltips.py:347 ../src/tooltips.py:544 #, fuzzy msgid "Jabber ID: " msgstr "ID Jabber:" -#: ../src/tooltips.py:329 ../src/tooltips.py:524 +#: ../src/tooltips.py:350 ../src/tooltips.py:548 msgid "Resource: " msgstr "" -#: ../src/tooltips.py:334 +#: ../src/tooltips.py:355 #, python-format msgid "%(owner_or_admin_or_member)s of this group chat" msgstr "" -#: ../src/tooltips.py:431 +#: ../src/tooltips.py:455 msgid " [blocked]" msgstr "" -#: ../src/tooltips.py:435 +#: ../src/tooltips.py:459 msgid " [minimized]" msgstr "" -#: ../src/tooltips.py:450 ../src/tooltips.py:705 +#: ../src/tooltips.py:474 ../src/tooltips.py:686 msgid "Status: " msgstr "Stad:" -#: ../src/tooltips.py:480 +#: ../src/tooltips.py:504 #, fuzzy, python-format msgid "Last status: %s" msgstr "Stad diwezhañ: %s" -#: ../src/tooltips.py:482 +#: ../src/tooltips.py:506 #, fuzzy, python-format msgid " since %s" msgstr "dibaoe %s" -#: ../src/tooltips.py:500 +#: ../src/tooltips.py:524 #, fuzzy msgid "Connected" msgstr "Kevreadenn" -#: ../src/tooltips.py:502 +#: ../src/tooltips.py:526 #, fuzzy msgid "Disconnected" msgstr "Darempred diluget" #. ('both' is the normal sub so we don't show it) -#: ../src/tooltips.py:531 +#: ../src/tooltips.py:555 msgid "Subscription: " msgstr "Koumanant:" -#: ../src/tooltips.py:541 +#: ../src/tooltips.py:565 msgid "OpenPGP: " msgstr "OpenPGP : " -#: ../src/tooltips.py:637 +#: ../src/tooltips.py:618 #, fuzzy msgid "Tune:" msgstr "Doare:" -#: ../src/tooltips.py:663 +#: ../src/tooltips.py:644 msgid "Download" msgstr "Pellgargañ" -#: ../src/tooltips.py:669 +#: ../src/tooltips.py:650 msgid "Upload" msgstr "Kas" -#: ../src/tooltips.py:676 +#: ../src/tooltips.py:657 msgid "Type: " msgstr "Doare:" -#: ../src/tooltips.py:680 +#: ../src/tooltips.py:661 msgid "Transferred: " msgstr "Treuzkaset:" -#: ../src/tooltips.py:683 ../src/tooltips.py:704 +#: ../src/tooltips.py:664 ../src/tooltips.py:685 msgid "Not started" msgstr "N'eo ket kroget" -#: ../src/tooltips.py:687 +#: ../src/tooltips.py:668 msgid "Stopped" msgstr "Arsavet" -#: ../src/tooltips.py:689 ../src/tooltips.py:692 +#: ../src/tooltips.py:670 ../src/tooltips.py:673 msgid "Completed" msgstr "Echu" -#: ../src/tooltips.py:696 +#: ../src/tooltips.py:677 msgid "?transfer status:Paused" msgstr "" #. stalled is not paused. it is like 'frozen' it stopped alone -#: ../src/tooltips.py:700 +#: ../src/tooltips.py:681 msgid "Stalled" msgstr "" -#: ../src/tooltips.py:702 +#: ../src/tooltips.py:683 msgid "Transferring" msgstr "O treuzkas" -#: ../src/tooltips.py:738 +#: ../src/tooltips.py:721 msgid "This service has not yet responded with detailed information" msgstr "N'eus ket bet kaset titouroù munut gant ar servij-mañ c'hoazh" -#: ../src/tooltips.py:741 +#: ../src/tooltips.py:724 msgid "" "This service could not respond with detailed information.\n" "It is most likely legacy or broken" @@ -9939,37 +9988,37 @@ msgstr "" "N'eus ket bet kaset titouroù munut gant ar servij-mañ.\n" "Sur 'walc'h eo torr pe kamm" -#: ../src/vcard.py:245 +#: ../src/vcard.py:252 msgid "?Client:Unknown" msgstr "Dianav" -#: ../src/vcard.py:247 +#: ../src/vcard.py:254 msgid "?OS:Unknown" msgstr "Dianav" -#: ../src/vcard.py:268 +#: ../src/vcard.py:275 #, fuzzy msgid "?Time:Unknown" msgstr "Dianav" -#: ../src/vcard.py:292 ../src/vcard.py:302 ../src/vcard.py:511 +#: ../src/vcard.py:299 ../src/vcard.py:309 ../src/vcard.py:518 #, python-format msgid "since %s" msgstr "dibaoe %s" -#: ../src/vcard.py:331 +#: ../src/vcard.py:336 #, fuzzy msgid "Affiliation:" msgstr "Poelladoù" -#: ../src/vcard.py:339 +#: ../src/vcard.py:344 msgid "" "This contact is interested in your presence information, but you are not " "interested in his/her presence" msgstr "" "Dedennet eo an darempred-mañ gant ho pezañs, met n'oc'h ket gant he/e hini" -#: ../src/vcard.py:341 +#: ../src/vcard.py:346 msgid "" "You are interested in the contact's presence information, but he/she is not " "interested in yours" @@ -9977,30 +10026,54 @@ msgstr "" "Dedennet oc'h gant bezañs an darempred-mañ, met hennezh/hounnez n'eo ket " "gant ho hini" -#: ../src/vcard.py:343 +#: ../src/vcard.py:348 msgid "You and the contact are interested in each other's presence information" msgstr "Dedennet hoc'h an eil gant bezañs egile/eben" #. None -#: ../src/vcard.py:345 +#: ../src/vcard.py:350 msgid "" "You are not interested in the contact's presence, and neither he/she is " "interested in yours" msgstr "" "N'oc'h ket dedennet gant bezañs an darempred-mañ, nag eñ/hi gant ho hini" -#: ../src/vcard.py:352 +#: ../src/vcard.py:357 msgid "You are waiting contact's answer about your subscription request" msgstr "Emaoc'h o c'hortoz respont an darempred d'ho koulenn koumanantiñ" -#: ../src/vcard.py:354 +#: ../src/vcard.py:359 msgid "There is no pending subscription request." msgstr "" -#: ../src/vcard.py:359 ../src/vcard.py:413 ../src/vcard.py:536 +#: ../src/vcard.py:364 ../src/vcard.py:418 ../src/vcard.py:541 msgid " resource with priority " msgstr "" +#~ msgid "_Incoming message:" +#~ msgstr "Kemennadenn o _tegouezhout:" + +#~ msgid "_Outgoing message:" +#~ msgstr "Kemennadenn o _vont 'maez:" + +#, fuzzy +#~ msgid "gtk-ok" +#~ msgstr "gtk+" + +#~ msgid "OpenPGP passphrase was not given" +#~ msgstr "N'eo ket bet roet ar ger-kuzh OpenPGP" + +#~ msgid "" +#~ "To continue sending and receiving messages, you will need to reconnect." +#~ msgstr "" +#~ "Evit kenderc'hel da gas ha da resev kemennadennoù, e rankit lugañ en-dro." + +#~ msgid "[This message is encrypted]" +#~ msgstr "[Sifret eo ar gemennadenn-mañ]" + +#~ msgid "%i days ago" +#~ msgstr "%i devezh 'zo" + #~ msgid "Add Special _Notification" #~ msgstr "Ouzhpennañ ur gelaouenn _ispisial" @@ -10245,9 +10318,6 @@ msgstr "" #~ msgid "Also known as iChat style" #~ msgstr "Anvet ivez stil iChat" -#~ msgid "B_efore nickname:" -#~ msgstr "_A-raok al lesanv:" - #~ msgid "Chat" #~ msgstr "Flap" diff --git a/po/cs.po b/po/cs.po index b6d2479c0..18adb40a9 100644 --- a/po/cs.po +++ b/po/cs.po @@ -21,7 +21,7 @@ msgid "" msgstr "" "Project-Id-Version: gajim\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2009-10-28 22:17+0100\n" +"POT-Creation-Date: 2009-11-25 22:20+0100\n" "PO-Revision-Date: 2009-08-19 23:44+0200\n" "Last-Translator: Petr Menšík \n" "Language-Team: <>\n" @@ -293,9 +293,9 @@ msgstr "Upravit osobní informace..." #. No configured account #: ../data/glade/account_modification_window.glade.h:16 #: ../data/glade/accounts_window.glade.h:21 -#: ../data/glade/roster_window.glade.h:5 ../src/common/helpers.py:1217 -#: ../src/common/helpers.py:1229 ../src/notify.py:547 ../src/notify.py:568 -#: ../src/notify.py:607 ../src/notify.py:619 +#: ../data/glade/roster_window.glade.h:5 ../src/common/helpers.py:1100 +#: ../src/common/helpers.py:1112 ../src/notify.py:560 ../src/notify.py:581 +#: ../src/notify.py:620 ../src/notify.py:632 msgid "Gajim" msgstr "Gajim" @@ -304,9 +304,9 @@ msgstr "Gajim" #. General group cannot be changed #: ../data/glade/account_modification_window.glade.h:17 #: ../data/glade/accounts_window.glade.h:22 -#: ../data/glade/preferences_window.glade.h:50 ../src/common/contacts.py:98 -#: ../src/dialogs.py:103 ../src/dialogs.py:111 ../src/roster_window.py:2753 -#: ../src/roster_window.py:5351 +#: ../data/glade/preferences_window.glade.h:52 ../src/common/contacts.py:135 +#: ../src/dialogs.py:111 ../src/dialogs.py:121 ../src/roster_window.py:2746 +#: ../src/roster_window.py:5268 msgid "General" msgstr "Obecné" @@ -364,21 +364,21 @@ msgid "Information about you, as stored in the server" msgstr "Informace o Vás, jak jsou uloženy na serveru" #: ../data/glade/account_modification_window.glade.h:27 -#: ../data/glade/accounts_window.glade.h:35 ../src/config.py:1585 -#: ../src/config.py:2131 +#: ../data/glade/accounts_window.glade.h:35 ../src/config.py:1646 +#: ../src/config.py:2196 msgid "No key selected" msgstr "Není zvolen žádný klíč" #. None means no proxy profile selected #: ../data/glade/account_modification_window.glade.h:29 #: ../data/glade/accounts_window.glade.h:37 -#: ../data/glade/change_mood_dialog.glade.h:3 ../src/config.py:1106 -#: ../src/config.py:1209 ../src/config.py:1489 ../src/config.py:1494 -#: ../src/config.py:2038 ../src/config.py:2117 ../src/config.py:2130 -#: ../src/config.py:3317 ../src/config.py:3390 ../src/dialogs.py:293 -#: ../src/dialogs.py:295 ../src/dialogs.py:498 ../src/dialogs.py:511 -#: ../src/roster_window.py:2807 ../src/roster_window.py:2813 -#: ../src/roster_window.py:2818 +#: ../data/glade/change_mood_dialog.glade.h:3 ../src/config.py:1158 +#: ../src/config.py:1261 ../src/config.py:1550 ../src/config.py:1555 +#: ../src/config.py:2103 ../src/config.py:2182 ../src/config.py:2195 +#: ../src/config.py:3396 ../src/config.py:3469 ../src/dialogs.py:308 +#: ../src/dialogs.py:310 ../src/dialogs.py:513 ../src/dialogs.py:526 +#: ../src/roster_window.py:2800 ../src/roster_window.py:2806 +#: ../src/roster_window.py:2811 msgid "None" msgstr "Žádný" @@ -533,8 +533,8 @@ msgstr "" "Můžeš také zvážit změnu nastavení firewallu." #: ../data/glade/accounts_window.glade.h:32 -#: ../data/glade/zeroconf_information_window.glade.h:4 ../src/config.py:1612 -#: ../src/dialogs.py:806 +#: ../data/glade/zeroconf_information_window.glade.h:4 ../src/config.py:1673 +#: ../src/dialogs.py:830 msgid "Jabber ID:" msgstr "Jabber ID:" @@ -548,7 +548,7 @@ msgid "Mer_ge accounts" msgstr "_Spojit účty" #. Rename -#: ../data/glade/accounts_window.glade.h:42 ../src/roster_window.py:5302 +#: ../data/glade/accounts_window.glade.h:42 ../src/roster_window.py:5219 msgid "Re_name" msgstr "Přejme_novat" @@ -944,7 +944,7 @@ msgstr "Naposledy upraveno:" msgid "New entry received" msgstr "Přijat nový záznam" -#: ../data/glade/atom_entry_window.glade.h:5 ../src/atom_window.py:114 +#: ../data/glade/atom_entry_window.glade.h:5 ../src/atom_window.py:124 msgid "You have received new entry:" msgstr "Dostal(a) jste novou položku: " @@ -988,11 +988,11 @@ msgstr "Zadejte heslo:" msgid "Type your new status message" msgstr "Napište nový popis stavu" -#: ../data/glade/change_status_message_dialog.glade.h:2 ../src/tooltips.py:601 +#: ../data/glade/change_status_message_dialog.glade.h:2 ../src/tooltips.py:613 msgid "Activity:" msgstr "Činnost:" -#: ../data/glade/change_status_message_dialog.glade.h:3 ../src/tooltips.py:586 +#: ../data/glade/change_status_message_dialog.glade.h:3 ../src/tooltips.py:608 msgid "Mood:" msgstr "Nálada:" @@ -1083,8 +1083,8 @@ msgstr "Upravit _skupiny" #. Invite to #. Invite to Groupchat -#: ../data/glade/contact_context_menu.glade.h:6 ../src/roster_window.py:5257 -#: ../src/roster_window.py:5412 +#: ../data/glade/contact_context_menu.glade.h:6 ../src/roster_window.py:5174 +#: ../src/roster_window.py:5333 msgid "In_vite to" msgstr "_Pozvat do" @@ -1097,8 +1097,8 @@ msgid "Remo_ve" msgstr "Odst_ranit" #. Send Custom Status -#: ../data/glade/contact_context_menu.glade.h:9 ../src/roster_window.py:5267 -#: ../src/roster_window.py:5497 +#: ../data/glade/contact_context_menu.glade.h:9 ../src/roster_window.py:5184 +#: ../src/roster_window.py:5420 msgid "Send Cus_tom Status" msgstr "Poslat vlastní stav" @@ -1131,8 +1131,8 @@ msgid "_Allow him/her to see my status" msgstr "_Dovol kontaktu vidět můj stav" #: ../data/glade/contact_context_menu.glade.h:18 -#: ../data/glade/gc_occupants_menu.glade.h:7 ../src/roster_window.py:5330 -#: ../src/roster_window.py:5449 ../src/roster_window.py:5578 +#: ../data/glade/gc_occupants_menu.glade.h:7 ../src/roster_window.py:5247 +#: ../src/roster_window.py:5370 ../src/roster_window.py:5501 msgid "_Block" msgstr "_Blokovat" @@ -1143,7 +1143,7 @@ msgstr "_Zakaž mu/jí vidět můj stav" #: ../data/glade/contact_context_menu.glade.h:20 #: ../data/glade/gc_control_popup_menu.glade.h:6 #: ../data/glade/gc_occupants_menu.glade.h:8 -#: ../data/glade/roster_window.glade.h:21 ../src/roster_window.py:5647 +#: ../data/glade/roster_window.glade.h:21 ../src/roster_window.py:5570 msgid "_History" msgstr "_Historie" @@ -1164,8 +1164,8 @@ msgid "_Subscription" msgstr "_Autorizace" #: ../data/glade/contact_context_menu.glade.h:25 -#: ../data/glade/gc_occupants_menu.glade.h:13 ../src/roster_window.py:5324 -#: ../src/roster_window.py:5443 ../src/roster_window.py:5575 +#: ../data/glade/gc_occupants_menu.glade.h:13 ../src/roster_window.py:5241 +#: ../src/roster_window.py:5364 ../src/roster_window.py:5498 msgid "_Unblock" msgstr "_Odblokovat" @@ -1253,7 +1253,7 @@ msgstr "" msgid "When a file transfer is complete show a popup notification" msgstr "Zobraz upozornění, až bude přenos souboru dokončen" -#: ../data/glade/filetransfers.glade.h:13 ../src/filetransfers_window.py:792 +#: ../data/glade/filetransfers.glade.h:13 ../src/filetransfers_window.py:820 msgid "_Continue" msgstr "_Pokračovat" @@ -1261,7 +1261,7 @@ msgstr "_Pokračovat" msgid "_Notify me when a file transfer is complete" msgstr "_Upozornit mě po dokončení přenosu souboru" -#: ../data/glade/filetransfers.glade.h:15 ../src/filetransfers_window.py:200 +#: ../data/glade/filetransfers.glade.h:15 ../src/filetransfers_window.py:204 msgid "_Open Containing Folder" msgstr "_Otevřít obsahující složku" @@ -1290,7 +1290,7 @@ msgstr "" "Řádek kontaktu\n" "Nadpis rozhovoru" -#: ../data/glade/gajim_themes_window.glade.h:6 ../src/chat_control.py:818 +#: ../data/glade/gajim_themes_window.glade.h:6 ../src/chat_control.py:859 msgid "Bold" msgstr "Tučné" @@ -1310,11 +1310,11 @@ msgstr "Úprava témat Gajimu" msgid "Gone" msgstr "Pryč" -#: ../data/glade/gajim_themes_window.glade.h:11 ../src/common/pep.py:153 +#: ../data/glade/gajim_themes_window.glade.h:11 ../src/common/pep.py:150 msgid "Inactive" msgstr "Neaktivní" -#: ../data/glade/gajim_themes_window.glade.h:12 ../src/chat_control.py:819 +#: ../data/glade/gajim_themes_window.glade.h:12 ../src/chat_control.py:860 msgid "Italic" msgstr "Latinka" @@ -1363,7 +1363,7 @@ msgstr "Změnit _předmět" msgid "Configure _Room..." msgstr "Nastavit _místnost" -#: ../data/glade/gc_control_popup_menu.glade.h:4 ../src/disco.py:1624 +#: ../data/glade/gc_control_popup_menu.glade.h:4 ../src/disco.py:1746 msgid "_Bookmark" msgstr "_Záložky" @@ -1451,8 +1451,9 @@ msgstr "" msgid "Welcome to Gajim History Logs Manager" msgstr "Vítejte do Gajimova Správce Historie" -#: ../data/glade/history_manager.glade.h:4 ../src/dialogs.py:2884 -#: ../src/dialogs.py:2987 +#. Change label for accept_button to action name instead of 'OK'. +#: ../data/glade/history_manager.glade.h:4 ../src/dialogs.py:3007 +#: ../src/dialogs.py:3104 msgid "Delete" msgstr "Smazat" @@ -1482,7 +1483,7 @@ msgstr "" msgid "_Search Database" msgstr "_Hledat v databázi" -#: ../data/glade/history_window.glade.h:1 ../src/history_window.py:316 +#: ../data/glade/history_window.glade.h:1 ../src/history_window.py:323 msgid "Conversation History" msgstr "Historie konverzace" @@ -1510,7 +1511,7 @@ msgstr "_Zaznamenat historii konverzace" msgid "Bookmark this room" msgstr "Přidat tuto místnost do záložek" -#: ../data/glade/join_groupchat_window.glade.h:3 ../src/dialogs.py:1972 +#: ../data/glade/join_groupchat_window.glade.h:3 ../src/dialogs.py:2076 msgid "Join Group Chat" msgstr "Připojit se do diskuze" @@ -1537,8 +1538,8 @@ msgstr "Nedávno:" msgid "Room:" msgstr "Místnost:" -#: ../data/glade/join_groupchat_window.glade.h:9 ../src/disco.py:1201 -#: ../src/disco.py:1628 +#: ../data/glade/join_groupchat_window.glade.h:9 ../src/disco.py:1306 +#: ../src/disco.py:1750 msgid "_Join" msgstr "_Vstoupit" @@ -1566,7 +1567,7 @@ msgstr "Minimalizovat po připojení" msgid "Print status:" msgstr "Vypiš stav:" -#: ../data/glade/manage_bookmarks_window.glade.h:9 ../src/config.py:1602 +#: ../data/glade/manage_bookmarks_window.glade.h:9 ../src/config.py:1663 msgid "Server:" msgstr "Server:" @@ -1677,17 +1678,26 @@ msgid "Show a list of formattings" msgstr "Zobrazit seznam formátování" #: ../data/glade/message_window.glade.h:10 -msgid "Show a menu of advanced functions (Alt+A)" +#, fuzzy +msgid "Show a menu of advanced functions (Alt+D)" msgstr "Zobrazit nabídku rozšířených funkcí (Alt+A)" #: ../data/glade/message_window.glade.h:11 msgid "Show the contact's profile (Ctrl+I)" msgstr "Zobrazit profil kontaktu (Ctrl+I)" -#. Make sure the character after "_" is not M/m (conflicts with Alt+M that is supposed to show the Emoticon Selector) +#: ../data/glade/message_window.glade.h:12 +msgid "Toggle audio session" +msgstr "" + #: ../data/glade/message_window.glade.h:13 +msgid "Toggle video session" +msgstr "" + +#. Make sure the character after "_" is not M/m (conflicts with Alt+M that is supposed to show the Emoticon Selector) +#: ../data/glade/message_window.glade.h:15 #: ../data/glade/xml_console_window.glade.h:11 -#: ../src/filetransfers_window.py:260 +#: ../src/filetransfers_window.py:266 msgid "_Send" msgstr "Ode_slat" @@ -1819,6 +1829,16 @@ msgid "Configure color and font of the interface" msgstr "Nastav barvu a písmo uživatelského rozhraní" #: ../data/glade/preferences_window.glade.h:36 +#, fuzzy +msgid "Contact's message:" +msgstr "Zpráva diskuze:" + +#: ../data/glade/preferences_window.glade.h:37 +#, fuzzy +msgid "Contact's nickname:" +msgstr "Jméno kontaktu" + +#: ../data/glade/preferences_window.glade.h:38 msgid "" "Detached roster with detached chats\n" "Detached roster with single chat\n" @@ -1832,31 +1852,31 @@ msgstr "" "Samostatný roster a samostatná okna pro diskuze pro každý účet\n" "Samostatný roster s diskuzními okny podle typu" -#: ../data/glade/preferences_window.glade.h:41 +#: ../data/glade/preferences_window.glade.h:43 msgid "Display _activity of contacts in roster" msgstr "Zobrazovat čin_nosti kontaktů v seznamu" -#: ../data/glade/preferences_window.glade.h:42 +#: ../data/glade/preferences_window.glade.h:44 msgid "Display _extra email details" msgstr "Zobraz _podrobnosti emailu" -#: ../data/glade/preferences_window.glade.h:43 +#: ../data/glade/preferences_window.glade.h:45 msgid "Display _tunes of contacts in roster" msgstr "Zobrazovat _hudbu kontaktů v seznamu" -#: ../data/glade/preferences_window.glade.h:44 +#: ../data/glade/preferences_window.glade.h:46 msgid "Display a_vatars of contacts in roster" msgstr "Zobrazovat a_vatary kontaktů v seznamu" -#: ../data/glade/preferences_window.glade.h:45 +#: ../data/glade/preferences_window.glade.h:47 msgid "Display m_ood of contacts in roster" msgstr "Zobrazovat _nálady kontaktů v seznamu" -#: ../data/glade/preferences_window.glade.h:46 +#: ../data/glade/preferences_window.glade.h:48 msgid "Display status _messages of contacts in roster" msgstr "Zobrazovat p_opis stavu kontaktů v Seznamu" -#: ../data/glade/preferences_window.glade.h:47 +#: ../data/glade/preferences_window.glade.h:49 msgid "" "Gajim can send and receive meta-information related to a conversation you " "may have with a contact. Here you can specify which chatstates you want to " @@ -1866,7 +1886,7 @@ msgstr "" "vztahující se k rozhovoru. Tady můžete nastavit, které stavy rozhovoru " "chcete zobrazovat v oknech rozhovoru." -#: ../data/glade/preferences_window.glade.h:48 +#: ../data/glade/preferences_window.glade.h:50 msgid "" "Gajim can send and receive meta-information related to a conversation you " "may have with a contact. Here you can specify which chatstates you want to " @@ -1876,7 +1896,7 @@ msgstr "" "vztahující se k rozhovoru. Tady můžete nastavit, které stavy rozhovoru " "chcete posílat svému protějšku." -#: ../data/glade/preferences_window.glade.h:49 +#: ../data/glade/preferences_window.glade.h:51 msgid "" "Gajim will notify you via a popup window in the bottom right of the screen " "about contacts that just signed out" @@ -1884,17 +1904,17 @@ msgstr "" "Gajim Vás upozorní o přávě odpojených kontaktech pomocí popupu v pravém " "dolním rohu obrazovky" -#: ../data/glade/preferences_window.glade.h:51 +#: ../data/glade/preferences_window.glade.h:53 msgid "Hide all buttons in chat windows" msgstr "Skryje tlačítka v okně diskuze." -#: ../data/glade/preferences_window.glade.h:52 +#: ../data/glade/preferences_window.glade.h:54 msgid "" "If checked, Gajim will allow others to detect the operation system you are " "using" msgstr "Pokud je zaškrtnuto, Gajim se připojí do této místnosti při spuštění" -#: ../data/glade/preferences_window.glade.h:53 +#: ../data/glade/preferences_window.glade.h:55 msgid "" "If checked, Gajim will also include information about the sender of the new " "emails" @@ -1902,13 +1922,13 @@ msgstr "" "Pokud zaškrtnuto, Gajim uvede také informaci o odesilateli zprávy nového " "emailu" -#: ../data/glade/preferences_window.glade.h:54 +#: ../data/glade/preferences_window.glade.h:56 msgid "" "If checked, Gajim will change status to Away when the computer is unused." msgstr "" "Pokud je zaškrtnuto, Gajim změnít stav na 'Pryč' pokud je počítač nepoužíván." -#: ../data/glade/preferences_window.glade.h:55 +#: ../data/glade/preferences_window.glade.h:57 msgid "" "If checked, Gajim will change status to Not Available when the computer has " "not been used even longer" @@ -1916,7 +1936,7 @@ msgstr "" "Pokud je zaškrtnuto, Gajim změní stav na 'Nedostupný' pokud se počítač " "nepoužívá delší dobu" -#: ../data/glade/preferences_window.glade.h:56 +#: ../data/glade/preferences_window.glade.h:58 msgid "" "If checked, Gajim will display avatars of contacts in roster window and in " "group chats" @@ -1924,7 +1944,7 @@ msgstr "" "Pokud zaškrtnuto, Gajim bude zobrazovat avatary kontaktů v okně Seznamu a v " "diskuzích" -#: ../data/glade/preferences_window.glade.h:57 +#: ../data/glade/preferences_window.glade.h:59 msgid "" "If checked, Gajim will display status messages of contacts under the contact " "name in roster window and in group chats" @@ -1932,28 +1952,28 @@ msgstr "" "Pokud zaškrtnuto, Gajim bude zobrazovat popisy stavů kontaktů pod jménem v " "okně Seznamu a v diskuzích" -#: ../data/glade/preferences_window.glade.h:58 +#: ../data/glade/preferences_window.glade.h:60 msgid "" "If checked, Gajim will display the activity of contacts in the roster window" msgstr "" "Pokud zaškrtnuto, Gajim bude zobrazovat avatary kontaktů v okně Seznamu a v " "diskuzích" -#: ../data/glade/preferences_window.glade.h:59 +#: ../data/glade/preferences_window.glade.h:61 msgid "" "If checked, Gajim will display the mood of contacts in the roster window" msgstr "" "Pokud zaškrtnuto, Gajim bude zobrazovat avatary kontaktů v okně Seznamu a v " "diskuzích" -#: ../data/glade/preferences_window.glade.h:60 +#: ../data/glade/preferences_window.glade.h:62 msgid "" "If checked, Gajim will display the tunes of contacts in the roster window" msgstr "" "Pokud zaškrtnuto, Gajim bude zobrazovat avatary kontaktů v okně Seznamu a v " "diskuzích" -#: ../data/glade/preferences_window.glade.h:61 +#: ../data/glade/preferences_window.glade.h:63 msgid "" "If checked, Gajim will highlight spelling errors in input fields of chat " "windows. If no language is explicitly set via right click on the input " @@ -1963,7 +1983,7 @@ msgstr "" "nastavení jazyk přes pravé tlačítko na vstupním poli, tak se použije výchozí " "jazyk pro tento kontakt nebo diskuzi." -#: ../data/glade/preferences_window.glade.h:62 +#: ../data/glade/preferences_window.glade.h:64 msgid "" "If checked, Gajim will ignore incoming events from unauthorized contacts. " "Use with caution, because it blocks all messages from any contact that is " @@ -1973,7 +1993,7 @@ msgstr "" "rozvahou, protože tato volba zakáže všechny zprávy od kontaktů, které ještě " "nemáte v rosteru" -#: ../data/glade/preferences_window.glade.h:63 +#: ../data/glade/preferences_window.glade.h:65 msgid "" "If checked, Gajim will keep logs for encrypted messages. Please note that " "when using E2E encryption the remote party has to agree on logging, else the " @@ -1983,7 +2003,7 @@ msgstr "" "použití E2E musí protějšek souhlasit se záznamem, jinak zprávy nebudou " "zaznamenávány." -#: ../data/glade/preferences_window.glade.h:64 +#: ../data/glade/preferences_window.glade.h:66 msgid "" "If checked, Gajim will show a notification when a new e-mail is received via " "GMail" @@ -1991,7 +2011,7 @@ msgstr "" "Pokud zaškrtnuto, Gajim uvede také informaci o odesilateli zprávy nového " "emailu" -#: ../data/glade/preferences_window.glade.h:65 +#: ../data/glade/preferences_window.glade.h:67 msgid "" "If checked, Gajim will use protocol-specific status icons. (eg. A contact " "from MSN will have the equivalent msn icon for status online, away, busy, " @@ -2001,7 +2021,7 @@ msgstr "" "z MSN bude mít odpovídající ikonu msn pro stavy připojen, pryč, nerušit, " "atd...)" -#: ../data/glade/preferences_window.glade.h:66 +#: ../data/glade/preferences_window.glade.h:68 msgid "" "If enabled, Gajim will not ask for a status message. The specified default " "message will be used instead." @@ -2009,7 +2029,7 @@ msgstr "" "Pokud zaškrtnuto, Gajim se nebude pokáždé ptát na zprávu stavu. Místo toho " "použije výchozí nadefinovanou zprávu." -#: ../data/glade/preferences_window.glade.h:67 +#: ../data/glade/preferences_window.glade.h:69 msgid "" "If not disabled, Gajim will replace ascii smilies like ':)' with equivalent " "animated or static graphical emoticons" @@ -2017,19 +2037,19 @@ msgstr "" "Pokud zaškrtnuto, Gajim nahradí ascii smajlíky jako ':)' za ekvivalentní " "animované nebo statické grafické smajlíky" -#: ../data/glade/preferences_window.glade.h:68 +#: ../data/glade/preferences_window.glade.h:70 msgid "Log _encrypted chat session" msgstr "Logovat šifrované rozhovory" -#: ../data/glade/preferences_window.glade.h:69 +#: ../data/glade/preferences_window.glade.h:71 msgid "Ma_ke message windows compact" msgstr "Udělej o_kna zpráv kompaktní" -#: ../data/glade/preferences_window.glade.h:70 +#: ../data/glade/preferences_window.glade.h:72 msgid "Ma_nage..." msgstr "Sp_ravovat..." -#: ../data/glade/preferences_window.glade.h:71 +#: ../data/glade/preferences_window.glade.h:73 msgid "" "Never\n" "Only when pending events\n" @@ -2039,32 +2059,32 @@ msgstr "" "Pouze při čekajících událostech\n" "Vždy" -#: ../data/glade/preferences_window.glade.h:74 +#: ../data/glade/preferences_window.glade.h:76 msgid "Notifications" msgstr "Upozornění" -#: ../data/glade/preferences_window.glade.h:75 +#: ../data/glade/preferences_window.glade.h:77 msgid "Notify me about contacts that sign _in" msgstr "Upozorni mě na kontakty které se přihlásí" -#: ../data/glade/preferences_window.glade.h:76 +#: ../data/glade/preferences_window.glade.h:78 msgid "Notify me about contacts that sign _out" msgstr "Upozorni mě na kontakty které se odhlásí" -#: ../data/glade/preferences_window.glade.h:77 +#: ../data/glade/preferences_window.glade.h:79 msgid "Notify on new _GMail email" msgstr "Upozorni při novém _GMail emailu" # FIXME: snad je to ok? -#: ../data/glade/preferences_window.glade.h:78 +#: ../data/glade/preferences_window.glade.h:80 msgid "Personal Events" msgstr "Moje události" -#: ../data/glade/preferences_window.glade.h:79 +#: ../data/glade/preferences_window.glade.h:81 msgid "Play _sounds" msgstr "Přehrávat _zvuky" -#: ../data/glade/preferences_window.glade.h:80 +#: ../data/glade/preferences_window.glade.h:82 msgid "" "Pop it up\n" "Notify me about it\n" @@ -2074,23 +2094,23 @@ msgstr "" "Upozorni mě\n" "Zobrazit pouze v rosteru" -#: ../data/glade/preferences_window.glade.h:83 +#: ../data/glade/preferences_window.glade.h:85 msgid "Preferences" msgstr "Nastavení" -#: ../data/glade/preferences_window.glade.h:84 +#: ../data/glade/preferences_window.glade.h:86 msgid "Show systray:" msgstr "Zobraz oznamovací oblast:" -#: ../data/glade/preferences_window.glade.h:85 +#: ../data/glade/preferences_window.glade.h:87 msgid "Sign _in" msgstr "_Přihlásí" -#: ../data/glade/preferences_window.glade.h:86 +#: ../data/glade/preferences_window.glade.h:88 msgid "Sign _out" msgstr "_Odhlásí" -#: ../data/glade/preferences_window.glade.h:87 +#: ../data/glade/preferences_window.glade.h:89 msgid "" "Some messages may include rich content (formatting, colors etc). If checked, " "Gajim will just display the raw message text." @@ -2098,27 +2118,27 @@ msgstr "" "Některé zprávy mohou obsahovat formátování (odsazení, barvy aj.). Pokud je " "zaškrtnuto, Gajim zobrazí pouze čistý text." -#: ../data/glade/preferences_window.glade.h:88 +#: ../data/glade/preferences_window.glade.h:90 msgid "Sort contacts by status" msgstr "Seřadit podle stavu" -#: ../data/glade/preferences_window.glade.h:89 ../src/config.py:390 +#: ../data/glade/preferences_window.glade.h:91 ../src/config.py:377 msgid "Status" msgstr "Stav" -#: ../data/glade/preferences_window.glade.h:90 +#: ../data/glade/preferences_window.glade.h:92 msgid "Status _iconset:" msgstr "Výchozí _ikony stavů:" -#: ../data/glade/preferences_window.glade.h:91 +#: ../data/glade/preferences_window.glade.h:93 msgid "Style" msgstr "Styl" -#: ../data/glade/preferences_window.glade.h:92 +#: ../data/glade/preferences_window.glade.h:94 msgid "T_heme:" msgstr "_Téma:" -#: ../data/glade/preferences_window.glade.h:93 +#: ../data/glade/preferences_window.glade.h:95 msgid "" "The auto away status message. If empty, Gajim will not change the current " "status message\n" @@ -2130,7 +2150,7 @@ msgstr "" "$S se nahradí za předchozí popis stavu\n" "$T se nahradí dobou nečinnosti před zapnutím stavu Pryč" -#: ../data/glade/preferences_window.glade.h:96 +#: ../data/glade/preferences_window.glade.h:98 msgid "" "The auto not available status message. If empty, Gajim will not change the " "current status message\n" @@ -2142,103 +2162,105 @@ msgstr "" "$S se nahradí za předchozí popis stavu\n" "$T se nahradí dobou nečinnosti před zapnutím stavu Nedostupný" -#: ../data/glade/preferences_window.glade.h:99 +#: ../data/glade/preferences_window.glade.h:101 msgid "Use _transports icons" msgstr "Používat ikony _transportů" -#: ../data/glade/preferences_window.glade.h:100 +#: ../data/glade/preferences_window.glade.h:102 msgid "Use system _default" msgstr "Použij nastavení _systému" -#: ../data/glade/preferences_window.glade.h:101 +#: ../data/glade/preferences_window.glade.h:103 msgid "When new event is received:" msgstr "Když je přijata nová zpráva" -#: ../data/glade/preferences_window.glade.h:102 +#: ../data/glade/preferences_window.glade.h:104 +#, fuzzy +msgid "Your message:" +msgstr "Chybová zpráva: %s" + +#: ../data/glade/preferences_window.glade.h:105 +#, fuzzy +msgid "Your nickname:" +msgstr "Přezdívka:" + +#: ../data/glade/preferences_window.glade.h:106 msgid "_Away after:" msgstr "_Automaticky pryč po:" -#: ../data/glade/preferences_window.glade.h:103 +#: ../data/glade/preferences_window.glade.h:107 msgid "_Browser:" msgstr "_Prohlížeč:" -#: ../data/glade/preferences_window.glade.h:104 +#: ../data/glade/preferences_window.glade.h:108 msgid "_Display chat state notifications:" msgstr "Zobrazovat _události stavu rozhovoru:" -#: ../data/glade/preferences_window.glade.h:105 +#: ../data/glade/preferences_window.glade.h:109 msgid "_Emoticons:" msgstr "_Smajlíky:" -#: ../data/glade/preferences_window.glade.h:106 +#: ../data/glade/preferences_window.glade.h:110 msgid "_File manager:" msgstr "_Správce souborů:" -#: ../data/glade/preferences_window.glade.h:107 +#: ../data/glade/preferences_window.glade.h:111 msgid "_Highlight misspelled words" msgstr "Zvýrazňovat _slova s překlepy" -#: ../data/glade/preferences_window.glade.h:108 +#: ../data/glade/preferences_window.glade.h:112 msgid "_Ignore events from contacts not in the roster" msgstr "_Ignorovat události od kontaktů mimo můj Seznam" -#: ../data/glade/preferences_window.glade.h:109 +#: ../data/glade/preferences_window.glade.h:113 msgid "_Ignore rich content in incoming messages" msgstr "_Ignoruj formátování v příchozích zprávách" -#: ../data/glade/preferences_window.glade.h:110 -msgid "_Incoming message:" -msgstr "_Příchozí zpráva:" - -#: ../data/glade/preferences_window.glade.h:111 +#: ../data/glade/preferences_window.glade.h:114 msgid "_Log status changes of contacts" msgstr "Zaznamenávat změny _stavu kontaktů" -#: ../data/glade/preferences_window.glade.h:112 +#: ../data/glade/preferences_window.glade.h:115 msgid "_Mail client:" msgstr "E-_mailový klient:" -#: ../data/glade/preferences_window.glade.h:113 +#: ../data/glade/preferences_window.glade.h:116 msgid "_Not available after:" msgstr "Automaticky _nedostupný po:" -#: ../data/glade/preferences_window.glade.h:114 +#: ../data/glade/preferences_window.glade.h:117 msgid "_Open..." msgstr "_Otevřít..." -#: ../data/glade/preferences_window.glade.h:115 -msgid "_Outgoing message:" -msgstr "_Odchozí zpráva:" - -#: ../data/glade/preferences_window.glade.h:116 +#: ../data/glade/preferences_window.glade.h:118 msgid "_Reset to Default Colors" msgstr "_Vrátit k výchozím barvám" -#: ../data/glade/preferences_window.glade.h:117 +#: ../data/glade/preferences_window.glade.h:119 msgid "_Send chat state notifications:" msgstr "Zobrazovat _události stavu rozhovoru:" -#: ../data/glade/preferences_window.glade.h:118 +#: ../data/glade/preferences_window.glade.h:120 msgid "_Status message:" msgstr "_Stav:" -#: ../data/glade/preferences_window.glade.h:119 +#: ../data/glade/preferences_window.glade.h:121 msgid "_URL highlight:" msgstr "Zvýraznění _URL:" -#: ../data/glade/preferences_window.glade.h:120 +#: ../data/glade/preferences_window.glade.h:122 msgid "_Window behavior:" msgstr "Chování _okna" -#: ../data/glade/preferences_window.glade.h:121 +#: ../data/glade/preferences_window.glade.h:123 msgid "in _group chats" msgstr "v _diskuzích" -#: ../data/glade/preferences_window.glade.h:122 +#: ../data/glade/preferences_window.glade.h:124 msgid "in _roster" msgstr "v _rosteru" -#: ../data/glade/preferences_window.glade.h:123 +#: ../data/glade/preferences_window.glade.h:125 msgid "minutes" msgstr "minutách" @@ -2291,7 +2313,7 @@ msgstr "Jabber ID" msgid "Order:" msgstr "Pořadí:" -#: ../data/glade/privacy_list_window.glade.h:12 ../src/dialogs.py:3114 +#: ../data/glade/privacy_list_window.glade.h:12 ../src/dialogs.py:3235 msgid "Privacy List" msgstr "Nastavení Soukromí" @@ -2435,7 +2457,7 @@ msgid "Prefix:" msgstr "Před jménem" #: ../data/glade/profile_window.glade.h:25 -#: ../data/glade/vcard_information_window.glade.h:30 ../src/vcard.py:327 +#: ../data/glade/vcard_information_window.glade.h:30 ../src/vcard.py:332 msgid "Role:" msgstr "Postavení:" @@ -2495,8 +2517,8 @@ msgstr "Odstranit účet z Gajimu i ze _serveru" #. Remove group #. Remove -#: ../data/glade/remove_account_window.glade.h:4 ../src/roster_window.py:5339 -#: ../src/roster_window.py:5459 ../src/roster_window.py:5588 +#: ../data/glade/remove_account_window.glade.h:4 ../src/roster_window.py:5256 +#: ../src/roster_window.py:5380 ../src/roster_window.py:5511 msgid "_Remove" msgstr "Odst_ranit" @@ -2515,13 +2537,13 @@ msgid "Roster Item Exchange" msgstr "" #: ../data/glade/roster_item_exchange_window.glade.h:4 -#, fuzzy -msgid "gtk-cancel" -msgstr "gtk-close" +#: ../data/glade/service_registration_window.glade.h:3 +msgid "_OK" +msgstr "_OK" #: ../data/glade/roster_item_exchange_window.glade.h:5 #, fuzzy -msgid "gtk-ok" +msgid "gtk-cancel" msgstr "gtk-close" #: ../data/glade/roster_window.glade.h:1 @@ -2579,7 +2601,7 @@ msgstr "_Akce" msgid "_Contents" msgstr "_Obsah" -#: ../data/glade/roster_window.glade.h:18 ../src/disco.py:1357 +#: ../data/glade/roster_window.glade.h:18 ../src/disco.py:1467 msgid "_Edit" msgstr "_Úpravy" @@ -2620,11 +2642,11 @@ msgid "_Add contact" msgstr "Přidat _kontakt" #. Information -#: ../data/glade/search_window.glade.h:4 ../src/roster_window.py:5600 +#: ../data/glade/search_window.glade.h:4 ../src/roster_window.py:5523 msgid "_Information" msgstr "Informace o kontaktu" -#: ../data/glade/search_window.glade.h:5 ../src/disco.py:1213 +#: ../data/glade/search_window.glade.h:5 ../src/disco.py:1318 msgid "_Search" msgstr "_Najít" @@ -2644,10 +2666,6 @@ msgstr "Zaregistrovat" msgid "_Cancel" msgstr "_Zrušit" -#: ../data/glade/service_registration_window.glade.h:3 -msgid "_OK" -msgstr "_OK" - #: ../data/glade/single_message_window.glade.h:1 msgid "0" msgstr "0" @@ -2852,280 +2870,266 @@ msgstr "Zdroj:" msgid "Status:" msgstr "Stav:" -#: ../src/adhoc_commands.py:268 +#: ../src/adhoc_commands.py:295 msgid "Cancel confirmation" msgstr "Zrušit ověření" -#: ../src/adhoc_commands.py:269 +#: ../src/adhoc_commands.py:296 msgid "" "You are in process of executing command. Do you really want to cancel it?" msgstr "Právě se provadí příkaz. Chcete ho skutečně přerušit?" -#: ../src/adhoc_commands.py:301 ../src/adhoc_commands.py:324 +#: ../src/adhoc_commands.py:328 ../src/adhoc_commands.py:351 msgid "Service sent malformed data" msgstr "Služba odeslala chybné data" -#: ../src/adhoc_commands.py:310 +#: ../src/adhoc_commands.py:337 msgid "Service changed the session identifier." msgstr "Služba změnila identifikátor sezení." #. when stanza doesn't have error description -#: ../src/adhoc_commands.py:405 +#: ../src/adhoc_commands.py:436 msgid "Service returned an error." msgstr "Služba vrátila chybu." #. For i18n -#: ../src/advanced_configuration_window.py:89 +#: ../src/advanced_configuration_window.py:91 msgid "Activated" msgstr "Aktivní" -#: ../src/advanced_configuration_window.py:89 +#: ../src/advanced_configuration_window.py:91 msgid "Deactivated" msgstr "Neaktivní" -#: ../src/advanced_configuration_window.py:91 +#: ../src/advanced_configuration_window.py:93 msgid "Boolean" msgstr "Boolean" -#: ../src/advanced_configuration_window.py:92 +#: ../src/advanced_configuration_window.py:94 msgid "Integer" msgstr "Číslo" -#: ../src/advanced_configuration_window.py:93 +#: ../src/advanced_configuration_window.py:95 msgid "Text" msgstr "Text" -#: ../src/advanced_configuration_window.py:94 ../src/chat_control.py:838 +#: ../src/advanced_configuration_window.py:96 ../src/chat_control.py:879 msgid "Color" msgstr "Barva" -#: ../src/advanced_configuration_window.py:105 +#: ../src/advanced_configuration_window.py:107 msgid "Preference Name" msgstr "Název volby" -#: ../src/advanced_configuration_window.py:111 +#: ../src/advanced_configuration_window.py:113 msgid "Value" msgstr "Hodnota" -#: ../src/advanced_configuration_window.py:119 +#: ../src/advanced_configuration_window.py:121 msgid "Type" msgstr "Typ" #. we talk about option description in advanced configuration editor -#: ../src/advanced_configuration_window.py:172 +#: ../src/advanced_configuration_window.py:176 msgid "(None)" msgstr "(Žádný)" -#: ../src/advanced_configuration_window.py:255 +#: ../src/advanced_configuration_window.py:259 msgid "Hidden" msgstr "Skryté" -#: ../src/atom_window.py:110 +#: ../src/atom_window.py:119 #, fuzzy, python-format -msgid "You have received new entries (and %(count)d not displayed):" -msgstr "Dostal(a) jste novou položku: " +msgid "You have received new entries (and %d not displayed):" +msgid_plural "You have received new entries (and %d not displayed):" +msgstr[0] "Dostal(a) jste novou položku: " +msgstr[1] "Dostal(a) jste novou položku: " +msgstr[2] "Dostal(a) jste novou položku: " #. the next script, executed in the "po" directory, #. generates the following list. #. #!/bin/sh #. LANG=$(for i in *.po; do j=${i/.po/}; echo -n "_('"$j"')":" '"$j"', " ; done) #. echo "{_('en'):'en'",$LANG"}" -#: ../src/chat_control.py:74 +#: ../src/chat_control.py:75 msgid "English" msgstr "Angličtina" -#: ../src/chat_control.py:74 +#: ../src/chat_control.py:75 msgid "Belarusian" msgstr "Běloruština" -#: ../src/chat_control.py:74 +#: ../src/chat_control.py:75 msgid "Bulgarian" msgstr "Bulharština" -#: ../src/chat_control.py:74 +#: ../src/chat_control.py:75 msgid "Breton" msgstr "Bretonština" -#: ../src/chat_control.py:74 +#: ../src/chat_control.py:75 msgid "Czech" msgstr "Čeština" -#: ../src/chat_control.py:74 +#: ../src/chat_control.py:75 msgid "German" msgstr "Němčina" -#: ../src/chat_control.py:74 +#: ../src/chat_control.py:75 msgid "Greek" msgstr "Řečtina" -#: ../src/chat_control.py:74 +#: ../src/chat_control.py:75 msgid "British" msgstr "Britština" -#: ../src/chat_control.py:74 +#: ../src/chat_control.py:75 msgid "Esperanto" msgstr "Esperanto" -#: ../src/chat_control.py:74 +#: ../src/chat_control.py:75 msgid "Spanish" msgstr "Španělština" -#: ../src/chat_control.py:74 +#: ../src/chat_control.py:75 msgid "Basque" msgstr "Baskičtina" -#: ../src/chat_control.py:74 +#: ../src/chat_control.py:75 msgid "French" msgstr "Francouzština" -#: ../src/chat_control.py:74 +#: ../src/chat_control.py:75 msgid "Croatian" msgstr "Chorvatština" -#: ../src/chat_control.py:74 +#: ../src/chat_control.py:75 msgid "Italian" msgstr "Italština" -#: ../src/chat_control.py:74 +#: ../src/chat_control.py:75 msgid "Norwegian (b)" msgstr "Norština (b)" -#: ../src/chat_control.py:74 +#: ../src/chat_control.py:75 msgid "Dutch" msgstr "Holandština" -#: ../src/chat_control.py:74 +#: ../src/chat_control.py:75 msgid "Norwegian" msgstr "Norština" -#: ../src/chat_control.py:74 +#: ../src/chat_control.py:75 msgid "Polish" msgstr "Polština" -#: ../src/chat_control.py:74 +#: ../src/chat_control.py:75 msgid "Portuguese" msgstr "Portugalština" -#: ../src/chat_control.py:74 +#: ../src/chat_control.py:75 msgid "Brazilian Portuguese" msgstr "Brazilská portugalština" -#: ../src/chat_control.py:74 +#: ../src/chat_control.py:75 msgid "Russian" msgstr "Ruština" -#: ../src/chat_control.py:74 +#: ../src/chat_control.py:75 msgid "Serbian" msgstr "Srbština" -#: ../src/chat_control.py:74 +#: ../src/chat_control.py:75 msgid "Slovak" msgstr "Slovenština" -#: ../src/chat_control.py:74 +#: ../src/chat_control.py:75 msgid "Swedish" msgstr "Švédština" -#: ../src/chat_control.py:74 +#: ../src/chat_control.py:75 msgid "Chinese (Ch)" msgstr "Čínština" -#: ../src/chat_control.py:426 +#: ../src/chat_control.py:446 msgid "Spelling language" msgstr "Kontrola jazyka" #. we are not connected -#: ../src/chat_control.py:454 ../src/chat_control.py:642 +#: ../src/chat_control.py:478 ../src/chat_control.py:670 msgid "A connection is not available" msgstr "Spojení není dostupné" -#: ../src/chat_control.py:455 ../src/chat_control.py:643 +#: ../src/chat_control.py:479 ../src/chat_control.py:671 msgid "Your message can not be sent until you are connected." msgstr "Va¹e zpráva nemù¾e být odeslána dokud se nepøipojíte." -#: ../src/chat_control.py:820 +#: ../src/chat_control.py:861 msgid "Underline" msgstr "Podtrhnout" -#: ../src/chat_control.py:821 +#: ../src/chat_control.py:862 msgid "Strike" msgstr "Přeškrtnout" -#: ../src/chat_control.py:844 +#: ../src/chat_control.py:885 msgid "Font" msgstr "Font" -#: ../src/chat_control.py:853 +#: ../src/chat_control.py:894 msgid "Clear formating" msgstr "Smazat formátování" -#: ../src/chat_control.py:925 +#: ../src/chat_control.py:972 msgid "Really send file?" msgstr "Opravdu odeslat soubor?" -#: ../src/chat_control.py:926 +#: ../src/chat_control.py:973 #, python-format msgid "If you send a file to %s, he/she will know your real Jabber ID." msgstr "Pokud odešlete soubor %s, tak bude znát vaše skutečné Jabber ID." -#: ../src/chat_control.py:1317 ../src/chat_control.py:1718 +#: ../src/chat_control.py:1411 ../src/chat_control.py:1864 msgid "GPG encryption enabled" msgstr "GPG Šifrování zapnuto" #. Add to roster -#: ../src/chat_control.py:1346 ../src/common/contacts.py:113 -#: ../src/common/helpers.py:55 ../src/common/helpers.py:231 -#: ../src/conversation_textview.py:903 ../src/dialogs.py:1031 -#: ../src/dialogs.py:1882 ../src/dialogs.py:1907 ../src/gajim.py:999 -#: ../src/gajim.py:1750 ../src/gui_menu_builder.py:243 -#: ../src/gui_menu_builder.py:385 ../src/roster_window.py:988 -#: ../src/roster_window.py:1622 ../src/roster_window.py:1624 -#: ../src/roster_window.py:1926 ../src/roster_window.py:3187 -#: ../src/roster_window.py:3213 +#: ../src/chat_control.py:1436 ../src/common/contacts.py:150 +#: ../src/common/contacts.py:253 ../src/common/helpers.py:55 +#: ../src/common/helpers.py:231 ../src/conversation_textview.py:916 +#: ../src/dialogs.py:1060 ../src/dialogs.py:1973 ../src/dialogs.py:2002 +#: ../src/gui_interface.py:610 ../src/gui_menu_builder.py:255 +#: ../src/gui_menu_builder.py:398 ../src/roster_window.py:1576 +#: ../src/roster_window.py:1578 ../src/roster_window.py:1893 +#: ../src/roster_window.py:3194 ../src/roster_window.py:3220 msgid "Not in Roster" msgstr "Není v Rosteru" -#: ../src/chat_control.py:1359 +#: ../src/chat_control.py:1480 #, fuzzy msgid "This contact does not support file transfer." msgstr "Seznam aktivních, dokončených a zastavených přenosů souborů" -#: ../src/chat_control.py:1362 +#: ../src/chat_control.py:1483 msgid "You need to know the real JID of the contact to send him or her a file." msgstr "" -#: ../src/chat_control.py:1469 ../src/tooltips.py:626 -msgid "Unknown Artist" -msgstr "Neznámý Umělec" - -#: ../src/chat_control.py:1471 ../src/tooltips.py:631 -msgid "Unknown Title" -msgstr "Neznámý Název" - -#: ../src/chat_control.py:1473 ../src/tooltips.py:636 -msgid "Unknown Source" -msgstr "Neznámý Zdroj" - -#: ../src/chat_control.py:1476 ../src/tooltips.py:638 +#: ../src/chat_control.py:1555 #, python-format -msgid "" -"\"%(title)s\" by %(artist)s\n" -"from %(source)s" +msgid "%(type)s state : %(state)s, reason: %(reason)s" msgstr "" -"\"%(title)s\" od %(artist)s\n" -"z %(source)s" -#: ../src/chat_control.py:1613 +#: ../src/chat_control.py:1720 #, python-format msgid "%(nickname)s from group chat %(room_name)s" msgstr "%(nickname)s z diskuze %(room_name)s" #. No key assigned nor a key is used by remote contact -#: ../src/chat_control.py:1698 ../src/dialogs.py:4484 +#: ../src/chat_control.py:1844 ../src/dialogs.py:4627 msgid "No GPG key assigned" msgstr "Nepřiřazen GPG klíč" -#: ../src/chat_control.py:1699 +#: ../src/chat_control.py:1845 msgid "" "No GPG key is assigned to this contact. So you cannot encrypt messages with " "GPG." @@ -3133,50 +3137,50 @@ msgstr "" "Tento kontakt nemá přiřazen GPG klíč. Proto nemůžeš šifrovat pomocí GPG " "zprávy." -#: ../src/chat_control.py:1708 +#: ../src/chat_control.py:1854 msgid "GPG encryption disabled" msgstr "GPG Šifrování vypnuto" -#: ../src/chat_control.py:1734 +#: ../src/chat_control.py:1880 msgid "Session WILL be logged" msgstr "Sezení BUDE logováno" -#: ../src/chat_control.py:1736 +#: ../src/chat_control.py:1882 msgid "Session WILL NOT be logged" msgstr "Sezení NEBUDE logováno" #. encryption %s active -#: ../src/chat_control.py:1750 +#: ../src/chat_control.py:1899 msgid "is" msgstr "je" -#: ../src/chat_control.py:1750 +#: ../src/chat_control.py:1899 msgid "is NOT" msgstr "NENÍ" #. chat session %s be logged -#: ../src/chat_control.py:1752 +#: ../src/chat_control.py:1901 msgid "will" msgstr "bude" -#: ../src/chat_control.py:1752 +#: ../src/chat_control.py:1901 msgid "will NOT" msgstr "NEBUDE" #. About encrypted chat session -#: ../src/chat_control.py:1756 +#: ../src/chat_control.py:1905 msgid "and authenticated" msgstr "a autentizovaný" #. About encrypted chat session -#: ../src/chat_control.py:1760 +#: ../src/chat_control.py:1909 msgid "and NOT authenticated" msgstr "a NEautentizovaný" #. status will become 'is' or 'is not', authentificaed will become #. 'and authentificated' or 'and not authentificated', logged will become #. 'will' or 'will not' -#: ../src/chat_control.py:1766 +#: ../src/chat_control.py:1915 #, python-format msgid "" "%(type)s encryption %(status)s active %(authenticated)s.\n" @@ -3185,62 +3189,62 @@ msgstr "" "Šifrování %(type)s %(status)s aktivní %(authenticated)s.\n" "Váš rozhovor %(logged)s zaznamenáván." -#: ../src/chat_control.py:1906 +#: ../src/chat_control.py:2055 msgid "Session negotiation cancelled" msgstr "Sezení bylo zrušeno" -#: ../src/chat_control.py:1913 +#: ../src/chat_control.py:2064 msgid "This session is encrypted" msgstr "Toto sezení je šifrované" -#: ../src/chat_control.py:1916 +#: ../src/chat_control.py:2067 msgid " and WILL be logged" msgstr "a BUDE zaznamenáváno" -#: ../src/chat_control.py:1918 +#: ../src/chat_control.py:2069 msgid " and WILL NOT be logged" msgstr "a NEBUDE zaznamenáváno" -#: ../src/chat_control.py:1923 +#: ../src/chat_control.py:2074 msgid "" "Remote contact's identity not verified. Click the shield button for more " "details." msgstr "Kontakt nebyl ověřen. Klikněte na tlačítko štítu pro více informací." -#: ../src/chat_control.py:1925 +#: ../src/chat_control.py:2076 msgid "E2E encryption disabled" msgstr "E2E Šifrování vypnuto" -#: ../src/chat_control.py:1959 ../src/chat_control.py:1972 +#: ../src/chat_control.py:2113 ../src/chat_control.py:2126 msgid "The following message was NOT encrypted" msgstr "Následující zpráva NEBYLA šifrovaná" -#: ../src/chat_control.py:1965 +#: ../src/chat_control.py:2119 msgid "The following message was encrypted" msgstr "Následující zpráva byla šifrovaná" #. %s is being replaced in the code with JID -#: ../src/chat_control.py:2235 +#: ../src/chat_control.py:2388 #, python-format msgid "You just received a new message from \"%s\"" msgstr "Právě jsi obdržela novou zprávu od \"%s\"" -#: ../src/chat_control.py:2236 +#: ../src/chat_control.py:2389 msgid "" "If you close this tab and you have history disabled, this message will be " "lost." msgstr "" "Pokud zavřete toto okno a historie je vypnutá, tato zpráva bude ztracena." -#: ../src/chat_control.py:2391 ../src/common/connection_handlers.py:2073 -#: ../src/common/connection_handlers.py:2119 -#: ../src/common/connection_handlers.py:2347 -#: ../src/common/connection_handlers.py:2489 ../src/common/connection.py:1368 -#: ../src/gajim.py:154 ../src/session.py:130 +#: ../src/chat_control.py:2542 ../src/common/connection_handlers.py:2100 +#: ../src/common/connection_handlers.py:2146 +#: ../src/common/connection_handlers.py:2338 +#: ../src/common/connection_handlers.py:2483 ../src/common/connection.py:420 +#: ../src/gajim.py:154 ../src/session.py:134 msgid "Database Error" msgstr "Chyba Databáze" -#: ../src/chat_control.py:2392 +#: ../src/chat_control.py:2543 #, python-format msgid "" "The database file (%s) cannot be read. Try to repair it or remove it (all " @@ -3249,7 +3253,7 @@ msgstr "" "Nelze přečíst soubor databáze (%s). Opravte ho nebo smažte (tím ztratíte " "všechny zprávy v historii)." -#: ../src/chat_control.py:2622 +#: ../src/chat_control.py:2784 #, python-format msgid "%(name)s is now %(status)s" msgstr "%(name)s je nyní %(status)s" @@ -3258,23 +3262,23 @@ msgstr "%(name)s je nyní %(status)s" msgid "creating logs database" msgstr "vytvářím databázi historie" -#: ../src/common/check_paths.py:128 ../src/common/check_paths.py:139 -#: ../src/common/check_paths.py:146 +#: ../src/common/check_paths.py:129 ../src/common/check_paths.py:140 +#: ../src/common/check_paths.py:147 #, python-format msgid "%s is a file but it should be a directory" msgstr "%s je soubor, ale měl by být adresář" -#: ../src/common/check_paths.py:129 ../src/common/check_paths.py:140 -#: ../src/common/check_paths.py:147 ../src/common/check_paths.py:155 +#: ../src/common/check_paths.py:130 ../src/common/check_paths.py:141 +#: ../src/common/check_paths.py:148 ../src/common/check_paths.py:156 msgid "Gajim will now exit" msgstr "Gajim se nyní ukončí" -#: ../src/common/check_paths.py:154 +#: ../src/common/check_paths.py:155 #, python-format msgid "%s is a directory but should be a file" msgstr "%s je adresář, ale měl by to být soubor" -#: ../src/common/check_paths.py:170 +#: ../src/common/check_paths.py:171 #, python-format msgid "creating %s directory" msgstr "vytvářím adresář %s " @@ -3337,10 +3341,10 @@ msgid "Choose the groupchats you want to leave" msgstr "Vyber diskuze, které chceš opustit" #. Make special context menu if group is Groupchats -#: ../src/common/commands.py:205 ../src/common/contacts.py:94 -#: ../src/common/helpers.py:55 ../src/roster_window.py:812 -#: ../src/roster_window.py:1626 ../src/roster_window.py:1628 -#: ../src/roster_window.py:5227 +#: ../src/common/commands.py:205 ../src/common/contacts.py:131 +#: ../src/common/helpers.py:55 ../src/roster_window.py:809 +#: ../src/roster_window.py:1580 ../src/roster_window.py:1582 +#: ../src/roster_window.py:5144 msgid "Groupchats" msgstr "Diskuze" @@ -3452,9 +3456,9 @@ msgstr "" "Seznam (oddělené mezerami) řádků (účtů a skupin), které budou \"zhroucené\"." #. sorted alphanum -#: ../src/common/config.py:106 ../src/common/config.py:483 -#: ../src/common/optparser.py:245 ../src/common/optparser.py:463 -#: ../src/common/optparser.py:497 ../src/gajim.py:3471 +#: ../src/common/config.py:106 ../src/common/config.py:482 +#: ../src/common/optparser.py:288 ../src/common/optparser.py:465 +#: ../src/common/optparser.py:499 ../src/gui_interface.py:3251 msgid "default" msgstr "výchozí" @@ -4113,7 +4117,7 @@ msgstr "" msgid "Jabberd2 workaround" msgstr "Jabberd2 workaround" -#: ../src/common/config.py:331 +#: ../src/common/config.py:330 msgid "" "If checked, Gajim will use your IP and proxies defined in " "file_transfer_proxies option for file transfer." @@ -4121,15 +4125,15 @@ msgstr "" "Pokud je zaškrtnuto, Gajim použije Vaší IP a proxy servery definované ve " "volbě pro přenos souborů file_transfer_proxies." -#: ../src/common/config.py:345 +#: ../src/common/config.py:344 msgid "Answer to receipt requests" msgstr "Odpověď na doručení žádosti" -#: ../src/common/config.py:346 +#: ../src/common/config.py:345 msgid "Sent receipt requests" msgstr "Poslat žádost" -#: ../src/common/config.py:354 +#: ../src/common/config.py:353 msgid "" "When negotiating an encrypted session, should Gajim assume you want your " "messages to be logged?" @@ -4137,112 +4141,112 @@ msgstr "" "Pokud sestavuji šifrované sezení, má Gajim přepokládat povolení " "zaznamenávání zpráv?" -#: ../src/common/config.py:417 +#: ../src/common/config.py:416 msgid "Is OpenPGP enabled for this contact?" msgstr "Je OpenPGP povoleno pro tento kontakt?" -#: ../src/common/config.py:418 +#: ../src/common/config.py:417 msgid "" "Should Gajim automatically start an encrypted session with this contact when " "possible?" msgstr "" "Má Gajim uskutečnit šifrované spojení s tímto kontaktem je-li k dispozici?" -#: ../src/common/config.py:419 ../src/common/config.py:422 +#: ../src/common/config.py:418 ../src/common/config.py:421 msgid "Language for which we want to check misspelled words" msgstr "Jazyk, pro který chcete kontrolovat překlepy ve slovech" -#: ../src/common/config.py:428 +#: ../src/common/config.py:427 msgid "all or space separated status" msgstr "všechny nebo mezerou oddělené stavy" -#: ../src/common/config.py:429 +#: ../src/common/config.py:428 msgid "'yes', 'no', or 'both'" msgstr "'yes', 'no', nebo 'both'" -#: ../src/common/config.py:430 ../src/common/config.py:432 -#: ../src/common/config.py:433 ../src/common/config.py:436 -#: ../src/common/config.py:437 +#: ../src/common/config.py:429 ../src/common/config.py:431 +#: ../src/common/config.py:432 ../src/common/config.py:435 +#: ../src/common/config.py:436 msgid "'yes', 'no' or ''" msgstr "'yes', 'no' nebo ''" -#: ../src/common/config.py:443 ../src/common/pep.py:160 +#: ../src/common/config.py:442 ../src/common/pep.py:157 msgid "Sleeping" msgstr "Spím" -#: ../src/common/config.py:444 +#: ../src/common/config.py:443 msgid "Back soon" msgstr "Hned jsem zpět" -#: ../src/common/config.py:444 +#: ../src/common/config.py:443 msgid "Back in some minutes." msgstr "Jsem zpátky za pár minut." -#: ../src/common/config.py:445 ../src/common/pep.py:130 +#: ../src/common/config.py:444 ../src/common/pep.py:127 msgid "Eating" msgstr "Jím" -#: ../src/common/config.py:445 +#: ../src/common/config.py:444 msgid "I'm eating, so leave me a message." msgstr "Právě jím, prosím zanechte mi zprávu." -#: ../src/common/config.py:446 +#: ../src/common/config.py:445 msgid "Movie" msgstr "Film" -#: ../src/common/config.py:446 +#: ../src/common/config.py:445 msgid "I'm watching a movie." msgstr "Dívám se na film." -#: ../src/common/config.py:447 ../src/common/pep.py:189 +#: ../src/common/config.py:446 ../src/common/pep.py:186 msgid "Working" msgstr "Pracuji" -#: ../src/common/config.py:447 +#: ../src/common/config.py:446 msgid "I'm working." msgstr "Právě pracuji." -#: ../src/common/config.py:448 +#: ../src/common/config.py:447 msgid "Phone" msgstr "Telefon" -#: ../src/common/config.py:448 +#: ../src/common/config.py:447 msgid "I'm on the phone." msgstr "Zrovna telefonuji." -#: ../src/common/config.py:449 +#: ../src/common/config.py:448 msgid "Out" msgstr "Venku" -#: ../src/common/config.py:449 +#: ../src/common/config.py:448 msgid "I'm out enjoying life." msgstr "Užívám si života venku." -#: ../src/common/config.py:460 +#: ../src/common/config.py:459 msgid "I'm available." msgstr "Jsem dostupný." -#: ../src/common/config.py:461 +#: ../src/common/config.py:460 msgid "I'm free for chat." msgstr "Hledám někoho na pokec." -#: ../src/common/config.py:462 ../src/config.py:1419 +#: ../src/common/config.py:461 ../src/config.py:1478 msgid "Be right back." msgstr "Hned jsem zpět." -#: ../src/common/config.py:463 +#: ../src/common/config.py:462 msgid "I'm not available." msgstr "Nejsem dostupný." -#: ../src/common/config.py:464 +#: ../src/common/config.py:463 msgid "Do not disturb." msgstr "Nerušit." -#: ../src/common/config.py:465 ../src/common/config.py:466 +#: ../src/common/config.py:464 ../src/common/config.py:465 msgid "Bye!" msgstr "Zdar!" -#: ../src/common/config.py:476 +#: ../src/common/config.py:475 msgid "" "Sound to play when a group chat message contains one of the words in " "muc_highlight_words, or when a group chat message contains your nickname." @@ -4250,97 +4254,96 @@ msgstr "" "Zvuk, který bude přehrán, pokud zpráva diskuze obsahuje jedno ze slov v " "muc_highlight_words, nebo když obsahuje Vaši přezdívku." -#: ../src/common/config.py:477 +#: ../src/common/config.py:476 msgid "Sound to play when any MUC message arrives." msgstr "Přehraný zvuk při příchodu jakékoliv MUC zprávy." -#: ../src/common/config.py:486 ../src/common/optparser.py:259 +#: ../src/common/config.py:485 ../src/common/optparser.py:302 msgid "green" msgstr "zelený" -#: ../src/common/config.py:490 ../src/common/optparser.py:245 +#: ../src/common/config.py:489 ../src/common/optparser.py:288 msgid "grocery" msgstr "potraviny" -#: ../src/common/config.py:494 +#: ../src/common/config.py:493 msgid "human" msgstr "člověk" -#: ../src/common/config.py:498 +#: ../src/common/config.py:497 msgid "marine" msgstr "mariňák" -#: ../src/common/connection_handlers.py:76 -#: ../src/common/zeroconf/connection_handlers_zeroconf.py:52 +#: ../src/common/connection_handlers.py:83 +#: ../src/common/zeroconf/connection_handlers_zeroconf.py:53 msgid "Unable to load idle module" msgstr "Nelze nahrát idle modul" -#: ../src/common/connection_handlers.py:244 -#: ../src/common/zeroconf/connection_handlers_zeroconf.py:94 +#: ../src/common/connection_handlers.py:251 msgid "Wrong host" msgstr "Nesprávné jméno počítače" -#: ../src/common/connection_handlers.py:245 +#: ../src/common/connection_handlers.py:252 msgid "Invalid local address? :-O" msgstr "Neplatná místní adresa? :-O" -#: ../src/common/connection_handlers.py:678 +#: ../src/common/connection_handlers.py:696 #, python-format msgid "Registration information for transport %s has not arrived in time" msgstr "Registrační informace pro transport %s nedorazily včas" -#: ../src/common/connection_handlers.py:685 +#: ../src/common/connection_handlers.py:703 msgid "Registration succeeded" msgstr "Registrace úspěšná" -#: ../src/common/connection_handlers.py:686 +#: ../src/common/connection_handlers.py:704 #, fuzzy, python-format msgid "Registration with agent %s succeeded" msgstr "Registrace úspěšná" -#: ../src/common/connection_handlers.py:688 +#: ../src/common/connection_handlers.py:706 msgid "Registration failed" msgstr "Registrace selhala" -#: ../src/common/connection_handlers.py:688 +#: ../src/common/connection_handlers.py:706 #, python-format msgid "" "Registration with agent %(agent)s failed with error %(error)s: %(error_msg)s" msgstr "" -#: ../src/common/connection_handlers.py:990 -#: ../src/common/connection_handlers.py:2071 -#: ../src/common/connection_handlers.py:2117 -#: ../src/common/connection_handlers.py:2345 -#: ../src/common/connection_handlers.py:2487 ../src/common/connection.py:1366 -#: ../src/gajim.py:380 +#: ../src/common/connection_handlers.py:1008 +#: ../src/common/connection_handlers.py:2098 +#: ../src/common/connection_handlers.py:2144 +#: ../src/common/connection_handlers.py:2336 +#: ../src/common/connection_handlers.py:2481 ../src/common/connection.py:418 +#: ../src/gajim.py:354 msgid "Disk Write Error" msgstr "Chyba zápisu na disk (možná je plný?)" -#: ../src/common/connection_handlers.py:1207 ../src/common/connection.py:935 +#: ../src/common/connection_handlers.py:1225 ../src/common/connection.py:1373 msgid "Invisibility not supported" msgstr "Neviditelnost není podporována" -#: ../src/common/connection_handlers.py:1208 ../src/common/connection.py:936 +#: ../src/common/connection_handlers.py:1226 ../src/common/connection.py:1374 #, python-format msgid "Account %s doesn't support invisibility." msgstr "Účet %s nepodporuje neviditelnost." -#: ../src/common/connection_handlers.py:1892 ../src/common/connection.py:1181 -#: ../src/config.py:1875 ../src/config.py:1884 ../src/config.py:1943 -#: ../src/config.py:3281 ../src/dataforms_widget.py:555 ../src/dialogs.py:2665 +#: ../src/common/connection_handlers.py:1919 ../src/common/connection.py:233 +#: ../src/config.py:1940 ../src/config.py:1949 ../src/config.py:2008 +#: ../src/config.py:3360 ../src/dataforms_widget.py:577 ../src/dialogs.py:2781 msgid "Invalid Jabber ID" msgstr "Neplatné Jabber ID" -#: ../src/common/connection_handlers.py:1893 +#: ../src/common/connection_handlers.py:1920 msgid "A message from a non-valid JID arrived, it has been ignored." msgstr "Přišla zpráva od neplatného JID a byla ignorována." -#: ../src/common/connection_handlers.py:2074 -#: ../src/common/connection_handlers.py:2120 -#: ../src/common/connection_handlers.py:2348 -#: ../src/common/connection_handlers.py:2490 ../src/common/connection.py:1369 -#: ../src/gajim.py:155 ../src/session.py:131 +#: ../src/common/connection_handlers.py:2101 +#: ../src/common/connection_handlers.py:2147 +#: ../src/common/connection_handlers.py:2339 +#: ../src/common/connection_handlers.py:2484 ../src/common/connection.py:421 +#: ../src/gajim.py:155 ../src/session.py:135 #, python-format msgid "" "The database file (%s) cannot be read. Try to repair it (see http://trac." @@ -4349,7 +4352,7 @@ msgstr "" "Nelze přečíst soubor databáze (%s). Opravte ho (viz http://trac.gajim.org/" "wiki/DatabaseBackup) nebo smažte (tím ztratítu všechny zprávy v historii)." -#: ../src/common/connection_handlers.py:2200 +#: ../src/common/connection_handlers.py:2191 #, python-format msgid "Nickname not allowed: %s" msgstr "Přezdívka nepovolena: %s" @@ -4357,76 +4360,76 @@ msgstr "Přezdívka nepovolena: %s" #. maximum user number reached #. we are banned #. group chat does not exist -#: ../src/common/connection_handlers.py:2295 +#: ../src/common/connection_handlers.py:2286 +#: ../src/common/connection_handlers.py:2294 +#: ../src/common/connection_handlers.py:2300 #: ../src/common/connection_handlers.py:2303 -#: ../src/common/connection_handlers.py:2309 -#: ../src/common/connection_handlers.py:2312 -#: ../src/common/connection_handlers.py:2315 -#: ../src/common/connection_handlers.py:2319 ../src/gajim.py:523 +#: ../src/common/connection_handlers.py:2306 +#: ../src/common/connection_handlers.py:2310 ../src/gui_interface.py:128 msgid "Unable to join group chat" msgstr "Nelze se připojit se do diskuze" -#: ../src/common/connection_handlers.py:2296 +#: ../src/common/connection_handlers.py:2287 #, python-format msgid "Maximum number of users for %s has been reached" msgstr "" -#: ../src/common/connection_handlers.py:2304 +#: ../src/common/connection_handlers.py:2295 #, python-format msgid "You are banned from group chat %s." msgstr "Máš zakázán přístup do diskuze %s." -#: ../src/common/connection_handlers.py:2310 +#: ../src/common/connection_handlers.py:2301 #, python-format msgid "Group chat %s does not exist." msgstr "Diskuze %s neexistuje." -#: ../src/common/connection_handlers.py:2313 +#: ../src/common/connection_handlers.py:2304 msgid "Group chat creation is restricted." msgstr "Vytváření místností není povoleno." -#: ../src/common/connection_handlers.py:2316 +#: ../src/common/connection_handlers.py:2307 #, python-format msgid "Your registered nickname must be used in group chat %s." msgstr "Musí být použita přezdívka, jež máte zaregistrovánu v diskuzi %s." -#: ../src/common/connection_handlers.py:2320 +#: ../src/common/connection_handlers.py:2311 #, python-format msgid "You are not in the members list in groupchat %s." msgstr "Nejsi v seznamu členů diskuze %s." #. Room has been destroyed. see #. http://www.xmpp.org/extensions/xep-0045.html#destroyroom -#: ../src/common/connection_handlers.py:2363 +#: ../src/common/connection_handlers.py:2354 msgid "Room has been destroyed" msgstr "Místnost byla zničena" -#: ../src/common/connection_handlers.py:2371 +#: ../src/common/connection_handlers.py:2362 #, python-format msgid "You can join this room instead: %s" msgstr "Můžete se připojit do této místnosti: %s" -#: ../src/common/connection_handlers.py:2402 +#: ../src/common/connection_handlers.py:2393 msgid "I would like to add you to my roster." msgstr "Rád(a) bych si tě přidal(a) do seznamu." #. BE CAREFUL: no con.updateRosterItem() in a callback -#: ../src/common/connection_handlers.py:2423 +#: ../src/common/connection_handlers.py:2414 #, python-format msgid "we are now subscribed to %s" msgstr "jsme nyní zapsáni k %s" -#: ../src/common/connection_handlers.py:2425 +#: ../src/common/connection_handlers.py:2416 #, python-format msgid "unsubscribe request from %s" msgstr "Žádost o zrušení autorizace od %s" -#: ../src/common/connection_handlers.py:2427 +#: ../src/common/connection_handlers.py:2418 #, python-format msgid "we are now unsubscribed from %s" msgstr "byla nám zrušena autorizace od %s" -#: ../src/common/connection_handlers.py:2619 +#: ../src/common/connection_handlers.py:2613 #, python-format msgid "" "JID %s is not RFC compliant. It will not be added to your roster. Use roster " @@ -4563,145 +4566,28 @@ msgstr "Použítý klíč neobsahuje podpis certifikátu" msgid "Application verification failure" msgstr "Ověřování aplikace skončilo neúspěchem" -#: ../src/common/connection.py:278 -#: ../src/common/zeroconf/connection_zeroconf.py:215 -#, python-format -msgid "Connection with account \"%s\" has been lost" -msgstr "Spojení s účtem \"%s\" bylo ztraceno" - -#: ../src/common/connection.py:279 -msgid "Reconnect manually." -msgstr "Znovu připojit ručně." - -#: ../src/common/connection.py:290 -#, fuzzy, python-format -msgid "Server %(name)s answered wrongly to register request: %(error)s" -msgstr "Server %s odpověděl chybně na požadavek regisrace: %s" - -#: ../src/common/connection.py:324 -#, python-format -msgid "Server %s provided a different registration form" -msgstr "Server %s poskytnul rozdílný registrační formulář" - -#: ../src/common/connection.py:337 -#, python-format -msgid "Unknown SSL error: %d" -msgstr "Neznámá SSL chyba: %d" - -#. wrong answer -#: ../src/common/connection.py:352 -msgid "Invalid answer" -msgstr "Neplatná odpověď" - -#: ../src/common/connection.py:353 -#, python-format -msgid "Transport %(name)s answered wrongly to register request: %(error)s" -msgstr "Transport %(name)s odpověděl chybně na požadavek registrace: %(error)s" - -#: ../src/common/connection.py:636 ../src/common/connection.py:765 -#: ../src/common/connection.py:1526 -#: ../src/common/zeroconf/connection_zeroconf.py:249 -#, python-format -msgid "Could not connect to \"%s\"" -msgstr "Nemůžu se připojit k \"%s\"" - -#: ../src/common/connection.py:637 ../src/gajim.py:1094 -msgid "Check your connection or try again later." -msgstr "Ověřte spojení nebo zkuste později." - -#: ../src/common/connection.py:642 -#, fuzzy, python-format -msgid "Server replied: %s" -msgstr "Uloženo do: %s" - -#: ../src/common/connection.py:655 -msgid "Connection to proxy failed" -msgstr "Spojení s proxy selhalo" - -#: ../src/common/connection.py:686 ../src/common/connection.py:745 -#, python-format -msgid "Could not connect to account %s" -msgstr "Selhalo připojení k účti %s" - -#: ../src/common/connection.py:687 ../src/common/connection.py:746 -#, python-format -msgid "Connection with account %s has been lost. Retry connecting." -msgstr "Spojení s účtem %s bylo ztraceno. Opět se připojte." - -#: ../src/common/connection.py:712 -#, python-format -msgid "The authenticity of the %s certificate could be invalid." -msgstr "Autentizace certifikátu %s je neplatná." - -#: ../src/common/connection.py:715 -#, python-format -msgid "" -"\n" -"SSL Error: %s" -msgstr "" -"\n" -"SSL Error: %s" - -#: ../src/common/connection.py:717 -#, python-format -msgid "" -"\n" -"Unknown SSL error: %d" -msgstr "" -"\n" -"Neznámá SSL chyba: %d" - -#: ../src/common/connection.py:766 -msgid "Check your connection or try again later" -msgstr "Ověřte připojení nebo zkuste později" - -#: ../src/common/connection.py:794 -#, python-format -msgid "Authentication failed with \"%s\"" -msgstr "Autentizace selhala s \"%s\"" - -#: ../src/common/connection.py:796 -msgid "Please check your login and password for correctness." -msgstr "Prosím zkontrolujte správnost jména a hesla." - -#: ../src/common/connection.py:862 -msgid "Error while removing privacy list" -msgstr "Chyba při odebírání privacy listu" - -#: ../src/common/connection.py:863 -#, python-format -msgid "" -"Privacy list %s has not been removed. It is maybe active in one of your " -"connected resources. Deactivate it and try again." -msgstr "" -"Privacy list %s nebyl odstraněn. Možná je aktivní v jednom z připojených " -"zdrojů. Zruště jeho používání a zkuste znovu." - -#: ../src/common/connection.py:1182 ../src/dialogs.py:2666 +#: ../src/common/connection.py:234 ../src/dialogs.py:2782 #, python-format msgid "It is not possible to send a message to %s, this JID is not valid." msgstr "Není možné poslat zprávu kontaktu %s, takové JID není platné." # FIXME: co to je? -#: ../src/common/connection.py:1204 -#: ../src/common/zeroconf/connection_zeroconf.py:389 +#: ../src/common/connection.py:256 msgid "Neither the remote presence is signed, nor a key was assigned." msgstr "Není podepsaná přítomnost ani není přiřazen klíč." -#: ../src/common/connection.py:1206 -#: ../src/common/zeroconf/connection_zeroconf.py:391 +#: ../src/common/connection.py:259 #, python-format msgid "The contact's key (%s) does not match the key assigned in Gajim." msgstr "Klíč kontaktu (%s) se neshoduje s klíčem v Gajimu." #. we're not english #. one in locale and one en -#: ../src/common/connection.py:1254 +#: ../src/common/connection.py:307 msgid "[This message is *encrypted* (See :XEP:`27`]" msgstr "[Tato zpráva je *zašifrovaná* (Viz :XEP:\"27\")]" -#: ../src/common/connection.py:1356 -#: ../src/common/zeroconf/connection_zeroconf.py:468 +#: ../src/common/connection.py:408 #, python-format msgid "" "Subject: %(subject)s\n" @@ -4710,44 +4596,158 @@ msgstr "" "Předmět: %(subject)s\n" "%(message)s" -#: ../src/common/connection.py:1383 +#: ../src/common/connection.py:721 +#, python-format +msgid "Connection with account \"%s\" has been lost" +msgstr "Spojení s účtem \"%s\" bylo ztraceno" + +#: ../src/common/connection.py:722 +msgid "Reconnect manually." +msgstr "Znovu připojit ručně." + +#: ../src/common/connection.py:734 +#, fuzzy, python-format +msgid "Server %(name)s answered wrongly to register request: %(error)s" +msgstr "Server %s odpověděl chybně na požadavek regisrace: %s" + +#: ../src/common/connection.py:768 +#, python-format +msgid "Server %s provided a different registration form" +msgstr "Server %s poskytnul rozdílný registrační formulář" + +#: ../src/common/connection.py:781 +#, python-format +msgid "Unknown SSL error: %d" +msgstr "Neznámá SSL chyba: %d" + +#. wrong answer +#: ../src/common/connection.py:796 +msgid "Invalid answer" +msgstr "Neplatná odpověď" + +#: ../src/common/connection.py:797 +#, python-format +msgid "Transport %(name)s answered wrongly to register request: %(error)s" +msgstr "Transport %(name)s odpověděl chybně na požadavek registrace: %(error)s" + +#: ../src/common/connection.py:1075 ../src/common/connection.py:1204 +#: ../src/common/connection.py:1673 +#: ../src/common/zeroconf/connection_zeroconf.py:189 +#, python-format +msgid "Could not connect to \"%s\"" +msgstr "Nemůžu se připojit k \"%s\"" + +#: ../src/common/connection.py:1076 ../src/gui_interface.py:705 +msgid "Check your connection or try again later." +msgstr "Ověřte spojení nebo zkuste později." + +#: ../src/common/connection.py:1081 +#, fuzzy, python-format +msgid "Server replied: %s" +msgstr "Uloženo do: %s" + +#: ../src/common/connection.py:1094 +msgid "Connection to proxy failed" +msgstr "Spojení s proxy selhalo" + +#: ../src/common/connection.py:1125 ../src/common/connection.py:1184 +#, python-format +msgid "Could not connect to account %s" +msgstr "Selhalo připojení k účti %s" + +#: ../src/common/connection.py:1126 ../src/common/connection.py:1185 +#, python-format +msgid "Connection with account %s has been lost. Retry connecting." +msgstr "Spojení s účtem %s bylo ztraceno. Opět se připojte." + +#: ../src/common/connection.py:1151 +#, python-format +msgid "The authenticity of the %s certificate could be invalid." +msgstr "Autentizace certifikátu %s je neplatná." + +#: ../src/common/connection.py:1154 +#, python-format +msgid "" +"\n" +"SSL Error: %s" +msgstr "" +"\n" +"SSL Error: %s" + +#: ../src/common/connection.py:1156 +#, python-format +msgid "" +"\n" +"Unknown SSL error: %d" +msgstr "" +"\n" +"Neznámá SSL chyba: %d" + +#: ../src/common/connection.py:1205 +msgid "Check your connection or try again later" +msgstr "Ověřte připojení nebo zkuste později" + +#: ../src/common/connection.py:1236 +#, python-format +msgid "Authentication failed with \"%s\"" +msgstr "Autentizace selhala s \"%s\"" + +#: ../src/common/connection.py:1238 +msgid "Please check your login and password for correctness." +msgstr "Prosím zkontrolujte správnost jména a hesla." + +#: ../src/common/connection.py:1300 +msgid "Error while removing privacy list" +msgstr "Chyba při odebírání privacy listu" + +#: ../src/common/connection.py:1301 +#, python-format +msgid "" +"Privacy list %s has not been removed. It is maybe active in one of your " +"connected resources. Deactivate it and try again." +msgstr "" +"Privacy list %s nebyl odstraněn. Možná je aktivní v jednom z připojených " +"zdrojů. Zruště jeho používání a zkuste znovu." + +#: ../src/common/connection.py:1541 #, python-format msgid "Sent contact: \"%s\" (%s)" msgstr "" -#: ../src/common/connection.py:1386 +#: ../src/common/connection.py:1544 #, fuzzy msgid "Sent contacts:" msgstr "Pozvat kontakt" -#: ../src/common/connection.py:1559 ../src/common/connection.py:1580 +#: ../src/common/connection.py:1703 ../src/common/connection.py:1724 msgid "Not fetched because of invisible status" msgstr "Nestáhnuto z důvodu stavu neviditelnosti" -#: ../src/common/connection.py:1982 +#: ../src/common/connection.py:2106 #, fuzzy msgid "Unregister failed" msgstr "Registrace selhala" -#: ../src/common/connection.py:1983 +#: ../src/common/connection.py:2107 #, python-format msgid "Unregistration with server %(server)s failed: %(error)s" msgstr "" -#: ../src/common/contacts.py:92 ../src/common/helpers.py:55 -#: ../src/gajim.py:999 +#: ../src/common/contacts.py:129 ../src/common/helpers.py:55 +#: ../src/gui_interface.py:610 msgid "Observers" msgstr "Přihlížející" -#: ../src/common/contacts.py:96 ../src/common/contacts.py:348 +#: ../src/common/contacts.py:133 ../src/common/contacts.py:335 #: ../src/common/helpers.py:55 ../src/disco.py:119 ../src/disco.py:120 -#: ../src/disco.py:1354 ../src/gajim.py:802 ../src/roster_window.py:847 -#: ../src/roster_window.py:1549 ../src/roster_window.py:1618 -#: ../src/roster_window.py:1620 ../src/roster_window.py:1773 +#: ../src/disco.py:1464 ../src/gui_interface.py:413 +#: ../src/roster_window.py:848 ../src/roster_window.py:1501 +#: ../src/roster_window.py:1572 ../src/roster_window.py:1574 +#: ../src/roster_window.py:1732 msgid "Transports" msgstr "Transporty" -#: ../src/common/contacts.py:356 +#: ../src/common/contacts.py:343 msgid "Not in roster" msgstr "Není v rosteru" @@ -4993,7 +4993,7 @@ msgstr "Ukecaný" msgid "_Available" msgstr "Přip_ojen" -#: ../src/common/helpers.py:212 ../src/features_window.py:116 +#: ../src/common/helpers.py:212 ../src/features_window.py:118 msgid "Available" msgstr "Připojen" @@ -5111,48 +5111,48 @@ msgid "has closed the chat window or tab" msgstr "zavřel(a) okno zprávy" #. GiB means gibibyte -#: ../src/common/helpers.py:658 +#: ../src/common/helpers.py:588 #, python-format msgid "%s GiB" msgstr "%s GiB" #. GB means gigabyte -#: ../src/common/helpers.py:661 +#: ../src/common/helpers.py:591 #, python-format msgid "%s GB" msgstr "%s GB" #. MiB means mibibyte -#: ../src/common/helpers.py:665 +#: ../src/common/helpers.py:595 #, python-format msgid "%s MiB" msgstr "%s MiB" #. MB means megabyte -#: ../src/common/helpers.py:668 +#: ../src/common/helpers.py:598 #, python-format msgid "%s MB" msgstr "%s MB" #. KiB means kibibyte -#: ../src/common/helpers.py:672 +#: ../src/common/helpers.py:602 #, python-format msgid "%s KiB" msgstr "%s KiB" #. KB means kilo bytes -#: ../src/common/helpers.py:675 +#: ../src/common/helpers.py:605 #, python-format msgid "%s KB" msgstr "%s KB" #. B means bytes -#: ../src/common/helpers.py:678 +#: ../src/common/helpers.py:608 #, python-format msgid "%s B" msgstr "%s B" -#: ../src/common/helpers.py:1166 ../src/common/helpers.py:1173 +#: ../src/common/helpers.py:1049 ../src/common/helpers.py:1056 #, python-format msgid "%d message pending" msgid_plural "%d messages pending" @@ -5160,22 +5160,22 @@ msgstr[0] "Čeká %d zpráva" msgstr[1] "Čekají %d zprávy" msgstr[2] "Čeká %d zpráv" -#: ../src/common/helpers.py:1179 +#: ../src/common/helpers.py:1062 #, python-format msgid " from room %s" msgstr "z místností %s" -#: ../src/common/helpers.py:1182 ../src/common/helpers.py:1201 +#: ../src/common/helpers.py:1065 ../src/common/helpers.py:1084 #, python-format msgid " from user %s" msgstr "od uživatele %s" -#: ../src/common/helpers.py:1184 +#: ../src/common/helpers.py:1067 #, python-format msgid " from %s" msgstr "od %s" -#: ../src/common/helpers.py:1191 ../src/common/helpers.py:1198 +#: ../src/common/helpers.py:1074 ../src/common/helpers.py:1081 #, python-format msgid "%d event pending" msgid_plural "%d events pending" @@ -5183,7 +5183,7 @@ msgstr[0] "Čeká %d událost" msgstr[1] "Čekají %d události" msgstr[2] "Čeká %d událostí" -#: ../src/common/helpers.py:1231 +#: ../src/common/helpers.py:1114 #, python-format msgid "Gajim - %s" msgstr "Gajim - %s" @@ -5199,16 +5199,16 @@ msgid "%s is not a valid loglevel" msgstr "%s není platný loglevel" #. we talk about a file -#: ../src/common/optparser.py:57 +#: ../src/common/optparser.py:59 #, python-format msgid "error: cannot open %s for reading" msgstr "chyba: nemůžu otevřít %s pro čtení" -#: ../src/common/optparser.py:254 ../src/common/optparser.py:255 +#: ../src/common/optparser.py:297 ../src/common/optparser.py:298 msgid "cyan" msgstr "azurová" -#: ../src/common/optparser.py:371 +#: ../src/common/optparser.py:373 msgid "migrating logs database to indices" msgstr "převádím záznamy historie k použítí indexů" @@ -5217,667 +5217,688 @@ msgstr "převádím záznamy historie k použítí indexů" msgid "XMPP account %s@%s" msgstr "XMPP účet %s@%s" -#: ../src/common/pep.py:30 +#: ../src/common/pep.py:27 msgid "Afraid" msgstr "Vylekaný" -#: ../src/common/pep.py:31 +#: ../src/common/pep.py:28 msgid "Amazed" msgstr "Užaslý" -#: ../src/common/pep.py:32 +#: ../src/common/pep.py:29 msgid "Amorous" msgstr "Milující" -#: ../src/common/pep.py:33 +#: ../src/common/pep.py:30 msgid "Angry" msgstr "Rozzlobený" -#: ../src/common/pep.py:34 +#: ../src/common/pep.py:31 msgid "Annoyed" msgstr "Mrzutý" -#: ../src/common/pep.py:35 +#: ../src/common/pep.py:32 #, fuzzy msgid "Anxious" msgstr "Znepokojený" -#: ../src/common/pep.py:36 +#: ../src/common/pep.py:33 msgid "Aroused" msgstr "Vzrušený" -#: ../src/common/pep.py:37 +#: ../src/common/pep.py:34 msgid "Ashamed" msgstr "Zahanbený" -#: ../src/common/pep.py:38 +#: ../src/common/pep.py:35 msgid "Bored" msgstr "Znuděný" -#: ../src/common/pep.py:39 +#: ../src/common/pep.py:36 msgid "Brave" msgstr "Statečný" -#: ../src/common/pep.py:40 +#: ../src/common/pep.py:37 msgid "Calm" msgstr "Klidný" -#: ../src/common/pep.py:41 +#: ../src/common/pep.py:38 msgid "Cautious" msgstr "Opatrný" -#: ../src/common/pep.py:42 +#: ../src/common/pep.py:39 msgid "Cold" msgstr "Chladný" -#: ../src/common/pep.py:43 +#: ../src/common/pep.py:40 msgid "Confident" msgstr "Sebevědomý" -#: ../src/common/pep.py:44 +#: ../src/common/pep.py:41 msgid "Confused" msgstr "Zmatený" -#: ../src/common/pep.py:45 +#: ../src/common/pep.py:42 msgid "Contemplative" msgstr "Zamyšlený" -#: ../src/common/pep.py:46 +#: ../src/common/pep.py:43 msgid "Contented" msgstr "Spokojený" -#: ../src/common/pep.py:47 +#: ../src/common/pep.py:44 msgid "Cranky" msgstr "Potrhlý" -#: ../src/common/pep.py:48 +#: ../src/common/pep.py:45 msgid "Crazy" msgstr "Šílený" -#: ../src/common/pep.py:49 +#: ../src/common/pep.py:46 msgid "Creative" msgstr "Tvořivý" -#: ../src/common/pep.py:50 +#: ../src/common/pep.py:47 msgid "Curious" msgstr "Zvědavý" -#: ../src/common/pep.py:51 +#: ../src/common/pep.py:48 msgid "Dejected" msgstr "Odmítnutý" -#: ../src/common/pep.py:52 +#: ../src/common/pep.py:49 msgid "Depressed" msgstr "Deprimovaný" -#: ../src/common/pep.py:53 +#: ../src/common/pep.py:50 msgid "Disappointed" msgstr "Zklamaný" -#: ../src/common/pep.py:54 +#: ../src/common/pep.py:51 msgid "Disgusted" msgstr "Znechucený" -#: ../src/common/pep.py:55 +#: ../src/common/pep.py:52 msgid "Dismayed" msgstr "Zděšený" -#: ../src/common/pep.py:56 +#: ../src/common/pep.py:53 msgid "Distracted" msgstr "Roztržitý" -#: ../src/common/pep.py:57 +#: ../src/common/pep.py:54 #, fuzzy msgid "Embarrassed" msgstr "Rozpačitý" -#: ../src/common/pep.py:58 +#: ../src/common/pep.py:55 msgid "Envious" msgstr "Závidějící" -#: ../src/common/pep.py:59 +#: ../src/common/pep.py:56 msgid "Excited" msgstr "Nadšený" -#: ../src/common/pep.py:60 +#: ../src/common/pep.py:57 msgid "Flirtatious" msgstr "Záletný" -#: ../src/common/pep.py:61 +#: ../src/common/pep.py:58 #, fuzzy msgid "Frustrated" msgstr "Rozčarovaný" -#: ../src/common/pep.py:62 +#: ../src/common/pep.py:59 msgid "Grateful" msgstr "Vděčný" -#: ../src/common/pep.py:63 +#: ../src/common/pep.py:60 msgid "Grieving" msgstr "Truchlící" -#: ../src/common/pep.py:64 +#: ../src/common/pep.py:61 #, fuzzy msgid "Grumpy" msgstr "Nevrlý" -#: ../src/common/pep.py:65 +#: ../src/common/pep.py:62 msgid "Guilty" msgstr "Provinilý" -#: ../src/common/pep.py:66 +#: ../src/common/pep.py:63 msgid "Happy" msgstr "Šťastný" -#: ../src/common/pep.py:67 +#: ../src/common/pep.py:64 msgid "Hopeful" msgstr "Doufající" -#: ../src/common/pep.py:68 +#: ../src/common/pep.py:65 msgid "Hot" msgstr "Rozpálený" -#: ../src/common/pep.py:69 +#: ../src/common/pep.py:66 msgid "Humbled" msgstr "Pokorný" -#: ../src/common/pep.py:70 +#: ../src/common/pep.py:67 #, fuzzy msgid "Humiliated" msgstr "Ponížený" -#: ../src/common/pep.py:71 +#: ../src/common/pep.py:68 msgid "Hungry" msgstr "Hladový" -#: ../src/common/pep.py:72 +#: ../src/common/pep.py:69 msgid "Hurt" msgstr "Raněný" -#: ../src/common/pep.py:73 +#: ../src/common/pep.py:70 #, fuzzy msgid "Impressed" msgstr "Ohromený" -#: ../src/common/pep.py:74 +#: ../src/common/pep.py:71 msgid "In Awe" msgstr "S respektem" -#: ../src/common/pep.py:75 +#: ../src/common/pep.py:72 msgid "In Love" msgstr "Zamilovaný" -#: ../src/common/pep.py:76 +#: ../src/common/pep.py:73 msgid "Indignant" msgstr "Rozhořčený" -#: ../src/common/pep.py:77 +#: ../src/common/pep.py:74 msgid "Interested" msgstr "Zaujatý" -#: ../src/common/pep.py:78 +#: ../src/common/pep.py:75 #, fuzzy msgid "Intoxicated" msgstr "Opilý/Zfetovaný" -#: ../src/common/pep.py:79 +#: ../src/common/pep.py:76 msgid "Invincible" msgstr "Nepřekonatelný" -#: ../src/common/pep.py:80 +#: ../src/common/pep.py:77 msgid "Jealous" msgstr "Žárlivý" -#: ../src/common/pep.py:81 +#: ../src/common/pep.py:78 msgid "Lonely" msgstr "Osamělý" -#: ../src/common/pep.py:82 +#: ../src/common/pep.py:79 msgid "Lost" msgstr "Ztracený" -#: ../src/common/pep.py:83 +#: ../src/common/pep.py:80 msgid "Lucky" msgstr "Šťastný" -#: ../src/common/pep.py:84 +#: ../src/common/pep.py:81 msgid "Mean" msgstr "Nízký" -#: ../src/common/pep.py:85 +#: ../src/common/pep.py:82 msgid "Moody" msgstr "Náladový" -#: ../src/common/pep.py:86 +#: ../src/common/pep.py:83 msgid "Nervous" msgstr "Nervózní" -#: ../src/common/pep.py:87 +#: ../src/common/pep.py:84 msgid "Neutral" msgstr "Bez emocí" -#: ../src/common/pep.py:88 +#: ../src/common/pep.py:85 msgid "Offended" msgstr "Uražený" -#: ../src/common/pep.py:89 +#: ../src/common/pep.py:86 msgid "Outraged" msgstr "Rozčílený" -#: ../src/common/pep.py:90 +#: ../src/common/pep.py:87 msgid "Playful" msgstr "Hravý" -#: ../src/common/pep.py:91 +#: ../src/common/pep.py:88 msgid "Proud" msgstr "Hrdý" -#: ../src/common/pep.py:92 +#: ../src/common/pep.py:89 #, fuzzy msgid "Relaxed" msgstr "Uvolněný" -#: ../src/common/pep.py:93 +#: ../src/common/pep.py:90 #, fuzzy msgid "Relieved" msgstr "Uvolněný" -#: ../src/common/pep.py:94 +#: ../src/common/pep.py:91 msgid "Remorseful" msgstr "Kajícný" -#: ../src/common/pep.py:95 +#: ../src/common/pep.py:92 #, fuzzy msgid "Restless" msgstr "Netrpělivý" -#: ../src/common/pep.py:96 +#: ../src/common/pep.py:93 msgid "Sad" msgstr "Smutný" -#: ../src/common/pep.py:97 +#: ../src/common/pep.py:94 msgid "Sarcastic" msgstr "Jízlivý" -#: ../src/common/pep.py:98 +#: ../src/common/pep.py:95 msgid "Satisfied" msgstr "Spokojený" -#: ../src/common/pep.py:99 +#: ../src/common/pep.py:96 msgid "Serious" msgstr "Vážný" -#: ../src/common/pep.py:100 +#: ../src/common/pep.py:97 msgid "Shocked" msgstr "Šokovaný" -#: ../src/common/pep.py:101 +#: ../src/common/pep.py:98 msgid "Shy" msgstr "Plachý" -#: ../src/common/pep.py:102 +#: ../src/common/pep.py:99 msgid "Sick" msgstr "Nemocný" -#: ../src/common/pep.py:103 +#: ../src/common/pep.py:100 msgid "Sleepy" msgstr "Ospalý" -#: ../src/common/pep.py:104 +#: ../src/common/pep.py:101 msgid "Spontaneous" msgstr "Spontánní" -#: ../src/common/pep.py:105 +#: ../src/common/pep.py:102 msgid "Stressed" msgstr "Stresovaný" -#: ../src/common/pep.py:106 +#: ../src/common/pep.py:103 msgid "Strong" msgstr "Silný" -#: ../src/common/pep.py:107 +#: ../src/common/pep.py:104 msgid "Surprised" msgstr "Překvapený" -#: ../src/common/pep.py:108 +#: ../src/common/pep.py:105 msgid "Thankful" msgstr "Děkovný" -#: ../src/common/pep.py:109 +#: ../src/common/pep.py:106 msgid "Thirsty" msgstr "Žíznivý" -#: ../src/common/pep.py:110 +#: ../src/common/pep.py:107 msgid "Tired" msgstr "Unavený" -#: ../src/common/pep.py:111 +#: ../src/common/pep.py:108 msgid "Undefined" msgstr "Nedefinováno" -#: ../src/common/pep.py:112 +#: ../src/common/pep.py:109 msgid "Weak" msgstr "Slabý" -#: ../src/common/pep.py:113 +#: ../src/common/pep.py:110 #, fuzzy msgid "Worried" msgstr "Ustaraný" -#: ../src/common/pep.py:116 +#: ../src/common/pep.py:113 #, fuzzy msgid "Doing Chores" msgstr "Domácí práce" -#: ../src/common/pep.py:117 +#: ../src/common/pep.py:114 msgid "Buying Groceries" msgstr "Nakupuji potraviny" -#: ../src/common/pep.py:118 +#: ../src/common/pep.py:115 msgid "Cleaning" msgstr "Uklízím" -#: ../src/common/pep.py:119 +#: ../src/common/pep.py:116 msgid "Cooking" msgstr "Vařím" -#: ../src/common/pep.py:120 +#: ../src/common/pep.py:117 #, fuzzy msgid "Doing Maintenance" msgstr "Dělám údržbu" -#: ../src/common/pep.py:121 +#: ../src/common/pep.py:118 msgid "Doing the Dishes" msgstr "Umývám nádobí" -#: ../src/common/pep.py:122 +#: ../src/common/pep.py:119 msgid "Doing the Laundry" msgstr "Peru" -#: ../src/common/pep.py:123 +#: ../src/common/pep.py:120 msgid "Gardening" msgstr "Zahradničím" -#: ../src/common/pep.py:124 +#: ../src/common/pep.py:121 #, fuzzy msgid "Running an Errand" msgstr "Vyřizuji" -#: ../src/common/pep.py:125 +#: ../src/common/pep.py:122 msgid "Walking the Dog" msgstr "Venčím psa" -#: ../src/common/pep.py:126 +#: ../src/common/pep.py:123 #, fuzzy msgid "Drinking" msgstr "Piju" -#: ../src/common/pep.py:127 +#: ../src/common/pep.py:124 msgid "Having a Beer" msgstr "Piju pivo" -#: ../src/common/pep.py:128 +#: ../src/common/pep.py:125 #, fuzzy msgid "Having Coffee" msgstr "Na kávě" -#: ../src/common/pep.py:129 +#: ../src/common/pep.py:126 msgid "Having Tea" msgstr "Dávám si čaj" -#: ../src/common/pep.py:131 +#: ../src/common/pep.py:128 #, fuzzy msgid "Having a Snack" msgstr "Svačím" -#: ../src/common/pep.py:132 +#: ../src/common/pep.py:129 #, fuzzy msgid "Having Breakfast" msgstr "Snídám" -#: ../src/common/pep.py:133 +#: ../src/common/pep.py:130 #, fuzzy msgid "Having Dinner" msgstr "Večeřím" -#: ../src/common/pep.py:134 +#: ../src/common/pep.py:131 #, fuzzy msgid "Having Lunch" msgstr "Obědvám" -#: ../src/common/pep.py:135 +#: ../src/common/pep.py:132 msgid "Exercising" msgstr "Cvičím" -#: ../src/common/pep.py:136 ../src/common/pep.py:181 +#: ../src/common/pep.py:133 ../src/common/pep.py:178 msgid "Cycling" msgstr "Jedu na kole" -#: ../src/common/pep.py:137 +#: ../src/common/pep.py:134 msgid "Dancing" msgstr "Tančím" -#: ../src/common/pep.py:138 +#: ../src/common/pep.py:135 msgid "Hiking" msgstr "Na výšlapu" -#: ../src/common/pep.py:139 +#: ../src/common/pep.py:136 #, fuzzy msgid "Jogging" msgstr "Jogging" -#: ../src/common/pep.py:140 +#: ../src/common/pep.py:137 msgid "Playing Sports" msgstr "Sportuji" -#: ../src/common/pep.py:141 +#: ../src/common/pep.py:138 msgid "Running" msgstr "Běhám" -#: ../src/common/pep.py:142 +#: ../src/common/pep.py:139 msgid "Skiing" msgstr "Lyžuji" -#: ../src/common/pep.py:143 +#: ../src/common/pep.py:140 msgid "Swimming" msgstr "Plavu" -#: ../src/common/pep.py:144 +#: ../src/common/pep.py:141 msgid "Working out" msgstr "Posiluji" -#: ../src/common/pep.py:145 +#: ../src/common/pep.py:142 #, fuzzy msgid "Grooming" msgstr "Pečuji o sebe" -#: ../src/common/pep.py:146 +#: ../src/common/pep.py:143 #, fuzzy msgid "At the Spa" msgstr "V lázních" -#: ../src/common/pep.py:147 +#: ../src/common/pep.py:144 #, fuzzy msgid "Brushing Teeth" msgstr "Čistím si zuby" -#: ../src/common/pep.py:148 +#: ../src/common/pep.py:145 #, fuzzy msgid "Getting a Haircut" msgstr "U holiče" -#: ../src/common/pep.py:149 +#: ../src/common/pep.py:146 msgid "Shaving" msgstr "Holím se" -#: ../src/common/pep.py:150 +#: ../src/common/pep.py:147 msgid "Taking a Bath" msgstr "Koupu se" -#: ../src/common/pep.py:151 +#: ../src/common/pep.py:148 msgid "Taking a Shower" msgstr "Sprchuji se" -#: ../src/common/pep.py:152 +#: ../src/common/pep.py:149 msgid "Having an Appointment" msgstr "Mám schůzku" -#: ../src/common/pep.py:154 +#: ../src/common/pep.py:151 msgid "Day Off" msgstr "Den volna" -#: ../src/common/pep.py:155 +#: ../src/common/pep.py:152 #, fuzzy msgid "Hanging out" msgstr "Venku za zábavou" -#: ../src/common/pep.py:156 +#: ../src/common/pep.py:153 msgid "Hiding" msgstr "Skrývám se" -#: ../src/common/pep.py:157 +#: ../src/common/pep.py:154 msgid "On Vacation" msgstr "Na dovolené" -#: ../src/common/pep.py:158 +#: ../src/common/pep.py:155 msgid "Praying" msgstr "Modlím se" -#: ../src/common/pep.py:159 +#: ../src/common/pep.py:156 msgid "Scheduled Holiday" msgstr "Plánovaná dovolená" -#: ../src/common/pep.py:161 +#: ../src/common/pep.py:158 msgid "Thinking" msgstr "Přemýšlím" -#: ../src/common/pep.py:162 +#: ../src/common/pep.py:159 #, fuzzy msgid "Relaxing" msgstr "Relaxuji" -#: ../src/common/pep.py:163 +#: ../src/common/pep.py:160 msgid "Fishing" msgstr "Rybařím" -#: ../src/common/pep.py:164 +#: ../src/common/pep.py:161 #, fuzzy msgid "Gaming" msgstr "Hraji hry" -#: ../src/common/pep.py:165 +#: ../src/common/pep.py:162 #, fuzzy msgid "Going out" msgstr "Venku" -#: ../src/common/pep.py:166 +#: ../src/common/pep.py:163 msgid "Partying" msgstr "Na párty" -#: ../src/common/pep.py:167 +#: ../src/common/pep.py:164 msgid "Reading" msgstr "Čtu si" -#: ../src/common/pep.py:168 +#: ../src/common/pep.py:165 #, fuzzy msgid "Rehearsing" msgstr "Nacvičuji" -#: ../src/common/pep.py:169 +#: ../src/common/pep.py:166 msgid "Shopping" msgstr "Nakupuji" -#: ../src/common/pep.py:170 +#: ../src/common/pep.py:167 msgid "Smoking" msgstr "Kouřím" -#: ../src/common/pep.py:171 +#: ../src/common/pep.py:168 msgid "Socializing" msgstr "Ve společnosti" -#: ../src/common/pep.py:172 +#: ../src/common/pep.py:169 msgid "Sunbathing" msgstr "Opaluji se" -#: ../src/common/pep.py:173 +#: ../src/common/pep.py:170 msgid "Watching TV" msgstr "Sleduji TV" -#: ../src/common/pep.py:174 +#: ../src/common/pep.py:171 msgid "Watching a Movie" msgstr "Dívám se na film" -#: ../src/common/pep.py:175 +#: ../src/common/pep.py:172 #, fuzzy msgid "Talking" msgstr "Povídám si" -#: ../src/common/pep.py:176 +#: ../src/common/pep.py:173 msgid "In Real Life" msgstr "Ve skutečném světě" -#: ../src/common/pep.py:177 +#: ../src/common/pep.py:174 msgid "On the Phone" msgstr "Telefonuji" -#: ../src/common/pep.py:178 +#: ../src/common/pep.py:175 msgid "On Video Phone" msgstr "Mám videohovor" -#: ../src/common/pep.py:179 +#: ../src/common/pep.py:176 msgid "Traveling" msgstr "Cestuji" -#: ../src/common/pep.py:180 +#: ../src/common/pep.py:177 #, fuzzy msgid "Commuting" msgstr "Dojíždím" -#: ../src/common/pep.py:182 +#: ../src/common/pep.py:179 msgid "Driving" msgstr "Řídím" -#: ../src/common/pep.py:183 +#: ../src/common/pep.py:180 msgid "In a Car" msgstr "V autě" -#: ../src/common/pep.py:184 +#: ../src/common/pep.py:181 msgid "On a Bus" msgstr "V autobuse" -#: ../src/common/pep.py:185 +#: ../src/common/pep.py:182 msgid "On a Plane" msgstr "V letadle" -#: ../src/common/pep.py:186 +#: ../src/common/pep.py:183 msgid "On a Train" msgstr "Ve vlaku" -#: ../src/common/pep.py:187 +#: ../src/common/pep.py:184 msgid "On a Trip" msgstr "Na výletě" -#: ../src/common/pep.py:188 +#: ../src/common/pep.py:185 msgid "Walking" msgstr "Na procházce" -#: ../src/common/pep.py:190 +#: ../src/common/pep.py:187 msgid "Coding" msgstr "Programuji" -#: ../src/common/pep.py:191 +#: ../src/common/pep.py:188 #, fuzzy msgid "In a Meeting" msgstr "Na setkání" -#: ../src/common/pep.py:192 +#: ../src/common/pep.py:189 msgid "Studying" msgstr "Učím se" -#: ../src/common/pep.py:193 +#: ../src/common/pep.py:190 msgid "Writing" msgstr "Píši" +#: ../src/common/pep.py:335 +msgid "Unknown Artist" +msgstr "Neznámý Umělec" + +#: ../src/common/pep.py:338 +msgid "Unknown Title" +msgstr "Neznámý Název" + +#: ../src/common/pep.py:341 +msgid "Unknown Source" +msgstr "Neznámý Zdroj" + +#: ../src/common/pep.py:344 +#, python-format +msgid "" +"\"%(title)s\" by %(artist)s\n" +"from %(source)s" +msgstr "" +"\"%(title)s\" od %(artist)s\n" +"z %(source)s" + #. We cannot bind port, call error callback and fail #: ../src/common/socks5.py:86 #, python-format @@ -5899,37 +5920,11 @@ msgstr "" "[Tato zpráva je součástí šifrovaného sezení. Pokud vidíte tuto zprávu, tak " "je něco špatně.]" -#: ../src/common/zeroconf/connection_handlers_zeroconf.py:94 -#, python-format -msgid "" -"The host %s you configured as the ft_add_hosts_to_send advanced option is " -"not valid, so ignored." -msgstr "" -"Host %s nastevený jako ft_add_hosts_to_send má rozšířenou volbu chybnou, " -"bude ignorována." - -#. We didn't set a passphrase -#: ../src/common/zeroconf/connection_zeroconf.py:173 -msgid "OpenPGP passphrase was not given" -msgstr "OpenPGP heslo nebylo zadáno" - -#. %s is the account name here -#: ../src/common/zeroconf/connection_zeroconf.py:175 -#: ../src/roster_window.py:1970 -#, python-format -msgid "You will be connected to %s without OpenPGP." -msgstr "Budete připojen(a) k %s bez OpenPGP." - -#: ../src/common/zeroconf/connection_zeroconf.py:216 -msgid "To continue sending and receiving messages, you will need to reconnect." -msgstr "" -"Pro pokračování v přijímání a odesílání zpráv se musíte znovu připojit." - -#: ../src/common/zeroconf/connection_zeroconf.py:239 +#: ../src/common/zeroconf/connection_zeroconf.py:178 msgid "Avahi error" msgstr "Chyba Avahi" -#: ../src/common/zeroconf/connection_zeroconf.py:239 +#: ../src/common/zeroconf/connection_zeroconf.py:179 #, python-format msgid "" "%s\n" @@ -5938,52 +5933,44 @@ msgstr "" "%s\n" "Zasílání lokálních zpráv nemusí fungovat správně." -#: ../src/common/zeroconf/connection_zeroconf.py:250 +#: ../src/common/zeroconf/connection_zeroconf.py:190 msgid "Please check if Avahi or Bonjour is installed." msgstr "Zkontrolujte zda je Avahi nebo Bonjour nainstalováno." -#: ../src/common/zeroconf/connection_zeroconf.py:259 -#: ../src/common/zeroconf/connection_zeroconf.py:263 +#: ../src/common/zeroconf/connection_zeroconf.py:199 +#: ../src/common/zeroconf/connection_zeroconf.py:203 msgid "Could not start local service" msgstr "Nepodařilo se spustit lokální službu" -#: ../src/common/zeroconf/connection_zeroconf.py:260 +#: ../src/common/zeroconf/connection_zeroconf.py:200 #, python-format msgid "Unable to bind to port %d." msgstr "Nemůžu naslouchat na portu %d." -#: ../src/common/zeroconf/connection_zeroconf.py:264 -#: ../src/common/zeroconf/connection_zeroconf.py:359 +#: ../src/common/zeroconf/connection_zeroconf.py:204 +#: ../src/common/zeroconf/connection_zeroconf.py:283 +#: ../src/common/zeroconf/connection_zeroconf.py:294 +#: ../src/common/zeroconf/connection_zeroconf.py:308 msgid "Please check if avahi-daemon is running." msgstr "Zkontrolujte, zda avahi-daemon běží." -#: ../src/common/zeroconf/connection_zeroconf.py:358 +#: ../src/common/zeroconf/connection_zeroconf.py:282 +#: ../src/common/zeroconf/connection_zeroconf.py:293 +#: ../src/common/zeroconf/connection_zeroconf.py:307 #, python-format msgid "Could not change status of account \"%s\"" msgstr "Nemůžu změnit stav účtu \"%s\"" -#: ../src/common/zeroconf/connection_zeroconf.py:381 -msgid "" -"You are not connected or not visible to others. Your message could not be " -"sent." -msgstr "" -"Nejsi připojen nebo viditelný pro ostatní. Tvoje zpráva nemůže být odeslána." - -#. we're not english -#: ../src/common/zeroconf/connection_zeroconf.py:399 -msgid "[This message is encrypted]" -msgstr "[Tato zpráva je zašifrovaná]" - -#: ../src/common/zeroconf/connection_zeroconf.py:483 +#: ../src/common/zeroconf/connection_zeroconf.py:324 msgid "Your message could not be sent." msgstr "Vaše zpráva nemohla být odeslána." #. Contact Offline -#: ../src/common/zeroconf/connection_zeroconf.py:489 +#: ../src/common/zeroconf/connection_zeroconf.py:334 msgid "Contact is offline. Your message could not be sent." msgstr "Kontakt je offline. Vaše zpráva nemohla být odeslána." -#: ../src/common/zeroconf/connection_zeroconf.py:593 +#: ../src/common/zeroconf/connection_zeroconf.py:359 msgid "" "Connection to host could not be established: Timeout while sending data." msgstr "Spojení k počítači nebylo navázáno:Vypršel čas při odesílání dat." @@ -5994,24 +5981,24 @@ msgstr "Spojení k počítači nebylo navázáno:Vypršel čas při odesílání msgid "Error while adding service. %s" msgstr "Chyba při přidávání služby. %s" -#: ../src/config.py:151 ../src/config.py:597 +#: ../src/config.py:157 ../src/config.py:586 msgid "Disabled" msgstr "Vypnuto" -#: ../src/config.py:396 +#: ../src/config.py:383 msgid "Default Message" msgstr "Výchozí Zpráva" -#: ../src/config.py:405 +#: ../src/config.py:392 msgid "Enabled" msgstr "Povolit" -#: ../src/config.py:663 ../src/dialogs.py:1327 +#: ../src/config.py:654 ../src/dialogs.py:1365 #, python-format msgid "Dictionary for lang %s not available" msgstr "Slovník pro jazyk %s není dostupný" -#: ../src/config.py:664 +#: ../src/config.py:655 #, python-format msgid "" "You have to install %s dictionary to use spellchecking, or choose another " @@ -6020,212 +6007,212 @@ msgstr "" "Musíš nainstalovat %s slovník k použití kontroly pravopisu, nebo vybrat jiný " "jazyk nastavením volby speller_language." -#: ../src/config.py:1040 +#: ../src/config.py:1092 msgid "status message title" msgstr "titulek stavu" -#: ../src/config.py:1040 +#: ../src/config.py:1092 msgid "status message text" msgstr "text stavu" #. Name column -#: ../src/config.py:1339 ../src/dialogs.py:2122 ../src/dialogs.py:2186 -#: ../src/dialogs.py:2891 ../src/disco.py:773 ../src/disco.py:1568 -#: ../src/disco.py:1854 ../src/history_window.py:87 +#: ../src/config.py:1394 ../src/dialogs.py:2232 ../src/dialogs.py:2298 +#: ../src/dialogs.py:3014 ../src/disco.py:831 ../src/disco.py:1690 +#: ../src/disco.py:1992 ../src/history_window.py:89 msgid "Name" msgstr "Jméno" -#: ../src/config.py:1428 +#: ../src/config.py:1487 msgid "Relogin now?" msgstr "Připojit se teď znovu?" -#: ../src/config.py:1429 +#: ../src/config.py:1488 msgid "If you want all the changes to apply instantly, you must relogin." msgstr "Pokud chcete, aby se změny projevily ihned, musíte se znovu přihlásit." -#: ../src/config.py:1559 ../src/config.py:1684 +#: ../src/config.py:1620 ../src/config.py:1745 msgid "OpenPGP is not usable on this computer" msgstr "OpenPGP na tomto počítači není použitelné" -#: ../src/config.py:1720 ../src/config.py:1764 +#: ../src/config.py:1785 ../src/config.py:1829 msgid "Unread events" msgstr "Nepřečtené zprávy" -#: ../src/config.py:1721 +#: ../src/config.py:1786 msgid "Read all pending events before removing this account." msgstr "Přečtěte si všechny čekající zprávy, než smažete tento účet." -#: ../src/config.py:1747 +#: ../src/config.py:1812 #, python-format msgid "You have opened chat in account %s" msgstr "Otevřel(a) jsi rozhovor z účtu %s" -#: ../src/config.py:1748 +#: ../src/config.py:1813 msgid "All chat and groupchat windows will be closed. Do you want to continue?" msgstr "" "Všechna okna rozhovorů a diskuzí budou zavřena. Opravdu chceš pokračovat?" -#: ../src/config.py:1760 ../src/config.py:2283 ../src/config.py:2317 +#: ../src/config.py:1825 ../src/config.py:2348 ../src/config.py:2382 msgid "You are currently connected to the server" msgstr "Nejste přávě připojen(a) k serveru" -#: ../src/config.py:1761 +#: ../src/config.py:1826 msgid "To change the account name, you must be disconnected." msgstr "Ke změně jména účtu se musite odpojit." -#: ../src/config.py:1765 +#: ../src/config.py:1830 msgid "To change the account name, you must read all pending events." msgstr "Před změnou jména účtu si musíte přečíst všechny čekající zprávy." -#: ../src/config.py:1771 +#: ../src/config.py:1836 msgid "Account Name Already Used" msgstr "Jméno účtu už existuje" -#: ../src/config.py:1772 +#: ../src/config.py:1837 msgid "" "This name is already used by another of your accounts. Please choose another " "name." msgstr "Toto jméno je už použito pro jiný účet. Zvolte jiné, prosím." -#: ../src/config.py:1776 ../src/config.py:1780 +#: ../src/config.py:1841 ../src/config.py:1845 msgid "Invalid account name" msgstr "Neplatné jméno účtu" -#: ../src/config.py:1777 +#: ../src/config.py:1842 msgid "Account name cannot be empty." msgstr "Jméno účtu nemůže být prázdné." -#: ../src/config.py:1781 +#: ../src/config.py:1846 msgid "Account name cannot contain spaces." msgstr "Jméno účtu nesmí obsahovat mezery." -#: ../src/config.py:1856 +#: ../src/config.py:1921 msgid "Rename Account" msgstr "Přejmenovat účet" -#: ../src/config.py:1857 +#: ../src/config.py:1922 #, python-format msgid "Enter a new name for account %s" msgstr "Zadej nové jméno pro účet %s." -#: ../src/config.py:1885 +#: ../src/config.py:1950 msgid "A Jabber ID must be in the form \"user@servername\"." msgstr "Jabber ID musí být ve tvaru \"uživatel@jménoserveru\"." -#: ../src/config.py:2093 ../src/config.py:3327 +#: ../src/config.py:2158 ../src/config.py:3406 msgid "Invalid entry" msgstr "Neplatný záznam" -#: ../src/config.py:2094 ../src/config.py:3328 +#: ../src/config.py:2159 ../src/config.py:3407 msgid "Custom port must be a port number." msgstr "Vlastní port musí být číslo portu." -#: ../src/config.py:2115 +#: ../src/config.py:2180 msgid "Failed to get secret keys" msgstr "Selhalo získání privátního klíče" -#: ../src/config.py:2116 +#: ../src/config.py:2181 #, fuzzy msgid "There is no OpenPGP secret key available." msgstr "Nastala chyba při získávání Vašich OpenPGP privátních klíčů." -#: ../src/config.py:2150 +#: ../src/config.py:2215 msgid "OpenPGP Key Selection" msgstr "Výběr OpenPGP klíče" -#: ../src/config.py:2151 +#: ../src/config.py:2216 msgid "Choose your OpenPGP key" msgstr "Vyberte Váš OpenPGP klíč" -#: ../src/config.py:2158 +#: ../src/config.py:2223 msgid "No such account available" msgstr "Takový účet není dostupný" -#: ../src/config.py:2159 +#: ../src/config.py:2224 msgid "You must create your account before editing your personal information." msgstr "Musíte vytvořit účet před úpravou vašich osobních údajů." -#: ../src/config.py:2166 ../src/dialogs.py:1933 ../src/dialogs.py:2110 -#: ../src/dialogs.py:2289 ../src/disco.py:441 ../src/profile_window.py:317 +#: ../src/config.py:2231 ../src/dialogs.py:2031 ../src/dialogs.py:2220 +#: ../src/dialogs.py:2405 ../src/disco.py:477 ../src/profile_window.py:325 msgid "You are not connected to the server" msgstr "Nejste připojen(a) k serveru" -#: ../src/config.py:2167 +#: ../src/config.py:2232 msgid "Without a connection, you can not edit your personal information." msgstr "Bez připojení nemůžete upravovat osobní údaje." -#: ../src/config.py:2171 +#: ../src/config.py:2236 msgid "Your server doesn't support Vcard" msgstr "Váš server nepodporuje vizitky." -#: ../src/config.py:2172 +#: ../src/config.py:2237 msgid "Your server can't save your personal information." msgstr "Váš server neumí uložit Vaše osobní informace." -#: ../src/config.py:2284 ../src/config.py:2318 +#: ../src/config.py:2349 ../src/config.py:2383 #, fuzzy msgid "To disable the account, you must be disconnected." msgstr "Ke změně jména účtu se musite odpojit." -#: ../src/config.py:2289 +#: ../src/config.py:2354 msgid "Account Local already exists." msgstr "Účet Local už existuje." -#: ../src/config.py:2290 +#: ../src/config.py:2355 msgid "Please rename or remove it before enabling link-local messaging." msgstr "Prosím přejmenujte nebo odstraňte před povolením lokálních zpráv." -#: ../src/config.py:2438 +#: ../src/config.py:2510 #, python-format msgid "Edit %s" msgstr "Uprav %s" -#: ../src/config.py:2440 +#: ../src/config.py:2512 #, python-format msgid "Register to %s" msgstr "Registrovat k %s" #. list at the beginning -#: ../src/config.py:2476 +#: ../src/config.py:2548 msgid "Ban List" msgstr "Ban List" -#: ../src/config.py:2477 +#: ../src/config.py:2549 msgid "Member List" msgstr "Seznam členů" -#: ../src/config.py:2478 +#: ../src/config.py:2550 msgid "Owner List" msgstr "Seznam vlastníků" -#: ../src/config.py:2479 +#: ../src/config.py:2551 msgid "Administrator List" msgstr "Seznam správců" #. Address column #. holds JID (who said this) -#: ../src/config.py:2528 ../src/disco.py:780 ../src/history_manager.py:208 +#: ../src/config.py:2600 ../src/disco.py:838 ../src/history_manager.py:208 msgid "JID" msgstr "JID" -#: ../src/config.py:2538 +#: ../src/config.py:2610 msgid "Reason" msgstr "Důvod" -#: ../src/config.py:2545 +#: ../src/config.py:2617 msgid "Nick" msgstr "Přezdívka" -#: ../src/config.py:2551 +#: ../src/config.py:2623 msgid "Role" msgstr "Postavení" -#: ../src/config.py:2578 +#: ../src/config.py:2650 msgid "Banning..." msgstr "Zakazuji..." #. You can move '\n' before user@domain if that line is TOO BIG -#: ../src/config.py:2580 +#: ../src/config.py:2652 msgid "" "Whom do you want to ban?\n" "\n" @@ -6233,37 +6220,37 @@ msgstr "" "Koho chcete zakázat?\n" "\n" -#: ../src/config.py:2582 +#: ../src/config.py:2654 msgid "Adding Member..." msgstr "Přidávám člena..." -#: ../src/config.py:2583 +#: ../src/config.py:2655 msgid "" "Whom do you want to make a member?\n" "\n" msgstr "Kdo se má stát členem?\n" -#: ../src/config.py:2585 +#: ../src/config.py:2657 msgid "Adding Owner..." msgstr "Přidávám vlastníka..." -#: ../src/config.py:2586 +#: ../src/config.py:2658 msgid "" "Whom do you want to make an owner?\n" "\n" msgstr "Kdo se má stát vlastníkem?\n" -#: ../src/config.py:2588 +#: ../src/config.py:2660 msgid "Adding Administrator..." msgstr "Přidávám správce..." -#: ../src/config.py:2589 +#: ../src/config.py:2661 msgid "" "Whom do you want to make an administrator?\n" "\n" msgstr "Kdo se má stát správcem?\n" -#: ../src/config.py:2590 +#: ../src/config.py:2662 #, fuzzy msgid "" "Can be one of the following:\n" @@ -6281,58 +6268,59 @@ msgstr "" "uživatel@doména),\n" "doména/zdroj, nebo adresa obsahující poddoménu." -#: ../src/config.py:2687 +#: ../src/config.py:2763 #, python-format msgid "Removing %s account" msgstr "Odstraňuju účet %s" -#: ../src/config.py:2709 ../src/gajim.py:1491 ../src/gajim.py:1588 +#: ../src/config.py:2785 ../src/gui_interface.py:1102 +#: ../src/gui_interface.py:1199 msgid "Password Required" msgstr "Vyžadováno heslo" -#: ../src/config.py:2710 ../src/gajim.py:1568 +#: ../src/config.py:2786 ../src/gui_interface.py:1179 #, python-format msgid "Enter your password for account %s" msgstr "Zadejte heslo pro účet %s" -#: ../src/config.py:2711 ../src/gajim.py:1588 +#: ../src/config.py:2787 ../src/gui_interface.py:1199 msgid "Save password" msgstr "Uložit heslo" -#: ../src/config.py:2720 +#: ../src/config.py:2796 #, python-format msgid "Account \"%s\" is connected to the server" msgstr "Účet \"%s\" se připojil k serveru" -#: ../src/config.py:2721 +#: ../src/config.py:2797 msgid "If you remove it, the connection will be lost." msgstr "Pokud jej smažete, připojení bude ztraceno." -#: ../src/config.py:2819 +#: ../src/config.py:2895 msgid "Default" msgstr "Výchozí" -#: ../src/config.py:2819 +#: ../src/config.py:2895 msgid "?print_status:All" msgstr "?print_status:Všechny" -#: ../src/config.py:2820 +#: ../src/config.py:2896 msgid "Enter and leave only" msgstr "Pouze při vstupu a výstupu" -#: ../src/config.py:2821 +#: ../src/config.py:2897 msgid "?print_status:None" msgstr "?print_status:Žádný" -#: ../src/config.py:2889 +#: ../src/config.py:2967 msgid "New Group Chat" msgstr "Nová diskuze" -#: ../src/config.py:2922 +#: ../src/config.py:3000 msgid "This bookmark has invalid data" msgstr "Tato záložka má neplatná data" -#: ../src/config.py:2923 +#: ../src/config.py:3001 msgid "" "Please be sure to fill out server and room fields or remove this bookmark." msgstr "" @@ -6340,29 +6328,29 @@ msgstr "" "záložku." #. invalid char -#: ../src/config.py:3041 ../src/dialogs.py:1746 +#: ../src/config.py:3119 ../src/dialogs.py:1829 msgid "Invalid nickname" msgstr "Neplatné uživatelské jméno" -#: ../src/config.py:3042 ../src/config.py:3056 ../src/config.py:3070 +#: ../src/config.py:3120 ../src/config.py:3134 ../src/config.py:3148 #, fuzzy msgid "Character not allowed" msgstr "Přezdívka nepovolena: %s" -#: ../src/config.py:3055 ../src/config.py:3303 +#: ../src/config.py:3133 ../src/config.py:3382 msgid "Invalid server" msgstr "Neplatný server" -#: ../src/config.py:3069 +#: ../src/config.py:3147 #, fuzzy msgid "Invalid room" msgstr "Neplatný záznam" -#: ../src/config.py:3220 +#: ../src/config.py:3299 msgid "Account has been added successfully" msgstr "Účet byl úspěšně přidán" -#: ../src/config.py:3221 ../src/config.py:3227 +#: ../src/config.py:3300 ../src/config.py:3306 #, fuzzy msgid "" "You can set advanced account options by pressing the Advanced button, or " @@ -6372,32 +6360,32 @@ msgstr "" "Můžete nastavit rozšířené volby účtu po stisknutí tlačítka Rozšířené, nebo " "později stisknutím v položce menu Účty v nabídce Úpravy hlavního okna." -#: ../src/config.py:3226 +#: ../src/config.py:3305 msgid "Your new account has been created successfully" msgstr "Váš účet byl úspěšně vytvořen" -#: ../src/config.py:3264 +#: ../src/config.py:3343 msgid "Invalid username" msgstr "Neplatné uživatelské jméno" -#: ../src/config.py:3266 +#: ../src/config.py:3345 msgid "You must provide a username to configure this account." msgstr "Musíte zadat uživatelské jméno před nastavením tohoto účtu." -#: ../src/config.py:3304 +#: ../src/config.py:3383 msgid "Please provide a server on which you want to register." msgstr "Prosím zadejte server u kterého se chcete zaregistrovat." -#: ../src/config.py:3360 ../src/gajim.py:2144 +#: ../src/config.py:3439 ../src/gui_interface.py:1857 msgid "Certificate Already in File" msgstr "Certifikát je již v souboru" -#: ../src/config.py:3361 ../src/gajim.py:2145 +#: ../src/config.py:3440 ../src/gui_interface.py:1858 #, python-format msgid "This certificate is already in file %s, so it's not added again." msgstr "Tento certifikát je již v souboru %s, takže nebude znova přidán." -#: ../src/config.py:3429 +#: ../src/config.py:3510 #, fuzzy, python-format msgid "" "Security Warning\n" @@ -6412,7 +6400,7 @@ msgstr "" "SSL Chyba: %s\n" "Přesto se chcete připojit na tento server?" -#: ../src/config.py:3435 ../src/gajim.py:2169 +#: ../src/config.py:3516 ../src/gui_interface.py:1882 #, python-format msgid "" "Add this certificate to the list of trusted certificates.\n" @@ -6423,63 +6411,63 @@ msgstr "" "SHA1 otisk certifikátu:\n" "%s" -#: ../src/config.py:3460 ../src/config.py:3483 +#: ../src/config.py:3543 ../src/config.py:3570 msgid "An error occurred during account creation" msgstr "Nastala chyba při vytváření účtu" -#: ../src/config.py:3550 +#: ../src/config.py:3637 msgid "Account name is in use" msgstr "Jméno účtu se používá" -#: ../src/config.py:3551 +#: ../src/config.py:3638 msgid "You already have an account using this name." msgstr "Již máte účet s tímto jménem." -#: ../src/config.py:3704 +#: ../src/config.py:3791 msgid "Active" msgstr "Aktivní" -#: ../src/config.py:3712 +#: ../src/config.py:3799 msgid "Event" msgstr "Událost" -#: ../src/config.py:3747 +#: ../src/config.py:3834 msgid "First Message Received" msgstr "První zpráva přijata" -#: ../src/config.py:3748 +#: ../src/config.py:3835 msgid "Next Message Received Focused" msgstr "Další zpráva přijata zvýrazněná" -#: ../src/config.py:3750 +#: ../src/config.py:3837 msgid "Next Message Received Unfocused" msgstr "Další zpráva přijata nezvýrazněná" -#: ../src/config.py:3751 +#: ../src/config.py:3838 msgid "Contact Connected" msgstr "Kontakt se připojil" -#: ../src/config.py:3752 +#: ../src/config.py:3839 msgid "Contact Disconnected" msgstr "Kontakt se odpojil" -#: ../src/config.py:3753 +#: ../src/config.py:3840 msgid "Message Sent" msgstr "Zpráva odeslána" -#: ../src/config.py:3754 +#: ../src/config.py:3841 msgid "Group Chat Message Highlight" msgstr "Zvýraznění zprávy v diskuzi" -#: ../src/config.py:3755 +#: ../src/config.py:3842 msgid "Group Chat Message Received" msgstr "Přijetí zprávy v diskuzi" -#: ../src/config.py:3756 +#: ../src/config.py:3843 msgid "GMail Email Received" msgstr "Přišel GMail Email" -#: ../src/conversation_textview.py:592 +#: ../src/conversation_textview.py:599 msgid "" "This icon indicates that this message has not yet\n" "been received by the remote end. If this icon stays\n" @@ -6489,7 +6477,7 @@ msgstr "" "stranou. Pokud zůstává dlouho, zpráva je pravděpodobně\n" "ztracena." -#: ../src/conversation_textview.py:611 +#: ../src/conversation_textview.py:618 #, fuzzy msgid "" "Text below this line is what has been said since the\n" @@ -6498,227 +6486,225 @@ msgstr "" "Text pod touto čarou označuje to, co bylo řečeno po posledním čtení této " "diskuze" -#: ../src/conversation_textview.py:724 +#: ../src/conversation_textview.py:737 #, fuzzy msgid "_Quote" msgstr "_Konec" -#: ../src/conversation_textview.py:731 +#: ../src/conversation_textview.py:744 #, python-format msgid "_Actions for \"%s\"" msgstr "_Akce pro \"%s\"" -#: ../src/conversation_textview.py:743 +#: ../src/conversation_textview.py:756 msgid "Read _Wikipedia Article" msgstr "Číst článkek na _Wikipedia" -#: ../src/conversation_textview.py:748 +#: ../src/conversation_textview.py:761 msgid "Look it up in _Dictionary" msgstr "Vyhledat ve _slovníku" -#: ../src/conversation_textview.py:765 +#: ../src/conversation_textview.py:778 #, python-format msgid "Dictionary URL is missing an \"%s\" and it is not WIKTIONARY" msgstr "URL slovníku chybí \"%s\" a není to WIKTIONARY" #. we must have %s in the url -#: ../src/conversation_textview.py:778 +#: ../src/conversation_textview.py:791 #, python-format msgid "Web Search URL is missing an \"%s\"" msgstr "URL pro hledání na webu chybí \"%s\"" -#: ../src/conversation_textview.py:781 +#: ../src/conversation_textview.py:794 msgid "Web _Search for it" msgstr "_Hledat na Webu" -#: ../src/conversation_textview.py:787 +#: ../src/conversation_textview.py:800 msgid "Open as _Link" msgstr "Otevřít jako _Odkaz" -#: ../src/conversation_textview.py:1274 +#. %i is day in year (1-365) +#: ../src/conversation_textview.py:1295 +#, fuzzy, python-format msgid "Yesterday" -msgstr "Včera" - -#. the number is >= 2 -#. %i is day in year (1-365), %d (1-31) we want %i -#: ../src/conversation_textview.py:1278 -#, python-format -msgid "%i days ago" -msgstr "před %i dny" +msgid_plural "%i days ago" +msgstr[0] "Včera" +msgstr[1] "Včera" +msgstr[2] "Včera" #. if we have subject, show it too! -#: ../src/conversation_textview.py:1312 ../src/history_window.py:464 +#: ../src/conversation_textview.py:1330 ../src/history_window.py:475 #, python-format msgid "Subject: %s\n" msgstr "Předmět: %s\n" -#: ../src/dataforms_widget.py:559 +#: ../src/dataforms_widget.py:581 msgid "Jabber ID already in list" msgstr "Jabber ID je již na seznamu" -#: ../src/dataforms_widget.py:560 +#: ../src/dataforms_widget.py:582 msgid "The Jabber ID you entered is already in the list. Choose another one." msgstr "Jabber ID je již na seznamu. Vyberte jiné." #. Default jid -#: ../src/dataforms_widget.py:571 +#: ../src/dataforms_widget.py:593 msgid "new@jabber.id" msgstr "new@jabber.id" -#: ../src/dataforms_widget.py:574 ../src/dataforms_widget.py:576 +#: ../src/dataforms_widget.py:596 ../src/dataforms_widget.py:598 #, python-format msgid "new%d@jabber.id" msgstr "new%d@jabber.id" -#: ../src/dialogs.py:75 +#: ../src/dialogs.py:81 #, python-format msgid "Contact name: %s" msgstr "Jméno kontaktu: %s" -#: ../src/dialogs.py:77 +#: ../src/dialogs.py:83 #, python-format msgid "Jabber ID: %s" msgstr "Jabber ID: %s" -#: ../src/dialogs.py:184 +#: ../src/dialogs.py:194 msgid "Group" msgstr "Skupina" -#: ../src/dialogs.py:191 +#: ../src/dialogs.py:201 msgid "In the group" msgstr "Ve skupině" -#: ../src/dialogs.py:277 +#: ../src/dialogs.py:292 msgid "KeyID" msgstr "ID klíče" -#: ../src/dialogs.py:282 +#: ../src/dialogs.py:297 msgid "Contact name" msgstr "Jméno kontaktu" -#: ../src/dialogs.py:454 +#: ../src/dialogs.py:469 msgid "Set Mood" msgstr "Nastavit Náladu" -#: ../src/dialogs.py:572 +#: ../src/dialogs.py:589 #, python-format msgid "%s Status Message" msgstr "Text stavu %s" -#: ../src/dialogs.py:586 +#: ../src/dialogs.py:603 msgid "Status Message" msgstr "Text stavu" -#: ../src/dialogs.py:772 +#: ../src/dialogs.py:793 msgid "Overwrite Status Message?" msgstr "Přepsat Text stavu?" -#: ../src/dialogs.py:773 +#: ../src/dialogs.py:794 msgid "" "This name is already used. Do you want to overwrite this status message?" msgstr "Toto jméno je již použito. Chcete přepsat text stavu?" -#: ../src/dialogs.py:781 +#: ../src/dialogs.py:802 msgid "Save as Preset Status Message" msgstr "Uložit jako přednastavený stav" -#: ../src/dialogs.py:782 +#: ../src/dialogs.py:803 msgid "Please type a name for this status message" msgstr "Napište jméno pro tento stav" -#: ../src/dialogs.py:807 +#: ../src/dialogs.py:831 msgid "AIM Address:" msgstr "AIM adresa:" -#: ../src/dialogs.py:808 +#: ../src/dialogs.py:832 msgid "GG Number:" msgstr "GG číslo: " -#: ../src/dialogs.py:809 +#: ../src/dialogs.py:833 msgid "ICQ Number:" msgstr "ICQ číslo: " -#: ../src/dialogs.py:810 +#: ../src/dialogs.py:834 msgid "MSN Address:" msgstr "MSN adresa:" -#: ../src/dialogs.py:811 +#: ../src/dialogs.py:835 msgid "Yahoo! Address:" msgstr "Yahoo! adresa:" -#: ../src/dialogs.py:847 +#: ../src/dialogs.py:872 #, python-format msgid "Please fill in the data of the contact you want to add in account %s" msgstr "Prosím vyplňte údaje kontaktu, který chcete přidat do účtu %s" -#: ../src/dialogs.py:849 +#: ../src/dialogs.py:874 msgid "Please fill in the data of the contact you want to add" msgstr "Prosím vyplňte údaje o kontaktu, který chcete přidat" -#: ../src/dialogs.py:1006 ../src/dialogs.py:1012 ../src/dialogs.py:1017 +#: ../src/dialogs.py:1035 ../src/dialogs.py:1041 ../src/dialogs.py:1046 msgid "Invalid User ID" msgstr "Neplatný identifikátor uživatele" -#: ../src/dialogs.py:1013 +#: ../src/dialogs.py:1042 msgid "The user ID must not contain a resource." msgstr "User ID nesmí obsahovat zdroj." -#: ../src/dialogs.py:1018 +#: ../src/dialogs.py:1047 msgid "You cannot add yourself to your roster." msgstr "Rád(a) bych si tě přidal(a) do seznamu." -#: ../src/dialogs.py:1032 +#: ../src/dialogs.py:1061 msgid "Contact already in roster" msgstr "Kontakt už je v Seznamu" -#: ../src/dialogs.py:1033 +#: ../src/dialogs.py:1062 msgid "This contact is already listed in your roster." msgstr "Tento kontakt už je obsažen ve Vašem seznamu." -#: ../src/dialogs.py:1069 +#: ../src/dialogs.py:1098 msgid "User ID:" msgstr "Uživatel:" -#: ../src/dialogs.py:1127 +#: ../src/dialogs.py:1159 msgid "A GTK+ jabber client" msgstr "GTK+ Jabber client" -#: ../src/dialogs.py:1128 +#: ../src/dialogs.py:1160 msgid "GTK+ Version:" msgstr "GTK+ verze: " -#: ../src/dialogs.py:1129 +#: ../src/dialogs.py:1161 msgid "PyGTK Version:" msgstr "PyGTK verze: " -#: ../src/dialogs.py:1139 +#: ../src/dialogs.py:1171 msgid "Current Developers:" msgstr "Aktivní vývojáři:" -#: ../src/dialogs.py:1141 +#: ../src/dialogs.py:1173 msgid "Past Developers:" msgstr "Vysloužilí vývojáři:" -#: ../src/dialogs.py:1147 +#: ../src/dialogs.py:1179 msgid "THANKS:" msgstr "DÍKY:" #. remove one english sentence #. and add it manually as translatable -#: ../src/dialogs.py:1153 +#: ../src/dialogs.py:1185 msgid "Last but not least, we would like to thank all the package maintainers." msgstr "" "Poslední, nikoliv nejmenší, poděkování patří všem správcům instalačních " "balíčků." #. here you write your name in the form Name FamilyName -#: ../src/dialogs.py:1166 +#: ../src/dialogs.py:1198 msgid "translator-credits" msgstr "" "Petr Menšík \n" "scippio " -#: ../src/dialogs.py:1328 +#: ../src/dialogs.py:1366 #, python-format msgid "" "You have to install %s dictionary to use spellchecking, or choose another " @@ -6729,98 +6715,102 @@ msgstr "" "Musíš nainstalovat %s slovník k použití kontroly pravopisu, nebo vybrat jiný " "jazyk nastavením volby speller_language." -#: ../src/dialogs.py:1747 ../src/dialogs.py:2061 +#: ../src/dialogs.py:1830 ../src/dialogs.py:2171 msgid "The nickname has not allowed characters." msgstr "Jabber ID diskuze obsahuje nepřijatelné znaky." -#: ../src/dialogs.py:1859 +#: ../src/dialogs.py:1948 #, python-format msgid "Subscription request for account %(account)s from %(jid)s" msgstr "Žádost o autorizaci na účtu %(account)s od %(jid)s" -#: ../src/dialogs.py:1862 +#: ../src/dialogs.py:1951 #, python-format msgid "Subscription request from %s" msgstr "Žádost o autorizaci od %s" -#: ../src/dialogs.py:1928 ../src/gajim.py:2827 +#: ../src/dialogs.py:2026 ../src/gui_interface.py:2592 #, python-format msgid "You are already in group chat %s" msgstr "Už jsi v místnosti %s" -#: ../src/dialogs.py:1934 +#: ../src/dialogs.py:2032 msgid "You can not join a group chat unless you are connected." msgstr "Nemůžete vstoupit do diskuze pokud nejste připojen(a)." -#: ../src/dialogs.py:1970 +#: ../src/dialogs.py:2074 #, python-format msgid "Join Group Chat with account %s" msgstr "Vstoupit do diskuze z účtu %s" -#: ../src/dialogs.py:2050 +#: ../src/dialogs.py:2160 #, fuzzy msgid "Invalid Account" msgstr "Neplatné jméno účtu" -#: ../src/dialogs.py:2051 +#: ../src/dialogs.py:2161 #, fuzzy msgid "" "You have to choose an account from which you want to join the groupchat." msgstr "Účet z kterého chcete vstoupit do místnosti" -#: ../src/dialogs.py:2060 +#: ../src/dialogs.py:2170 msgid "Invalid Nickname" msgstr "Neplatné uživatelské jméno" -#: ../src/dialogs.py:2065 ../src/dialogs.py:2071 -#: ../src/groupchat_control.py:1738 +#: ../src/dialogs.py:2175 ../src/dialogs.py:2181 +#: ../src/groupchat_control.py:1776 msgid "Invalid group chat Jabber ID" msgstr "Neplatné Jabber ID diskuzní místnosti" -#: ../src/dialogs.py:2066 ../src/dialogs.py:2072 -#: ../src/groupchat_control.py:1739 +#: ../src/dialogs.py:2176 +#, fuzzy +msgid "Please enter the group chat Jabber ID as room@server." +msgstr "Jabber ID diskuze obsahuje nepřijatelné znaky." + +#: ../src/dialogs.py:2182 ../src/groupchat_control.py:1777 msgid "The group chat Jabber ID has not allowed characters." msgstr "Jabber ID diskuze obsahuje nepřijatelné znaky." -#: ../src/dialogs.py:2079 +#: ../src/dialogs.py:2189 msgid "This is not a group chat" msgstr "Tohle není diskuze" -#: ../src/dialogs.py:2080 +#: ../src/dialogs.py:2190 #, python-format msgid "%s is not the name of a group chat." msgstr "%s není jméno diskuze." -#: ../src/dialogs.py:2111 +#: ../src/dialogs.py:2221 msgid "Without a connection, you can not synchronise your contacts." msgstr "Nemůžete měnit heslo, pokud nejste připojen(a)." -#: ../src/dialogs.py:2125 +#: ../src/dialogs.py:2235 msgid "Server" msgstr "Server" -#: ../src/dialogs.py:2158 +#: ../src/dialogs.py:2270 msgid "This account is not connected to the server" msgstr "Tento účet není připojen k serveru" -#: ../src/dialogs.py:2159 +#: ../src/dialogs.py:2271 msgid "You cannot synchronize with an account unless it is connected." msgstr "Nemůžete synchronyzovat účet pokud nění připojen." -#: ../src/dialogs.py:2183 +#: ../src/dialogs.py:2295 msgid "Synchronise" msgstr "Synchronizovat" -#: ../src/dialogs.py:2241 +#: ../src/dialogs.py:2355 #, python-format msgid "Start Chat with account %s" msgstr "Začít rozhovor z účtu %s" -#: ../src/dialogs.py:2243 +#: ../src/dialogs.py:2357 msgid "Start Chat" msgstr "Začít rozhovor" -#: ../src/dialogs.py:2244 +#: ../src/dialogs.py:2358 msgid "" "Fill in the nickname or the Jabber ID of the contact you would like\n" "to send a chat message to:" @@ -6828,300 +6818,329 @@ msgstr "" "Vyplňte Jabber ID nebo přezdívku kontaktu, se kterým chcete začít rozhovor:" #. if offline or connecting -#: ../src/dialogs.py:2268 ../src/dialogs.py:2651 ../src/dialogs.py:2813 +#: ../src/dialogs.py:2384 ../src/dialogs.py:2767 ../src/dialogs.py:2929 msgid "Connection not available" msgstr "Spojení není dostupné" -#: ../src/dialogs.py:2269 ../src/dialogs.py:2652 ../src/dialogs.py:2814 +#: ../src/dialogs.py:2385 ../src/dialogs.py:2768 ../src/dialogs.py:2930 #, python-format msgid "Please make sure you are connected with \"%s\"." msgstr "Prosím ujistěte se že jste připojen s účtem \"%s\"." -#: ../src/dialogs.py:2278 ../src/dialogs.py:2281 +#: ../src/dialogs.py:2394 ../src/dialogs.py:2397 msgid "Invalid JID" msgstr "Neplatné JID" -#: ../src/dialogs.py:2281 +#: ../src/dialogs.py:2397 #, python-format msgid "Unable to parse \"%s\"." msgstr "Nemůžu dekódovat \"%s\"." -#: ../src/dialogs.py:2290 +#: ../src/dialogs.py:2406 msgid "Without a connection, you can not change your password." msgstr "Nemůžete měnit heslo, pokud nejste připojen(a)." -#: ../src/dialogs.py:2309 +#: ../src/dialogs.py:2425 msgid "Invalid password" msgstr "Neplatné heslo" -#: ../src/dialogs.py:2309 +#: ../src/dialogs.py:2425 msgid "You must enter a password." msgstr "Musíte zadat heslo." -#: ../src/dialogs.py:2313 +#: ../src/dialogs.py:2429 msgid "Passwords do not match" msgstr "Hesla se neshodují" -#: ../src/dialogs.py:2314 +#: ../src/dialogs.py:2430 msgid "The passwords typed in both fields must be identical." msgstr "Hesla zadaná v obou políčkách musí být identická." #. img to display #. default value -#: ../src/dialogs.py:2353 ../src/notify.py:257 ../src/notify.py:491 +#: ../src/dialogs.py:2469 ../src/notify.py:263 ../src/notify.py:504 msgid "Contact Signed In" msgstr "Kontakt se přihlásil" -#: ../src/dialogs.py:2355 ../src/notify.py:265 ../src/notify.py:493 +#: ../src/dialogs.py:2471 ../src/notify.py:271 ../src/notify.py:506 msgid "Contact Signed Out" msgstr "Kontakt se odhlásil" #. chat message #. img to display -#: ../src/dialogs.py:2357 ../src/notify.py:288 ../src/notify.py:342 -#: ../src/notify.py:495 +#: ../src/dialogs.py:2473 ../src/notify.py:294 ../src/notify.py:349 +#: ../src/notify.py:508 msgid "New Message" msgstr "Nová zpráva" #. single message -#: ../src/dialogs.py:2357 ../src/notify.py:269 ../src/notify.py:343 -#: ../src/notify.py:495 +#: ../src/dialogs.py:2473 ../src/notify.py:275 ../src/notify.py:350 +#: ../src/notify.py:508 msgid "New Single Message" msgstr "Nová jednoduché zpráva" #. private message -#: ../src/dialogs.py:2358 ../src/notify.py:276 ../src/notify.py:343 -#: ../src/notify.py:496 +#: ../src/dialogs.py:2474 ../src/notify.py:282 ../src/notify.py:350 +#: ../src/notify.py:509 msgid "New Private Message" msgstr "Nová soukromá zpráva" -#: ../src/dialogs.py:2358 ../src/gajim.py:1704 ../src/notify.py:505 +#: ../src/dialogs.py:2474 ../src/gui_interface.py:1315 ../src/notify.py:518 msgid "New E-mail" msgstr "Nový E-mail" -#: ../src/dialogs.py:2360 ../src/gajim.py:1770 ../src/notify.py:498 +#: ../src/dialogs.py:2476 ../src/gui_interface.py:1382 ../src/notify.py:511 msgid "File Transfer Request" msgstr "Žádost o přenos souboru" -#: ../src/dialogs.py:2362 ../src/gajim.py:1670 ../src/gajim.py:1737 -#: ../src/notify.py:500 +#: ../src/dialogs.py:2478 ../src/gui_interface.py:1281 +#: ../src/gui_interface.py:1349 ../src/notify.py:513 msgid "File Transfer Error" msgstr "Chyba přenosu souboru" -#: ../src/dialogs.py:2364 ../src/gajim.py:1815 ../src/gajim.py:1837 -#: ../src/gajim.py:1854 ../src/notify.py:502 +#: ../src/dialogs.py:2480 ../src/gui_interface.py:1427 +#: ../src/gui_interface.py:1449 ../src/gui_interface.py:1466 +#: ../src/notify.py:515 msgid "File Transfer Completed" msgstr "Přenos souboru dokončen" -#: ../src/dialogs.py:2365 ../src/gajim.py:1818 ../src/notify.py:503 +#: ../src/dialogs.py:2481 ../src/gui_interface.py:1430 ../src/notify.py:516 msgid "File Transfer Stopped" msgstr "Přenos souboru zastaven" -#: ../src/dialogs.py:2367 ../src/gajim.py:1512 ../src/notify.py:507 +#: ../src/dialogs.py:2483 ../src/gui_interface.py:1123 ../src/notify.py:520 msgid "Groupchat Invitation" msgstr "Skupinová pozvánka" -#: ../src/dialogs.py:2369 ../src/notify.py:249 ../src/notify.py:509 +#: ../src/dialogs.py:2485 ../src/notify.py:255 ../src/notify.py:522 msgid "Contact Changed Status" msgstr "Kontakt změnil stav" -#: ../src/dialogs.py:2570 +#: ../src/dialogs.py:2686 #, python-format msgid "Single Message using account %s" msgstr "Jednoduchá zpráva z účtu %s" -#: ../src/dialogs.py:2572 +#: ../src/dialogs.py:2688 #, python-format msgid "Single Message in account %s" msgstr "Jednoduchá zpráva z účtu %s" -#: ../src/dialogs.py:2574 +#: ../src/dialogs.py:2690 msgid "Single Message" msgstr "Jednoduchá zpráva" #. prepare UI for Sending -#: ../src/dialogs.py:2577 +#: ../src/dialogs.py:2693 #, python-format msgid "Send %s" msgstr "Odeslat %s" #. prepare UI for Receiving -#: ../src/dialogs.py:2600 +#: ../src/dialogs.py:2716 #, python-format msgid "Received %s" msgstr "Přijaté %s" #. prepare UI for Receiving -#: ../src/dialogs.py:2623 +#: ../src/dialogs.py:2739 #, python-format msgid "Form %s" msgstr "Od %s" #. we create a new blank window to send and we preset RE: and to jid -#: ../src/dialogs.py:2702 +#: ../src/dialogs.py:2818 #, python-format msgid "RE: %s" msgstr "RE: %s" -#: ../src/dialogs.py:2703 +#: ../src/dialogs.py:2819 #, python-format msgid "%s wrote:\n" msgstr "%s napsal(a):\n" -#: ../src/dialogs.py:2752 +#: ../src/dialogs.py:2868 #, python-format msgid "XML Console for %s" msgstr "XML Konzole pro %s" -#: ../src/dialogs.py:2754 +#: ../src/dialogs.py:2870 msgid "XML Console" msgstr "XML Konzole" -#. Set labels -#. self.action can be 'add', 'modify' or 'remove' -#: ../src/dialogs.py:2865 +#. Action that can be done with an incoming list of contacts +#: ../src/dialogs.py:2958 +#, fuzzy +msgid "add" +msgstr "Smutný" + +#: ../src/dialogs.py:2958 +#, fuzzy +msgid "modify" +msgstr "Náladový" + +#: ../src/dialogs.py:2959 +#, fuzzy +msgid "remove" +msgstr "Odst_ranit" + +#: ../src/dialogs.py:2987 #, fuzzy, python-format -msgid "%s would like you to %s some contacts in your roster." +msgid "" +"%(jid)s would like you to %(action)s some contacts in your " +"roster." msgstr "Chtěl(a) bych si Vás přidat do mého Seznamu." -#: ../src/dialogs.py:2880 ../src/dialogs.py:2928 +#. Change label for accept_button to action name instead of 'OK'. +#: ../src/dialogs.py:3003 ../src/dialogs.py:3049 #, fuzzy msgid "Add" msgstr "Adresa" -#: ../src/dialogs.py:2882 ../src/dialogs.py:2961 +#. Change label for accept_button to action name instead of 'OK'. +#: ../src/dialogs.py:3005 ../src/dialogs.py:3080 #, fuzzy msgid "Modify" msgstr "Náladový" -#: ../src/dialogs.py:2888 +#: ../src/dialogs.py:3011 #, fuzzy msgid "Jabber ID" msgstr "Jabber ID:" -#: ../src/dialogs.py:2894 +#: ../src/dialogs.py:3017 #, fuzzy msgid "Groups" msgstr "Skupina" #. it is selected -#. remote_jid = model[iter][1].decode('utf-8') -#: ../src/dialogs.py:3008 +#. remote_jid = model[iter_][1].decode('utf-8') +#: ../src/dialogs.py:3125 #, fuzzy, python-format msgid "%s suggested me to add you in my roster." msgstr "Rád(a) bych si tě přidal(a) do seznamu." -#: ../src/dialogs.py:3108 +#: ../src/dialogs.py:3139 +#, fuzzy, python-format +msgid "Added %s contacts" +msgstr "Přidat _kontakt" + +#: ../src/dialogs.py:3176 +#, fuzzy, python-format +msgid "Removed %s contacts" +msgstr "Odstraní kontakt ze Seznamu" + +#: ../src/dialogs.py:3229 #, python-format msgid "Privacy List %s" msgstr "Soukromý seznam %s" -#: ../src/dialogs.py:3112 +#: ../src/dialogs.py:3233 #, python-format msgid "Privacy List for %s" msgstr "Soukromý seznam pro %s" -#: ../src/dialogs.py:3168 +#: ../src/dialogs.py:3289 #, fuzzy, python-format msgid "Order: %(order)s, action: %(action)s, type: %(type)s, value: %(value)s" msgstr "Pořadí: %s, akce: %s, typ: %s, hodnota: %s" -#: ../src/dialogs.py:3173 +#: ../src/dialogs.py:3294 #, python-format msgid "Order: %(order)s, action: %(action)s" msgstr "Pořadí: %(order)s, akce: %(action)s" -#: ../src/dialogs.py:3215 +#: ../src/dialogs.py:3338 msgid "Edit a rule" msgstr "Upravit pravidlo" -#: ../src/dialogs.py:3326 +#: ../src/dialogs.py:3449 msgid "Add a rule" msgstr "Přidat pravidlo" -#: ../src/dialogs.py:3423 +#: ../src/dialogs.py:3549 #, python-format msgid "Privacy Lists for %s" msgstr "Soukromý seznam pro %s" -#: ../src/dialogs.py:3425 +#: ../src/dialogs.py:3551 msgid "Privacy Lists" msgstr "Soukromý Seznam" -#: ../src/dialogs.py:3495 +#: ../src/dialogs.py:3621 msgid "Invalid List Name" msgstr "Neplatné jméno seznamu" -#: ../src/dialogs.py:3496 +#: ../src/dialogs.py:3622 msgid "You must enter a name to create a privacy list." msgstr "Musíte zadat jméno pro vytvoření privacy listu." -#: ../src/dialogs.py:3528 +#: ../src/dialogs.py:3654 msgid "You are invited to a groupchat" msgstr "Jste pozván do diskuze" -#: ../src/dialogs.py:3531 +#: ../src/dialogs.py:3657 msgid "$Contact has invited you to join a discussion" msgstr "$Contact Vás pozval(a) do místnosti %(room_jid)s" -#: ../src/dialogs.py:3533 +#: ../src/dialogs.py:3659 #, python-format msgid "$Contact has invited you to group chat %(room_jid)s" msgstr "$Contact Vás pozval(a) do místnosti %(room_jid)s" -#: ../src/dialogs.py:3541 +#: ../src/dialogs.py:3667 #, python-format msgid "Comment: %s" msgstr "Komentář: %s" -#: ../src/dialogs.py:3543 +#: ../src/dialogs.py:3669 msgid "Do you want to accept the invitation?" msgstr "Chcete přijmout pozvání?" -#: ../src/dialogs.py:3599 +#: ../src/dialogs.py:3730 msgid "Choose Sound" msgstr "Vyberte zvuk" -#: ../src/dialogs.py:3609 ../src/dialogs.py:3663 +#: ../src/dialogs.py:3740 ../src/dialogs.py:3796 msgid "All files" msgstr "Všechny soubory" -#: ../src/dialogs.py:3614 +#: ../src/dialogs.py:3745 msgid "Wav Sounds" msgstr "Waw soubory" -#: ../src/dialogs.py:3650 +#: ../src/dialogs.py:3783 msgid "Choose Image" msgstr "Vyberte obrázek" -#: ../src/dialogs.py:3668 +#: ../src/dialogs.py:3801 msgid "Images" msgstr "Obrázky" -#: ../src/dialogs.py:3733 +#: ../src/dialogs.py:3868 #, python-format msgid "When %s becomes:" msgstr "Kdy %s může být:" -#: ../src/dialogs.py:3735 +#: ../src/dialogs.py:3870 #, python-format msgid "Adding Special Notification for %s" msgstr "Přidávám zvláštní notifikaci pro %s" #. # means number -#: ../src/dialogs.py:3804 +#: ../src/dialogs.py:3939 msgid "#" msgstr "č." -#: ../src/dialogs.py:3810 +#: ../src/dialogs.py:3945 msgid "Condition" msgstr "Podmínka" -#: ../src/dialogs.py:3928 +#: ../src/dialogs.py:4065 msgid "when I am " msgstr "když jsem " -#: ../src/dialogs.py:4400 +#: ../src/dialogs.py:4541 #, fuzzy, python-format msgid "" "Your chat session with %(jid)s is encrypted.\n" @@ -7132,19 +7151,19 @@ msgstr "" "\n" "Krátký Autentizační řetězec pro toto sezení je: %(sas)s" -#: ../src/dialogs.py:4404 +#: ../src/dialogs.py:4545 msgid "You have already verified this contact's identity." msgstr "Už jste prověřoval identitu tohoto kontaktu." -#: ../src/dialogs.py:4410 ../src/dialogs.py:4497 +#: ../src/dialogs.py:4551 ../src/dialogs.py:4640 msgid "Contact's identity verified" msgstr "Identita kontaktu ověřena" -#: ../src/dialogs.py:4418 +#: ../src/dialogs.py:4559 msgid "Verify again..." msgstr "Ověřit znovu" -#: ../src/dialogs.py:4423 +#: ../src/dialogs.py:4564 msgid "" "To be certain that only the expected person can read your messages or " "send you messages, you need to verify their identity by clicking the button " @@ -7154,19 +7173,19 @@ msgstr "" "zprávy nebo vám poslat zprávu, je potřeba ověřit jejich identitu kliknutí na " "tlačítko dole." -#: ../src/dialogs.py:4426 ../src/dialogs.py:4478 ../src/dialogs.py:4491 +#: ../src/dialogs.py:4567 ../src/dialogs.py:4621 ../src/dialogs.py:4634 msgid "Contact's identity NOT verified" msgstr "Identita kontaktu NENÍ ověřena" -#: ../src/dialogs.py:4433 +#: ../src/dialogs.py:4574 msgid "Verify..." msgstr "Ověřit..." -#: ../src/dialogs.py:4445 +#: ../src/dialogs.py:4586 msgid "Have you verified the contact's identity?" msgstr "Ověřil(a) jste identitu kontaktu?" -#: ../src/dialogs.py:4446 +#: ../src/dialogs.py:4587 #, fuzzy, python-format msgid "" "To prevent talking to an unknown person, you should speak to %(jid)s " @@ -7180,21 +7199,21 @@ msgstr "" "Autentizační řetězec (SAS) jako vy.\n" "Krátký Autentizační řetězec: %(sas)s" -#: ../src/dialogs.py:4447 +#: ../src/dialogs.py:4588 msgid "Did you talk to the remote contact and verify the SAS?" msgstr "Mluvily jste se vzdáleným kontaktem a ověřil s ním SAS?" -#: ../src/dialogs.py:4479 +#: ../src/dialogs.py:4622 #, python-format msgid "The contact's key (%s) does not match the key assigned in Gajim." msgstr "Klíč kontaktu (%s) se neshoduje s klíčem přiřazeným v Gajimu." -#: ../src/dialogs.py:4485 +#: ../src/dialogs.py:4628 msgid "No GPG key is assigned to this contact. So you cannot encrypt messages." msgstr "" "Tomuto kontaktu není přiřazen GPG klíč. Proto nemůžete šifrovat zprávy." -#: ../src/dialogs.py:4492 +#: ../src/dialogs.py:4635 msgid "" "GPG key is assigned to this contact, but you do not trust his key, so " "message cannot be encrypted. Use your GPG client to trust this key." @@ -7203,7 +7222,7 @@ msgstr "" "proto zpráva nemůže být zašifrovaná. Použijte Váš GPG klient pro " "nastavení důvěry." -#: ../src/dialogs.py:4498 +#: ../src/dialogs.py:4641 msgid "" "GPG Key is assigned to this contact, and you trust his key, so messages will " "be encrypted." @@ -7211,6 +7230,25 @@ msgstr "" "Tento kontakt má přiřazen GPG klíč a tomuto klíči důvěřujete, zprávy tedy " "budou šifrované." +#: ../src/dialogs.py:4708 +msgid "an audio and video" +msgstr "" + +#: ../src/dialogs.py:4710 +msgid "an audio" +msgstr "" + +#: ../src/dialogs.py:4712 +msgid "a video" +msgstr "" + +#: ../src/dialogs.py:4716 +#, python-format +msgid "" +"%(contact)s wants to start %(type)s session with you. Do you want to answer " +"the call?" +msgstr "" + #: ../src/disco.py:118 msgid "Others" msgstr "Ostatní" @@ -7220,24 +7258,24 @@ msgstr "Ostatní" msgid "Conference" msgstr "Diskuze" -#: ../src/disco.py:442 +#: ../src/disco.py:478 msgid "Without a connection, you can not browse available services" msgstr "Bez spojení nemůžete prohlížet dostupné služby" -#: ../src/disco.py:516 +#: ../src/disco.py:554 #, python-format msgid "Service Discovery using account %s" msgstr "Procházení služeb s použitím účtu %s" -#: ../src/disco.py:518 +#: ../src/disco.py:556 msgid "Service Discovery" msgstr "Service Discovery" -#: ../src/disco.py:659 +#: ../src/disco.py:706 msgid "The service could not be found" msgstr "Tato služba nebyla nalezena" -#: ../src/disco.py:660 +#: ../src/disco.py:707 msgid "" "There is no service at the address you entered, or it is not responding. " "Check the address and try again." @@ -7245,284 +7283,265 @@ msgstr "" "Služba na zadané adrese neexistuje, nebo neodpovídá. Zkontrolujte adresu a " "opakujte znovu." -#: ../src/disco.py:664 ../src/disco.py:960 +#: ../src/disco.py:711 ../src/disco.py:1047 msgid "The service is not browsable" msgstr "Službu nelze prohlížet" -#: ../src/disco.py:665 +#: ../src/disco.py:712 msgid "This type of service does not contain any items to browse." msgstr "Tento typ služby neobsahuje žádné položky, které je možné prohlížet." -#: ../src/disco.py:702 ../src/disco.py:712 +#: ../src/disco.py:751 ../src/disco.py:761 msgid "Invalid Server Name" msgstr "Neplatné jméno serveru" -#: ../src/disco.py:759 +#: ../src/disco.py:815 #, python-format msgid "Browsing %(address)s using account %(account)s" msgstr "Procházím %(address)s pomocí účtu %(account)s" -#: ../src/disco.py:799 +#: ../src/disco.py:859 msgid "_Browse" msgstr "_Prohlížet" -#: ../src/disco.py:961 +#: ../src/disco.py:1048 msgid "This service does not contain any items to browse." msgstr "Tato služba neobsahuje žádné položky, které je možno prohlížet." -#: ../src/disco.py:1183 +#: ../src/disco.py:1288 msgid "_Execute Command" msgstr "Spustit _příkaz..." -#: ../src/disco.py:1193 ../src/disco.py:1359 +#: ../src/disco.py:1298 ../src/disco.py:1469 msgid "Re_gister" msgstr "Re_gistrace" -#: ../src/disco.py:1396 +#: ../src/disco.py:1510 #, python-format msgid "Scanning %(current)d / %(total)d.." msgstr "Skenuji %(current)d / %(total)d.." #. Users column -#: ../src/disco.py:1578 +#: ../src/disco.py:1700 msgid "Users" msgstr "Uživatelé" #. Description column -#: ../src/disco.py:1586 +#: ../src/disco.py:1708 msgid "Description" msgstr "Popis" #. Id column -#: ../src/disco.py:1594 +#: ../src/disco.py:1716 msgid "Id" msgstr "č." -#: ../src/disco.py:1659 ../src/gajim.py:3311 +#: ../src/disco.py:1781 ../src/gui_interface.py:3088 msgid "Bookmark already set" msgstr "Záložka je už nastavena" -#: ../src/disco.py:1660 ../src/gajim.py:3312 +#: ../src/disco.py:1782 ../src/gui_interface.py:3089 #, python-format msgid "Group Chat \"%s\" is already in your bookmarks." msgstr "Diskuze \"%s\" už je ve Vašich záložkách." -#: ../src/disco.py:1669 ../src/gajim.py:3325 +#: ../src/disco.py:1791 ../src/gui_interface.py:3102 msgid "Bookmark has been added successfully" msgstr "Záložka byla úspěšně přidána" -#: ../src/disco.py:1670 ../src/gajim.py:3326 +#: ../src/disco.py:1792 ../src/gui_interface.py:3103 msgid "You can manage your bookmarks via Actions menu in your roster." msgstr "Můžete spravovat Vaše záložky přes menu Akce ve vašem Seznamu." -#: ../src/disco.py:1863 +#: ../src/disco.py:2001 msgid "Subscribed" msgstr "Autorizován" -#: ../src/disco.py:1871 +#: ../src/disco.py:2009 msgid "Node" msgstr "Uzel" -#: ../src/disco.py:1933 +#: ../src/disco.py:2073 msgid "New post" msgstr "Nový záznam" -#: ../src/disco.py:1939 +#: ../src/disco.py:2079 msgid "_Subscribe" msgstr "_Žádat autorizaci" -#: ../src/disco.py:1945 +#: ../src/disco.py:2085 msgid "_Unsubscribe" msgstr "_Zrušit autorizaci" -#: ../src/features_window.py:46 +#: ../src/features_window.py:48 msgid "SSL certificat validation" msgstr "Validace SSL certifikátu" -#: ../src/features_window.py:47 +#: ../src/features_window.py:49 msgid "" "A library used to validate server certificates to ensure a secure connection." msgstr "" "Knihovna se používá k ověření certifikátu serveru pro zabezpečené spojení." -#: ../src/features_window.py:48 ../src/features_window.py:49 +#: ../src/features_window.py:50 ../src/features_window.py:51 msgid "Requires python-pyopenssl." msgstr "Je potřeba python-pyopenssl." -#: ../src/features_window.py:50 +#: ../src/features_window.py:52 msgid "Bonjour / Zeroconf" msgstr "Bonjour / Zeroconf" -#: ../src/features_window.py:51 +#: ../src/features_window.py:53 msgid "Serverless chatting with autodetected clients in a local network." msgstr "" "Serverless automaticky komunikuje s klienty detekovanými v místní síti." -#: ../src/features_window.py:52 +#: ../src/features_window.py:54 msgid "Requires python-avahi." msgstr "Je potřeba python-avahi." -#: ../src/features_window.py:53 +#: ../src/features_window.py:55 msgid "Requires pybonjour (http://o2s.csail.mit.edu/o2s-wiki/pybonjour)." msgstr "Je potřeba pybonjour (http://o2s.csail.mit.edu/o2s-wiki/pybonjour)." -#: ../src/features_window.py:54 +#: ../src/features_window.py:56 msgid "Command line" msgstr "Příkazový řádek" -#: ../src/features_window.py:55 +#: ../src/features_window.py:57 #, fuzzy msgid "A script to control Gajim via commandline." msgstr "Skript, který ovládá Gajim s příkazové řádky." -#: ../src/features_window.py:56 +#: ../src/features_window.py:58 msgid "Requires python-dbus." msgstr "Je potřeba python-dbus." -#: ../src/features_window.py:57 ../src/features_window.py:61 -#: ../src/features_window.py:65 ../src/features_window.py:69 -#: ../src/features_window.py:73 ../src/features_window.py:81 -#: ../src/features_window.py:85 +#: ../src/features_window.py:59 ../src/features_window.py:63 +#: ../src/features_window.py:67 ../src/features_window.py:71 +#: ../src/features_window.py:75 ../src/features_window.py:83 +#: ../src/features_window.py:87 ../src/features_window.py:111 msgid "Feature not available under Windows." msgstr "Vlastnost není k dispozici pod Windows." -#: ../src/features_window.py:58 +#: ../src/features_window.py:60 msgid "OpenGPG message encryption" msgstr "Šifrování zpráv OpenGPG " -#: ../src/features_window.py:59 +#: ../src/features_window.py:61 msgid "Encrypting chat messages with gpg keys." msgstr "Šifruji zprávy gpg klíči." -#: ../src/features_window.py:60 +#: ../src/features_window.py:62 msgid "Requires gpg and python-GnuPGInterface." msgstr "Je potřeba gpg a python-GnuPGInterface." -#: ../src/features_window.py:62 +#: ../src/features_window.py:64 #, fuzzy msgid "Network-manager" msgstr "Správce sítě (network-manager)" -#: ../src/features_window.py:63 +#: ../src/features_window.py:65 msgid "Autodetection of network status." msgstr "Autodetekce stavu sítě." -#: ../src/features_window.py:64 +#: ../src/features_window.py:66 msgid "Requires gnome-network-manager and python-dbus." msgstr "Je potřeba gnome-network-manager a python-dbus." -#: ../src/features_window.py:66 +#: ../src/features_window.py:68 msgid "Session Management" msgstr "Správa Sezení" -#: ../src/features_window.py:67 +#: ../src/features_window.py:69 msgid "Gajim session is stored on logout and restored on login." msgstr "Sezení Gajimu je uloženo při odhlášení a znovu načteno při přihlášení." -#: ../src/features_window.py:68 +#: ../src/features_window.py:70 msgid "Requires python-gnome2." msgstr "Je potřeba python-gnome2." -#: ../src/features_window.py:70 +#: ../src/features_window.py:72 msgid "Password encryption" msgstr "Šifrování hesla" -#: ../src/features_window.py:71 +#: ../src/features_window.py:73 msgid "Passwords can be stored securely and not just in plaintext." msgstr "Heslo může být bezpečně uloženo." -#: ../src/features_window.py:72 +#: ../src/features_window.py:74 #, fuzzy msgid "Requires gnome-keyring and python-gnome2-desktop, or kwalletcli." msgstr "Je potřeba gnome-keyring a python-gnome2-desktop." -#: ../src/features_window.py:74 +#: ../src/features_window.py:76 msgid "SRV" msgstr "SRV" -#: ../src/features_window.py:75 +#: ../src/features_window.py:77 msgid "Ability to connect to servers which are using SRV records." msgstr "Schopnost připojit se na servery používající SRV záznamy." -#: ../src/features_window.py:76 +#: ../src/features_window.py:78 msgid "Requires dnsutils." msgstr "Je potřeba dnsutils." -#: ../src/features_window.py:77 +#: ../src/features_window.py:79 msgid "Requires nslookup to use SRV records." msgstr "Je potřeba nslookup pro použití SRV záznamů." -#: ../src/features_window.py:78 +#: ../src/features_window.py:80 msgid "Spell Checker" msgstr "Kontrola Pravopisu" -#: ../src/features_window.py:79 +#: ../src/features_window.py:81 msgid "Spellchecking of composed messages." msgstr "Kontrola Pravopisu psaných zpráv." -#: ../src/features_window.py:80 +#: ../src/features_window.py:82 msgid "Requires libgtkspell." msgstr "Vyžaduje libgtkspell." -#: ../src/features_window.py:82 +#: ../src/features_window.py:84 msgid "Notification" msgstr "Upozornění" -#: ../src/features_window.py:83 +#: ../src/features_window.py:85 msgid "Passive popups notifying for new events." msgstr "Pasivní okna oznamující nové události." -#: ../src/features_window.py:84 +#: ../src/features_window.py:86 msgid "" "Requires python-notify or instead python-dbus in conjunction with " "notification-daemon." msgstr "" " Je potřeba python-notify nebo python-dbus ve spojení s notification-daemon." -#: ../src/features_window.py:86 -msgid "Trayicon" -msgstr "Tray ikona" - -#: ../src/features_window.py:87 -msgid "A icon in systemtray reflecting the current presence." -msgstr "Ikona v systémové liště zobrazující aktuální stav." - #: ../src/features_window.py:88 -msgid "" -"Requires python-gnome2-extras or compiled trayicon module from Gajim sources." -msgstr "" -"Je potřeba python-gnome2-extras nebo zkompilovaný trayicon modul ze zdrojáků " -"Gajima." - -#: ../src/features_window.py:89 -msgid "Requires PyGTK >= 2.10." -msgstr "Je potřeba PyGTK verze 2.10. nebo vyšší." - -#: ../src/features_window.py:90 msgid "Automatic status" msgstr "Automatický stav" -#: ../src/features_window.py:91 +#: ../src/features_window.py:89 msgid "Ability to measure idle time, in order to set auto status." msgstr "Funkce pro měření času nečinnosti pro nastavení automatického stavu." -#: ../src/features_window.py:92 +#: ../src/features_window.py:90 msgid "Requires libxss library." msgstr "Vyžaduje knihovnu libxss." -#: ../src/features_window.py:93 +#: ../src/features_window.py:91 msgid "Requires python2.5." msgstr "Je potřeba python2.5." -#: ../src/features_window.py:94 +#: ../src/features_window.py:92 msgid "LaTeX" msgstr "LaTeX" -#: ../src/features_window.py:95 +#: ../src/features_window.py:93 msgid "Transform LaTeX expressions between $$ $$." msgstr "Převede LaTeX výraz mezi $$ $$." -#: ../src/features_window.py:96 +#: ../src/features_window.py:94 msgid "" "Requires texlive-latex-base and dvipng. You have to set 'use_latex' to True " "in the Advanced Configuration Editor." @@ -7530,7 +7549,7 @@ msgstr "" "Je potřeba texlive-latex-base a dvipng. Dále musíte nastavit 'use_latex' na " "True v Editoru rozšířeného nastavení." -#: ../src/features_window.py:97 +#: ../src/features_window.py:95 msgid "" "Requires texlive-latex-base and dvipng (All is in MikTeX). You have to set " "'use_latex' to True in the Advanced Configuration Editor." @@ -7538,23 +7557,23 @@ msgstr "" "Je potřeba texlive-latex-base a dvipng (vše je v MikTeXu). Dále musíte " "nastavit 'use_latex' na True v Editoru rozšířeného nastavení." -#: ../src/features_window.py:98 +#: ../src/features_window.py:96 msgid "End to End message encryption" msgstr "End to End šifrování zpráv" -#: ../src/features_window.py:99 +#: ../src/features_window.py:97 msgid "Encrypting chat messages." msgstr "Šifruji zprávy." -#: ../src/features_window.py:100 ../src/features_window.py:101 +#: ../src/features_window.py:98 ../src/features_window.py:99 msgid "Requires python-crypto." msgstr "Je potřeba python-crypto." -#: ../src/features_window.py:102 +#: ../src/features_window.py:100 msgid "RST Generator" msgstr "RST Generátor" -#: ../src/features_window.py:103 +#: ../src/features_window.py:101 msgid "" "Generate XHTML output from RST code (see http://docutils.sourceforge.net/" "docs/ref/rst/restructuredtext.html)." @@ -7562,24 +7581,37 @@ msgstr "" "Generuje XHTML výstup pro RST kód (viz.: http://docutils.sourceforge.net/" "docs/ref/rst/restructuredtext.html)." -#: ../src/features_window.py:104 ../src/features_window.py:105 +#: ../src/features_window.py:102 ../src/features_window.py:103 msgid "Requires python-docutils." msgstr "Je potřeba python-docutils." -#: ../src/features_window.py:106 +#: ../src/features_window.py:104 msgid "Banners and clickable links" msgstr "Bannery a klikatelné odkazy" -#: ../src/features_window.py:107 +#: ../src/features_window.py:105 msgid "Ability to have clickable URLs in chat and groupchat window banners." msgstr "" "Funkce umožňující mít klikatelné URL odkazy v rozhovoru a předmětu diskuze." -#: ../src/features_window.py:108 ../src/features_window.py:109 +#: ../src/features_window.py:106 ../src/features_window.py:107 msgid "Requires python-sexy." msgstr "Je potřeba python-sexy." -#: ../src/features_window.py:123 +#: ../src/features_window.py:108 +msgid "Audio / Video" +msgstr "" + +#: ../src/features_window.py:109 +msgid "Ability to start audio and video chat." +msgstr "" + +#: ../src/features_window.py:110 +#, fuzzy +msgid "Requires python-farsight." +msgstr "Je potřeba python-avahi." + +#: ../src/features_window.py:125 msgid "Feature" msgstr "Vlastnost" @@ -7595,92 +7627,92 @@ msgstr "Čas" msgid "Progress" msgstr "Průběh" -#: ../src/filetransfers_window.py:173 ../src/filetransfers_window.py:227 +#: ../src/filetransfers_window.py:177 ../src/filetransfers_window.py:233 #, python-format msgid "Filename: %s" msgstr "Soubor: %s" -#: ../src/filetransfers_window.py:174 ../src/filetransfers_window.py:313 +#: ../src/filetransfers_window.py:178 ../src/filetransfers_window.py:323 #, python-format msgid "Size: %s" msgstr "Velikost: %s" #. You is a reply of who sent a file #. You is a reply of who received a file -#: ../src/filetransfers_window.py:183 ../src/filetransfers_window.py:193 -#: ../src/history_manager.py:520 +#: ../src/filetransfers_window.py:187 ../src/filetransfers_window.py:197 +#: ../src/history_manager.py:529 msgid "You" msgstr "Vy" -#: ../src/filetransfers_window.py:184 +#: ../src/filetransfers_window.py:188 #, python-format msgid "Sender: %s" msgstr "Odesílatel: %s" -#: ../src/filetransfers_window.py:185 ../src/filetransfers_window.py:596 -#: ../src/tooltips.py:670 +#: ../src/filetransfers_window.py:189 ../src/filetransfers_window.py:617 +#: ../src/tooltips.py:651 msgid "Recipient: " msgstr "Příjemce: " -#: ../src/filetransfers_window.py:196 +#: ../src/filetransfers_window.py:200 #, python-format msgid "Saved in: %s" msgstr "Uloženo do: %s" -#: ../src/filetransfers_window.py:198 +#: ../src/filetransfers_window.py:202 msgid "File transfer completed" msgstr "Přenos soubor dokončen" -#: ../src/filetransfers_window.py:212 ../src/filetransfers_window.py:218 +#: ../src/filetransfers_window.py:217 ../src/filetransfers_window.py:224 msgid "File transfer cancelled" msgstr "Přenos souboru zrušen" -#: ../src/filetransfers_window.py:212 ../src/filetransfers_window.py:219 +#: ../src/filetransfers_window.py:217 ../src/filetransfers_window.py:225 msgid "Connection with peer cannot be established." msgstr "Spojení s protistranou se nepodařilo navázat." -#: ../src/filetransfers_window.py:228 +#: ../src/filetransfers_window.py:234 #, python-format msgid "Recipient: %s" msgstr "Příjemce: %s" -#: ../src/filetransfers_window.py:230 +#: ../src/filetransfers_window.py:236 #, python-format msgid "Error message: %s" msgstr "Chybová zpráva: %s" -#: ../src/filetransfers_window.py:231 +#: ../src/filetransfers_window.py:237 #, fuzzy msgid "File transfer stopped" msgstr "Přenos souboru zastaven" -#: ../src/filetransfers_window.py:251 +#: ../src/filetransfers_window.py:257 msgid "Choose File to Send..." msgstr "Vyber soubor k odeslání..." -#: ../src/filetransfers_window.py:267 ../src/tooltips.py:708 +#: ../src/filetransfers_window.py:273 ../src/tooltips.py:689 msgid "Description: " msgstr "Popis:" -#: ../src/filetransfers_window.py:278 +#: ../src/filetransfers_window.py:286 msgid "Gajim cannot access this file" msgstr "Gajim nemůže otevřít tento soubor" -#: ../src/filetransfers_window.py:279 +#: ../src/filetransfers_window.py:287 msgid "This file is being used by another process." msgstr "Tento soubor je používán jiným procesem." -#: ../src/filetransfers_window.py:310 +#: ../src/filetransfers_window.py:320 #, python-format msgid "File: %s" msgstr "Soubor: %s" -#: ../src/filetransfers_window.py:316 +#: ../src/filetransfers_window.py:326 #, python-format msgid "Type: %s" msgstr "Typ: %s" -#: ../src/filetransfers_window.py:318 +#: ../src/filetransfers_window.py:328 #, python-format msgid "Description: %s" msgstr "Popis: %s" @@ -7689,49 +7721,49 @@ msgstr "Popis: %s" # #, python-format # msgid "Description: %s" # msgstr "Popis: %s" -#: ../src/filetransfers_window.py:319 +#: ../src/filetransfers_window.py:329 #, python-format msgid "%s wants to send you a file:" msgstr "%s Vám chce poslat soubor:" -#: ../src/filetransfers_window.py:332 ../src/gtkgui_helpers.py:812 +#: ../src/filetransfers_window.py:342 ../src/gtkgui_helpers.py:858 #, python-format msgid "Cannot overwrite existing file \"%s\"" msgstr "Nemohu přepsat existující soubor \"%s\"" -#: ../src/filetransfers_window.py:333 ../src/gtkgui_helpers.py:814 +#: ../src/filetransfers_window.py:343 ../src/gtkgui_helpers.py:860 msgid "" "A file with this name already exists and you do not have permission to " "overwrite it." msgstr "Soubor tohoto jména již existuje a ty nemáš oprávnění k jeho přepsání." -#: ../src/filetransfers_window.py:349 ../src/gtkgui_helpers.py:818 +#: ../src/filetransfers_window.py:359 ../src/gtkgui_helpers.py:864 msgid "This file already exists" msgstr "Tento soubor už existuje" -#: ../src/filetransfers_window.py:349 ../src/gtkgui_helpers.py:818 +#: ../src/filetransfers_window.py:359 ../src/gtkgui_helpers.py:864 msgid "What do you want to do?" msgstr "Co by jste rád(a) dělal(a)?" #. read-only bit is used to mark special folder under windows, #. not to mark that a folder is read-only. See ticket #3587 -#: ../src/filetransfers_window.py:359 ../src/gtkgui_helpers.py:825 +#: ../src/filetransfers_window.py:369 ../src/gtkgui_helpers.py:871 #, python-format msgid "Directory \"%s\" is not writable" msgstr "Adresář \"%s\" není zapisovatelný" -#: ../src/filetransfers_window.py:359 ../src/gtkgui_helpers.py:826 +#: ../src/filetransfers_window.py:369 ../src/gtkgui_helpers.py:872 msgid "You do not have permission to create files in this directory." msgstr "Nemáš oprávnění k vytváření souborů v tomto adresáři." -#: ../src/filetransfers_window.py:369 +#: ../src/filetransfers_window.py:379 msgid "Save File as..." msgstr "Uložit jako..." #. Print remaining time in format 00:00:00 #. You can change the places of (hours), (minutes), (seconds) - #. they are not translatable. -#: ../src/filetransfers_window.py:435 +#: ../src/filetransfers_window.py:449 #, python-format msgid "%(hours)02.d:%(minutes)02.d:%(seconds)02.d" msgstr "%(hours)02.d:%(minutes)02.d:%(seconds)02.d" @@ -7739,32 +7771,32 @@ msgstr "%(hours)02.d:%(minutes)02.d:%(seconds)02.d" #. This should make the string Kb/s, #. where 'Kb' part is taken from %s. #. Only the 's' after / (which means second) should be translated. -#: ../src/filetransfers_window.py:526 +#: ../src/filetransfers_window.py:542 #, python-format msgid "(%(filesize_unit)s/s)" msgstr "(%(filesize_unit)s/s)" -#: ../src/filetransfers_window.py:566 ../src/filetransfers_window.py:569 +#: ../src/filetransfers_window.py:585 ../src/filetransfers_window.py:588 msgid "Invalid File" msgstr "Neplatný soubor" -#: ../src/filetransfers_window.py:566 +#: ../src/filetransfers_window.py:585 msgid "File: " msgstr "Soubor: " -#: ../src/filetransfers_window.py:570 +#: ../src/filetransfers_window.py:589 msgid "It is not possible to send empty files" msgstr "Není možné posílat prázdné soubory" -#: ../src/filetransfers_window.py:592 ../src/tooltips.py:660 +#: ../src/filetransfers_window.py:613 ../src/tooltips.py:641 msgid "Name: " msgstr "Jméno: " -#: ../src/filetransfers_window.py:594 ../src/tooltips.py:664 +#: ../src/filetransfers_window.py:615 ../src/tooltips.py:645 msgid "Sender: " msgstr "Odesílatel: " -#: ../src/filetransfers_window.py:781 +#: ../src/filetransfers_window.py:809 msgid "Pause" msgstr "Pauza" @@ -7836,11 +7868,11 @@ msgstr "" "získat na %s" #. set the icon to all newly opened wind -#: ../src/gajim.py:354 +#: ../src/gajim.py:328 msgid "Gajim is already running" msgstr "Gajim již běží" -#: ../src/gajim.py:355 +#: ../src/gajim.py:329 msgid "" "Another instance of Gajim seems to be running\n" "Run anyway?" @@ -7848,462 +7880,28 @@ msgstr "" "Jiná instance Gajimu pravděpodobně již běží\n" "Přesto spustit?" -#: ../src/gajim.py:440 -msgid "Passphrase Required" -msgstr "Heslo Vyžadováno" - -#: ../src/gajim.py:441 -#, python-format -msgid "Enter GPG key passphrase for key %(keyid)s (account %(account)s)." -msgstr "Zadej heslo GPG klíče pro účet %(keyid)s (účet %(account)s)." - -#: ../src/gajim.py:455 -#, fuzzy -msgid "GPG key expired" -msgstr "Nepřiřazen GPG klíč" - -#: ../src/gajim.py:456 -#, fuzzy, python-format -msgid "Your GPG key has expied, you will be connected to %s without OpenPGP." -msgstr "Budete připojen(a) k %s bez OpenPGP." - -#. ask again -#: ../src/gajim.py:465 -msgid "Wrong Passphrase" -msgstr "Nesprávné heslo" - -#: ../src/gajim.py:466 -msgid "Please retype your GPG passphrase or press Cancel." -msgstr "Prosím zopakujte Vaše heslo pro GPG klíč, nebo stiskněte Zrušit." - -#: ../src/gajim.py:524 -#, python-format -msgid "" -"Your desired nickname in group chat %s is in use or registered by another " -"occupant.\n" -"Please specify another nickname below:" -msgstr "" -"Tebou požadované přezdívka se již používá v diskuzi %s nebo je " -"zaregistrována někým jiným.\n" -"Níže vyber jinou přezdívku:" - -#: ../src/gajim.py:527 -msgid "Always use this nickname when there is a conflict" -msgstr "" - -#: ../src/gajim.py:544 -msgid "Do you accept this request?" -msgstr "Chcete přijmout tuto žádost?" - -#: ../src/gajim.py:546 -#, python-format -msgid "Do you accept this request on account %s?" -msgstr "Chcete přijmout tuto žádost na účtě %s?" - -#: ../src/gajim.py:549 -#, fuzzy, python-format -msgid "HTTP (%(method)s) Authorization for %(url)s (id: %(id)s)" -msgstr "HTTP (%s) Autorizace pro %s (id: %s)" - -#: ../src/gajim.py:600 ../src/notify.py:511 -msgid "Connection Failed" -msgstr "Spojení selhalo" - -#: ../src/gajim.py:933 ../src/gajim.py:937 -#, python-format -msgid "Error %(code)s: %(msg)s" -msgstr "Chyba %(code)s: %(msg)s" - -#. ('MSGNOTSENT', account, (jid, ierror_msg, msg, time, session)) -#: ../src/gajim.py:947 ../src/gajim.py:961 -#, fuzzy, python-format -msgid "error while sending %(message)s ( %(error)s )" -msgstr "chyba při odesílání %s ( %s )" - -#: ../src/gajim.py:988 ../src/notify.py:513 -#, fuzzy -msgid "Subscription request" -msgstr "Žádost o autorizaci" - -#: ../src/gajim.py:1013 -msgid "Authorization accepted" -msgstr "Autorizace přijata" - -#: ../src/gajim.py:1014 -#, python-format -msgid "The contact \"%s\" has authorized you to see his or her status." -msgstr "Kontakt \"%s\" Vás autorizoval k zobrazení jeho stavu." - -#: ../src/gajim.py:1026 -#, python-format -msgid "Contact \"%s\" removed subscription from you" -msgstr "Kontakt \"%s\" Vám odebral autorizaci" - -#: ../src/gajim.py:1027 -msgid "" -"You will always see him or her as offline.\n" -"Do you want to remove him or her from your contact list?" -msgstr "" -"Vždy uvidíte jeho nebo ji odpojeného/odpojenou.\n" -"Opravdu jeho/ji chcete odstrani ze seznamu kontaktů?" - -#: ../src/gajim.py:1052 ../src/notify.py:515 -#, fuzzy -msgid "Unsubscribed" -msgstr "_Zrušit autorizaci" - -#: ../src/gajim.py:1093 -#, python-format -msgid "Contact with \"%s\" cannot be established" -msgstr "Kontakt s \"%s\" nebyl navázán" - -#: ../src/gajim.py:1283 ../src/groupchat_control.py:1251 -#, python-format -msgid "%(nick)s is now known as %(new_nick)s" -msgstr "%(nick)s se přejmenoval na %(new_nick)s" - -#: ../src/gajim.py:1308 ../src/groupchat_control.py:1436 -#: ../src/history_window.py:431 ../src/notify.py:244 -#, python-format -msgid "%(nick)s is now %(status)s" -msgstr "%(nick)s je nyní %(status)s" - -#: ../src/gajim.py:1375 -#, python-format -msgid "%(jid)s has set the subject to %(subject)s" -msgstr "%(jid)s nastavil předmět na %(subject)s" - -#. Can be a presence (see chg_contact_status in groupchat_control.py) -#. Can be a message (see handle_event_gc_config_change in gajim.py) -#: ../src/gajim.py:1439 ../src/groupchat_control.py:1191 -msgid "Any occupant is allowed to see your full JID" -msgstr "Každý návštěvník uvidí váš úplný JID" - -#: ../src/gajim.py:1442 -msgid "Room now shows unavailable member" -msgstr "Místnost nyní zobrazuje nedostupné členy" - -#: ../src/gajim.py:1444 -msgid "room now does not show unavailable members" -msgstr "místnost nyní nezobrazuje nedostupné členy" - -#: ../src/gajim.py:1447 -msgid "A non-privacy-related room configuration change has occurred" -msgstr "Nastala změna nastavení netýkající se soukromí" - -#. Can be a presence (see chg_contact_status in groupchat_control.py) -#: ../src/gajim.py:1450 -msgid "Room logging is now enabled" -msgstr "Zaznamenávání historie je zapnuto" - -#: ../src/gajim.py:1452 -msgid "Room logging is now disabled" -msgstr "Zaznamenávání historie je vypnuto" - -#: ../src/gajim.py:1454 -msgid "Room is now non-anonymous" -msgstr "Místnost není anonymní" - -#: ../src/gajim.py:1457 -msgid "Room is now semi-anonymous" -msgstr "Místnost je částečně anonymní" - -#: ../src/gajim.py:1460 -msgid "Room is now fully-anonymous" -msgstr "Místnost je plně anonymní" - -#: ../src/gajim.py:1492 -#, fuzzy, python-format -msgid "A Password is required to join the room %s. Please type it." -msgstr "Pro připojení do místnosti %s je vyžadováno heslo. Zadejte" - -#: ../src/gajim.py:1526 -msgid "" -"You configured Gajim to use GPG agent, but there is no GPG agent running or " -"it returned a wrong passphrase.\n" -msgstr "" -"Nastavily jste Gajim aby používal GPG agenta, ale žádný GPG agent není " -"spuštěný nebo vrátil chybné heslo.\n" - -#: ../src/gajim.py:1528 ../src/gajim.py:1534 -msgid "You are currently connected without your OpenPGP key." -msgstr "Momentálně jste připojen(a) bez vašeho OpenPGP klíče." - -#: ../src/gajim.py:1529 -msgid "Your passphrase is incorrect" -msgstr "Vaše heslo je neplatné" - -#: ../src/gajim.py:1533 -#, fuzzy -msgid "OpenGPG Passphrase Incorrect" -msgstr "Vaše heslo je neplatné" - -#: ../src/gajim.py:1559 -#, fuzzy -msgid "GPG key not trusted" -msgstr "GPG je nepoužitelné" - -#: ../src/gajim.py:1559 -#, fuzzy -msgid "" -"The GPG key used to encrypt this chat is not trusted. Do you really want to " -"encrypt this message?" -msgstr "" -"Tomuto kontaktu není přiřazen GPG klíč. Proto nemůžete šifrovat zprávy." - -#: ../src/gajim.py:1561 ../src/gajim.py:2227 ../src/gajim.py:2262 -#: ../src/groupchat_control.py:1674 ../src/message_window.py:222 -#: ../src/roster_window.py:2667 ../src/roster_window.py:3292 -#: ../src/roster_window.py:3970 -msgid "Do _not ask me again" -msgstr "Příště _nezobrazovat" - -#: ../src/gajim.py:1571 -#, fuzzy -msgid "" -"Gnome Keyring is installed but not \t\t\t\tcorrectly started (environment " -"variable probably not \t\t\t\tcorrectly set)" -msgstr "" -"Gnome Keyring je nainstalován ale není správně spuštěn (proměná prostředí " -"není asi správně nastavena)" - -#: ../src/gajim.py:1681 -#, python-format -msgid "New mail on %(gmail_mail_address)s" -msgstr "Nový E-mail pro %(gmail_mail_address)s" - -#: ../src/gajim.py:1683 -#, python-format -msgid "You have %d new mail conversation" -msgid_plural "You have %d new mail conversations" -msgstr[0] "Máte %d nepřečtený E-mail" -msgstr[1] "Máte %d nepřečtené E-maily" -msgstr[2] "Máte %d nepřečtených E-mailů" - -#: ../src/gajim.py:1696 -#, python-format -msgid "" -"\n" -"\n" -"From: %(from_address)s\n" -"Subject: %(subject)s\n" -"%(snippet)s" -msgstr "" -"\n" -"\n" -"Od: %(from_address)s\n" -"Předmět: %(subject)s\n" -"%(snippet)s" - -#: ../src/gajim.py:1767 -#, python-format -msgid "%s wants to send you a file." -msgstr "%s Vám chce poslat soubor." - -#: ../src/gajim.py:1805 ../src/roster_window.py:1851 -#, fuzzy -msgid "Remote contact stopped transfer" -msgstr "Odstraní kontakt ze Seznamu" - -#: ../src/gajim.py:1807 ../src/roster_window.py:1853 -#, fuzzy -msgid "Error opening file" -msgstr "Chyba při čtení souboru:" - -#: ../src/gajim.py:1838 -#, python-format -msgid "You successfully received %(filename)s from %(name)s." -msgstr "Soubor %(filename)s od %(name)s byl úspěsně přijat." - -#. ft stopped -#: ../src/gajim.py:1842 -#, python-format -msgid "File transfer of %(filename)s from %(name)s stopped." -msgstr "Přenos souboru %(filename)s od %(name)s byl zastaven." - -#: ../src/gajim.py:1855 -#, python-format -msgid "You successfully sent %(filename)s to %(name)s." -msgstr "Soubor %(filename)s byl uspěšně odeslán %(name)s." - -#. ft stopped -#: ../src/gajim.py:1859 -#, python-format -msgid "File transfer of %(filename)s to %(name)s stopped." -msgstr "Přenos souboru %(filename)s pro %(name)s byl zastaven." - -#: ../src/gajim.py:1961 -#, python-format -msgid "" -"Unable to decrypt message from %s\n" -"It may have been tampered with." -msgstr "" -"Nepodařilo se dešifrovat zprávu od %s\n" -"Možná je falešná." - -#: ../src/gajim.py:1968 -msgid "Unable to decrypt message" -msgstr "Nepodařilo se dešifrovat zprávu" - -#: ../src/gajim.py:2042 -msgid "Username Conflict" -msgstr "Konflikt uživatelských jmen" - -#: ../src/gajim.py:2043 -msgid "Please type a new username for your local account" -msgstr "Prosím zadejte nové uživatelské jméno pro lokální účet" - -#: ../src/gajim.py:2055 -msgid "Ping?" -msgstr "Ping?" - -#: ../src/gajim.py:2068 -#, python-format -msgid "Pong! (%s s.)" -msgstr "Pong! (%s s.)" - -#: ../src/gajim.py:2079 -msgid "Error." -msgstr "Chyba." - -#: ../src/gajim.py:2106 -msgid "Resource Conflict" -msgstr "Konflikt Zdrojů" - -#: ../src/gajim.py:2107 -msgid "" -"You are already connected to this account with the same resource. Please " -"type a new one" -msgstr "Už jsi připojen(a) k tomuto účtu se stejným zdrojem. Prosím zadej nový" - -#: ../src/gajim.py:2166 -msgid "Error verifying SSL certificate" -msgstr "Chyba ověřování SSL certifikátu" - -#: ../src/gajim.py:2167 -#, python-format -msgid "" -"There was an error verifying the SSL certificate of your jabber server: %" -"(error)s\n" -"Do you still want to connect to this server?" -msgstr "" -"Chyba při ověřování SSL vertifikátu na vašem jabber serveru: %(error)s\n" -"Chcete se přesto připojit?" - -#: ../src/gajim.py:2172 -msgid "Ignore this error for this certificate." -msgstr "Ignorovat tuto chybu certifikátu." - -#: ../src/gajim.py:2192 -msgid "SSL certificate error" -msgstr "Chyba SSL certifikátu" - -#: ../src/gajim.py:2193 -#, python-format -msgid "" -"It seems the SSL certificate of account %(account)s has changed or your " -"connection is being hacked.\n" -"Old fingerprint: %(old)s\n" -"New fingerprint: %(new)s\n" -"\n" -"Do you still want to connect and update the fingerprint of the certificate?" -msgstr "" -"Vypadá to, že se SSL certifikát účtu %(account)s změnil nebo někdo hackuje " -"vaše spojení.\n" -"Starý otisk: %(old)s\n" -"Nový otisk: %(new)s\n" -"\n" -"Chcete se stále připojit a aktualizovat otisk certifikátu?" - -#: ../src/gajim.py:2223 ../src/gajim.py:2258 -msgid "Insecure connection" -msgstr "Nezabezpečené Spojení" - -#: ../src/gajim.py:2224 -msgid "" -"You are about to send your password on an unencrypted connection. Are you " -"sure you want to do that?" -msgstr "" -"Chystáte se poslat vaše heslo nezabezpečeným spojením. Jste si jistý(á), že " -"to skutečně chcete udělat?" - -#: ../src/gajim.py:2226 ../src/gajim.py:2261 -msgid "Yes, I really want to connect insecurely" -msgstr "Ano, chci se připojit nezabezpečeně" - -#: ../src/gajim.py:2259 -msgid "" -"You are about to send your password on an insecure connection. You should " -"install PyOpenSSL to prevent that. Are you sure you want to do that?" -msgstr "" -"Abyste nemuseli posílat heslo nezabezpečeným připojením nainstalujte si " -"PyOpenSSL. Jste si jisti, že to chcete udělat?" - -#: ../src/gajim.py:2279 -msgid "PEP node was not removed" -msgstr "PEP uzel nebyl smazán" - -#: ../src/gajim.py:2280 -#, python-format -msgid "PEP node %(node)s was not removed: %(message)s" -msgstr "PEP uzel %(node)s se nepodařilo odstranit: %(message)s" - -#. theme doesn't exist, disable emoticons -#: ../src/gajim.py:2784 ../src/gajim.py:2806 -msgid "Emoticons disabled" -msgstr "Smajlíci byly vypnuty" - -#: ../src/gajim.py:2785 -msgid "" -"Your configured emoticons theme has not been found, so emoticons have been " -"disabled." -msgstr "" -"Vámi nastavené téma pro smajlíky nebylo nalezeno, proto budou smajlíci " -"vypnuty " - -#: ../src/gajim.py:2807 -msgid "" -"Your configured emoticons theme cannot been loaded. You maybe need to update " -"the format of emoticons.py file. See http://trac.gajim.org/wiki/Emoticons " -"for more details." -msgstr "" -"Vámi nastavené téma smajlíků se nepodařilo načíst. Možná je potřeba " -"aktualizovat formát v souboru emoticons.py. Viz.: http://trac.gajim.org/wiki/" -"Emoticons " - -#: ../src/gajim.py:2833 ../src/roster_window.py:3432 -msgid "You cannot join a group chat while you are invisible" -msgstr "Nemůžete vstoupit do diskuze, pokud jste neviditelný(á)" - -# FIXME: jaky je rozdil mezi settings a preferences? - kdo vi :) -#. it is good to notify the user -#. in case he or she cannot see the output of the console -#: ../src/gajim.py:3202 -msgid "Could not save your settings and preferences" -msgstr "Nelze uložit Vaše nastavení" - -#: ../src/gajim-remote.py:78 +#: ../src/gajim-remote.py:77 msgid "Shows a help on specific command" msgstr "Zobrazí nápovědu pro konkrétní příkaz" #. User gets help for the command, specified by this parameter -#: ../src/gajim-remote.py:81 +#: ../src/gajim-remote.py:80 msgid "command" msgstr "příkaz" -#: ../src/gajim-remote.py:82 +#: ../src/gajim-remote.py:81 msgid "show help on command" msgstr "zobraz nápovědu k příkazu" -#: ../src/gajim-remote.py:86 +#: ../src/gajim-remote.py:85 msgid "Shows or hides the roster window" msgstr "Zobrazí nebo skryje okno Seznamu" -#: ../src/gajim-remote.py:90 +#: ../src/gajim-remote.py:89 msgid "Pops up a window with the next pending event" msgstr "Zobrazí okno s další nepřečtenou událostí" -#: ../src/gajim-remote.py:94 +#: ../src/gajim-remote.py:93 msgid "" "Prints a list of all contacts in the roster. Each contact appears on a " "separate line" @@ -8311,50 +7909,50 @@ msgstr "" "Vytiskne seznam všech kontaktů v rosteru. Každý kontakt se objeví na " "samostatném řádku" -#: ../src/gajim-remote.py:97 ../src/gajim-remote.py:112 -#: ../src/gajim-remote.py:122 ../src/gajim-remote.py:132 -#: ../src/gajim-remote.py:148 ../src/gajim-remote.py:162 -#: ../src/gajim-remote.py:171 ../src/gajim-remote.py:192 -#: ../src/gajim-remote.py:222 ../src/gajim-remote.py:231 -#: ../src/gajim-remote.py:238 ../src/gajim-remote.py:245 -#: ../src/gajim-remote.py:256 ../src/gajim-remote.py:272 -#: ../src/gajim-remote.py:283 +#: ../src/gajim-remote.py:96 ../src/gajim-remote.py:111 +#: ../src/gajim-remote.py:121 ../src/gajim-remote.py:131 +#: ../src/gajim-remote.py:147 ../src/gajim-remote.py:161 +#: ../src/gajim-remote.py:170 ../src/gajim-remote.py:191 +#: ../src/gajim-remote.py:221 ../src/gajim-remote.py:230 +#: ../src/gajim-remote.py:237 ../src/gajim-remote.py:244 +#: ../src/gajim-remote.py:255 ../src/gajim-remote.py:271 +#: ../src/gajim-remote.py:282 msgid "account" msgstr "účet" -#: ../src/gajim-remote.py:97 +#: ../src/gajim-remote.py:96 msgid "show only contacts of the given account" msgstr "zobraz pouze kontakty zadaného účtu" -#: ../src/gajim-remote.py:103 +#: ../src/gajim-remote.py:102 msgid "Prints a list of registered accounts" msgstr "Vypíše seznam registrovaných účtů" -#: ../src/gajim-remote.py:107 +#: ../src/gajim-remote.py:106 msgid "Changes the status of account or accounts" msgstr "Změní stav účtu nebo účtů" #. offline, online, chat, away, xa, dnd, invisible should not be translated -#: ../src/gajim-remote.py:110 +#: ../src/gajim-remote.py:109 msgid "status" msgstr "stav" -#: ../src/gajim-remote.py:110 +#: ../src/gajim-remote.py:109 msgid "one of: offline, online, chat, away, xa, dnd, invisible " msgstr "" "jeden z: odpojen, připojen, ukecaný, pryč, nedostupný, nerušit, neviditelný " -#: ../src/gajim-remote.py:111 ../src/gajim-remote.py:134 -#: ../src/gajim-remote.py:145 ../src/gajim-remote.py:159 -#: ../src/gajim-remote.py:170 ../src/gajim-remote.py:274 +#: ../src/gajim-remote.py:110 ../src/gajim-remote.py:133 +#: ../src/gajim-remote.py:144 ../src/gajim-remote.py:158 +#: ../src/gajim-remote.py:169 ../src/gajim-remote.py:273 msgid "message" msgstr "zpráva" -#: ../src/gajim-remote.py:111 +#: ../src/gajim-remote.py:110 msgid "status message" msgstr "text stavu" -#: ../src/gajim-remote.py:112 +#: ../src/gajim-remote.py:111 msgid "" "change status of account \"account\". If not specified, try to change status " "of all accounts that have \"sync with global status\" option set" @@ -8362,22 +7960,22 @@ msgstr "" "změnit stav účtu \"account\". Pokud není uveden, zkuste změnit stav všech " "účtů které mají povolenu volbu \"sync with global status\" " -#: ../src/gajim-remote.py:118 +#: ../src/gajim-remote.py:117 #, fuzzy msgid "Changes the priority of account or accounts" msgstr "Změní stav účtu nebo účtů" -#: ../src/gajim-remote.py:120 +#: ../src/gajim-remote.py:119 #, fuzzy msgid "priority" msgstr "Priori_ta:" -#: ../src/gajim-remote.py:120 +#: ../src/gajim-remote.py:119 #, fuzzy msgid "priority you want to give to the account" msgstr "Chtěl(a) bych za_registrovat nový účet" -#: ../src/gajim-remote.py:122 +#: ../src/gajim-remote.py:121 #, fuzzy msgid "" "change the priority of the given account. If not specified, change status of " @@ -8386,23 +7984,23 @@ msgstr "" "změnit stav účtu \"account\". Pokud není uveden, zkuste změnit stav všech " "účtů které mají povolenu volbu \"sync with global status\" " -#: ../src/gajim-remote.py:128 +#: ../src/gajim-remote.py:127 msgid "Shows the chat dialog so that you can send messages to a contact" msgstr "Zobrazte okno rozhovoru, aby jste mohl(a) poslat zprávu kontaktu" -#: ../src/gajim-remote.py:130 +#: ../src/gajim-remote.py:129 msgid "JID of the contact that you want to chat with" msgstr "JID kontaktu, se kterým chcete komunikovat" -#: ../src/gajim-remote.py:132 ../src/gajim-remote.py:222 +#: ../src/gajim-remote.py:131 ../src/gajim-remote.py:221 msgid "if specified, contact is taken from the contact list of this account" msgstr "pokud uvedeno, kontakt bude vzít ze seznamu kontaktů pro tento účet" -#: ../src/gajim-remote.py:135 +#: ../src/gajim-remote.py:134 msgid "message content. The account must be specified or \"\"" msgstr "" -#: ../src/gajim-remote.py:140 +#: ../src/gajim-remote.py:139 msgid "" "Sends new chat message to a contact in the roster. Both OpenPGP key and " "account are optional. If you want to set only 'account', without 'OpenPGP " @@ -8412,29 +8010,29 @@ msgstr "" "volitelné. Pokud chcete nastavit pouze 'account' bez 'OpenPGP key', nastavte " "prostě 'OpenPGP key' na ''." -#: ../src/gajim-remote.py:144 ../src/gajim-remote.py:157 +#: ../src/gajim-remote.py:143 ../src/gajim-remote.py:156 msgid "JID of the contact that will receive the message" msgstr "JID kontaktu, který obdrží zprávu" -#: ../src/gajim-remote.py:145 ../src/gajim-remote.py:159 -#: ../src/gajim-remote.py:170 +#: ../src/gajim-remote.py:144 ../src/gajim-remote.py:158 +#: ../src/gajim-remote.py:169 msgid "message contents" msgstr "Tělo zprávy" -#: ../src/gajim-remote.py:146 ../src/gajim-remote.py:160 +#: ../src/gajim-remote.py:145 ../src/gajim-remote.py:159 msgid "pgp key" msgstr "pgp klíč" -#: ../src/gajim-remote.py:146 ../src/gajim-remote.py:160 +#: ../src/gajim-remote.py:145 ../src/gajim-remote.py:159 msgid "if specified, the message will be encrypted using this public key" msgstr "pokud bude uvedeno, zpráva bude zašifrována tímto veřejným klíčem" -#: ../src/gajim-remote.py:148 ../src/gajim-remote.py:162 -#: ../src/gajim-remote.py:171 +#: ../src/gajim-remote.py:147 ../src/gajim-remote.py:161 +#: ../src/gajim-remote.py:170 msgid "if specified, the message will be sent using this account" msgstr "pokud bude uvedeno, zpráva bude odeslána z tohoto účtu" -#: ../src/gajim-remote.py:153 +#: ../src/gajim-remote.py:152 msgid "" "Sends new single message to a contact in the roster. Both OpenPGP key and " "account are optional. If you want to set only 'account', without 'OpenPGP " @@ -8444,135 +8042,135 @@ msgstr "" "jsou volitelné. Pokud chcete nastavit pouze 'account' bez 'OpenPGP key', " "nastavte prostě 'OpenPGP key' na ''." -#: ../src/gajim-remote.py:158 +#: ../src/gajim-remote.py:157 msgid "subject" msgstr "předmět" -#: ../src/gajim-remote.py:158 +#: ../src/gajim-remote.py:157 msgid "message subject" msgstr "předmět zprávy" -#: ../src/gajim-remote.py:167 +#: ../src/gajim-remote.py:166 msgid "Sends new message to a groupchat you've joined." msgstr "Poslat novou zprávu do diskuze ke které jste připojeni." -#: ../src/gajim-remote.py:169 +#: ../src/gajim-remote.py:168 msgid "JID of the room that will receive the message" msgstr "JID diskuze do které přijde zpráva" -#: ../src/gajim-remote.py:176 +#: ../src/gajim-remote.py:175 msgid "Gets detailed info on a contact" msgstr "Získej detailní informace o kontaktu" -#: ../src/gajim-remote.py:178 ../src/gajim-remote.py:191 -#: ../src/gajim-remote.py:221 ../src/gajim-remote.py:230 +#: ../src/gajim-remote.py:177 ../src/gajim-remote.py:190 +#: ../src/gajim-remote.py:220 ../src/gajim-remote.py:229 msgid "JID of the contact" msgstr "JID kontaktu" -#: ../src/gajim-remote.py:182 +#: ../src/gajim-remote.py:181 msgid "Gets detailed info on a account" msgstr "Získej detailní informace o účtu" -#: ../src/gajim-remote.py:184 +#: ../src/gajim-remote.py:183 msgid "Name of the account" msgstr "Jméno účtu" -#: ../src/gajim-remote.py:188 +#: ../src/gajim-remote.py:187 msgid "Sends file to a contact" msgstr "Pošle soubor kontaktu" -#: ../src/gajim-remote.py:190 +#: ../src/gajim-remote.py:189 msgid "file" msgstr "soubor" -#: ../src/gajim-remote.py:190 +#: ../src/gajim-remote.py:189 msgid "File path" msgstr "Cesta k souboru" -#: ../src/gajim-remote.py:192 +#: ../src/gajim-remote.py:191 msgid "if specified, file will be sent using this account" msgstr "pokud bude uvedeno, zpráva bude odeslána z tohoto účtu" -#: ../src/gajim-remote.py:197 +#: ../src/gajim-remote.py:196 msgid "Lists all preferences and their values" msgstr "Vypíše všechna nastavení a jejich hodnoty" # FIXME: opravit, pokud je mozne prekladat i key & value -#: ../src/gajim-remote.py:201 +#: ../src/gajim-remote.py:200 msgid "Sets value of 'key' to 'value'." msgstr "Nastaví hodnotu klíče 'key' na hodnotu 'value'" -#: ../src/gajim-remote.py:203 +#: ../src/gajim-remote.py:202 msgid "key=value" msgstr "klíč=hodnota" # FIXME: opet -#: ../src/gajim-remote.py:203 +#: ../src/gajim-remote.py:202 msgid "'key' is the name of the preference, 'value' is the value to set it to" msgstr "'klíč' je jméno volby, 'hodnota' je hodnota která se nastavuje" -#: ../src/gajim-remote.py:208 +#: ../src/gajim-remote.py:207 msgid "Deletes a preference item" msgstr "Smaže položku nastavení" -#: ../src/gajim-remote.py:210 +#: ../src/gajim-remote.py:209 msgid "key" msgstr "klíč" -#: ../src/gajim-remote.py:210 +#: ../src/gajim-remote.py:209 msgid "name of the preference to be deleted" msgstr "jméno volby, která bude smazána" -#: ../src/gajim-remote.py:214 +#: ../src/gajim-remote.py:213 msgid "Writes the current state of Gajim preferences to the .config file" msgstr "Zapíše aktuální nastavení do souboru .config" -#: ../src/gajim-remote.py:219 +#: ../src/gajim-remote.py:218 msgid "Removes contact from roster" msgstr "Odstraní kontakt ze Seznamu" -#: ../src/gajim-remote.py:228 +#: ../src/gajim-remote.py:227 msgid "Adds contact to roster" msgstr "Přidat kontakt do Seznamu" -#: ../src/gajim-remote.py:230 +#: ../src/gajim-remote.py:229 msgid "jid" msgstr "jid" -#: ../src/gajim-remote.py:231 +#: ../src/gajim-remote.py:230 msgid "Adds new contact to this account" msgstr "Přidá nový kontakt do tohoto účtu" -#: ../src/gajim-remote.py:236 +#: ../src/gajim-remote.py:235 msgid "Returns current status (the global one unless account is specified)" msgstr "Vrátí aktuální stav (globální, pokud není uveden účet)" -#: ../src/gajim-remote.py:243 +#: ../src/gajim-remote.py:242 msgid "" "Returns current status message (the global one unless account is specified)" msgstr "Vrací aktuální popis stavu (globální, pokud není uveden účet)" -#: ../src/gajim-remote.py:250 +#: ../src/gajim-remote.py:249 msgid "Returns number of unread messages" msgstr "Vrací počet nepřečtených zpráv" -#: ../src/gajim-remote.py:254 +#: ../src/gajim-remote.py:253 msgid "Opens 'Start Chat' dialog" msgstr "Otevře dialog 'Začít rozhovor'" -#: ../src/gajim-remote.py:256 +#: ../src/gajim-remote.py:255 msgid "Starts chat, using this account" msgstr "Začít rozhovor z tohoto účtu" -#: ../src/gajim-remote.py:260 +#: ../src/gajim-remote.py:259 msgid "Sends custom XML" msgstr "Poslat vlastní XML" -#: ../src/gajim-remote.py:262 +#: ../src/gajim-remote.py:261 msgid "XML to send" msgstr "XML k odeslání" -#: ../src/gajim-remote.py:263 +#: ../src/gajim-remote.py:262 msgid "" "Account in which the xml will be sent; if not specified, xml will be sent to " "all accounts" @@ -8580,72 +8178,72 @@ msgstr "" "Účet, ze kterého bude xml odesláno; pokud nebude uvedeno, xml bude odeslání " "ze všech účtů" -#: ../src/gajim-remote.py:269 +#: ../src/gajim-remote.py:268 msgid "Handle a xmpp:/ uri" msgstr "Obsluhovat xmpp:/ uri" -#: ../src/gajim-remote.py:271 +#: ../src/gajim-remote.py:270 msgid "uri" msgstr "uri" -#: ../src/gajim-remote.py:271 +#: ../src/gajim-remote.py:270 msgid "URI to handle" msgstr "URI k obsluze" -#: ../src/gajim-remote.py:272 +#: ../src/gajim-remote.py:271 msgid "Account in which you want to handle it" msgstr "Účet s kterým chcete manipulovat" -#: ../src/gajim-remote.py:274 +#: ../src/gajim-remote.py:273 #, fuzzy msgid "Message content" msgstr "Tělo zprávy" -#: ../src/gajim-remote.py:278 +#: ../src/gajim-remote.py:277 msgid "Join a MUC room" msgstr "_Vstoupit do místnosti MUC" -#: ../src/gajim-remote.py:280 +#: ../src/gajim-remote.py:279 msgid "room" msgstr "místnost" -#: ../src/gajim-remote.py:280 +#: ../src/gajim-remote.py:279 msgid "Room JID" msgstr "JID Místnosti" -#: ../src/gajim-remote.py:281 +#: ../src/gajim-remote.py:280 msgid "nick" msgstr "přezdívka" -#: ../src/gajim-remote.py:281 +#: ../src/gajim-remote.py:280 msgid "Nickname to use" msgstr "Přezdívka kterou chete použít" -#: ../src/gajim-remote.py:282 +#: ../src/gajim-remote.py:281 msgid "password" msgstr "heslo" -#: ../src/gajim-remote.py:282 +#: ../src/gajim-remote.py:281 msgid "Password to enter the room" msgstr "Heslo pro vstup do místnosti" -#: ../src/gajim-remote.py:283 +#: ../src/gajim-remote.py:282 msgid "Account from which you want to enter the room" msgstr "Účet z kterého chcete vstoupit do místnosti" -#: ../src/gajim-remote.py:288 +#: ../src/gajim-remote.py:287 msgid "Check if Gajim is running" msgstr "Zkontrolujte, zda Gajim již běží." -#: ../src/gajim-remote.py:292 +#: ../src/gajim-remote.py:291 msgid "Shows or hides the ipython window" msgstr "Zobrazí nebo skryje okno ipythonu" -#: ../src/gajim-remote.py:319 +#: ../src/gajim-remote.py:318 msgid "Missing argument \"contact_jid\"" msgstr "Chybí parametry \"contact_jid\"" -#: ../src/gajim-remote.py:338 +#: ../src/gajim-remote.py:339 #, python-format msgid "" "'%s' is not in your roster.\n" @@ -8654,15 +8252,15 @@ msgstr "" "'%s' není ve vašem Seznamu.\n" "Prosím uveďte účet, přes který bude odeslána zpráva." -#: ../src/gajim-remote.py:341 +#: ../src/gajim-remote.py:342 msgid "You have no active account" msgstr "Nemáte aktivní účet" -#: ../src/gajim-remote.py:393 +#: ../src/gajim-remote.py:395 msgid "It seems Gajim is not running. So you can't use gajim-remote." msgstr "Vypadá to, že Gajim neběží. Proto nemůžete použít gajim-remote" -#: ../src/gajim-remote.py:416 +#: ../src/gajim-remote.py:422 #, python-format msgid "" "Usage: %(basename)s %(command)s %(arguments)s \n" @@ -8671,16 +8269,16 @@ msgstr "" "Použití: %(basename)s %(command)s %(arguments)s \n" "\t %(help)s" -#: ../src/gajim-remote.py:420 +#: ../src/gajim-remote.py:426 msgid "Arguments:" msgstr "Parametry:" -#: ../src/gajim-remote.py:424 +#: ../src/gajim-remote.py:430 #, python-format msgid "%s not found" msgstr "%s nebyl nalezen" -#: ../src/gajim-remote.py:428 +#: ../src/gajim-remote.py:436 #, python-format msgid "" "Usage: %s command [arguments]\n" @@ -8689,7 +8287,7 @@ msgstr "" "Použití: %s příkaz [parametry]\n" "Příkaz je jeden z:\n" -#: ../src/gajim-remote.py:493 +#: ../src/gajim-remote.py:505 #, python-format msgid "" "Too many arguments. \n" @@ -8698,7 +8296,7 @@ msgstr "" "Příliš mnoho parametrů. \n" "Napište \"%(basename)s help %(command)s\" pro více informací" -#: ../src/gajim-remote.py:498 +#: ../src/gajim-remote.py:510 #, python-format msgid "" "Argument \"%(arg)s\" is not specified. \n" @@ -8707,7 +8305,7 @@ msgstr "" "Parametr \"%(arg)s\" nebyl uveden. \n" "Napište \"%(basename)s help %(command)s\" pro více informací" -#: ../src/gajim-remote.py:517 +#: ../src/gajim-remote.py:529 msgid "Wrong uri" msgstr "Nesprávné uri" @@ -8736,150 +8334,174 @@ msgstr "Nemůžete smazat právě používané téma" msgid "Please first choose another for your current theme." msgstr "Vyberte prosím napřed jiné téma." -#: ../src/groupchat_control.py:162 +#: ../src/groupchat_control.py:167 msgid "Sending private message failed" msgstr "Odesílání soukromé zprávy selhalo" #. in second %s code replaces with nickname -#: ../src/groupchat_control.py:164 +#: ../src/groupchat_control.py:169 #, python-format msgid "You are no longer in group chat \"%(room)s\" or \"%(nick)s\" has left." msgstr "Už nejsi v místnosti \"%(room)s\" nebo \"%(nick)s\" odešel(a)." -#: ../src/groupchat_control.py:436 +#: ../src/groupchat_control.py:439 msgid "Insert Nickname" msgstr "Vložit přezdívku" -#: ../src/groupchat_control.py:595 +#: ../src/groupchat_control.py:617 msgid "Conversation with " msgstr "Rozhovor s" -#: ../src/groupchat_control.py:597 +#: ../src/groupchat_control.py:619 msgid "Continued conversation" msgstr "Pokračování v rozhovoru" #. Can be a message (see handle_event_gc_config_change in gajim.py) -#: ../src/groupchat_control.py:1194 +#. Can be a presence (see chg_contact_status in groupchat_control.py) +#: ../src/groupchat_control.py:1228 ../src/gui_interface.py:1050 +msgid "Any occupant is allowed to see your full JID" +msgstr "Každý návštěvník uvidí váš úplný JID" + +#. Can be a message (see handle_event_gc_config_change in gajim.py) +#: ../src/groupchat_control.py:1231 msgid "Room logging is enabled" msgstr "Zaznamenávání historie je povoleno" -#: ../src/groupchat_control.py:1196 +#: ../src/groupchat_control.py:1233 msgid "A new room has been created" msgstr "Nová místnost byla vytvořena" -#: ../src/groupchat_control.py:1199 +#: ../src/groupchat_control.py:1236 msgid "The server has assigned or modified your roomnick" msgstr "Server přidělil nebo změnil název vaší místnosti" #. do not print 'kicked by None' -#: ../src/groupchat_control.py:1205 +#: ../src/groupchat_control.py:1242 #, python-format msgid "%(nick)s has been kicked: %(reason)s" msgstr "%(nick)s byli vyhozeni: %(reason)s" -#: ../src/groupchat_control.py:1209 +#: ../src/groupchat_control.py:1246 #, python-format msgid "%(nick)s has been kicked by %(who)s: %(reason)s" msgstr "%(nick)s byli vyhozeni od %(who)s: %(reason)s" # FIXME: preklad pro ban? zabanovani je hnusne #. do not print 'banned by None' -#: ../src/groupchat_control.py:1219 +#: ../src/groupchat_control.py:1256 #, python-format msgid "%(nick)s has been banned: %(reason)s" msgstr "%(nick)s byli zakázáni: %(reason)s" -#: ../src/groupchat_control.py:1223 +#: ../src/groupchat_control.py:1260 #, python-format msgid "%(nick)s has been banned by %(who)s: %(reason)s" msgstr "%(nick)s byl zakázán od %(who)s: %(reason)s" -#: ../src/groupchat_control.py:1235 ../src/groupchat_control.py:1328 +#: ../src/groupchat_control.py:1272 ../src/groupchat_control.py:1365 #, python-format msgid "You are now known as %s" msgstr "Jste nyní znám(a) jako %s" -#: ../src/groupchat_control.py:1289 ../src/groupchat_control.py:1293 -#: ../src/groupchat_control.py:1298 +#: ../src/groupchat_control.py:1288 ../src/gui_interface.py:894 +#, python-format +msgid "%(nick)s is now known as %(new_nick)s" +msgstr "%(nick)s se přejmenoval na %(new_nick)s" + +#: ../src/groupchat_control.py:1326 ../src/groupchat_control.py:1330 +#: ../src/groupchat_control.py:1335 #, python-format msgid "%(nick)s has been removed from the room (%(reason)s)" msgstr "%(nick)s byli vyhozeni z místnosti: %(reason)s" -#: ../src/groupchat_control.py:1290 +#: ../src/groupchat_control.py:1327 msgid "affiliation changed" msgstr "Příslušnost:" -#: ../src/groupchat_control.py:1295 +#: ../src/groupchat_control.py:1332 msgid "room configuration changed to members-only" msgstr "nastavení místnosti se změnilo na vstup pouze členům" -#: ../src/groupchat_control.py:1300 +#: ../src/groupchat_control.py:1337 msgid "system shutdown" msgstr "vypnout systém" -#: ../src/groupchat_control.py:1377 +#: ../src/groupchat_control.py:1414 #, python-format msgid "** Affiliation of %(nick)s has been set to %(affiliation)s by %(actor)s" msgstr "** %(actor)s nastavil(a) vztah %(nick)s na %(affiliation)s" -#: ../src/groupchat_control.py:1381 +#: ../src/groupchat_control.py:1418 #, python-format msgid "** Affiliation of %(nick)s has been set to %(affiliation)s" msgstr "** Vztah %(nick)s byl nastaven na %(affiliation)s" -#: ../src/groupchat_control.py:1396 +#: ../src/groupchat_control.py:1433 #, python-format msgid "** Role of %(nick)s has been set to %(role)s by %(actor)s" msgstr "** %(actor)s nastavil(a) postavení %(nick)s na %(role)s" -#: ../src/groupchat_control.py:1400 +#: ../src/groupchat_control.py:1437 #, python-format msgid "** Role of %(nick)s has been set to %(role)s" msgstr "** Postavení %(nick)s bylo nastaveno na %(role)s" -#: ../src/groupchat_control.py:1429 +#: ../src/groupchat_control.py:1466 #, python-format msgid "%s has left" msgstr "%s odešel(a)" -#: ../src/groupchat_control.py:1434 +#: ../src/groupchat_control.py:1471 #, python-format msgid "%s has joined the group chat" msgstr "%s vstoupil do místnosti" -#: ../src/groupchat_control.py:1668 +#: ../src/groupchat_control.py:1473 ../src/gui_interface.py:919 +#: ../src/history_window.py:442 ../src/notify.py:250 +#, python-format +msgid "%(nick)s is now %(status)s" +msgstr "%(nick)s je nyní %(status)s" + +#: ../src/groupchat_control.py:1706 #, python-format msgid "Are you sure you want to leave group chat \"%s\"?" msgstr "Jste si jistý(á), že chcete opustit místnost \"%s\"?" -#: ../src/groupchat_control.py:1670 +#: ../src/groupchat_control.py:1708 msgid "" "If you close this window, you will be disconnected from this group chat." msgstr "Pokud zavřete toto okno, budete odpojen(a) z této místnosti." -#: ../src/groupchat_control.py:1707 +#: ../src/groupchat_control.py:1712 ../src/gui_interface.py:1172 +#: ../src/gui_interface.py:1940 ../src/gui_interface.py:1975 +#: ../src/message_window.py:227 ../src/roster_window.py:2658 +#: ../src/roster_window.py:3301 ../src/roster_window.py:3990 +msgid "Do _not ask me again" +msgstr "Příště _nezobrazovat" + +#: ../src/groupchat_control.py:1745 msgid "Changing Subject" msgstr "Měním Téma" -#: ../src/groupchat_control.py:1708 +#: ../src/groupchat_control.py:1746 msgid "Please specify the new subject:" msgstr "Prosím zadejte nové téma:" -#: ../src/groupchat_control.py:1715 +#: ../src/groupchat_control.py:1753 msgid "Changing Nickname" msgstr "Měním přezdívku" -#: ../src/groupchat_control.py:1716 +#: ../src/groupchat_control.py:1754 msgid "Please specify the new nickname you want to use:" msgstr "Prosím zadejte novou přezdívku, kterou chcete používat:" #. Ask for a reason -#: ../src/groupchat_control.py:1745 +#: ../src/groupchat_control.py:1783 #, python-format msgid "Destroying %s" msgstr "Likviduji: %s" -#: ../src/groupchat_control.py:1746 +#: ../src/groupchat_control.py:1784 msgid "" "You are going to definitively destroy this room.\n" "You may specify a reason below:" @@ -8887,22 +8509,22 @@ msgstr "" "Místnost bude s konečnou platností zničena.\n" "Můžete specifikovat důvod zničení:" -#: ../src/groupchat_control.py:1748 +#: ../src/groupchat_control.py:1786 msgid "You may also enter an alternate venue:" msgstr "Také můžete specifikovat náhradní místo:" #. ask for reason -#: ../src/groupchat_control.py:1921 +#: ../src/groupchat_control.py:1967 #, python-format msgid "Kicking %s" msgstr "Vyhazuji %s" -#: ../src/groupchat_control.py:1922 ../src/groupchat_control.py:2227 +#: ../src/groupchat_control.py:1968 ../src/groupchat_control.py:2291 msgid "You may specify a reason below:" msgstr "Můžete uvést důvod níže:" #. ask for reason -#: ../src/groupchat_control.py:2226 +#: ../src/groupchat_control.py:2290 #, python-format msgid "Banning %s" msgstr "Zakazuji %s" @@ -8927,58 +8549,478 @@ msgid "Details" msgstr "Detaily" #. we talk about file -#: ../src/gtkgui_helpers.py:166 ../src/gtkgui_helpers.py:181 +#: ../src/gtkgui_helpers.py:171 ../src/gtkgui_helpers.py:186 #, python-format msgid "Error: cannot open %s for reading" msgstr "Chyba: nemůžu otevřít %s pro čtení" -#: ../src/gtkgui_helpers.py:351 +#: ../src/gtkgui_helpers.py:362 msgid "Error reading file:" msgstr "Chyba při čtení souboru:" -#: ../src/gtkgui_helpers.py:354 +#: ../src/gtkgui_helpers.py:365 msgid "Error parsing file:" msgstr "Chyba parsování souboru:" #. do not traceback (could be a permission problem) #. we talk about a file here -#: ../src/gtkgui_helpers.py:391 +#: ../src/gtkgui_helpers.py:406 #, python-format msgid "Could not write to %s. Session Management support will not work" msgstr "Nemůžu zapsat do %s. Podpora správy sezení nebude fungovat" #. xmpp: is currently handled by another program, so ask the user -#: ../src/gtkgui_helpers.py:728 +#: ../src/gtkgui_helpers.py:770 msgid "Gajim is not the default Jabber client" msgstr "Gajim není výchozí Jabber klient" -#: ../src/gtkgui_helpers.py:729 +#: ../src/gtkgui_helpers.py:771 msgid "Would you like to make Gajim the default Jabber client?" msgstr "Chcete nastavit Gajim jako výchozí Jabber klient?" -#: ../src/gtkgui_helpers.py:730 +#: ../src/gtkgui_helpers.py:772 msgid "Always check to see if Gajim is the default Jabber client on startup" msgstr "Vždy zkontroluj při startu, zda je Gajim výchozí Jabber klient." -#: ../src/gtkgui_helpers.py:799 +#: ../src/gtkgui_helpers.py:845 msgid "Extension not supported" msgstr "Rozšíření není podporováno" -#: ../src/gtkgui_helpers.py:800 +#: ../src/gtkgui_helpers.py:846 #, python-format msgid "Image cannot be saved in %(type)s format. Save as %(new_filename)s?" msgstr "" "Obrázek nelze uložit ve formátu %(type)s. Uložit jako %(new_filename)s?" -#: ../src/gtkgui_helpers.py:835 +#: ../src/gtkgui_helpers.py:881 msgid "Save Image as..." msgstr "Uložit obrázek jako..." -#: ../src/gui_menu_builder.py:89 +#: ../src/gui_interface.py:129 +#, python-format +msgid "" +"Your desired nickname in group chat %s is in use or registered by another " +"occupant.\n" +"Please specify another nickname below:" +msgstr "" +"Tebou požadované přezdívka se již používá v diskuzi %s nebo je " +"zaregistrována někým jiným.\n" +"Níže vyber jinou přezdívku:" + +#: ../src/gui_interface.py:132 +msgid "Always use this nickname when there is a conflict" +msgstr "" + +#: ../src/gui_interface.py:149 +msgid "Do you accept this request?" +msgstr "Chcete přijmout tuto žádost?" + +#: ../src/gui_interface.py:151 +#, python-format +msgid "Do you accept this request on account %s?" +msgstr "Chcete přijmout tuto žádost na účtě %s?" + +#: ../src/gui_interface.py:154 +#, fuzzy, python-format +msgid "HTTP (%(method)s) Authorization for %(url)s (id: %(id)s)" +msgstr "HTTP (%s) Autorizace pro %s (id: %s)" + +#: ../src/gui_interface.py:205 ../src/notify.py:524 +msgid "Connection Failed" +msgstr "Spojení selhalo" + +#: ../src/gui_interface.py:544 ../src/gui_interface.py:548 +#, python-format +msgid "Error %(code)s: %(msg)s" +msgstr "Chyba %(code)s: %(msg)s" + +#. ('MSGNOTSENT', account, (jid, ierror_msg, msg, time, session)) +#: ../src/gui_interface.py:558 ../src/gui_interface.py:572 +#, fuzzy, python-format +msgid "error while sending %(message)s ( %(error)s )" +msgstr "chyba při odesílání %s ( %s )" + +#: ../src/gui_interface.py:599 ../src/notify.py:526 +#, fuzzy +msgid "Subscription request" +msgstr "Žádost o autorizaci" + +#: ../src/gui_interface.py:624 +msgid "Authorization accepted" +msgstr "Autorizace přijata" + +#: ../src/gui_interface.py:625 +#, python-format +msgid "The contact \"%s\" has authorized you to see his or her status." +msgstr "Kontakt \"%s\" Vás autorizoval k zobrazení jeho stavu." + +#: ../src/gui_interface.py:637 +#, python-format +msgid "Contact \"%s\" removed subscription from you" +msgstr "Kontakt \"%s\" Vám odebral autorizaci" + +#: ../src/gui_interface.py:638 +msgid "" +"You will always see him or her as offline.\n" +"Do you want to remove him or her from your contact list?" +msgstr "" +"Vždy uvidíte jeho nebo ji odpojeného/odpojenou.\n" +"Opravdu jeho/ji chcete odstrani ze seznamu kontaktů?" + +#: ../src/gui_interface.py:663 ../src/notify.py:528 +#, fuzzy +msgid "Unsubscribed" +msgstr "_Zrušit autorizaci" + +#: ../src/gui_interface.py:704 +#, python-format +msgid "Contact with \"%s\" cannot be established" +msgstr "Kontakt s \"%s\" nebyl navázán" + +#: ../src/gui_interface.py:986 +#, python-format +msgid "%(jid)s has set the subject to %(subject)s" +msgstr "%(jid)s nastavil předmět na %(subject)s" + +#: ../src/gui_interface.py:1053 +msgid "Room now shows unavailable member" +msgstr "Místnost nyní zobrazuje nedostupné členy" + +#: ../src/gui_interface.py:1055 +msgid "room now does not show unavailable members" +msgstr "místnost nyní nezobrazuje nedostupné členy" + +#: ../src/gui_interface.py:1058 +msgid "A non-privacy-related room configuration change has occurred" +msgstr "Nastala změna nastavení netýkající se soukromí" + +#. Can be a presence (see chg_contact_status in groupchat_control.py) +#: ../src/gui_interface.py:1061 +msgid "Room logging is now enabled" +msgstr "Zaznamenávání historie je zapnuto" + +#: ../src/gui_interface.py:1063 +msgid "Room logging is now disabled" +msgstr "Zaznamenávání historie je vypnuto" + +#: ../src/gui_interface.py:1065 +msgid "Room is now non-anonymous" +msgstr "Místnost není anonymní" + +#: ../src/gui_interface.py:1068 +msgid "Room is now semi-anonymous" +msgstr "Místnost je částečně anonymní" + +#: ../src/gui_interface.py:1071 +msgid "Room is now fully-anonymous" +msgstr "Místnost je plně anonymní" + +#: ../src/gui_interface.py:1103 +#, fuzzy, python-format +msgid "A Password is required to join the room %s. Please type it." +msgstr "Pro připojení do místnosti %s je vyžadováno heslo. Zadejte" + +#: ../src/gui_interface.py:1137 +msgid "" +"You configured Gajim to use GPG agent, but there is no GPG agent running or " +"it returned a wrong passphrase.\n" +msgstr "" +"Nastavily jste Gajim aby používal GPG agenta, ale žádný GPG agent není " +"spuštěný nebo vrátil chybné heslo.\n" + +#: ../src/gui_interface.py:1139 ../src/gui_interface.py:1145 +msgid "You are currently connected without your OpenPGP key." +msgstr "Momentálně jste připojen(a) bez vašeho OpenPGP klíče." + +#: ../src/gui_interface.py:1140 +msgid "Your passphrase is incorrect" +msgstr "Vaše heslo je neplatné" + +#: ../src/gui_interface.py:1144 +#, fuzzy +msgid "OpenGPG Passphrase Incorrect" +msgstr "Vaše heslo je neplatné" + +#: ../src/gui_interface.py:1170 +#, fuzzy +msgid "GPG key not trusted" +msgstr "GPG je nepoužitelné" + +#: ../src/gui_interface.py:1170 +#, fuzzy +msgid "" +"The GPG key used to encrypt this chat is not trusted. Do you really want to " +"encrypt this message?" +msgstr "" +"Tomuto kontaktu není přiřazen GPG klíč. Proto nemůžete šifrovat zprávy." + +#: ../src/gui_interface.py:1182 +#, fuzzy +msgid "" +"Gnome Keyring is installed but not \t\t\t\tcorrectly started (environment " +"variable probably not \t\t\t\tcorrectly set)" +msgstr "" +"Gnome Keyring je nainstalován ale není správně spuštěn (proměná prostředí " +"není asi správně nastavena)" + +#: ../src/gui_interface.py:1292 +#, python-format +msgid "New mail on %(gmail_mail_address)s" +msgstr "Nový E-mail pro %(gmail_mail_address)s" + +#: ../src/gui_interface.py:1294 +#, python-format +msgid "You have %d new mail conversation" +msgid_plural "You have %d new mail conversations" +msgstr[0] "Máte %d nepřečtený E-mail" +msgstr[1] "Máte %d nepřečtené E-maily" +msgstr[2] "Máte %d nepřečtených E-mailů" + +#: ../src/gui_interface.py:1307 +#, python-format +msgid "" +"\n" +"\n" +"From: %(from_address)s\n" +"Subject: %(subject)s\n" +"%(snippet)s" +msgstr "" +"\n" +"\n" +"Od: %(from_address)s\n" +"Předmět: %(subject)s\n" +"%(snippet)s" + +#: ../src/gui_interface.py:1379 +#, python-format +msgid "%s wants to send you a file." +msgstr "%s Vám chce poslat soubor." + +#: ../src/gui_interface.py:1417 ../src/roster_window.py:1814 +#, fuzzy +msgid "Remote contact stopped transfer" +msgstr "Odstraní kontakt ze Seznamu" + +#: ../src/gui_interface.py:1419 ../src/roster_window.py:1816 +#, fuzzy +msgid "Error opening file" +msgstr "Chyba při čtení souboru:" + +#: ../src/gui_interface.py:1450 +#, python-format +msgid "You successfully received %(filename)s from %(name)s." +msgstr "Soubor %(filename)s od %(name)s byl úspěsně přijat." + +#. ft stopped +#: ../src/gui_interface.py:1454 +#, python-format +msgid "File transfer of %(filename)s from %(name)s stopped." +msgstr "Přenos souboru %(filename)s od %(name)s byl zastaven." + +#: ../src/gui_interface.py:1467 +#, python-format +msgid "You successfully sent %(filename)s to %(name)s." +msgstr "Soubor %(filename)s byl uspěšně odeslán %(name)s." + +#. ft stopped +#: ../src/gui_interface.py:1471 +#, python-format +msgid "File transfer of %(filename)s to %(name)s stopped." +msgstr "Přenos souboru %(filename)s pro %(name)s byl zastaven." + +#: ../src/gui_interface.py:1576 +#, python-format +msgid "" +"Unable to decrypt message from %s\n" +"It may have been tampered with." +msgstr "" +"Nepodařilo se dešifrovat zprávu od %s\n" +"Možná je falešná." + +#: ../src/gui_interface.py:1583 +msgid "Unable to decrypt message" +msgstr "Nepodařilo se dešifrovat zprávu" + +#: ../src/gui_interface.py:1657 +msgid "Username Conflict" +msgstr "Konflikt uživatelských jmen" + +#: ../src/gui_interface.py:1658 +msgid "Please type a new username for your local account" +msgstr "Prosím zadejte nové uživatelské jméno pro lokální účet" + +#: ../src/gui_interface.py:1670 +msgid "Ping?" +msgstr "Ping?" + +#: ../src/gui_interface.py:1683 +#, python-format +msgid "Pong! (%s s.)" +msgstr "Pong! (%s s.)" + +#: ../src/gui_interface.py:1694 +msgid "Error." +msgstr "Chyba." + +#: ../src/gui_interface.py:1721 +msgid "Resource Conflict" +msgstr "Konflikt Zdrojů" + +#: ../src/gui_interface.py:1722 +msgid "" +"You are already connected to this account with the same resource. Please " +"type a new one" +msgstr "Už jsi připojen(a) k tomuto účtu se stejným zdrojem. Prosím zadej nový" + +#: ../src/gui_interface.py:1771 +#, fuzzy, python-format +msgid "%s wants to start a voice chat." +msgstr "%s Vám chce poslat soubor." + +#: ../src/gui_interface.py:1774 +#, fuzzy +msgid "Voice Chat Request" +msgstr "Žádost o přenos souboru" + +#: ../src/gui_interface.py:1879 +msgid "Error verifying SSL certificate" +msgstr "Chyba ověřování SSL certifikátu" + +#: ../src/gui_interface.py:1880 +#, python-format +msgid "" +"There was an error verifying the SSL certificate of your jabber server: %" +"(error)s\n" +"Do you still want to connect to this server?" +msgstr "" +"Chyba při ověřování SSL vertifikátu na vašem jabber serveru: %(error)s\n" +"Chcete se přesto připojit?" + +#: ../src/gui_interface.py:1885 +msgid "Ignore this error for this certificate." +msgstr "Ignorovat tuto chybu certifikátu." + +#: ../src/gui_interface.py:1905 +msgid "SSL certificate error" +msgstr "Chyba SSL certifikátu" + +#: ../src/gui_interface.py:1906 +#, python-format +msgid "" +"It seems the SSL certificate of account %(account)s has changed or your " +"connection is being hacked.\n" +"Old fingerprint: %(old)s\n" +"New fingerprint: %(new)s\n" +"\n" +"Do you still want to connect and update the fingerprint of the certificate?" +msgstr "" +"Vypadá to, že se SSL certifikát účtu %(account)s změnil nebo někdo hackuje " +"vaše spojení.\n" +"Starý otisk: %(old)s\n" +"Nový otisk: %(new)s\n" +"\n" +"Chcete se stále připojit a aktualizovat otisk certifikátu?" + +#: ../src/gui_interface.py:1936 ../src/gui_interface.py:1971 +msgid "Insecure connection" +msgstr "Nezabezpečené Spojení" + +#: ../src/gui_interface.py:1937 +msgid "" +"You are about to send your password on an unencrypted connection. Are you " +"sure you want to do that?" +msgstr "" +"Chystáte se poslat vaše heslo nezabezpečeným spojením. Jste si jistý(á), že " +"to skutečně chcete udělat?" + +#: ../src/gui_interface.py:1939 ../src/gui_interface.py:1974 +msgid "Yes, I really want to connect insecurely" +msgstr "Ano, chci se připojit nezabezpečeně" + +#: ../src/gui_interface.py:1972 +msgid "" +"You are about to send your password on an insecure connection. You should " +"install PyOpenSSL to prevent that. Are you sure you want to do that?" +msgstr "" +"Abyste nemuseli posílat heslo nezabezpečeným připojením nainstalujte si " +"PyOpenSSL. Jste si jisti, že to chcete udělat?" + +#: ../src/gui_interface.py:1992 +msgid "PEP node was not removed" +msgstr "PEP uzel nebyl smazán" + +#: ../src/gui_interface.py:1993 +#, python-format +msgid "PEP node %(node)s was not removed: %(message)s" +msgstr "PEP uzel %(node)s se nepodařilo odstranit: %(message)s" + +#. theme doesn't exist, disable emoticons +#: ../src/gui_interface.py:2547 ../src/gui_interface.py:2569 +msgid "Emoticons disabled" +msgstr "Smajlíci byly vypnuty" + +#: ../src/gui_interface.py:2548 +msgid "" +"Your configured emoticons theme has not been found, so emoticons have been " +"disabled." +msgstr "" +"Vámi nastavené téma pro smajlíky nebylo nalezeno, proto budou smajlíci " +"vypnuty " + +#: ../src/gui_interface.py:2570 +msgid "" +"Your configured emoticons theme cannot been loaded. You maybe need to update " +"the format of emoticons.py file. See http://trac.gajim.org/wiki/Emoticons " +"for more details." +msgstr "" +"Vámi nastavené téma smajlíků se nepodařilo načíst. Možná je potřeba " +"aktualizovat formát v souboru emoticons.py. Viz.: http://trac.gajim.org/wiki/" +"Emoticons " + +#: ../src/gui_interface.py:2598 ../src/roster_window.py:3441 +msgid "You cannot join a group chat while you are invisible" +msgstr "Nemůžete vstoupit do diskuze, pokud jste neviditelný(á)" + +# FIXME: jaky je rozdil mezi settings a preferences? - kdo vi :) +#. it is good to notify the user +#. in case he or she cannot see the output of the console +#: ../src/gui_interface.py:2969 +msgid "Could not save your settings and preferences" +msgstr "Nelze uložit Vaše nastavení" + +#: ../src/gui_interface.py:3462 +msgid "Passphrase Required" +msgstr "Heslo Vyžadováno" + +#: ../src/gui_interface.py:3463 +#, python-format +msgid "Enter GPG key passphrase for key %(keyid)s (account %(account)s)." +msgstr "Zadej heslo GPG klíče pro účet %(keyid)s (účet %(account)s)." + +#: ../src/gui_interface.py:3477 +#, fuzzy +msgid "GPG key expired" +msgstr "Nepřiřazen GPG klíč" + +#: ../src/gui_interface.py:3478 +#, fuzzy, python-format +msgid "Your GPG key has expired, you will be connected to %s without OpenPGP." +msgstr "Budete připojen(a) k %s bez OpenPGP." + +#. ask again +#: ../src/gui_interface.py:3487 +msgid "Wrong Passphrase" +msgstr "Nesprávné heslo" + +#: ../src/gui_interface.py:3488 +msgid "Please retype your GPG passphrase or press Cancel." +msgstr "Prosím zopakujte Vaše heslo pro GPG klíč, nebo stiskněte Zrušit." + +#: ../src/gui_menu_builder.py:93 msgid "_New Group Chat" msgstr "_Nová diskuze" -#: ../src/gui_menu_builder.py:400 +#: ../src/gui_menu_builder.py:413 msgid "I would like to add you to my roster" msgstr "Rád bych si Vás přidal(a) do svého seznamu" @@ -8993,7 +9035,7 @@ msgstr "Kontakty" #. holds time #: ../src/history_manager.py:174 ../src/history_manager.py:214 -#: ../src/history_window.py:95 +#: ../src/history_window.py:97 msgid "Date" msgstr "Datum" @@ -9004,7 +9046,7 @@ msgstr "Přezdívka" #. holds message #: ../src/history_manager.py:188 ../src/history_manager.py:220 -#: ../src/history_window.py:103 +#: ../src/history_window.py:105 msgid "Message" msgstr "Zpráva" @@ -9028,239 +9070,244 @@ msgstr "" "\n" "V případě kliknutí na ANO prosím vyčkejte..." -#: ../src/history_manager.py:458 +#: ../src/history_manager.py:467 msgid "Exporting History Logs..." msgstr "Exportuji záznamy historie..." -#: ../src/history_manager.py:533 +#: ../src/history_manager.py:542 #, python-format msgid "%(who)s on %(time)s said: %(message)s\n" msgstr "%(who)s v %(time)s řekl(a): %(message)s\n" -#: ../src/history_manager.py:570 +#: ../src/history_manager.py:579 msgid "Do you really want to delete logs of the selected contact?" msgid_plural "Do you really want to delete logs of the selected contacts?" msgstr[0] "Vážně chcete smazat všechny záznamy historie vybraného kontaktu?" msgstr[1] "Vážně chcete smazat všechny záznamy historie vybraných kontaktů?" msgstr[2] "" -#: ../src/history_manager.py:574 ../src/history_manager.py:609 +#: ../src/history_manager.py:583 ../src/history_manager.py:618 msgid "This is an irreversible operation." msgstr "Tato operace je nevratná." -#: ../src/history_manager.py:606 +#: ../src/history_manager.py:615 msgid "Do you really want to delete the selected message?" msgid_plural "Do you really want to delete the selected messages?" msgstr[0] "Vážně chcete smazat vybranou zprávu?" msgstr[1] "Vážně chcete smazat vybrané zprávy?" msgstr[2] "" -#: ../src/history_window.py:298 +#: ../src/history_window.py:305 #, python-format msgid "Conversation History with %s" msgstr "Historie rozhovorů s %s" -#: ../src/history_window.py:343 +#: ../src/history_window.py:350 msgid "Disk Error" msgstr "Chyba disku" -#: ../src/history_window.py:427 +#: ../src/history_window.py:438 #, python-format msgid "%(nick)s is now %(status)s: %(status_msg)s" msgstr "%(nick)s je nyní %(status)s: %(status_msg)s" -#: ../src/history_window.py:438 +#: ../src/history_window.py:449 #, fuzzy, python-format msgid "Error: %s" msgstr "Chybová zpráva: %s" -#: ../src/history_window.py:440 +#: ../src/history_window.py:451 #, fuzzy msgid "Error" msgstr "Chyba." -#: ../src/history_window.py:442 +#: ../src/history_window.py:453 #, python-format msgid "Status is now: %(status)s: %(status_msg)s" msgstr "Stav je nyní %(status)s: %(status_msg)s" -#: ../src/history_window.py:445 +#: ../src/history_window.py:456 #, python-format msgid "Status is now: %(status)s" msgstr "Stav je nyní %(status)s" -#: ../src/htmltextview.py:512 ../src/htmltextview.py:522 +#: ../src/htmltextview.py:513 ../src/htmltextview.py:523 msgid "Timeout loading image" msgstr "Nezdařilo se načtení obrázku" -#: ../src/htmltextview.py:532 +#: ../src/htmltextview.py:533 msgid "Image is too big" msgstr "Obrázek je příliš veliký" -#: ../src/message_window.py:220 +#: ../src/message_window.py:225 #, fuzzy msgid "You are going to close several tabs" msgstr "Nejste připojen(a) k serveru" -#: ../src/message_window.py:221 +#: ../src/message_window.py:226 #, fuzzy msgid "Do you really want to close them all?" msgstr "Vážně chcete smazat vybranou zprávu?" -#: ../src/message_window.py:481 +#: ../src/message_window.py:490 msgid "Chats" msgstr "Rozhovory" -#: ../src/message_window.py:483 +#: ../src/message_window.py:492 msgid "Group Chats" msgstr "Diskuze" -#: ../src/message_window.py:485 +#: ../src/message_window.py:494 msgid "Private Chats" msgstr "Soukromé rozhovory" -#: ../src/message_window.py:491 +#: ../src/message_window.py:500 msgid "Messages" msgstr "Zprávy" -#: ../src/negotiation.py:32 +#: ../src/negotiation.py:34 msgid "- messages will be logged" msgstr "- zprávy budou zaznamenány" -#: ../src/negotiation.py:34 +#: ../src/negotiation.py:36 msgid "- messages will not be logged" msgstr "- zprvý nebudou zaznamenány" -#: ../src/notify.py:242 +#: ../src/notify.py:248 #, python-format msgid "%(nick)s Changed Status" msgstr "%(nick)s Změnil(a) stav" -#: ../src/notify.py:252 +#: ../src/notify.py:258 #, python-format msgid "%(nickname)s Signed In" msgstr "%(nickname)s se přihlásil" -#: ../src/notify.py:260 +#: ../src/notify.py:266 #, python-format msgid "%(nickname)s Signed Out" msgstr "%(nickname)s se odhlásil" -#: ../src/notify.py:272 +#: ../src/notify.py:278 #, python-format msgid "New Single Message from %(nickname)s" msgstr "Nová jednoduché zpráva od %(nickname)s" -#: ../src/notify.py:280 +#: ../src/notify.py:286 #, python-format msgid "New Private Message from group chat %s" msgstr "Nová soukromá zpráva z místnosti %s" -#: ../src/notify.py:282 +#: ../src/notify.py:288 #, python-format msgid "%(nickname)s: %(message)s" msgstr "%(nickname)s: %(message)s" -#: ../src/notify.py:285 +#: ../src/notify.py:291 #, python-format msgid "Messaged by %(nickname)s" msgstr "Nová zpráva od %(nickname)s" -#: ../src/notify.py:291 +#: ../src/notify.py:297 #, python-format msgid "New Message from %(nickname)s" msgstr "Nová zpráva od %(nickname)s" -#: ../src/notify.py:555 +#: ../src/notify.py:568 msgid "Ignore" msgstr "Ignorovat" -#: ../src/profile_window.py:55 +#: ../src/profile_window.py:57 msgid "Retrieving profile..." msgstr "Stahuji profil..." -#: ../src/profile_window.py:108 ../src/roster_window.py:2852 +#: ../src/profile_window.py:110 ../src/roster_window.py:2845 msgid "File is empty" msgstr "Soubor je prázdný" -#: ../src/profile_window.py:111 ../src/roster_window.py:2855 +#: ../src/profile_window.py:113 ../src/roster_window.py:2848 msgid "File does not exist" msgstr "Soubor neexistuje" #. keep identation #. unknown format -#: ../src/profile_window.py:125 ../src/profile_window.py:141 -#: ../src/roster_window.py:2857 ../src/roster_window.py:2868 +#: ../src/profile_window.py:127 ../src/profile_window.py:143 +#: ../src/roster_window.py:2850 ../src/roster_window.py:2861 msgid "Could not load image" msgstr "Nezdařilo se načtení obrázku" -#: ../src/profile_window.py:251 +#: ../src/profile_window.py:255 msgid "Information received" msgstr "Informace přijata" -#: ../src/profile_window.py:318 +#: ../src/profile_window.py:326 msgid "Without a connection you can not publish your contact information." msgstr "Bez opětovného připojení nemůžete zveřejnit Vaše osobní údaje." -#: ../src/profile_window.py:332 +#: ../src/profile_window.py:339 msgid "Sending profile..." msgstr "Odesílám profil..." -#: ../src/profile_window.py:347 +#: ../src/profile_window.py:354 msgid "Information NOT published" msgstr "Informace NEBYLY zveřejněny" -#: ../src/profile_window.py:354 +#: ../src/profile_window.py:361 msgid "vCard publication failed" msgstr "publikování vizitky se nezdařilo" -#: ../src/profile_window.py:355 +#: ../src/profile_window.py:362 msgid "" "There was an error while publishing your personal information, try again " "later." msgstr "" "Nastala chyba při publikování Vašich osobních údajů, zkuste to později znovu." -#: ../src/roster_window.py:280 ../src/roster_window.py:1017 +#: ../src/roster_window.py:280 ../src/roster_window.py:1019 msgid "Merged accounts" msgstr "Spojené účty" -#: ../src/roster_window.py:1906 +#: ../src/roster_window.py:1871 msgid "Authorization has been sent" msgstr "Autorizace byla odeslána" -#: ../src/roster_window.py:1907 +#: ../src/roster_window.py:1872 #, python-format msgid "Now \"%s\" will know your status." msgstr "Nyní bude \"%s\" znát váš stav." -#: ../src/roster_window.py:1927 +#: ../src/roster_window.py:1894 msgid "Subscription request has been sent" msgstr "Žádost o autorizaci byla odeslána" -#: ../src/roster_window.py:1928 +#: ../src/roster_window.py:1895 #, python-format msgid "If \"%s\" accepts this request you will know his or her status." msgstr "Pokud \"%s\" povolí Vaši žádost o autorizaci, budete vidět jeho stav." -#: ../src/roster_window.py:1940 +#: ../src/roster_window.py:1909 msgid "Authorization has been removed" msgstr "Autorizace byla zrušena" -#: ../src/roster_window.py:1941 +#: ../src/roster_window.py:1910 #, python-format msgid "Now \"%s\" will always see you as offline." msgstr "Nyní Vás \"%s\" uvidí vždy jako odpojeného." -#: ../src/roster_window.py:1969 +#: ../src/roster_window.py:1938 msgid "GPG is not usable" msgstr "GPG je nepoužitelné" -#: ../src/roster_window.py:2174 ../src/roster_window.py:3383 +#: ../src/roster_window.py:1939 +#, python-format +msgid "You will be connected to %s without OpenPGP." +msgstr "Budete připojen(a) k %s bez OpenPGP." + +#: ../src/roster_window.py:2148 ../src/roster_window.py:3394 msgid "You are participating in one or more group chats" msgstr "Účinkujete v jedné nebo více diskuzích" -#: ../src/roster_window.py:2175 ../src/roster_window.py:3384 +#: ../src/roster_window.py:2149 ../src/roster_window.py:3395 msgid "" "Changing your status to invisible will result in disconnection from those " "group chats. Are you sure you want to go invisible?" @@ -9269,28 +9316,28 @@ msgstr "" "si jistý(á), že se chcete stát neviditelným(ou)?" # FIXME: mozna nejak lepe? :/ -#: ../src/roster_window.py:2201 +#: ../src/roster_window.py:2175 msgid "desync'ed" msgstr "nesynchronizováno" -#: ../src/roster_window.py:2257 +#: ../src/roster_window.py:2236 msgid "Really quit Gajim?" msgstr "" -#: ../src/roster_window.py:2258 +#: ../src/roster_window.py:2237 #, fuzzy msgid "Are you sure you want to quit Gajim?" msgstr "Jste si jistý(á), že chcete opustit místnost \"%s\"?" -#: ../src/roster_window.py:2259 +#: ../src/roster_window.py:2238 msgid "Always close Gajim" msgstr "" -#: ../src/roster_window.py:2350 ../src/roster_window.py:2587 +#: ../src/roster_window.py:2333 ../src/roster_window.py:2576 msgid "You have unread messages" msgstr "Máte nepřečtené zprávy" -#: ../src/roster_window.py:2351 +#: ../src/roster_window.py:2334 msgid "" "Messages will only be available for reading them later if you have history " "enabled and contact is in your roster." @@ -9298,16 +9345,16 @@ msgstr "" "Zprávy bude možné číst později, pokud máte povolený záznam historie a " "kontakt je v rosteru." -#: ../src/roster_window.py:2588 +#: ../src/roster_window.py:2577 msgid "You must read them before removing this transport." msgstr "Musíš si je přečíst před smazáním transportu." -#: ../src/roster_window.py:2591 +#: ../src/roster_window.py:2580 #, python-format msgid "Transport \"%s\" will be removed" msgstr "Transport \"%s\" bude smazán" -#: ../src/roster_window.py:2592 +#: ../src/roster_window.py:2581 msgid "" "You will no longer be able to send and receive messages from contacts using " "this transport." @@ -9315,11 +9362,11 @@ msgstr "" "Už více nebudete moci posílat i přijímat zprávy od kontaktů z tohoto " "transportu." -#: ../src/roster_window.py:2595 +#: ../src/roster_window.py:2584 msgid "Transports will be removed" msgstr "Transport bude smazán" -#: ../src/roster_window.py:2600 +#: ../src/roster_window.py:2589 #, fuzzy, python-format msgid "" "You will no longer be able to send and receive messages to contacts from " @@ -9328,68 +9375,68 @@ msgstr "" "Už více nebudete moci posílat ani přijímat zprávy od kontaktů z těchto " "transportů:%s" -#: ../src/roster_window.py:2662 +#: ../src/roster_window.py:2653 #, fuzzy msgid "You are about to block a contact. Are you sure you want to continue?" msgstr "Chystáte se vytvořit metacontact. Určitě chcete pokračovat?" -#: ../src/roster_window.py:2664 +#: ../src/roster_window.py:2655 msgid "" "This contact will see you offline and you will not receive messages he will " "send you." msgstr "" #. it's jid -#: ../src/roster_window.py:2748 +#: ../src/roster_window.py:2741 msgid "Rename Contact" msgstr "Přejmenovat kontakt" -#: ../src/roster_window.py:2749 +#: ../src/roster_window.py:2742 #, python-format msgid "Enter a new nickname for contact %s" msgstr "Zadej novou přezdívku pro kontakt %s." -#: ../src/roster_window.py:2756 +#: ../src/roster_window.py:2749 msgid "Rename Group" msgstr "Přejmenovat skupinu" -#: ../src/roster_window.py:2757 +#: ../src/roster_window.py:2750 #, python-format msgid "Enter a new name for group %s" msgstr "Zadej nové jméno pro skupinu %s." -#: ../src/roster_window.py:2798 +#: ../src/roster_window.py:2791 msgid "Remove Group" msgstr "Odstranit skupinu" -#: ../src/roster_window.py:2799 +#: ../src/roster_window.py:2792 #, python-format msgid "Do you want to remove group %s from the roster?" msgstr "Chceš smazat skupinu %s z rosteru?" -#: ../src/roster_window.py:2800 +#: ../src/roster_window.py:2793 msgid "Also remove all contacts in this group from your roster" msgstr "Odstranit také všechny kontakty v této skupině z Vašeho rosteru" -#: ../src/roster_window.py:2839 +#: ../src/roster_window.py:2832 msgid "Assign OpenPGP Key" msgstr "Přiřadit OpenPGP klíč" -#: ../src/roster_window.py:2840 +#: ../src/roster_window.py:2833 msgid "Select a key to apply to the contact" msgstr "Vybrat klíč k použítí s kontaktem" -#: ../src/roster_window.py:3203 +#: ../src/roster_window.py:3210 #, python-format msgid "Contact \"%s\" will be removed from your roster" msgstr "Kontakt \"%s\" bude smazán z Vašeho rosteru" -#: ../src/roster_window.py:3205 +#: ../src/roster_window.py:3212 #, python-format msgid "You are about to remove \"%(name)s\" (%(jid)s) from your roster.\n" msgstr "Chystáte se smazat \"%(name)s\" (%(jid)s) z vašeho rosteru.\n" -#: ../src/roster_window.py:3210 +#: ../src/roster_window.py:3217 msgid "" "By removing this contact you also remove authorization resulting in him or " "her always seeing you as offline." @@ -9398,11 +9445,11 @@ msgstr "" "odpojeného." #. Contact is not in roster -#: ../src/roster_window.py:3216 +#: ../src/roster_window.py:3223 msgid "Do you want to continue?" msgstr "Chcete pokračovat?" -#: ../src/roster_window.py:3219 +#: ../src/roster_window.py:3226 msgid "" "By removing this contact you also by default remove authorization resulting " "in him or her always seeing you as offline." @@ -9410,16 +9457,16 @@ msgstr "" "Smazáním kontaktu také zrušíte autorizaci. Kontakt Vás tak vždy uvidí jako " "odpojeného." -#: ../src/roster_window.py:3222 +#: ../src/roster_window.py:3229 msgid "I want this contact to know my status after removal" msgstr "Chci aby tento kontakt věděl o mém stavu i po odstranění" #. several contact to remove at the same time -#: ../src/roster_window.py:3226 +#: ../src/roster_window.py:3233 msgid "Contacts will be removed from your roster" msgstr "Kontakty budou smazány z Vašeho rosteru" -#: ../src/roster_window.py:3231 +#: ../src/roster_window.py:3238 #, python-format msgid "" "By removing these contacts:%s\n" @@ -9428,33 +9475,33 @@ msgstr "" "Smazáním těchto kontaktů:%s\n" "také zrušíte autorizaci. Kontakty Vás tak vždy uvidí jako odpojeného." -#: ../src/roster_window.py:3286 +#: ../src/roster_window.py:3295 #, fuzzy msgid "" "You are about to send a custom status. Are you sure you want to continue?" msgstr "Chystáte se vytvořit metacontact. Určitě chcete pokračovat?" -#: ../src/roster_window.py:3288 +#: ../src/roster_window.py:3297 #, python-format msgid "" "This contact will temporarily see you as %(status)s, but only until you " "change your status. Then he will see your global status." msgstr "" -#: ../src/roster_window.py:3305 +#: ../src/roster_window.py:3316 msgid "No account available" msgstr "Žádný účet není dostupný" -#: ../src/roster_window.py:3306 +#: ../src/roster_window.py:3317 msgid "You must create an account before you can chat with other contacts." msgstr "" "Musíte vytvořit účet před tím, než budete moci hovořit s jinými uživateli." -#: ../src/roster_window.py:3877 +#: ../src/roster_window.py:3897 msgid "Metacontacts storage not supported by your server" msgstr "Uložení metakontaktů není podporováno serverem" -#: ../src/roster_window.py:3879 +#: ../src/roster_window.py:3899 msgid "" "Your server does not support storing metacontacts information. So those " "information will not be saved on next reconnection." @@ -9462,12 +9509,12 @@ msgstr "" "Tvůj server nepodporuje ukládání metakontaktů. Tyto informace nebudou při " "přístím připojení uloženy." -#: ../src/roster_window.py:3964 +#: ../src/roster_window.py:3984 msgid "" "You are about to create a metacontact. Are you sure you want to continue?" msgstr "Chystáte se vytvořit metacontact. Určitě chcete pokračovat?" -#: ../src/roster_window.py:3966 +#: ../src/roster_window.py:3986 msgid "" "Metacontacts are a way to regroup several contacts in one line. Generally it " "is used when the same person has several Jabber accounts or transport " @@ -9477,11 +9524,11 @@ msgstr "" "jsou užitečné, když jeden člověk má víc účtů v síti Jabber nebo účty v " "transportech." -#: ../src/roster_window.py:4081 +#: ../src/roster_window.py:4101 msgid "Invalid file URI:" msgstr "Neplatná cesta k souboru:" -#: ../src/roster_window.py:4092 +#: ../src/roster_window.py:4112 #, fuzzy, python-format msgid "Do you want to send this file to %s:" msgid_plural "Do you want to send these files to %s:" @@ -9489,12 +9536,12 @@ msgstr[0] "Chcete poslat %s tento soubor:" msgstr[1] "Chcete poslat %s tyto soubory:" msgstr[2] "Chcete poslat %s tyto soubory:" -#: ../src/roster_window.py:4207 +#: ../src/roster_window.py:4227 #, fuzzy, python-format msgid "Send %s to %s" msgstr "Odeslat %s" -#: ../src/roster_window.py:4213 +#: ../src/roster_window.py:4233 #, fuzzy, python-format msgid "Make %s and %s metacontacts" msgstr "Pošle soubor kontaktu" @@ -9504,159 +9551,159 @@ msgstr "Pošle soubor kontaktu" #. for chat_with #. for single message #. join gc -#: ../src/roster_window.py:4794 ../src/roster_window.py:4865 -#: ../src/roster_window.py:4874 ../src/systray.py:216 ../src/systray.py:263 -#: ../src/systray.py:269 +#: ../src/roster_window.py:4718 ../src/roster_window.py:4789 +#: ../src/roster_window.py:4798 ../src/statusicon.py:248 +#: ../src/statusicon.py:295 ../src/statusicon.py:301 #, python-format msgid "using account %s" msgstr "pomocí účtu %s" #. add -#: ../src/roster_window.py:4881 +#: ../src/roster_window.py:4805 #, python-format msgid "to %s account" msgstr "do účtu %s" #. disco -#: ../src/roster_window.py:4886 +#: ../src/roster_window.py:4810 #, python-format msgid "using %s account" msgstr "pomocí účtu %s" -#: ../src/roster_window.py:4923 ../src/systray.py:279 +#: ../src/roster_window.py:4847 ../src/statusicon.py:311 msgid "_Manage Bookmarks..." msgstr "Spravovat _záložky..." #. profile, avatar -#: ../src/roster_window.py:4943 +#: ../src/roster_window.py:4867 #, python-format msgid "of account %s" msgstr "účtu %s" -#: ../src/roster_window.py:4983 +#: ../src/roster_window.py:4907 #, python-format msgid "for account %s" msgstr "pro účet %s" -#: ../src/roster_window.py:5039 ../src/roster_window.py:5140 +#: ../src/roster_window.py:4963 ../src/roster_window.py:5064 msgid "_Change Status Message" msgstr "Z_měnit popis stavu" -#: ../src/roster_window.py:5066 +#: ../src/roster_window.py:4990 msgid "Publish Tune" msgstr "_Zveřejnit hudbu" -#: ../src/roster_window.py:5074 +#: ../src/roster_window.py:4998 msgid "Configure Services..." msgstr "_Nastavit služby..." -#: ../src/roster_window.py:5228 +#: ../src/roster_window.py:5145 msgid "_Maximize All" msgstr "_Maximalizovat Vše" #. Send Group Message -#: ../src/roster_window.py:5236 ../src/roster_window.py:5404 +#: ../src/roster_window.py:5153 ../src/roster_window.py:5325 msgid "Send Group M_essage" msgstr "Ode_slat skupinovou zprávu" -#: ../src/roster_window.py:5244 +#: ../src/roster_window.py:5161 msgid "To all users" msgstr "Všem uživatelům" -#: ../src/roster_window.py:5248 +#: ../src/roster_window.py:5165 msgid "To all online users" msgstr "Všem dostupným uživatelům" #. Manage Transport submenu -#: ../src/roster_window.py:5424 +#: ../src/roster_window.py:5345 msgid "_Manage Contacts" msgstr "_Spravovat kontakty" #. Edit Groups -#: ../src/roster_window.py:5432 +#: ../src/roster_window.py:5353 msgid "Edit _Groups" msgstr "Upravit _skupiny" #. Send single message -#: ../src/roster_window.py:5485 +#: ../src/roster_window.py:5408 msgid "Send Single Message" msgstr "Ode_slat jednoduchou zprávu" #. Execute Command -#: ../src/roster_window.py:5531 +#: ../src/roster_window.py:5454 msgid "Execute Command..." msgstr "Provést příkaz..." #. Manage Transport submenu -#: ../src/roster_window.py:5541 +#: ../src/roster_window.py:5464 msgid "_Manage Transport" msgstr "Transporty" #. Modify Transport -#: ../src/roster_window.py:5549 +#: ../src/roster_window.py:5472 msgid "_Modify Transport" msgstr "_Upravit transport" #. Rename -#: ../src/roster_window.py:5558 +#: ../src/roster_window.py:5481 msgid "_Rename" msgstr "_Přejmenovat" -#: ../src/roster_window.py:5623 +#: ../src/roster_window.py:5546 msgid "_Maximize" msgstr "_Maximalizovat" -#: ../src/roster_window.py:5631 +#: ../src/roster_window.py:5554 #, fuzzy msgid "_Reconnect" msgstr "_Odpojit" -#: ../src/roster_window.py:5637 +#: ../src/roster_window.py:5560 msgid "_Disconnect" msgstr "_Odpojit" #. History manager -#: ../src/roster_window.py:5716 +#: ../src/roster_window.py:5642 msgid "History Manager" msgstr "Správce historie" -#: ../src/roster_window.py:5725 +#: ../src/roster_window.py:5653 msgid "_Join New Group Chat" msgstr "_Připojit se do diskuze" # FIXME: nejak divne, asi spatne prelozene -ne myslim ze to je ok -#: ../src/roster_window.py:5881 +#: ../src/roster_window.py:5809 msgid "Change Status Message..." msgstr "Změnit popis stavu..." # FIXME: hmm kdovi co to je.. -#: ../src/search_window.py:93 +#: ../src/search_window.py:94 msgid "Waiting for results" msgstr "Čekání na výsledky" -#: ../src/search_window.py:133 ../src/search_window.py:211 +#: ../src/search_window.py:132 ../src/search_window.py:210 msgid "Error in received dataform" msgstr "Chyba v příchozím datagramu" #. No result -#: ../src/search_window.py:167 ../src/search_window.py:203 +#: ../src/search_window.py:166 ../src/search_window.py:202 msgid "No result" msgstr "Žádný výsledek" -#: ../src/session.py:128 +#: ../src/session.py:132 msgid "Disk WriteError" msgstr "Chyba zápisu na disk" -#: ../src/session.py:249 +#: ../src/session.py:254 #, python-format msgid "Subject: %s" msgstr "Předmět: %s" -#: ../src/session.py:422 ../src/session.py:457 +#: ../src/session.py:429 ../src/session.py:464 msgid "Confirm these session options" msgstr "Potvrdit volby pro toto sezení" -#: ../src/session.py:424 +#: ../src/session.py:431 #, fuzzy, python-format msgid "" "The remote client wants to negotiate an session with these features:\n" @@ -9671,7 +9718,7 @@ msgstr "" "\n" "\t\tJsou tyto volby přijatelné?" -#: ../src/session.py:458 +#: ../src/session.py:465 #, python-format msgid "" "The remote client selected these options:\n" @@ -9686,116 +9733,116 @@ msgstr "" "\n" "Pokračovat v komunikaci?" -#: ../src/systray.py:177 +#: ../src/statusicon.py:209 msgid "_Change Status Message..." msgstr "_Změnit popis stavu..." -#: ../src/systray.py:293 +#: ../src/statusicon.py:325 msgid "Hide this menu" msgstr "Skryje toto menu" -#: ../src/tooltips.py:326 ../src/tooltips.py:520 +#: ../src/tooltips.py:347 ../src/tooltips.py:544 msgid "Jabber ID: " msgstr "Jabber ID:" -#: ../src/tooltips.py:329 ../src/tooltips.py:524 +#: ../src/tooltips.py:350 ../src/tooltips.py:548 msgid "Resource: " msgstr "Zdroj: " -#: ../src/tooltips.py:334 +#: ../src/tooltips.py:355 #, python-format msgid "%(owner_or_admin_or_member)s of this group chat" msgstr "%(owner_or_admin_or_member)s této diskuze" -#: ../src/tooltips.py:431 +#: ../src/tooltips.py:455 msgid " [blocked]" msgstr "[blokováno]" -#: ../src/tooltips.py:435 +#: ../src/tooltips.py:459 msgid " [minimized]" msgstr "[minimalizováno]" -#: ../src/tooltips.py:450 ../src/tooltips.py:705 +#: ../src/tooltips.py:474 ../src/tooltips.py:686 msgid "Status: " msgstr "Stav: " -#: ../src/tooltips.py:480 +#: ../src/tooltips.py:504 #, python-format msgid "Last status: %s" msgstr "Poslední stav: %s" -#: ../src/tooltips.py:482 +#: ../src/tooltips.py:506 #, python-format msgid " since %s" msgstr " od %s" -#: ../src/tooltips.py:500 +#: ../src/tooltips.py:524 msgid "Connected" msgstr "Spojeno" -#: ../src/tooltips.py:502 +#: ../src/tooltips.py:526 msgid "Disconnected" msgstr "Odpojenol" #. ('both' is the normal sub so we don't show it) -#: ../src/tooltips.py:531 +#: ../src/tooltips.py:555 msgid "Subscription: " msgstr "Autorizace: " -#: ../src/tooltips.py:541 +#: ../src/tooltips.py:565 msgid "OpenPGP: " msgstr "OpenPGP: " -#: ../src/tooltips.py:637 +#: ../src/tooltips.py:618 msgid "Tune:" msgstr "Hudba:" -#: ../src/tooltips.py:663 +#: ../src/tooltips.py:644 msgid "Download" msgstr "Stáhnout" -#: ../src/tooltips.py:669 +#: ../src/tooltips.py:650 msgid "Upload" msgstr "Nahrát" -#: ../src/tooltips.py:676 +#: ../src/tooltips.py:657 msgid "Type: " msgstr "Typ: " -#: ../src/tooltips.py:680 +#: ../src/tooltips.py:661 msgid "Transferred: " msgstr "Přeneseno: " -#: ../src/tooltips.py:683 ../src/tooltips.py:704 +#: ../src/tooltips.py:664 ../src/tooltips.py:685 msgid "Not started" msgstr "Nespuštěno" -#: ../src/tooltips.py:687 +#: ../src/tooltips.py:668 msgid "Stopped" msgstr "Zastaveno" -#: ../src/tooltips.py:689 ../src/tooltips.py:692 +#: ../src/tooltips.py:670 ../src/tooltips.py:673 msgid "Completed" msgstr "Dokončeno" -#: ../src/tooltips.py:696 +#: ../src/tooltips.py:677 msgid "?transfer status:Paused" msgstr "?transfer status:Pozastaveno" #. stalled is not paused. it is like 'frozen' it stopped alone -#: ../src/tooltips.py:700 +#: ../src/tooltips.py:681 msgid "Stalled" msgstr "Stagnuje" -#: ../src/tooltips.py:702 +#: ../src/tooltips.py:683 msgid "Transferring" msgstr "Přenáším" -#: ../src/tooltips.py:738 +#: ../src/tooltips.py:721 msgid "This service has not yet responded with detailed information" msgstr "Tato služba dosud neodpověděla s detaily" -#: ../src/tooltips.py:741 +#: ../src/tooltips.py:724 msgid "" "This service could not respond with detailed information.\n" "It is most likely legacy or broken" @@ -9803,62 +9850,116 @@ msgstr "" "Tato služba nemůže odpovědět s více podrobnostmi.\n" "Pravděpodobně je stará nebo rozbitá" -#: ../src/vcard.py:245 +#: ../src/vcard.py:252 msgid "?Client:Unknown" msgstr "?Client:Neznámý" -#: ../src/vcard.py:247 +#: ../src/vcard.py:254 msgid "?OS:Unknown" msgstr "?OS:Neznámý" -#: ../src/vcard.py:268 +#: ../src/vcard.py:275 msgid "?Time:Unknown" msgstr "?Time:Neznámý" -#: ../src/vcard.py:292 ../src/vcard.py:302 ../src/vcard.py:511 +#: ../src/vcard.py:299 ../src/vcard.py:309 ../src/vcard.py:518 #, python-format msgid "since %s" msgstr "od %s" -#: ../src/vcard.py:331 +#: ../src/vcard.py:336 msgid "Affiliation:" msgstr "Vztah" -#: ../src/vcard.py:339 +#: ../src/vcard.py:344 msgid "" "This contact is interested in your presence information, but you are not " "interested in his/her presence" msgstr "Tento kontakt zajímá Váš stav, ale Vy se nezajímate o jeho stav" -#: ../src/vcard.py:341 +#: ../src/vcard.py:346 msgid "" "You are interested in the contact's presence information, but he/she is not " "interested in yours" msgstr "Vy se zajímáte o stav kontaktu, ale on se nezajímá o Váš stav" -#: ../src/vcard.py:343 +#: ../src/vcard.py:348 msgid "You and the contact are interested in each other's presence information" msgstr "Vy i kontakt se zajímáte o stav toho druhého" #. None -#: ../src/vcard.py:345 +#: ../src/vcard.py:350 msgid "" "You are not interested in the contact's presence, and neither he/she is " "interested in yours" msgstr "Vy ani kontakt se nezajímáte o stav toho druhého" -#: ../src/vcard.py:352 +#: ../src/vcard.py:357 msgid "You are waiting contact's answer about your subscription request" msgstr "Čekáte na odpověď kontaktu na vaši žádost o autorizaci" -#: ../src/vcard.py:354 +#: ../src/vcard.py:359 msgid "There is no pending subscription request." msgstr "Není zde žádný nevyřízený požadavek." -#: ../src/vcard.py:359 ../src/vcard.py:413 ../src/vcard.py:536 +#: ../src/vcard.py:364 ../src/vcard.py:418 ../src/vcard.py:541 msgid " resource with priority " msgstr "zdroj s prioritou " +#~ msgid "_Incoming message:" +#~ msgstr "_Příchozí zpráva:" + +#~ msgid "_Outgoing message:" +#~ msgstr "_Odchozí zpráva:" + +#, fuzzy +#~ msgid "gtk-ok" +#~ msgstr "gtk-close" + +#~ msgid "" +#~ "The host %s you configured as the ft_add_hosts_to_send advanced option is " +#~ "not valid, so ignored." +#~ msgstr "" +#~ "Host %s nastevený jako ft_add_hosts_to_send má rozšířenou volbu chybnou, " +#~ "bude ignorována." + +#~ msgid "OpenPGP passphrase was not given" +#~ msgstr "OpenPGP heslo nebylo zadáno" + +#~ msgid "" +#~ "To continue sending and receiving messages, you will need to reconnect." +#~ msgstr "" +#~ "Pro pokračování v přijímání a odesílání zpráv se musíte znovu připojit." + +#~ msgid "" +#~ "You are not connected or not visible to others. Your message could not be " +#~ "sent." +#~ msgstr "" +#~ "Nejsi připojen nebo viditelný pro ostatní. Tvoje zpráva nemůže být " +#~ "odeslána." + +#~ msgid "[This message is encrypted]" +#~ msgstr "[Tato zpráva je zašifrovaná]" + +#~ msgid "%i days ago" +#~ msgstr "před %i dny" + +#~ msgid "Trayicon" +#~ msgstr "Tray ikona" + +#~ msgid "A icon in systemtray reflecting the current presence." +#~ msgstr "Ikona v systémové liště zobrazující aktuální stav." + +#~ msgid "" +#~ "Requires python-gnome2-extras or compiled trayicon module from Gajim " +#~ "sources." +#~ msgstr "" +#~ "Je potřeba python-gnome2-extras nebo zkompilovaný trayicon modul ze " +#~ "zdrojáků Gajima." + +#~ msgid "Requires PyGTK >= 2.10." +#~ msgstr "Je potřeba PyGTK verze 2.10. nebo vyšší." + #~ msgid "Add Special _Notification" #~ msgstr "Přidat zvláštní _upozornění" diff --git a/po/da.po b/po/da.po index c23efeb0a..ddbc82730 100644 --- a/po/da.po +++ b/po/da.po @@ -5,10 +5,10 @@ # Niels Felsted Thorsen , 2007, 2009. msgid "" msgstr "" -"Project-Id-Version: Gajim 0.12\n" +"Project-Id-Version: Gajim 0.13\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2009-10-28 22:17+0100\n" -"PO-Revision-Date: 2009-08-19 23:45+0200\n" +"POT-Creation-Date: 2009-11-25 22:20+0100\n" +"PO-Revision-Date: 2009-11-18 19:33+0100\n" "Last-Translator: Niels Felsted Thorsen \n" "Language-Team: <>\n" "MIME-Version: 1.0\n" @@ -93,7 +93,7 @@ msgstr "Vælg venligst en server" #: ../data/glade/account_creation_wizard_window.glade.h:7 msgid "@" -msgstr "" +msgstr "@" #: ../data/glade/account_creation_wizard_window.glade.h:8 msgid "" @@ -104,9 +104,8 @@ msgstr "" "SHA1 fingeraftryk af certifikatet:\n" #: ../data/glade/account_creation_wizard_window.glade.h:11 -#, fuzzy msgid "Anon_ymous authentication" -msgstr "Brug godkendelse" +msgstr "Anonym godkendelse" #: ../data/glade/account_creation_wizard_window.glade.h:12 msgid "Connect when I press Finish" @@ -133,7 +132,7 @@ msgstr "Hvis valgt vil Gajim huske adgangskoden for denne konto" #: ../data/glade/account_creation_wizard_window.glade.h:17 #: ../data/glade/account_modification_window.glade.h:26 msgid "Manage..." -msgstr "Kan håndteres..." +msgstr "Håndter..." #: ../data/glade/account_creation_wizard_window.glade.h:18 msgid "Prox_y:" @@ -281,9 +280,9 @@ msgstr "Redigere Personlig Information..." #. No configured account #: ../data/glade/account_modification_window.glade.h:16 #: ../data/glade/accounts_window.glade.h:21 -#: ../data/glade/roster_window.glade.h:5 ../src/common/helpers.py:1217 -#: ../src/common/helpers.py:1229 ../src/notify.py:547 ../src/notify.py:568 -#: ../src/notify.py:607 ../src/notify.py:619 +#: ../data/glade/roster_window.glade.h:5 ../src/common/helpers.py:1100 +#: ../src/common/helpers.py:1112 ../src/notify.py:560 ../src/notify.py:581 +#: ../src/notify.py:620 ../src/notify.py:632 msgid "Gajim" msgstr "Gajim" @@ -292,9 +291,9 @@ msgstr "Gajim" #. General group cannot be changed #: ../data/glade/account_modification_window.glade.h:17 #: ../data/glade/accounts_window.glade.h:22 -#: ../data/glade/preferences_window.glade.h:50 ../src/common/contacts.py:98 -#: ../src/dialogs.py:103 ../src/dialogs.py:111 ../src/roster_window.py:2753 -#: ../src/roster_window.py:5351 +#: ../data/glade/preferences_window.glade.h:52 ../src/common/contacts.py:135 +#: ../src/dialogs.py:111 ../src/dialogs.py:121 ../src/roster_window.py:2746 +#: ../src/roster_window.py:5268 msgid "General" msgstr "General" @@ -354,21 +353,21 @@ msgid "Information about you, as stored in the server" msgstr "Information om dig, som er gemt på serveren" #: ../data/glade/account_modification_window.glade.h:27 -#: ../data/glade/accounts_window.glade.h:35 ../src/config.py:1585 -#: ../src/config.py:2131 +#: ../data/glade/accounts_window.glade.h:35 ../src/config.py:1646 +#: ../src/config.py:2196 msgid "No key selected" msgstr "Ingen nøgle er valgt" #. None means no proxy profile selected #: ../data/glade/account_modification_window.glade.h:29 #: ../data/glade/accounts_window.glade.h:37 -#: ../data/glade/change_mood_dialog.glade.h:3 ../src/config.py:1106 -#: ../src/config.py:1209 ../src/config.py:1489 ../src/config.py:1494 -#: ../src/config.py:2038 ../src/config.py:2117 ../src/config.py:2130 -#: ../src/config.py:3317 ../src/config.py:3390 ../src/dialogs.py:293 -#: ../src/dialogs.py:295 ../src/dialogs.py:498 ../src/dialogs.py:511 -#: ../src/roster_window.py:2807 ../src/roster_window.py:2813 -#: ../src/roster_window.py:2818 +#: ../data/glade/change_mood_dialog.glade.h:3 ../src/config.py:1158 +#: ../src/config.py:1261 ../src/config.py:1550 ../src/config.py:1555 +#: ../src/config.py:2103 ../src/config.py:2182 ../src/config.py:2195 +#: ../src/config.py:3396 ../src/config.py:3469 ../src/dialogs.py:308 +#: ../src/dialogs.py:310 ../src/dialogs.py:513 ../src/dialogs.py:526 +#: ../src/roster_window.py:2800 ../src/roster_window.py:2806 +#: ../src/roster_window.py:2811 msgid "None" msgstr "Ingen" @@ -474,7 +473,6 @@ msgid "Proxy" msgstr "Proxy" #: ../data/glade/accounts_window.glade.h:5 -#, fuzzy msgid "A_djust to status" msgstr "_Tilpas til status" @@ -483,9 +481,8 @@ msgid "Accounts" msgstr "Kontoer" #: ../data/glade/accounts_window.glade.h:9 -#, fuzzy msgid "Anonymous authentication" -msgstr "Brug godkendelse" +msgstr "Anonym godkendelse" #: ../data/glade/accounts_window.glade.h:13 msgid "" @@ -496,9 +493,8 @@ msgstr "" "usikker forbindelse." #: ../data/glade/accounts_window.glade.h:17 -#, fuzzy msgid "Co_nnect on Gajim startup" -msgstr "T_ilslut når Gajim startes" +msgstr "Tilslut _når Gajim startes" #: ../data/glade/accounts_window.glade.h:19 #: ../data/glade/zeroconf_information_window.glade.h:2 @@ -526,8 +522,8 @@ msgstr "" "Du bør også ændre opsætning tilsvarende på en evt. brandmur." #: ../data/glade/accounts_window.glade.h:32 -#: ../data/glade/zeroconf_information_window.glade.h:4 ../src/config.py:1612 -#: ../src/dialogs.py:806 +#: ../data/glade/zeroconf_information_window.glade.h:4 ../src/config.py:1673 +#: ../src/dialogs.py:830 msgid "Jabber ID:" msgstr "Jabber ID:" @@ -541,68 +537,57 @@ msgid "Mer_ge accounts" msgstr "Fle_t kontoer" #. Rename -#: ../data/glade/accounts_window.glade.h:42 ../src/roster_window.py:5302 +#: ../data/glade/accounts_window.glade.h:42 ../src/roster_window.py:5219 msgid "Re_name" msgstr "Om_døb" #: ../data/glade/accounts_window.glade.h:47 -#, fuzzy msgid "Send _keep-alive packets" -msgstr "Send hold-i-live pakker" +msgstr "Send hold-i-live pa_kker" #: ../data/glade/accounts_window.glade.h:49 -#, fuzzy msgid "Synchroni_ze account status with global status" msgstr "Synk_roniser konto status med global status" #: ../data/glade/accounts_window.glade.h:51 -#, fuzzy msgid "Use G_PG Agent" -msgstr "Brug GPG _Agenten" +msgstr "Brug G_PG Agenten" #: ../data/glade/accounts_window.glade.h:52 -#, fuzzy msgid "Use cust_om hostname/port" -msgstr "Brug tilpasset værtsnavn/port" +msgstr "Brug tilpasset værtsnavn/p_ort" #: ../data/glade/accounts_window.glade.h:53 -#, fuzzy msgid "Use cust_om port:" -msgstr "Brug personlig port:" +msgstr "Brug pers_onlig port:" #: ../data/glade/accounts_window.glade.h:55 -#, fuzzy msgid "_Edit Personal Information..." -msgstr "Redigere Personlig Information..." +msgstr "R_ediger Personlig Information..." #: ../data/glade/accounts_window.glade.h:56 -#, fuzzy msgid "_Enable" -msgstr "Aktiver" +msgstr "Aktiv_er" #: ../data/glade/accounts_window.glade.h:57 -#, fuzzy msgid "_Hostname: " msgstr "_Værtsnavn:" #: ../data/glade/accounts_window.glade.h:59 -#, fuzzy msgid "_Manage..." -msgstr "Kan håndteres..." +msgstr "Hå_ndter..." #: ../data/glade/accounts_window.glade.h:61 -#, fuzzy msgid "_Port: " -msgstr "_Port:" +msgstr "_Port: " #: ../data/glade/accounts_window.glade.h:62 msgid "_Warn before using an insecure connection" msgstr "Ad_var mig før jeg bruger en usikker forbindelse" #: ../data/glade/accounts_window.glade.h:63 -#, fuzzy msgid "_use HTTP__PROXY environment variable" -msgstr "brug HTTP_PROXY miljøvariablen" +msgstr "br_ug HTTP__PROXY miljøvariablen" #: ../data/glade/accounts_window.glade.h:64 msgid "gtk-add" @@ -950,7 +935,7 @@ msgstr "Sidst ændret:" msgid "New entry received" msgstr "Ny hændelse modtaget" -#: ../data/glade/atom_entry_window.glade.h:5 ../src/atom_window.py:114 +#: ../data/glade/atom_entry_window.glade.h:5 ../src/atom_window.py:124 msgid "You have received new entry:" msgstr "Du har modtaget en ny hændelse:" @@ -994,11 +979,11 @@ msgstr "Skriv en ny adgangskode:" msgid "Type your new status message" msgstr "Skriv din nye status besked" -#: ../data/glade/change_status_message_dialog.glade.h:2 ../src/tooltips.py:601 +#: ../data/glade/change_status_message_dialog.glade.h:2 ../src/tooltips.py:613 msgid "Activity:" msgstr "Aktivitet:" -#: ../data/glade/change_status_message_dialog.glade.h:3 ../src/tooltips.py:586 +#: ../data/glade/change_status_message_dialog.glade.h:3 ../src/tooltips.py:608 msgid "Mood:" msgstr "Humør:" @@ -1078,9 +1063,8 @@ msgid "Assign Open_PGP Key..." msgstr "Tilskriv Open_PGP Nøgle..." #: ../data/glade/contact_context_menu.glade.h:4 -#, fuzzy msgid "E_xecute Command..." -msgstr "Kør Kommando..." +msgstr "Kør K_ommando..." #: ../data/glade/contact_context_menu.glade.h:5 msgid "Edit _Groups..." @@ -1088,8 +1072,8 @@ msgstr "Ændre _Grupper..." #. Invite to #. Invite to Groupchat -#: ../data/glade/contact_context_menu.glade.h:6 ../src/roster_window.py:5257 -#: ../src/roster_window.py:5412 +#: ../data/glade/contact_context_menu.glade.h:6 ../src/roster_window.py:5174 +#: ../src/roster_window.py:5333 msgid "In_vite to" msgstr "In_viter til" @@ -1102,8 +1086,8 @@ msgid "Remo_ve" msgstr "_Fjern" #. Send Custom Status -#: ../data/glade/contact_context_menu.glade.h:9 ../src/roster_window.py:5267 -#: ../src/roster_window.py:5497 +#: ../data/glade/contact_context_menu.glade.h:9 ../src/roster_window.py:5184 +#: ../src/roster_window.py:5420 msgid "Send Cus_tom Status" msgstr "Send _Tilpasset Status" @@ -1136,8 +1120,8 @@ msgid "_Allow him/her to see my status" msgstr "Till_ad ham/hende at se min status" #: ../data/glade/contact_context_menu.glade.h:18 -#: ../data/glade/gc_occupants_menu.glade.h:7 ../src/roster_window.py:5330 -#: ../src/roster_window.py:5449 ../src/roster_window.py:5578 +#: ../data/glade/gc_occupants_menu.glade.h:7 ../src/roster_window.py:5247 +#: ../src/roster_window.py:5370 ../src/roster_window.py:5501 msgid "_Block" msgstr "_Bloker" @@ -1148,7 +1132,7 @@ msgstr "_Nægt ham/hende at se min status" #: ../data/glade/contact_context_menu.glade.h:20 #: ../data/glade/gc_control_popup_menu.glade.h:6 #: ../data/glade/gc_occupants_menu.glade.h:8 -#: ../data/glade/roster_window.glade.h:21 ../src/roster_window.py:5647 +#: ../data/glade/roster_window.glade.h:21 ../src/roster_window.py:5570 msgid "_History" msgstr "_Historie" @@ -1169,8 +1153,8 @@ msgid "_Subscription" msgstr "_Abonnement" #: ../data/glade/contact_context_menu.glade.h:25 -#: ../data/glade/gc_occupants_menu.glade.h:13 ../src/roster_window.py:5324 -#: ../src/roster_window.py:5443 ../src/roster_window.py:5575 +#: ../data/glade/gc_occupants_menu.glade.h:13 ../src/roster_window.py:5241 +#: ../src/roster_window.py:5364 ../src/roster_window.py:5498 msgid "_Unblock" msgstr "_Fjern blokering" @@ -1258,7 +1242,7 @@ msgstr "" msgid "When a file transfer is complete show a popup notification" msgstr "Når en filoverførsel er færdig, vis en pop op påmindelse" -#: ../data/glade/filetransfers.glade.h:13 ../src/filetransfers_window.py:792 +#: ../data/glade/filetransfers.glade.h:13 ../src/filetransfers_window.py:820 msgid "_Continue" msgstr "_Fortsæt" @@ -1266,7 +1250,7 @@ msgstr "_Fortsæt" msgid "_Notify me when a file transfer is complete" msgstr "_Påmind mig når en filoverførsel er færdig" -#: ../data/glade/filetransfers.glade.h:15 ../src/filetransfers_window.py:200 +#: ../data/glade/filetransfers.glade.h:15 ../src/filetransfers_window.py:204 msgid "_Open Containing Folder" msgstr "_Åbn folderen med filen" @@ -1294,7 +1278,7 @@ msgstr "" "Kontakt række\n" "Samtale Banner" -#: ../data/glade/gajim_themes_window.glade.h:6 ../src/chat_control.py:818 +#: ../data/glade/gajim_themes_window.glade.h:6 ../src/chat_control.py:859 msgid "Bold" msgstr "Fed" @@ -1314,11 +1298,11 @@ msgstr "Gajim Tema Tilpasning" msgid "Gone" msgstr "Borte" -#: ../data/glade/gajim_themes_window.glade.h:11 ../src/common/pep.py:153 +#: ../data/glade/gajim_themes_window.glade.h:11 ../src/common/pep.py:150 msgid "Inactive" msgstr "Ikke aktiv" -#: ../data/glade/gajim_themes_window.glade.h:12 ../src/chat_control.py:819 +#: ../data/glade/gajim_themes_window.glade.h:12 ../src/chat_control.py:860 msgid "Italic" msgstr "Kursiv" @@ -1366,7 +1350,7 @@ msgstr "Ændre _Emne..." msgid "Configure _Room..." msgstr "Tilpas _Rum..." -#: ../data/glade/gc_control_popup_menu.glade.h:4 ../src/disco.py:1624 +#: ../data/glade/gc_control_popup_menu.glade.h:4 ../src/disco.py:1746 msgid "_Bookmark" msgstr "_Bogmærke" @@ -1455,8 +1439,9 @@ msgstr "" msgid "Welcome to Gajim History Logs Manager" msgstr "Velkommen til Gajims Loghistorie Håndterer" -#: ../data/glade/history_manager.glade.h:4 ../src/dialogs.py:2884 -#: ../src/dialogs.py:2987 +#. Change label for accept_button to action name instead of 'OK'. +#: ../data/glade/history_manager.glade.h:4 ../src/dialogs.py:3007 +#: ../src/dialogs.py:3104 msgid "Delete" msgstr "Slet" @@ -1486,7 +1471,7 @@ msgstr "" msgid "_Search Database" msgstr "_Søg Database" -#: ../data/glade/history_window.glade.h:1 ../src/history_window.py:316 +#: ../data/glade/history_window.glade.h:1 ../src/history_window.py:323 msgid "Conversation History" msgstr "Samtale Historie" @@ -1510,11 +1495,10 @@ msgid "_Log conversation history" msgstr "_Log samtale historie" #: ../data/glade/join_groupchat_window.glade.h:2 -#, fuzzy msgid "Bookmark this room" -msgstr "Bogmærk dette rom (Ctrl+B)" +msgstr "Bogmærk dette rom" -#: ../data/glade/join_groupchat_window.glade.h:3 ../src/dialogs.py:1972 +#: ../data/glade/join_groupchat_window.glade.h:3 ../src/dialogs.py:2076 msgid "Join Group Chat" msgstr "Bliv med i en Gruppe Samtale" @@ -1541,8 +1525,8 @@ msgstr "For nylig:" msgid "Room:" msgstr "Rum:" -#: ../data/glade/join_groupchat_window.glade.h:9 ../src/disco.py:1201 -#: ../src/disco.py:1628 +#: ../data/glade/join_groupchat_window.glade.h:9 ../src/disco.py:1306 +#: ../src/disco.py:1750 msgid "_Join" msgstr "_Bliv med:" @@ -1570,7 +1554,7 @@ msgstr "Minimer ved Automatisk Deltagelse" msgid "Print status:" msgstr "Skriv status:" -#: ../data/glade/manage_bookmarks_window.glade.h:9 ../src/config.py:1602 +#: ../data/glade/manage_bookmarks_window.glade.h:9 ../src/config.py:1663 msgid "Server:" msgstr "Server:" @@ -1599,14 +1583,14 @@ msgid "Settings" msgstr "Opsætning" #: ../data/glade/manage_proxies_window.glade.h:3 -#, fuzzy msgid "" "HTTP Connect\n" "SOCKS5\n" "BOSH" msgstr "" "HTTP Tilslutning\n" -"SOCKS5" +"SOCKS5\n" +"BOSH" #: ../data/glade/manage_proxies_window.glade.h:6 msgid "Manage Proxy Profiles" @@ -1617,32 +1601,28 @@ msgid "Pass_word:" msgstr "Adgangs_kode" #: ../data/glade/manage_proxies_window.glade.h:8 -#, fuzzy msgid "Proxy _Host:" -msgstr "Proxy:" +msgstr "Proxy _vært:" #: ../data/glade/manage_proxies_window.glade.h:9 -#, fuzzy msgid "Proxy _Port:" -msgstr "_Port:" +msgstr "Proxy _Port:" #: ../data/glade/manage_proxies_window.glade.h:10 msgid "Use HTTP prox_y" -msgstr "" +msgstr "Brug HTTP prox_y" #: ../data/glade/manage_proxies_window.glade.h:11 -#, fuzzy msgid "Use proxy auth_entication" -msgstr "Brug godkendelse" +msgstr "Brug proxy godkendelse" #: ../data/glade/manage_proxies_window.glade.h:12 msgid "_BOSH URL:" -msgstr "" +msgstr "_BOSH URL:" #: ../data/glade/manage_proxies_window.glade.h:14 -#, fuzzy msgid "_Type:" -msgstr "Type:" +msgstr "_Type:" #: ../data/glade/manage_proxies_window.glade.h:15 msgid "_Username:" @@ -1681,22 +1661,30 @@ msgid "Show a list of emoticons (Alt+M)" msgstr "Hvis en liste over følelsesikoner (Alt+M)" #: ../data/glade/message_window.glade.h:9 -#, fuzzy msgid "Show a list of formattings" -msgstr "Hvis en liste over følelsesikoner (Alt+M)" +msgstr "Hvis en liste over følelsesikoner" #: ../data/glade/message_window.glade.h:10 -msgid "Show a menu of advanced functions (Alt+A)" +#, fuzzy +msgid "Show a menu of advanced functions (Alt+D)" msgstr "Vis en menu med avancerede funktioner (Alt+A)" #: ../data/glade/message_window.glade.h:11 msgid "Show the contact's profile (Ctrl+I)" msgstr "Vis kontaktens profil (Ctrl+I)" -#. Make sure the character after "_" is not M/m (conflicts with Alt+M that is supposed to show the Emoticon Selector) +#: ../data/glade/message_window.glade.h:12 +msgid "Toggle audio session" +msgstr "" + #: ../data/glade/message_window.glade.h:13 +msgid "Toggle video session" +msgstr "" + +#. Make sure the character after "_" is not M/m (conflicts with Alt+M that is supposed to show the Emoticon Selector) +#: ../data/glade/message_window.glade.h:15 #: ../data/glade/xml_console_window.glade.h:11 -#: ../src/filetransfers_window.py:260 +#: ../src/filetransfers_window.py:266 msgid "_Send" msgstr "_Send" @@ -1794,7 +1782,7 @@ msgstr "" #: ../data/glade/preferences_window.glade.h:26 msgid "Allow sound when I'm _busy" -msgstr "" +msgstr "Tillad lyde når jeg er o_ptaget" #: ../data/glade/preferences_window.glade.h:27 msgid "Ask status message when I:" @@ -1827,6 +1815,16 @@ msgid "Configure color and font of the interface" msgstr "Konfigurér farve og skrifttyper for brugergrænsefladen" #: ../data/glade/preferences_window.glade.h:36 +#, fuzzy +msgid "Contact's message:" +msgstr "Samtale besked:" + +#: ../data/glade/preferences_window.glade.h:37 +#, fuzzy +msgid "Contact's nickname:" +msgstr "Kontakt navn" + +#: ../data/glade/preferences_window.glade.h:38 msgid "" "Detached roster with detached chats\n" "Detached roster with single chat\n" @@ -1840,31 +1838,31 @@ msgstr "" "Frigjort kontaktvindue med samtale vindue grupperet per konto\n" "Frigjort kontaktvindue med samtale vindue grupperet per type" -#: ../data/glade/preferences_window.glade.h:41 +#: ../data/glade/preferences_window.glade.h:43 msgid "Display _activity of contacts in roster" msgstr "Vis kontakternes _aktivitet i kontaktvinduet" -#: ../data/glade/preferences_window.glade.h:42 +#: ../data/glade/preferences_window.glade.h:44 msgid "Display _extra email details" msgstr "Vis _ekstra e-post detaljer" -#: ../data/glade/preferences_window.glade.h:43 +#: ../data/glade/preferences_window.glade.h:45 msgid "Display _tunes of contacts in roster" msgstr "Vis kontak_ternes melodier i kontaktvinduet" -#: ../data/glade/preferences_window.glade.h:44 +#: ../data/glade/preferences_window.glade.h:46 msgid "Display a_vatars of contacts in roster" msgstr "Vis kontakternes a_vatarer i kontaktvinduet" -#: ../data/glade/preferences_window.glade.h:45 +#: ../data/glade/preferences_window.glade.h:47 msgid "Display m_ood of contacts in roster" msgstr "Vis kontakternes humør i kontaktvinduet" -#: ../data/glade/preferences_window.glade.h:46 +#: ../data/glade/preferences_window.glade.h:48 msgid "Display status _messages of contacts in roster" msgstr "Vis status _beskeder for kontakter i kontaktvinduet" -#: ../data/glade/preferences_window.glade.h:47 +#: ../data/glade/preferences_window.glade.h:49 msgid "" "Gajim can send and receive meta-information related to a conversation you " "may have with a contact. Here you can specify which chatstates you want to " @@ -1874,7 +1872,7 @@ msgstr "" "med en kontakt. Her kan du specificere hvilke typer samtalestatus du vil " "vise i samtalevinduerne." -#: ../data/glade/preferences_window.glade.h:48 +#: ../data/glade/preferences_window.glade.h:50 msgid "" "Gajim can send and receive meta-information related to a conversation you " "may have with a contact. Here you can specify which chatstates you want to " @@ -1884,7 +1882,7 @@ msgstr "" "med en kontakt. Her kan du specificere hvilke typer samtalestatus du vil " "sende til modparten." -#: ../data/glade/preferences_window.glade.h:49 +#: ../data/glade/preferences_window.glade.h:51 msgid "" "Gajim will notify you via a popup window in the bottom right of the screen " "about contacts that just signed out" @@ -1892,31 +1890,31 @@ msgstr "" "Gajim vil påminde dig med et pop op vindue i højre bund af skærmen når en " "kontakt logger af" -#: ../data/glade/preferences_window.glade.h:51 +#: ../data/glade/preferences_window.glade.h:53 msgid "Hide all buttons in chat windows" msgstr "Skjul alle knapperne i samtale vinduer." -#: ../data/glade/preferences_window.glade.h:52 +#: ../data/glade/preferences_window.glade.h:54 msgid "" "If checked, Gajim will allow others to detect the operation system you are " "using" msgstr "" "Hvis valgt vil Gajim tillade andre at kunne se det operativ system du bruger" -#: ../data/glade/preferences_window.glade.h:53 +#: ../data/glade/preferences_window.glade.h:55 msgid "" "If checked, Gajim will also include information about the sender of the new " "emails" msgstr "" "Hvis valgt vil Gajim også inkludere information om senderen af den nye e-post" -#: ../data/glade/preferences_window.glade.h:54 +#: ../data/glade/preferences_window.glade.h:56 msgid "" "If checked, Gajim will change status to Away when the computer is unused." msgstr "" "Hvis valgt vil Gajim ændre status til Væk når computeren ikke bliver brugt." -#: ../data/glade/preferences_window.glade.h:55 +#: ../data/glade/preferences_window.glade.h:57 msgid "" "If checked, Gajim will change status to Not Available when the computer has " "not been used even longer" @@ -1924,7 +1922,7 @@ msgstr "" "Hvis valgt vil Gajim ændre status til Ikke Tilgængelig når computeren ikke " "har været brugt i endnu længere tid" -#: ../data/glade/preferences_window.glade.h:56 +#: ../data/glade/preferences_window.glade.h:58 msgid "" "If checked, Gajim will display avatars of contacts in roster window and in " "group chats" @@ -1932,7 +1930,7 @@ msgstr "" "Hvis valgt vil Gajim vise avatarer af kontakter i kontaktvinduet og i gruppe " "samtaler" -#: ../data/glade/preferences_window.glade.h:57 +#: ../data/glade/preferences_window.glade.h:59 msgid "" "If checked, Gajim will display status messages of contacts under the contact " "name in roster window and in group chats" @@ -1940,23 +1938,23 @@ msgstr "" "Hvis valgt vil Gajim vise status beskeder af kontakter under kontaktnavnet i " "kontaktvinduet og i gruppe samtaler" -#: ../data/glade/preferences_window.glade.h:58 +#: ../data/glade/preferences_window.glade.h:60 msgid "" "If checked, Gajim will display the activity of contacts in the roster window" msgstr "Hvis valgt vil Gajim vise kontakternes aktivitet i kontaktvinduet" -#: ../data/glade/preferences_window.glade.h:59 +#: ../data/glade/preferences_window.glade.h:61 msgid "" "If checked, Gajim will display the mood of contacts in the roster window" msgstr "Hvis valgt vil Gajim vise kontakternes humør i kontaktvinduet" -#: ../data/glade/preferences_window.glade.h:60 +#: ../data/glade/preferences_window.glade.h:62 msgid "" "If checked, Gajim will display the tunes of contacts in the roster window" msgstr "" "Hvis valgt vil Gajim vise i kontaktvinduet, hvilken melodi kontakten spiller" -#: ../data/glade/preferences_window.glade.h:61 +#: ../data/glade/preferences_window.glade.h:63 msgid "" "If checked, Gajim will highlight spelling errors in input fields of chat " "windows. If no language is explicitly set via right click on the input " @@ -1966,7 +1964,7 @@ msgstr "" "intet sprog er valgt ved at højreklikke i indtastningsfeltet, vil standard " "sproget blive brugt for denne kontakt eller gruppe samtale." -#: ../data/glade/preferences_window.glade.h:62 +#: ../data/glade/preferences_window.glade.h:64 msgid "" "If checked, Gajim will ignore incoming events from unauthorized contacts. " "Use with caution, because it blocks all messages from any contact that is " @@ -1976,7 +1974,7 @@ msgstr "" "kontakter. Brug med forsigtighed fordi det vil blokere alle beskeder fra " "alle kontakter som ikke er i kontaktvinduet." -#: ../data/glade/preferences_window.glade.h:63 +#: ../data/glade/preferences_window.glade.h:65 msgid "" "If checked, Gajim will keep logs for encrypted messages. Please note that " "when using E2E encryption the remote party has to agree on logging, else the " @@ -1986,7 +1984,7 @@ msgstr "" "opmærksom på når der bruges E2E kryptering må den anden i samtalen godkende " "evt. logning, ellers vil samtalen i blive logget." -#: ../data/glade/preferences_window.glade.h:64 +#: ../data/glade/preferences_window.glade.h:66 msgid "" "If checked, Gajim will show a notification when a new e-mail is received via " "GMail" @@ -1994,7 +1992,7 @@ msgstr "" "Hvis valgt vil Gajim vise en påmindelse når en ny e-post er modtaget via " "Gmail" -#: ../data/glade/preferences_window.glade.h:65 +#: ../data/glade/preferences_window.glade.h:67 msgid "" "If checked, Gajim will use protocol-specific status icons. (eg. A contact " "from MSN will have the equivalent msn icon for status online, away, busy, " @@ -2004,7 +2002,7 @@ msgstr "" "kontakt fra MSN vil have det tilsvarende msn ikon for status tilsluttet, " "borte, Travlt, etc...)" -#: ../data/glade/preferences_window.glade.h:66 +#: ../data/glade/preferences_window.glade.h:68 msgid "" "If enabled, Gajim will not ask for a status message. The specified default " "message will be used instead." @@ -2012,7 +2010,7 @@ msgstr "" "Hvis aktiveret vil Gajim i spørge for en status besked. Den valgte standard " "besked vil blive brugt i stedet." -#: ../data/glade/preferences_window.glade.h:67 +#: ../data/glade/preferences_window.glade.h:69 msgid "" "If not disabled, Gajim will replace ascii smilies like ':)' with equivalent " "animated or static graphical emoticons" @@ -2020,50 +2018,53 @@ msgstr "" "Hvis valgt vil Gajim erstatte tekst smileys som denne ':)' med den " "tilsvarende animerede eller statiske grafiske følelsesikon" -#: ../data/glade/preferences_window.glade.h:68 +#: ../data/glade/preferences_window.glade.h:70 msgid "Log _encrypted chat session" msgstr "Log krypt_eret samtale session" -#: ../data/glade/preferences_window.glade.h:69 +#: ../data/glade/preferences_window.glade.h:71 msgid "Ma_ke message windows compact" msgstr "Gør samtalevinduer _kompakte" -#: ../data/glade/preferences_window.glade.h:70 +#: ../data/glade/preferences_window.glade.h:72 msgid "Ma_nage..." msgstr "Hå_ndtere..." -#: ../data/glade/preferences_window.glade.h:71 +#: ../data/glade/preferences_window.glade.h:73 msgid "" "Never\n" "Only when pending events\n" "Always" msgstr "" +"Aldrig\n" +"Kun ved ventende hændelser\n" +"Altid" -#: ../data/glade/preferences_window.glade.h:74 +#: ../data/glade/preferences_window.glade.h:76 msgid "Notifications" msgstr "Påmindelser" -#: ../data/glade/preferences_window.glade.h:75 +#: ../data/glade/preferences_window.glade.h:77 msgid "Notify me about contacts that sign _in" msgstr "Påmind mig om kontakter logger _ind" -#: ../data/glade/preferences_window.glade.h:76 +#: ../data/glade/preferences_window.glade.h:78 msgid "Notify me about contacts that sign _out" msgstr "Påmind mig om kontakter som logger u_d" -#: ../data/glade/preferences_window.glade.h:77 +#: ../data/glade/preferences_window.glade.h:79 msgid "Notify on new _GMail email" msgstr "Påmind mig ved ny _GMail e-post" -#: ../data/glade/preferences_window.glade.h:78 +#: ../data/glade/preferences_window.glade.h:80 msgid "Personal Events" msgstr "Personlig Hændelser" -#: ../data/glade/preferences_window.glade.h:79 +#: ../data/glade/preferences_window.glade.h:81 msgid "Play _sounds" msgstr "Afspil _lyde" -#: ../data/glade/preferences_window.glade.h:80 +#: ../data/glade/preferences_window.glade.h:82 msgid "" "Pop it up\n" "Notify me about it\n" @@ -2073,24 +2074,23 @@ msgstr "" "Påmind mig om det\n" "Hvis kun i kontaktvinduet" -#: ../data/glade/preferences_window.glade.h:83 +#: ../data/glade/preferences_window.glade.h:85 msgid "Preferences" msgstr "Indstillinger" -#: ../data/glade/preferences_window.glade.h:84 -#, fuzzy +#: ../data/glade/preferences_window.glade.h:86 msgid "Show systray:" -msgstr "_Vis hændelse i systembakken" +msgstr "Vis systembakken:" -#: ../data/glade/preferences_window.glade.h:85 +#: ../data/glade/preferences_window.glade.h:87 msgid "Sign _in" msgstr "Logge _ind" -#: ../data/glade/preferences_window.glade.h:86 +#: ../data/glade/preferences_window.glade.h:88 msgid "Sign _out" msgstr "Log _af" -#: ../data/glade/preferences_window.glade.h:87 +#: ../data/glade/preferences_window.glade.h:89 msgid "" "Some messages may include rich content (formatting, colors etc). If checked, " "Gajim will just display the raw message text." @@ -2099,28 +2099,27 @@ msgstr "" "valgt\n" "vil Gajim kun vise den rå tekst." -#: ../data/glade/preferences_window.glade.h:88 +#: ../data/glade/preferences_window.glade.h:90 msgid "Sort contacts by status" msgstr "Sorter kontakter efter status" -#: ../data/glade/preferences_window.glade.h:89 ../src/config.py:390 +#: ../data/glade/preferences_window.glade.h:91 ../src/config.py:377 msgid "Status" msgstr "Status" -#: ../data/glade/preferences_window.glade.h:90 +#: ../data/glade/preferences_window.glade.h:92 msgid "Status _iconset:" msgstr "Status _ikonsæt:" -#: ../data/glade/preferences_window.glade.h:91 +#: ../data/glade/preferences_window.glade.h:93 msgid "Style" msgstr "Stil" -#: ../data/glade/preferences_window.glade.h:92 +#: ../data/glade/preferences_window.glade.h:94 msgid "T_heme:" msgstr "T_ema:" -#: ../data/glade/preferences_window.glade.h:93 -#, fuzzy +#: ../data/glade/preferences_window.glade.h:95 msgid "" "The auto away status message. If empty, Gajim will not change the current " "status message\n" @@ -2128,10 +2127,11 @@ msgid "" "$T will be replaced by auto-away timeout" msgstr "" "Den automatiske jeg er væk status besked. Hvis tom vil Gajim ikke ændre den " -"nuværende status besked" +"nuværende status besked\n" +"$S vil blive erstattet med den forrige status besked\n" +"$T vil blive erstattet med auto-away tidsudløb" -#: ../data/glade/preferences_window.glade.h:96 -#, fuzzy +#: ../data/glade/preferences_window.glade.h:98 msgid "" "The auto not available status message. If empty, Gajim will not change the " "current status message\n" @@ -2139,105 +2139,109 @@ msgid "" "$T will be replaced by auto-not-available timeout" msgstr "" "Den automatiske jeg er ikke tilgængelig status besked. Hvis tom vil Gajim " -"ikke ændre den nuværende status besked" +"ikke ændre den nuværende status besked\n" +"$S vil blive erstattet med den forrige status besked\n" +"$T vil blive erstattet med auto-not-available timeout" -#: ../data/glade/preferences_window.glade.h:99 +#: ../data/glade/preferences_window.glade.h:101 msgid "Use _transports icons" msgstr "Brug _transportens ikonsæt" -#: ../data/glade/preferences_window.glade.h:100 +#: ../data/glade/preferences_window.glade.h:102 msgid "Use system _default" msgstr "Brug system stan_dard" -#: ../data/glade/preferences_window.glade.h:101 +#: ../data/glade/preferences_window.glade.h:103 msgid "When new event is received:" msgstr "Når en ny hændelse er modtaget:" -#: ../data/glade/preferences_window.glade.h:102 +#: ../data/glade/preferences_window.glade.h:104 +#, fuzzy +msgid "Your message:" +msgstr "Fejl besked: %s" + +#: ../data/glade/preferences_window.glade.h:105 +#, fuzzy +msgid "Your nickname:" +msgstr "Kælenavn:" + +#: ../data/glade/preferences_window.glade.h:106 msgid "_Away after:" msgstr "_Væk efter:" -#: ../data/glade/preferences_window.glade.h:103 +#: ../data/glade/preferences_window.glade.h:107 msgid "_Browser:" msgstr "_Netlæser:" -#: ../data/glade/preferences_window.glade.h:104 +#: ../data/glade/preferences_window.glade.h:108 msgid "_Display chat state notifications:" msgstr "Vis samtalestatus påmin_delser:" -#: ../data/glade/preferences_window.glade.h:105 +#: ../data/glade/preferences_window.glade.h:109 msgid "_Emoticons:" msgstr "Føl_elsesikoner:" -#: ../data/glade/preferences_window.glade.h:106 +#: ../data/glade/preferences_window.glade.h:110 msgid "_File manager:" msgstr "_Filhåndterer:" -#: ../data/glade/preferences_window.glade.h:107 +#: ../data/glade/preferences_window.glade.h:111 msgid "_Highlight misspelled words" msgstr "Frem_hæv stavefejl" -#: ../data/glade/preferences_window.glade.h:108 +#: ../data/glade/preferences_window.glade.h:112 msgid "_Ignore events from contacts not in the roster" msgstr "_Ignorer hændelser fra kontakter som ikke er i kontaktvinduet" -#: ../data/glade/preferences_window.glade.h:109 +#: ../data/glade/preferences_window.glade.h:113 msgid "_Ignore rich content in incoming messages" msgstr "_Ignorer rigt indhold i indkommende beskeder" -#: ../data/glade/preferences_window.glade.h:110 -msgid "_Incoming message:" -msgstr "_Indkommende besked:" - -#: ../data/glade/preferences_window.glade.h:111 +#: ../data/glade/preferences_window.glade.h:114 msgid "_Log status changes of contacts" msgstr "_Log status ændringer hos kontakter" -#: ../data/glade/preferences_window.glade.h:112 +#: ../data/glade/preferences_window.glade.h:115 msgid "_Mail client:" msgstr "_E-post klient:" -#: ../data/glade/preferences_window.glade.h:113 +#: ../data/glade/preferences_window.glade.h:116 msgid "_Not available after:" msgstr "Ikke tilgæ_ngelig efter:" -#: ../data/glade/preferences_window.glade.h:114 +#: ../data/glade/preferences_window.glade.h:117 msgid "_Open..." msgstr "_Åbn..." -#: ../data/glade/preferences_window.glade.h:115 -msgid "_Outgoing message:" -msgstr "_Udgående besked:" - -#: ../data/glade/preferences_window.glade.h:116 +#: ../data/glade/preferences_window.glade.h:118 msgid "_Reset to Default Colors" msgstr "_Nulstil til Standard Farver" -#: ../data/glade/preferences_window.glade.h:117 +#: ../data/glade/preferences_window.glade.h:119 msgid "_Send chat state notifications:" msgstr "_Send samtalestatus påmindelser:" -#: ../data/glade/preferences_window.glade.h:118 +#: ../data/glade/preferences_window.glade.h:120 msgid "_Status message:" msgstr "_Status besked:" -#: ../data/glade/preferences_window.glade.h:119 +#: ../data/glade/preferences_window.glade.h:121 msgid "_URL highlight:" msgstr "_URL fremhævning:" -#: ../data/glade/preferences_window.glade.h:120 +#: ../data/glade/preferences_window.glade.h:122 msgid "_Window behavior:" msgstr "_Vinduets adfærd:" -#: ../data/glade/preferences_window.glade.h:121 +#: ../data/glade/preferences_window.glade.h:123 msgid "in _group chats" msgstr "i _gruppe samtaler" -#: ../data/glade/preferences_window.glade.h:122 +#: ../data/glade/preferences_window.glade.h:124 msgid "in _roster" msgstr "i _kontaktvinduet" -#: ../data/glade/preferences_window.glade.h:123 +#: ../data/glade/preferences_window.glade.h:125 msgid "minutes" msgstr "minutter" @@ -2270,9 +2274,8 @@ msgid "All" msgstr "Alle" #: ../data/glade/privacy_list_window.glade.h:7 -#, fuzzy msgid "All (including subscription)" -msgstr "Alle efter abonnering" +msgstr "Alle (inkluderende abonnering)" #: ../data/glade/privacy_list_window.glade.h:8 msgid "Allow" @@ -2290,7 +2293,7 @@ msgstr "Jabber ID" msgid "Order:" msgstr "Bestil:" -#: ../data/glade/privacy_list_window.glade.h:12 ../src/dialogs.py:3114 +#: ../data/glade/privacy_list_window.glade.h:12 ../src/dialogs.py:3235 msgid "Privacy List" msgstr "Privatlivs Liste" @@ -2434,7 +2437,7 @@ msgid "Prefix:" msgstr "Titel:" #: ../data/glade/profile_window.glade.h:25 -#: ../data/glade/vcard_information_window.glade.h:30 ../src/vcard.py:327 +#: ../data/glade/vcard_information_window.glade.h:30 ../src/vcard.py:332 msgid "Role:" msgstr "Rolle:" @@ -2494,8 +2497,8 @@ msgstr "Fjern konto fra Gajim og fra _serveren" #. Remove group #. Remove -#: ../data/glade/remove_account_window.glade.h:4 ../src/roster_window.py:5339 -#: ../src/roster_window.py:5459 ../src/roster_window.py:5588 +#: ../data/glade/remove_account_window.glade.h:4 ../src/roster_window.py:5256 +#: ../src/roster_window.py:5380 ../src/roster_window.py:5511 msgid "_Remove" msgstr "_Kan fjernes" @@ -2504,24 +2507,25 @@ msgid "" "someone@somewhere.com would like you to add some contacts in " "your roster." msgstr "" +"nogen@etsted.com vil gerne at du tilføjer nogen kontakter i " +"dit kontaktvindue." #: ../data/glade/roster_item_exchange_window.glade.h:2 msgid "Message Body , så beskeder kan ikke krypteres. Brug din GPG klient til at " "ændre dette." -#: ../src/dialogs.py:4498 +#: ../src/dialogs.py:4641 msgid "" "GPG Key is assigned to this contact, and you trust his key, so messages will " "be encrypted." @@ -7236,6 +7228,25 @@ msgstr "" "GPG Nøgle er tildet til denne kontakt, og du stoler på denne nøgle, så " "beskeder vil blive krypteret." +#: ../src/dialogs.py:4708 +msgid "an audio and video" +msgstr "" + +#: ../src/dialogs.py:4710 +msgid "an audio" +msgstr "" + +#: ../src/dialogs.py:4712 +msgid "a video" +msgstr "" + +#: ../src/dialogs.py:4716 +#, python-format +msgid "" +"%(contact)s wants to start %(type)s session with you. Do you want to answer " +"the call?" +msgstr "" + #: ../src/disco.py:118 msgid "Others" msgstr "Andre" @@ -7245,24 +7256,24 @@ msgstr "Andre" msgid "Conference" msgstr "Konference" -#: ../src/disco.py:442 +#: ../src/disco.py:478 msgid "Without a connection, you can not browse available services" msgstr "Du kan kun gennemse tilgængelige tjenester hvis du er tilsluttet" -#: ../src/disco.py:516 +#: ../src/disco.py:554 #, python-format msgid "Service Discovery using account %s" msgstr "Opdag Tjenester med kontoen %s" -#: ../src/disco.py:518 +#: ../src/disco.py:556 msgid "Service Discovery" msgstr "Opdag Tjenester" -#: ../src/disco.py:659 +#: ../src/disco.py:706 msgid "The service could not be found" msgstr "Tjenesten findes ikke" -#: ../src/disco.py:660 +#: ../src/disco.py:707 msgid "" "There is no service at the address you entered, or it is not responding. " "Check the address and try again." @@ -7270,294 +7281,264 @@ msgstr "" "Der er ikke nogen tjenester på den adresse som du indtastede, eller serveren " "gav intet svar. Kontroller adressen og prøv igen." -#: ../src/disco.py:664 ../src/disco.py:960 +#: ../src/disco.py:711 ../src/disco.py:1047 msgid "The service is not browsable" msgstr "Det er ikke mulig at gennemse denne tjeneste" -#: ../src/disco.py:665 +#: ../src/disco.py:712 msgid "This type of service does not contain any items to browse." msgstr "Denne type tjeneste har ingen elementer som kan gennemses." -#: ../src/disco.py:702 ../src/disco.py:712 +#: ../src/disco.py:751 ../src/disco.py:761 msgid "Invalid Server Name" msgstr "Ikke gyldigt server navn" -#: ../src/disco.py:759 +#: ../src/disco.py:815 #, python-format msgid "Browsing %(address)s using account %(account)s" msgstr "Gennemse %(address)s med konto %(account)s" -#: ../src/disco.py:799 +#: ../src/disco.py:859 msgid "_Browse" msgstr "_Gennemse" -#: ../src/disco.py:961 +#: ../src/disco.py:1048 msgid "This service does not contain any items to browse." msgstr "Denne tjeneste har ingen elementer som kan gennemses." -#: ../src/disco.py:1183 +#: ../src/disco.py:1288 msgid "_Execute Command" msgstr "_Kør Kommando" -#: ../src/disco.py:1193 ../src/disco.py:1359 +#: ../src/disco.py:1298 ../src/disco.py:1469 msgid "Re_gister" msgstr "Re_gistrer" -#: ../src/disco.py:1396 +#: ../src/disco.py:1510 #, python-format msgid "Scanning %(current)d / %(total)d.." msgstr "Skanner %(current)d / %(total)d.." #. Users column -#: ../src/disco.py:1578 +#: ../src/disco.py:1700 msgid "Users" msgstr "Brugere" #. Description column -#: ../src/disco.py:1586 +#: ../src/disco.py:1708 msgid "Description" msgstr "Beskrivelse" #. Id column -#: ../src/disco.py:1594 +#: ../src/disco.py:1716 msgid "Id" msgstr "Id" -#: ../src/disco.py:1659 ../src/gajim.py:3311 +#: ../src/disco.py:1781 ../src/gui_interface.py:3088 msgid "Bookmark already set" msgstr "Bogmærke er allerede sat" -#: ../src/disco.py:1660 ../src/gajim.py:3312 +#: ../src/disco.py:1782 ../src/gui_interface.py:3089 #, python-format msgid "Group Chat \"%s\" is already in your bookmarks." msgstr "Gruppe samtale \"%s\" er allerede i dine bogmærker." -#: ../src/disco.py:1669 ../src/gajim.py:3325 +#: ../src/disco.py:1791 ../src/gui_interface.py:3102 msgid "Bookmark has been added successfully" msgstr "Bogmærket er blevet tilføjet succesfuldt" -#: ../src/disco.py:1670 ../src/gajim.py:3326 +#: ../src/disco.py:1792 ../src/gui_interface.py:3103 msgid "You can manage your bookmarks via Actions menu in your roster." msgstr "" "De kan håndtere dine bogmærker via Handlings menuen i dit kontaktvindue." -#: ../src/disco.py:1863 +#: ../src/disco.py:2001 msgid "Subscribed" msgstr "Abonnerede" -#: ../src/disco.py:1871 +#: ../src/disco.py:2009 msgid "Node" msgstr "Knude" -#: ../src/disco.py:1933 +#: ../src/disco.py:2073 msgid "New post" msgstr "Ny post" -#: ../src/disco.py:1939 +#: ../src/disco.py:2079 msgid "_Subscribe" msgstr "_Abonner" -#: ../src/disco.py:1945 +#: ../src/disco.py:2085 msgid "_Unsubscribe" msgstr "_Frameld abonnement" -#: ../src/features_window.py:46 -#, fuzzy +#: ../src/features_window.py:48 msgid "SSL certificat validation" -msgstr "SSL certifikat fejl" +msgstr "SSL certifikat validering" -#: ../src/features_window.py:47 +#: ../src/features_window.py:49 msgid "" "A library used to validate server certificates to ensure a secure connection." msgstr "" "Et bibliotek brugt til at validere server certifikater for at sikre en " "sikker forbindelse." -#: ../src/features_window.py:48 ../src/features_window.py:49 +#: ../src/features_window.py:50 ../src/features_window.py:51 msgid "Requires python-pyopenssl." msgstr "Kræver python-pyopenssl." -#: ../src/features_window.py:50 +#: ../src/features_window.py:52 msgid "Bonjour / Zeroconf" msgstr "Bonjour / Zeroconf" -#: ../src/features_window.py:51 +#: ../src/features_window.py:53 msgid "Serverless chatting with autodetected clients in a local network." msgstr "" "Serverløs samtale med automatisk opdagede klienter i et lokalt netværk." -#: ../src/features_window.py:52 +#: ../src/features_window.py:54 msgid "Requires python-avahi." msgstr "Kræver python-avahi." -#: ../src/features_window.py:53 +#: ../src/features_window.py:55 msgid "Requires pybonjour (http://o2s.csail.mit.edu/o2s-wiki/pybonjour)." msgstr "Kræver pybonjour (http://o2s.csail.mit.edu/o2s-wiki/pybonjour)." -#: ../src/features_window.py:54 -#, fuzzy +#: ../src/features_window.py:56 msgid "Command line" -msgstr "Kommandoer: %s" +msgstr "Kommandolinje" -#: ../src/features_window.py:55 +#: ../src/features_window.py:57 msgid "A script to control Gajim via commandline." msgstr "Et script til at kontrollere Gajim via kommandolinjen." -#: ../src/features_window.py:56 +#: ../src/features_window.py:58 msgid "Requires python-dbus." msgstr "Kræver python-dbus." -#: ../src/features_window.py:57 ../src/features_window.py:61 -#: ../src/features_window.py:65 ../src/features_window.py:69 -#: ../src/features_window.py:73 ../src/features_window.py:81 -#: ../src/features_window.py:85 +#: ../src/features_window.py:59 ../src/features_window.py:63 +#: ../src/features_window.py:67 ../src/features_window.py:71 +#: ../src/features_window.py:75 ../src/features_window.py:83 +#: ../src/features_window.py:87 ../src/features_window.py:111 msgid "Feature not available under Windows." msgstr "Egenskab ikke tilgængelig under Windows." -#: ../src/features_window.py:58 -#, fuzzy -msgid "OpenGPG message encryption" -msgstr "OpenPGP Nøgle Valg" - -#: ../src/features_window.py:59 -#, fuzzy -msgid "Encrypting chat messages with gpg keys." -msgstr "Krypter samtale beskeder med gpg nøgler." - #: ../src/features_window.py:60 +msgid "OpenGPG message encryption" +msgstr "OpenPGP besked kryptering" + +#: ../src/features_window.py:61 +msgid "Encrypting chat messages with gpg keys." +msgstr "Krypterer samtale beskeder med gpg nøgler." + +#: ../src/features_window.py:62 msgid "Requires gpg and python-GnuPGInterface." msgstr "Kræver gpg og python-GnuPGInterface." -#: ../src/features_window.py:62 -#, fuzzy +#: ../src/features_window.py:64 msgid "Network-manager" -msgstr "network-manager" +msgstr "Network-manager" -#: ../src/features_window.py:63 +#: ../src/features_window.py:65 msgid "Autodetection of network status." msgstr "Automatisk opdagelse af netværksstatus." -#: ../src/features_window.py:64 +#: ../src/features_window.py:66 msgid "Requires gnome-network-manager and python-dbus." msgstr "Kræver gnome-network-manager og python-dbus." -#: ../src/features_window.py:66 +#: ../src/features_window.py:68 msgid "Session Management" msgstr "Sessions Håndtering" -#: ../src/features_window.py:67 +#: ../src/features_window.py:69 msgid "Gajim session is stored on logout and restored on login." msgstr "Gajim sessionen bliver gemt ved logud og genoprettet ved logind." -#: ../src/features_window.py:68 +#: ../src/features_window.py:70 msgid "Requires python-gnome2." msgstr "Kræver python-gnome2." -#: ../src/features_window.py:70 -#, fuzzy +#: ../src/features_window.py:72 msgid "Password encryption" -msgstr "Adgangskode for at slutte sig til rummet" +msgstr "Adgangskodekryptering" -#: ../src/features_window.py:71 +#: ../src/features_window.py:73 msgid "Passwords can be stored securely and not just in plaintext." msgstr "Adgangskoder kan blive gemt sikkert og ikke bare i ren tekst." -#: ../src/features_window.py:72 -#, fuzzy -msgid "Requires gnome-keyring and python-gnome2-desktop, or kwalletcli." -msgstr "Kræver gnome-keyring og python-gnome2-desktop." - #: ../src/features_window.py:74 +msgid "Requires gnome-keyring and python-gnome2-desktop, or kwalletcli." +msgstr "Kræver gnome-keyring og python-gnome2-desktop, eller kwalletcli." + +#: ../src/features_window.py:76 msgid "SRV" msgstr "SRV" -#: ../src/features_window.py:75 +#: ../src/features_window.py:77 msgid "Ability to connect to servers which are using SRV records." msgstr "Evnen til at tilslutte til servere som bruger SRV poster." -#: ../src/features_window.py:76 +#: ../src/features_window.py:78 msgid "Requires dnsutils." msgstr "Kræver dnsutils." -#: ../src/features_window.py:77 +#: ../src/features_window.py:79 msgid "Requires nslookup to use SRV records." msgstr "Kræver nslookup for at bruge SRV poster." -#: ../src/features_window.py:78 +#: ../src/features_window.py:80 msgid "Spell Checker" msgstr "Stavekontrol" -#: ../src/features_window.py:79 +#: ../src/features_window.py:81 msgid "Spellchecking of composed messages." msgstr "Stavekontrol af forfattede beskeder." -#: ../src/features_window.py:80 -#, fuzzy -msgid "Requires libgtkspell." -msgstr "Kræver python-sexy." - #: ../src/features_window.py:82 -#, fuzzy -msgid "Notification" -msgstr "Påmindelser" +msgid "Requires libgtkspell." +msgstr "Kræver libgtkspell." -#: ../src/features_window.py:83 +#: ../src/features_window.py:84 +msgid "Notification" +msgstr "Påmindelse" + +#: ../src/features_window.py:85 msgid "Passive popups notifying for new events." msgstr "Passive pop op vinduer som påminder om nye hændelser." -#: ../src/features_window.py:84 +#: ../src/features_window.py:86 msgid "" "Requires python-notify or instead python-dbus in conjunction with " "notification-daemon." msgstr "" "Kræver python-notify eller python-dbus i forbindelse med påmindelses-dæmonen." -#: ../src/features_window.py:86 -msgid "Trayicon" -msgstr "Statusikon" - -#: ../src/features_window.py:87 -msgid "A icon in systemtray reflecting the current presence." -msgstr "Et ikon i statusfeltet som viser din nuværende tilstedeværelse." - #: ../src/features_window.py:88 -msgid "" -"Requires python-gnome2-extras or compiled trayicon module from Gajim sources." -msgstr "" -"Kræver python-gnome2-extras eller et kompileret statusikon modul fra Gajim " -"kildekoden." +msgid "Automatic status" +msgstr "Automatisk status" #: ../src/features_window.py:89 -msgid "Requires PyGTK >= 2.10." -msgstr "Kræver PyGTK >= 2.10." - -#: ../src/features_window.py:90 -#, fuzzy -msgid "Automatic status" -msgstr "_Tilpas til status" - -#: ../src/features_window.py:91 msgid "Ability to measure idle time, in order to set auto status." msgstr "Evnen til at måle tomgangs tid, for at kunne sætte automatisk status." -#: ../src/features_window.py:92 +#: ../src/features_window.py:90 msgid "Requires libxss library." -msgstr "" +msgstr "Biblioteket libxss kræves" -#: ../src/features_window.py:93 -#, fuzzy +#: ../src/features_window.py:91 msgid "Requires python2.5." -msgstr "Kræver python-gnome2." +msgstr "Kræver python2.5." -#: ../src/features_window.py:94 +#: ../src/features_window.py:92 msgid "LaTeX" msgstr "LaTeX" -#: ../src/features_window.py:95 +#: ../src/features_window.py:93 msgid "Transform LaTeX expressions between $$ $$." msgstr "Omdan LaTeX udtryk mellem $$ $$." -#: ../src/features_window.py:96 +#: ../src/features_window.py:94 msgid "" "Requires texlive-latex-base and dvipng. You have to set 'use_latex' to True " "in the Advanced Configuration Editor." @@ -7565,7 +7546,7 @@ msgstr "" "Kræver texlive-latex-base og dvipng. Du må sætte 'use_latex' til True i den " "avancerede konfigurations editor." -#: ../src/features_window.py:97 +#: ../src/features_window.py:95 msgid "" "Requires texlive-latex-base and dvipng (All is in MikTeX). You have to set " "'use_latex' to True in the Advanced Configuration Editor." @@ -7573,25 +7554,23 @@ msgstr "" "Kræver texlive-latex-base og dvipng (begge findes i MikTeX). Du må sætte " "'use_latex' til True i den avancerede konfigurations editor." -#: ../src/features_window.py:98 -#, fuzzy +#: ../src/features_window.py:96 msgid "End to End message encryption" -msgstr "Ende til Ende Kryptering" +msgstr "Ende til Ende besked kryptering" -#: ../src/features_window.py:99 -#, fuzzy +#: ../src/features_window.py:97 msgid "Encrypting chat messages." msgstr "Krypterer samtale beskeder." -#: ../src/features_window.py:100 ../src/features_window.py:101 +#: ../src/features_window.py:98 ../src/features_window.py:99 msgid "Requires python-crypto." msgstr "Kræver python-crypto." -#: ../src/features_window.py:102 +#: ../src/features_window.py:100 msgid "RST Generator" msgstr "RST Generator" -#: ../src/features_window.py:103 +#: ../src/features_window.py:101 msgid "" "Generate XHTML output from RST code (see http://docutils.sourceforge.net/" "docs/ref/rst/restructuredtext.html)." @@ -7599,25 +7578,38 @@ msgstr "" "Generer XHTML uddata fra RST kode (se http://docutils.sourceforge.net/docs/" "ref/rst/restructuredtext.html)." -#: ../src/features_window.py:104 ../src/features_window.py:105 +#: ../src/features_window.py:102 ../src/features_window.py:103 msgid "Requires python-docutils." msgstr "Kræver python-docutils." -#: ../src/features_window.py:106 +#: ../src/features_window.py:104 msgid "Banners and clickable links" -msgstr "" +msgstr "Bannere og klikbare links" -#: ../src/features_window.py:107 +#: ../src/features_window.py:105 msgid "Ability to have clickable URLs in chat and groupchat window banners." msgstr "" "Muligheden for at have trykbare URL'er i samtale og gruppe samtale vindues " "bannere." -#: ../src/features_window.py:108 ../src/features_window.py:109 +#: ../src/features_window.py:106 ../src/features_window.py:107 msgid "Requires python-sexy." msgstr "Kræver python-sexy." -#: ../src/features_window.py:123 +#: ../src/features_window.py:108 +msgid "Audio / Video" +msgstr "" + +#: ../src/features_window.py:109 +msgid "Ability to start audio and video chat." +msgstr "" + +#: ../src/features_window.py:110 +#, fuzzy +msgid "Requires python-farsight." +msgstr "Kræver python-avahi." + +#: ../src/features_window.py:125 msgid "Feature" msgstr "Egenskab" @@ -7633,107 +7625,106 @@ msgstr "Tid" msgid "Progress" msgstr "Fremgang" -#: ../src/filetransfers_window.py:173 ../src/filetransfers_window.py:227 +#: ../src/filetransfers_window.py:177 ../src/filetransfers_window.py:233 #, python-format msgid "Filename: %s" msgstr "Filnavn: %s" -#: ../src/filetransfers_window.py:174 ../src/filetransfers_window.py:313 +#: ../src/filetransfers_window.py:178 ../src/filetransfers_window.py:323 #, python-format msgid "Size: %s" msgstr "Størrelse: %s" #. You is a reply of who sent a file #. You is a reply of who received a file -#: ../src/filetransfers_window.py:183 ../src/filetransfers_window.py:193 -#: ../src/history_manager.py:520 +#: ../src/filetransfers_window.py:187 ../src/filetransfers_window.py:197 +#: ../src/history_manager.py:529 msgid "You" msgstr "Du" -#: ../src/filetransfers_window.py:184 +#: ../src/filetransfers_window.py:188 #, python-format msgid "Sender: %s" msgstr "Afsender: %s" -#: ../src/filetransfers_window.py:185 ../src/filetransfers_window.py:596 -#: ../src/tooltips.py:670 +#: ../src/filetransfers_window.py:189 ../src/filetransfers_window.py:617 +#: ../src/tooltips.py:651 msgid "Recipient: " msgstr "Modtager: " -#: ../src/filetransfers_window.py:196 +#: ../src/filetransfers_window.py:200 #, python-format msgid "Saved in: %s" msgstr "Gemt i: %s" -#: ../src/filetransfers_window.py:198 +#: ../src/filetransfers_window.py:202 msgid "File transfer completed" msgstr "Filoverførsel er fuldført" -#: ../src/filetransfers_window.py:212 ../src/filetransfers_window.py:218 +#: ../src/filetransfers_window.py:217 ../src/filetransfers_window.py:224 msgid "File transfer cancelled" msgstr "Filoverførsel er afbrudt" -#: ../src/filetransfers_window.py:212 ../src/filetransfers_window.py:219 +#: ../src/filetransfers_window.py:217 ../src/filetransfers_window.py:225 msgid "Connection with peer cannot be established." msgstr "Tilslutning til ligeværdige kan ikke oprettes." -#: ../src/filetransfers_window.py:228 +#: ../src/filetransfers_window.py:234 #, python-format msgid "Recipient: %s" msgstr "Modtager: %s" -#: ../src/filetransfers_window.py:230 +#: ../src/filetransfers_window.py:236 #, python-format msgid "Error message: %s" msgstr "Fejl besked: %s" -#: ../src/filetransfers_window.py:231 -#, fuzzy +#: ../src/filetransfers_window.py:237 msgid "File transfer stopped" -msgstr "Filoverførsel Stoppede" +msgstr "Filoverførsel stoppede" -#: ../src/filetransfers_window.py:251 +#: ../src/filetransfers_window.py:257 msgid "Choose File to Send..." msgstr "Vælg en Fil at Sende..." -#: ../src/filetransfers_window.py:267 ../src/tooltips.py:708 +#: ../src/filetransfers_window.py:273 ../src/tooltips.py:689 msgid "Description: " msgstr "Beskrivelse: " -#: ../src/filetransfers_window.py:278 +#: ../src/filetransfers_window.py:286 msgid "Gajim cannot access this file" msgstr "Gajim kan ikke tilgå denne fil" -#: ../src/filetransfers_window.py:279 +#: ../src/filetransfers_window.py:287 msgid "This file is being used by another process." msgstr "Denne fil bliver brugt af en anden proces." -#: ../src/filetransfers_window.py:310 +#: ../src/filetransfers_window.py:320 #, python-format msgid "File: %s" msgstr "Fil: %s" -#: ../src/filetransfers_window.py:316 +#: ../src/filetransfers_window.py:326 #, python-format msgid "Type: %s" msgstr "Type: %s" -#: ../src/filetransfers_window.py:318 +#: ../src/filetransfers_window.py:328 #, python-format msgid "Description: %s" msgstr "Beskrivelse: %s" -#: ../src/filetransfers_window.py:319 +#: ../src/filetransfers_window.py:329 #, python-format msgid "%s wants to send you a file:" msgstr "%s vil gerne sende dig en fil:" -#: ../src/filetransfers_window.py:332 ../src/gtkgui_helpers.py:812 +#: ../src/filetransfers_window.py:342 ../src/gtkgui_helpers.py:858 #, python-format msgid "Cannot overwrite existing file \"%s\"" msgstr "Kan ikke overskrive den eksisterende fil \"%s\"" -#: ../src/filetransfers_window.py:333 ../src/gtkgui_helpers.py:814 +#: ../src/filetransfers_window.py:343 ../src/gtkgui_helpers.py:860 msgid "" "A file with this name already exists and you do not have permission to " "overwrite it." @@ -7741,33 +7732,33 @@ msgstr "" "En fil med dette navn eksisterer allerede og du har ikke rettigheder til at " "overskrive den." -#: ../src/filetransfers_window.py:349 ../src/gtkgui_helpers.py:818 +#: ../src/filetransfers_window.py:359 ../src/gtkgui_helpers.py:864 msgid "This file already exists" msgstr "Denne fil eksisterer allerede" -#: ../src/filetransfers_window.py:349 ../src/gtkgui_helpers.py:818 +#: ../src/filetransfers_window.py:359 ../src/gtkgui_helpers.py:864 msgid "What do you want to do?" msgstr "Hvad vil du gøre?" #. read-only bit is used to mark special folder under windows, #. not to mark that a folder is read-only. See ticket #3587 -#: ../src/filetransfers_window.py:359 ../src/gtkgui_helpers.py:825 +#: ../src/filetransfers_window.py:369 ../src/gtkgui_helpers.py:871 #, python-format msgid "Directory \"%s\" is not writable" msgstr "Kataloget \"%s\" er ikke skrivbart" -#: ../src/filetransfers_window.py:359 ../src/gtkgui_helpers.py:826 +#: ../src/filetransfers_window.py:369 ../src/gtkgui_helpers.py:872 msgid "You do not have permission to create files in this directory." msgstr "Du har ikke rettigheder til at oprette filer i dette katalog." -#: ../src/filetransfers_window.py:369 +#: ../src/filetransfers_window.py:379 msgid "Save File as..." msgstr "Gem Fil som..." #. Print remaining time in format 00:00:00 #. You can change the places of (hours), (minutes), (seconds) - #. they are not translatable. -#: ../src/filetransfers_window.py:435 +#: ../src/filetransfers_window.py:449 #, python-format msgid "%(hours)02.d:%(minutes)02.d:%(seconds)02.d" msgstr "%(hours)02.d:%(minutes)02.d:%(seconds)02.d" @@ -7775,32 +7766,32 @@ msgstr "%(hours)02.d:%(minutes)02.d:%(seconds)02.d" #. This should make the string Kb/s, #. where 'Kb' part is taken from %s. #. Only the 's' after / (which means second) should be translated. -#: ../src/filetransfers_window.py:526 +#: ../src/filetransfers_window.py:542 #, python-format msgid "(%(filesize_unit)s/s)" msgstr "(%(filesize_unit)s/s)" -#: ../src/filetransfers_window.py:566 ../src/filetransfers_window.py:569 +#: ../src/filetransfers_window.py:585 ../src/filetransfers_window.py:588 msgid "Invalid File" msgstr "Ugyldig Fil" -#: ../src/filetransfers_window.py:566 +#: ../src/filetransfers_window.py:585 msgid "File: " msgstr "Fil: " -#: ../src/filetransfers_window.py:570 +#: ../src/filetransfers_window.py:589 msgid "It is not possible to send empty files" msgstr "Det er ikke mulig at sende tomme filer" -#: ../src/filetransfers_window.py:592 ../src/tooltips.py:660 +#: ../src/filetransfers_window.py:613 ../src/tooltips.py:641 msgid "Name: " msgstr "Navn: " -#: ../src/filetransfers_window.py:594 ../src/tooltips.py:664 +#: ../src/filetransfers_window.py:615 ../src/tooltips.py:645 msgid "Sender: " msgstr "Afsender: " -#: ../src/filetransfers_window.py:781 +#: ../src/filetransfers_window.py:809 msgid "Pause" msgstr "Pause" @@ -7811,27 +7802,23 @@ msgstr "Gajim behøver en X server for at kunne køre. Slutter..." #: ../src/gajim.py:141 #, python-format msgid "importing PyGTK failed: %s" -msgstr "" +msgstr "importering af PyGTK fejlede: %s" #: ../src/gajim.py:180 -#, fuzzy msgid "Gajim needs PyGTK 2.12 or above" -msgstr "Gajim behøver PyGTK 2.8 eller højere" +msgstr "Gajim behøver PyGTK 2.12 eller højere" #: ../src/gajim.py:181 -#, fuzzy msgid "Gajim needs PyGTK 2.12 or above to run. Quiting..." -msgstr "Gajim behøver PyGTK 2.8 eller højere for at køre. Slutter..." +msgstr "Gajim behøver PyGTK 2.12 eller højere for at køre. Slutter..." #: ../src/gajim.py:183 -#, fuzzy msgid "Gajim needs GTK 2.12 or above" -msgstr "Gajim behøver GTK 2.8 eller højere" +msgstr "Gajim behøver GTK 2.12 eller højere" #: ../src/gajim.py:184 -#, fuzzy msgid "Gajim needs GTK 2.12 or above to run. Quiting..." -msgstr "Gajim behøver GTK 2.8 eller højere for at køre. Slutter..." +msgstr "Gajim behøver GTK 2.12 eller højere for at køre. Slutter..." #: ../src/gajim.py:189 msgid "GTK+ runtime is missing libglade support" @@ -7871,11 +7858,11 @@ msgstr "" "det fra %s" #. set the icon to all newly opened wind -#: ../src/gajim.py:354 +#: ../src/gajim.py:328 msgid "Gajim is already running" msgstr "Gajim kører allerede" -#: ../src/gajim.py:355 +#: ../src/gajim.py:329 msgid "" "Another instance of Gajim seems to be running\n" "Run anyway?" @@ -7883,466 +7870,28 @@ msgstr "" "En anden instans af Gajim ser ud til at køre\n" "Kør alligevel?" -#: ../src/gajim.py:440 -msgid "Passphrase Required" -msgstr "Adgangskode Påkrævet" - -#: ../src/gajim.py:441 -#, python-format -msgid "Enter GPG key passphrase for key %(keyid)s (account %(account)s)." -msgstr "Indtast adgangskoden til GPG nøglen %(keyid)s (Konto %(account)s)." - -#: ../src/gajim.py:455 -#, fuzzy -msgid "GPG key expired" -msgstr "Ingen GPG nøgle valgt" - -#: ../src/gajim.py:456 -#, fuzzy, python-format -msgid "Your GPG key has expied, you will be connected to %s without OpenPGP." -msgstr "Du vil blive tilsluttet til %s uden OpenPGP." - -#. ask again -#: ../src/gajim.py:465 -msgid "Wrong Passphrase" -msgstr "Forkert Adgangskode" - -#: ../src/gajim.py:466 -msgid "Please retype your GPG passphrase or press Cancel." -msgstr "Indtast din GPG adgangskode igen eller annuller." - -#: ../src/gajim.py:524 -#, python-format -msgid "" -"Your desired nickname in group chat %s is in use or registered by another " -"occupant.\n" -"Please specify another nickname below:" -msgstr "" -"Dit ønskede kælenavn i gruppesamtalen %s er i brug eller registreret af en " -"anden indehaver.\n" -"Specificer venligst et andet kælenavn under:" - -#: ../src/gajim.py:527 -msgid "Always use this nickname when there is a conflict" -msgstr "" - -#: ../src/gajim.py:544 -msgid "Do you accept this request?" -msgstr "Accepterer du denne forespørsel?" - -#: ../src/gajim.py:546 -#, python-format -msgid "Do you accept this request on account %s?" -msgstr "Accepterer du denne forespørgsel for konto %s?" - -#: ../src/gajim.py:549 -#, python-format -msgid "HTTP (%(method)s) Authorization for %(url)s (id: %(id)s)" -msgstr "HTTP (%(method)s) Autorisering for %(url)s (id: %(id)s)" - -#: ../src/gajim.py:600 ../src/notify.py:511 -msgid "Connection Failed" -msgstr "Tilslutning Fejlede" - -#: ../src/gajim.py:933 ../src/gajim.py:937 -#, python-format -msgid "Error %(code)s: %(msg)s" -msgstr "Fejl %(code)s: %(msg)s" - -#. ('MSGNOTSENT', account, (jid, ierror_msg, msg, time, session)) -#: ../src/gajim.py:947 ../src/gajim.py:961 -#, python-format -msgid "error while sending %(message)s ( %(error)s )" -msgstr "fejl opstod under sending %(message)s ( %(error)s )" - -#: ../src/gajim.py:988 ../src/notify.py:513 -#, fuzzy -msgid "Subscription request" -msgstr "Abonnement Forespørgsel" - -#: ../src/gajim.py:1013 -msgid "Authorization accepted" -msgstr "Autorisering accepteret" - -#: ../src/gajim.py:1014 -#, python-format -msgid "The contact \"%s\" has authorized you to see his or her status." -msgstr "Kontakten \"%s\" har godkendt dig til at se hans eller hendes status." - -#: ../src/gajim.py:1026 -#, python-format -msgid "Contact \"%s\" removed subscription from you" -msgstr "Kontakt \"%s\" har fjernet abonneringen på dig" - -#: ../src/gajim.py:1027 -msgid "" -"You will always see him or her as offline.\n" -"Do you want to remove him or her from your contact list?" -msgstr "" -"Du vil altid se ham eller hende som offline.\n" -"Vil du fjerne ham eller hende fra din kontakt liste?" - -#: ../src/gajim.py:1052 ../src/notify.py:515 -#, fuzzy -msgid "Unsubscribed" -msgstr "_Frameld abonnement" - -#: ../src/gajim.py:1093 -#, python-format -msgid "Contact with \"%s\" cannot be established" -msgstr "Kontakt med \"%s\" kan ikke blive etableret" - -#: ../src/gajim.py:1283 ../src/groupchat_control.py:1251 -#, python-format -msgid "%(nick)s is now known as %(new_nick)s" -msgstr "%(nick)s er nu kendt som %(new_nick)s" - -#: ../src/gajim.py:1308 ../src/groupchat_control.py:1436 -#: ../src/history_window.py:431 ../src/notify.py:244 -#, python-format -msgid "%(nick)s is now %(status)s" -msgstr "%(nick)s er nu %(status)s" - -#: ../src/gajim.py:1375 -#, python-format -msgid "%(jid)s has set the subject to %(subject)s" -msgstr "%(jid)s har sat emnet til %(subject)s" - -#. Can be a presence (see chg_contact_status in groupchat_control.py) -#. Can be a message (see handle_event_gc_config_change in gajim.py) -#: ../src/gajim.py:1439 ../src/groupchat_control.py:1191 -msgid "Any occupant is allowed to see your full JID" -msgstr "En hvilken som helst deltager har lov til at se din fulde JID" - -#: ../src/gajim.py:1442 -msgid "Room now shows unavailable member" -msgstr "Rummet viser nu; ikke tilgængelige medlemmer" - -#: ../src/gajim.py:1444 -msgid "room now does not show unavailable members" -msgstr "Rummet viser nu ikke; ikke tilgængelige medlemmer" - -#: ../src/gajim.py:1447 -msgid "A non-privacy-related room configuration change has occurred" -msgstr "En ændring i en non-privacy-related rum konfiguration har forekommet" - -#. Can be a presence (see chg_contact_status in groupchat_control.py) -#: ../src/gajim.py:1450 -msgid "Room logging is now enabled" -msgstr "Rum logging er nu aktiveret" - -#: ../src/gajim.py:1452 -msgid "Room logging is now disabled" -msgstr "Rum logging er nu deaktiveret" - -#: ../src/gajim.py:1454 -msgid "Room is now non-anonymous" -msgstr "Rummet er nu ikke-anonymt" - -#: ../src/gajim.py:1457 -msgid "Room is now semi-anonymous" -msgstr "Rummet er nu semi-anonymt" - -#: ../src/gajim.py:1460 -msgid "Room is now fully-anonymous" -msgstr "Rummet er nu helt anonymt" - -#: ../src/gajim.py:1492 -#, python-format -msgid "A Password is required to join the room %s. Please type it." -msgstr "" -"En adgangskode er påkrævet for at deltage i rummet %s. Venligst skriv den." - -#: ../src/gajim.py:1526 -msgid "" -"You configured Gajim to use GPG agent, but there is no GPG agent running or " -"it returned a wrong passphrase.\n" -msgstr "" -"Du har konfigureret Gajim til at bruge GPG agenten, men der er ingen GPG " -"agent som kører eller den returnerede en forkert gpg-løsen.\n" - -#: ../src/gajim.py:1528 ../src/gajim.py:1534 -msgid "You are currently connected without your OpenPGP key." -msgstr "Du er for øjeblikket tilsluttet uden din OpenPGP nøgle." - -#: ../src/gajim.py:1529 -msgid "Your passphrase is incorrect" -msgstr "Dit pgp-løsen er ikke korrekt" - -#: ../src/gajim.py:1533 -#, fuzzy -msgid "OpenGPG Passphrase Incorrect" -msgstr "Dit pgp-løsen er ikke korrekt" - -#: ../src/gajim.py:1559 -#, fuzzy -msgid "GPG key not trusted" -msgstr "GPG er ikke brugbar" - -#: ../src/gajim.py:1559 -#, fuzzy -msgid "" -"The GPG key used to encrypt this chat is not trusted. Do you really want to " -"encrypt this message?" -msgstr "" -"Ingen GPG nøgle er tildelt denne kontakt. Derfor kan du ikke kryptere " -"beskeder." - -#: ../src/gajim.py:1561 ../src/gajim.py:2227 ../src/gajim.py:2262 -#: ../src/groupchat_control.py:1674 ../src/message_window.py:222 -#: ../src/roster_window.py:2667 ../src/roster_window.py:3292 -#: ../src/roster_window.py:3970 -msgid "Do _not ask me again" -msgstr "Ikke spørg mig ige_n" - -#: ../src/gajim.py:1571 -#, fuzzy -msgid "" -"Gnome Keyring is installed but not \t\t\t\tcorrectly started (environment " -"variable probably not \t\t\t\tcorrectly set)" -msgstr "" -"Gnomes Nøglering er installeret men ikke \t\t\t\t\t\t\t startet korrekt " -"(miljøvariabel er sandsynligvis ikke \t\t\t\t\t\t\t sat op rigtig)" - -#: ../src/gajim.py:1681 -#, python-format -msgid "New mail on %(gmail_mail_address)s" -msgstr "Ny e-post på %(gmail_mail_address)s" - -#: ../src/gajim.py:1683 -#, python-format -msgid "You have %d new mail conversation" -msgid_plural "You have %d new mail conversations" -msgstr[0] "Du har %d ny e-post samtale" -msgstr[1] "Du har %d nye e-post samtaler" - -#: ../src/gajim.py:1696 -#, python-format -msgid "" -"\n" -"\n" -"From: %(from_address)s\n" -"Subject: %(subject)s\n" -"%(snippet)s" -msgstr "" -"\n" -"\n" -"Fra: %(from_address)s\n" -"Emne: %(subject)s\n" -"%(snippet)s" - -#: ../src/gajim.py:1767 -#, python-format -msgid "%s wants to send you a file." -msgstr "%s vil gerne sende dig en fil." - -#: ../src/gajim.py:1805 ../src/roster_window.py:1851 -#, fuzzy -msgid "Remote contact stopped transfer" -msgstr "Fjerner kontakt fra kontaktvinduet" - -#: ../src/gajim.py:1807 ../src/roster_window.py:1853 -#, fuzzy -msgid "Error opening file" -msgstr "Fejl ved læsning af fil:" - -#: ../src/gajim.py:1838 -#, python-format -msgid "You successfully received %(filename)s from %(name)s." -msgstr "Du har succesfuldt modtaget %(filename)s fra %(name)s" - -#. ft stopped -#: ../src/gajim.py:1842 -#, python-format -msgid "File transfer of %(filename)s from %(name)s stopped." -msgstr "Filoverførsel af %(filename)s fra %(name)s er stoppet." - -#: ../src/gajim.py:1855 -#, python-format -msgid "You successfully sent %(filename)s to %(name)s." -msgstr "Du har succesfuldt sendt %(filename)s til %(name)s." - -#. ft stopped -#: ../src/gajim.py:1859 -#, python-format -msgid "File transfer of %(filename)s to %(name)s stopped." -msgstr "Filoverførsel af %(filename)s til %(name)s er stoppet." - -#: ../src/gajim.py:1961 -#, python-format -msgid "" -"Unable to decrypt message from %s\n" -"It may have been tampered with." -msgstr "" -"Ikke i stand til at dekryptere beskeden fra %s\n" -"Det er mulig den er blevet forfalsket." - -#: ../src/gajim.py:1968 -msgid "Unable to decrypt message" -msgstr "Ikke i stand til at dekryptere beskeden" - -#: ../src/gajim.py:2042 -msgid "Username Conflict" -msgstr "Brugernavns Konflikt" - -#: ../src/gajim.py:2043 -msgid "Please type a new username for your local account" -msgstr "Skriv et nyt brugernavn for din lokale konto" - -#: ../src/gajim.py:2055 -msgid "Ping?" -msgstr "Ping?" - -#: ../src/gajim.py:2068 -#, python-format -msgid "Pong! (%s s.)" -msgstr "Pong! (%s .s)" - -#: ../src/gajim.py:2079 -msgid "Error." -msgstr "Fejl." - -#: ../src/gajim.py:2106 -msgid "Resource Conflict" -msgstr "Ressource Konflikt" - -#: ../src/gajim.py:2107 -msgid "" -"You are already connected to this account with the same resource. Please " -"type a new one" -msgstr "" -"Du er allerede tilsluttet til denne konto med den samme ressource. Skriv " -"venligst en ny" - -#: ../src/gajim.py:2166 -msgid "Error verifying SSL certificate" -msgstr "Fejl under verificering af SSL certifikat" - -#: ../src/gajim.py:2167 -#, python-format -msgid "" -"There was an error verifying the SSL certificate of your jabber server: %" -"(error)s\n" -"Do you still want to connect to this server?" -msgstr "" -"Der var en fejl under verificeringen af SSL certifikatet fra din jabber " -"server: %(error)s\n" -"Vil du stadig prøve på at forbinde til denne server?" - -#: ../src/gajim.py:2172 -msgid "Ignore this error for this certificate." -msgstr "Ignorer denne fejl for dette certifikat." - -#: ../src/gajim.py:2192 -msgid "SSL certificate error" -msgstr "SSL certifikat fejl" - -#: ../src/gajim.py:2193 -#, fuzzy, python-format -msgid "" -"It seems the SSL certificate of account %(account)s has changed or your " -"connection is being hacked.\n" -"Old fingerprint: %(old)s\n" -"New fingerprint: %(new)s\n" -"\n" -"Do you still want to connect and update the fingerprint of the certificate?" -msgstr "" -"Det ser ud til at SSL certifikatet er blevet ændret eller din forbindelse er " -"blevet kompromitteret\n" -"Gammelt fingeraftryk: %(old)s\n" -"Nyt fingeraftryk: %(new)s\n" -"\n" -"Vil du stadig forbinde og opdatere fingeraftrykket for certifikatet?" - -#: ../src/gajim.py:2223 ../src/gajim.py:2258 -msgid "Insecure connection" -msgstr "Ikke sikker forbindelse" - -#: ../src/gajim.py:2224 -msgid "" -"You are about to send your password on an unencrypted connection. Are you " -"sure you want to do that?" -msgstr "" -"Du er ved at sende din adgangskode over en ikke krypteret forbindelse. Er du " -"sikker på du vil gøre dette?" - -#: ../src/gajim.py:2226 ../src/gajim.py:2261 -msgid "Yes, I really want to connect insecurely" -msgstr "Ja, jeg vil virkelig gerne tilslutte mig uden sikkerhed" - -#: ../src/gajim.py:2259 -msgid "" -"You are about to send your password on an insecure connection. You should " -"install PyOpenSSL to prevent that. Are you sure you want to do that?" -msgstr "" -"Du er ved at sende din adgangskode på en usikker forbindelse. Du bør " -"installere PyOpenSSL for at forhindre dette. Er du sikker på du vil gøre " -"dette?" - -#: ../src/gajim.py:2279 -msgid "PEP node was not removed" -msgstr "PEP knude blev ikke fjernet" - -#: ../src/gajim.py:2280 -#, python-format -msgid "PEP node %(node)s was not removed: %(message)s" -msgstr "PEP knude %(node)s blev ikke fjernet: %(message)s" - -#. theme doesn't exist, disable emoticons -#: ../src/gajim.py:2784 ../src/gajim.py:2806 -msgid "Emoticons disabled" -msgstr "Følelsesikoner er ikke aktiveret" - -#: ../src/gajim.py:2785 -msgid "" -"Your configured emoticons theme has not been found, so emoticons have been " -"disabled." -msgstr "" -"Dit konfigurerede følelsesikon tema blev ikke fundet, så følelsesikoner er " -"blevet deaktiveret." - -#: ../src/gajim.py:2807 -msgid "" -"Your configured emoticons theme cannot been loaded. You maybe need to update " -"the format of emoticons.py file. See http://trac.gajim.org/wiki/Emoticons " -"for more details." -msgstr "" -"Dit konfigurerede følelsesikon tema kan ikke findes. Du er måske nød til at " -"opdatere formatet for filen emoticons.py. Se http://trac.gajim.org/wiki/" -"Emoticons for flere detaljer." - -#: ../src/gajim.py:2833 ../src/roster_window.py:3432 -msgid "You cannot join a group chat while you are invisible" -msgstr "Du kan ikke deltage i en gruppe samtale mens du er usynlig" - -#. it is good to notify the user -#. in case he or she cannot see the output of the console -#: ../src/gajim.py:3202 -msgid "Could not save your settings and preferences" -msgstr "Kunne ikke gemme din opsætning og indstillinger" - -#: ../src/gajim-remote.py:78 +#: ../src/gajim-remote.py:77 msgid "Shows a help on specific command" msgstr "Viser hjælp for en specifik kommando" #. User gets help for the command, specified by this parameter -#: ../src/gajim-remote.py:81 +#: ../src/gajim-remote.py:80 msgid "command" msgstr "Kommando" -#: ../src/gajim-remote.py:82 +#: ../src/gajim-remote.py:81 msgid "show help on command" msgstr "Vis hjælp for kommando" -#: ../src/gajim-remote.py:86 +#: ../src/gajim-remote.py:85 msgid "Shows or hides the roster window" msgstr "Viser eller gemmer kontaktvinduet" -#: ../src/gajim-remote.py:90 +#: ../src/gajim-remote.py:89 msgid "Pops up a window with the next pending event" msgstr "Popper op et vindue ved næste hændelse" -#: ../src/gajim-remote.py:94 +#: ../src/gajim-remote.py:93 msgid "" "Prints a list of all contacts in the roster. Each contact appears on a " "separate line" @@ -8350,49 +7899,49 @@ msgstr "" "Udskriver en liste af alle kontakter i kontaktvinduet. Hver kontakt placeres " "på en separat linie" -#: ../src/gajim-remote.py:97 ../src/gajim-remote.py:112 -#: ../src/gajim-remote.py:122 ../src/gajim-remote.py:132 -#: ../src/gajim-remote.py:148 ../src/gajim-remote.py:162 -#: ../src/gajim-remote.py:171 ../src/gajim-remote.py:192 -#: ../src/gajim-remote.py:222 ../src/gajim-remote.py:231 -#: ../src/gajim-remote.py:238 ../src/gajim-remote.py:245 -#: ../src/gajim-remote.py:256 ../src/gajim-remote.py:272 -#: ../src/gajim-remote.py:283 +#: ../src/gajim-remote.py:96 ../src/gajim-remote.py:111 +#: ../src/gajim-remote.py:121 ../src/gajim-remote.py:131 +#: ../src/gajim-remote.py:147 ../src/gajim-remote.py:161 +#: ../src/gajim-remote.py:170 ../src/gajim-remote.py:191 +#: ../src/gajim-remote.py:221 ../src/gajim-remote.py:230 +#: ../src/gajim-remote.py:237 ../src/gajim-remote.py:244 +#: ../src/gajim-remote.py:255 ../src/gajim-remote.py:271 +#: ../src/gajim-remote.py:282 msgid "account" msgstr "Konto" -#: ../src/gajim-remote.py:97 +#: ../src/gajim-remote.py:96 msgid "show only contacts of the given account" msgstr "viser kun kontakter for den givne konto" -#: ../src/gajim-remote.py:103 +#: ../src/gajim-remote.py:102 msgid "Prints a list of registered accounts" msgstr "Udskriver en liste af registrerede kontoer" -#: ../src/gajim-remote.py:107 +#: ../src/gajim-remote.py:106 msgid "Changes the status of account or accounts" msgstr "Ændrer status for kontoen eller kontoer" #. offline, online, chat, away, xa, dnd, invisible should not be translated -#: ../src/gajim-remote.py:110 +#: ../src/gajim-remote.py:109 msgid "status" msgstr "status" -#: ../src/gajim-remote.py:110 +#: ../src/gajim-remote.py:109 msgid "one of: offline, online, chat, away, xa, dnd, invisible " msgstr "en af: offline, online, chat, away, xa, dnd, invisible" -#: ../src/gajim-remote.py:111 ../src/gajim-remote.py:134 -#: ../src/gajim-remote.py:145 ../src/gajim-remote.py:159 -#: ../src/gajim-remote.py:170 ../src/gajim-remote.py:274 +#: ../src/gajim-remote.py:110 ../src/gajim-remote.py:133 +#: ../src/gajim-remote.py:144 ../src/gajim-remote.py:158 +#: ../src/gajim-remote.py:169 ../src/gajim-remote.py:273 msgid "message" msgstr "besked" -#: ../src/gajim-remote.py:111 +#: ../src/gajim-remote.py:110 msgid "status message" msgstr "status besked" -#: ../src/gajim-remote.py:112 +#: ../src/gajim-remote.py:111 msgid "" "change status of account \"account\". If not specified, try to change status " "of all accounts that have \"sync with global status\" option set" @@ -8401,49 +7950,44 @@ msgstr "" "status for alle kontoer der har sat \"synkroniser med generel status\" " "indstillingen" -#: ../src/gajim-remote.py:118 -#, fuzzy +#: ../src/gajim-remote.py:117 msgid "Changes the priority of account or accounts" -msgstr "Ændrer status for kontoen eller kontoer" +msgstr "Ændrer prioriteringen for kontoen eller kontoer" -#: ../src/gajim-remote.py:120 -#, fuzzy +#: ../src/gajim-remote.py:119 msgid "priority" -msgstr "Priori_tet:" +msgstr "prioritet" -#: ../src/gajim-remote.py:120 -#, fuzzy +#: ../src/gajim-remote.py:119 msgid "priority you want to give to the account" -msgstr "Jeg vil _registrere en ny konto" +msgstr "prioriteten du vil give til kontoen" -#: ../src/gajim-remote.py:122 -#, fuzzy +#: ../src/gajim-remote.py:121 msgid "" "change the priority of the given account. If not specified, change status of " "all accounts that have \"sync with global status\" option set" msgstr "" -"Ændre status for konto \"konto\". Hvis ikke spesificeret, prøv at ændre " -"status for alle kontoer der har sat \"synkroniser med generel status\" " -"indstillingen" +"ændre prioritet for en given konto. Hvis ikke specificeret, ændrer status " +"for alle kontoer der har sat \"synkroniser med generel status\" indstillingen" -#: ../src/gajim-remote.py:128 +#: ../src/gajim-remote.py:127 msgid "Shows the chat dialog so that you can send messages to a contact" msgstr "Vis samtale vinduet så du kan sende beskeder til en kontakt" -#: ../src/gajim-remote.py:130 +#: ../src/gajim-remote.py:129 msgid "JID of the contact that you want to chat with" msgstr "Kontaktens JID som du vil samtale med" -#: ../src/gajim-remote.py:132 ../src/gajim-remote.py:222 +#: ../src/gajim-remote.py:131 ../src/gajim-remote.py:221 msgid "if specified, contact is taken from the contact list of this account" msgstr "" "hvis specificeret vil kontakten tages fra kontaktlisten fra denne konto" -#: ../src/gajim-remote.py:135 +#: ../src/gajim-remote.py:134 msgid "message content. The account must be specified or \"\"" -msgstr "" +msgstr "besked indhold. Kontoen må specificeres eller \"\"" -#: ../src/gajim-remote.py:140 +#: ../src/gajim-remote.py:139 msgid "" "Sends new chat message to a contact in the roster. Both OpenPGP key and " "account are optional. If you want to set only 'account', without 'OpenPGP " @@ -8453,29 +7997,29 @@ msgstr "" "konto er valgfri. Hvis du ønsker at sætte en 'konto' uden 'OpenPGP nøgle', " "bare set 'OpenPGP nøgle' til ''." -#: ../src/gajim-remote.py:144 ../src/gajim-remote.py:157 +#: ../src/gajim-remote.py:143 ../src/gajim-remote.py:156 msgid "JID of the contact that will receive the message" msgstr "JID på den kontakt som skal modtage beskeden" -#: ../src/gajim-remote.py:145 ../src/gajim-remote.py:159 -#: ../src/gajim-remote.py:170 +#: ../src/gajim-remote.py:144 ../src/gajim-remote.py:158 +#: ../src/gajim-remote.py:169 msgid "message contents" msgstr "besked indhold" -#: ../src/gajim-remote.py:146 ../src/gajim-remote.py:160 +#: ../src/gajim-remote.py:145 ../src/gajim-remote.py:159 msgid "pgp key" msgstr "pgp nøgle" -#: ../src/gajim-remote.py:146 ../src/gajim-remote.py:160 +#: ../src/gajim-remote.py:145 ../src/gajim-remote.py:159 msgid "if specified, the message will be encrypted using this public key" msgstr "hvis specificeret vil beskeden blive krypteret med denne nøgle" -#: ../src/gajim-remote.py:148 ../src/gajim-remote.py:162 -#: ../src/gajim-remote.py:171 +#: ../src/gajim-remote.py:147 ../src/gajim-remote.py:161 +#: ../src/gajim-remote.py:170 msgid "if specified, the message will be sent using this account" msgstr "hvis specificeret vil beskeden blive sendt med denne konto" -#: ../src/gajim-remote.py:153 +#: ../src/gajim-remote.py:152 msgid "" "Sends new single message to a contact in the roster. Both OpenPGP key and " "account are optional. If you want to set only 'account', without 'OpenPGP " @@ -8485,139 +8029,139 @@ msgstr "" "nøgle og konto er valgfri. Hvis du ønsker at sætte en 'konto' uden 'OpenPGP " "nøgle', bare set 'OpenPGP nøgle' til ''." -#: ../src/gajim-remote.py:158 +#: ../src/gajim-remote.py:157 msgid "subject" msgstr "emne" -#: ../src/gajim-remote.py:158 +#: ../src/gajim-remote.py:157 msgid "message subject" msgstr "emne på besked" -#: ../src/gajim-remote.py:167 +#: ../src/gajim-remote.py:166 msgid "Sends new message to a groupchat you've joined." msgstr "Send en ny besked til en gruppesamtale du deltager i." -#: ../src/gajim-remote.py:169 +#: ../src/gajim-remote.py:168 msgid "JID of the room that will receive the message" msgstr "JID på den rum som skal modtage beskeden" -#: ../src/gajim-remote.py:176 +#: ../src/gajim-remote.py:175 msgid "Gets detailed info on a contact" msgstr "Få detaljeret information om kontakten" -#: ../src/gajim-remote.py:178 ../src/gajim-remote.py:191 -#: ../src/gajim-remote.py:221 ../src/gajim-remote.py:230 +#: ../src/gajim-remote.py:177 ../src/gajim-remote.py:190 +#: ../src/gajim-remote.py:220 ../src/gajim-remote.py:229 msgid "JID of the contact" msgstr "Kontaktens JID" -#: ../src/gajim-remote.py:182 +#: ../src/gajim-remote.py:181 msgid "Gets detailed info on a account" msgstr "Få detaljeret information om kontoen" -#: ../src/gajim-remote.py:184 +#: ../src/gajim-remote.py:183 msgid "Name of the account" msgstr "Navn på kontoen" -#: ../src/gajim-remote.py:188 +#: ../src/gajim-remote.py:187 msgid "Sends file to a contact" msgstr "Send en fil til en kontakt" -#: ../src/gajim-remote.py:190 +#: ../src/gajim-remote.py:189 msgid "file" msgstr "fil" -#: ../src/gajim-remote.py:190 +#: ../src/gajim-remote.py:189 msgid "File path" msgstr "Filsti" -#: ../src/gajim-remote.py:192 +#: ../src/gajim-remote.py:191 msgid "if specified, file will be sent using this account" msgstr "hvis specificeret vil filen blive sendt med denne konto" -#: ../src/gajim-remote.py:197 +#: ../src/gajim-remote.py:196 msgid "Lists all preferences and their values" msgstr "Hvis alle indstillinger og deres værdier" -#: ../src/gajim-remote.py:201 +#: ../src/gajim-remote.py:200 msgid "Sets value of 'key' to 'value'." msgstr "Sætter værdien for 'nøglen' til 'værdi'." -#: ../src/gajim-remote.py:203 +#: ../src/gajim-remote.py:202 msgid "key=value" msgstr "nøgle=værdi" -#: ../src/gajim-remote.py:203 +#: ../src/gajim-remote.py:202 msgid "'key' is the name of the preference, 'value' is the value to set it to" msgstr "" "'nøgle' er navnet for indstillingen, 'værdi' er den værdi den er sat til" -#: ../src/gajim-remote.py:208 +#: ../src/gajim-remote.py:207 msgid "Deletes a preference item" msgstr "Sletter et indstillingspunkt" -#: ../src/gajim-remote.py:210 +#: ../src/gajim-remote.py:209 msgid "key" msgstr "nøgle" -#: ../src/gajim-remote.py:210 +#: ../src/gajim-remote.py:209 msgid "name of the preference to be deleted" msgstr "navn på den indstilling som skal slettes" -#: ../src/gajim-remote.py:214 +#: ../src/gajim-remote.py:213 msgid "Writes the current state of Gajim preferences to the .config file" msgstr "" "Skriver den nuværende tilstand af Gajims indstillinger til .config filen" -#: ../src/gajim-remote.py:219 +#: ../src/gajim-remote.py:218 msgid "Removes contact from roster" msgstr "Fjerner kontakt fra kontaktvinduet" -#: ../src/gajim-remote.py:228 +#: ../src/gajim-remote.py:227 msgid "Adds contact to roster" msgstr "Tilføjer kontakt til kontaktvinduet" -#: ../src/gajim-remote.py:230 +#: ../src/gajim-remote.py:229 msgid "jid" msgstr "jid" -#: ../src/gajim-remote.py:231 +#: ../src/gajim-remote.py:230 msgid "Adds new contact to this account" msgstr "Tilføjer ny kontakt til denne konto" -#: ../src/gajim-remote.py:236 +#: ../src/gajim-remote.py:235 msgid "Returns current status (the global one unless account is specified)" msgstr "" "Returnere den nuværende status (den globale status hvis ikke en konto er " "valgt)" -#: ../src/gajim-remote.py:243 +#: ../src/gajim-remote.py:242 msgid "" "Returns current status message (the global one unless account is specified)" msgstr "" "Returnere den nuværende statusbesked (den globale status besked hvis ikke en " "konto er valgt)" -#: ../src/gajim-remote.py:250 +#: ../src/gajim-remote.py:249 msgid "Returns number of unread messages" msgstr "Returnerer antal ikke læste beskeder" -#: ../src/gajim-remote.py:254 +#: ../src/gajim-remote.py:253 msgid "Opens 'Start Chat' dialog" msgstr "Åbner 'Start Samtale' vinduet" -#: ../src/gajim-remote.py:256 +#: ../src/gajim-remote.py:255 msgid "Starts chat, using this account" msgstr "Starter en samtale med denne konto" -#: ../src/gajim-remote.py:260 +#: ../src/gajim-remote.py:259 msgid "Sends custom XML" msgstr "Sender tilpasset XML" -#: ../src/gajim-remote.py:262 +#: ../src/gajim-remote.py:261 msgid "XML to send" msgstr "XML som skal sendes" -#: ../src/gajim-remote.py:263 +#: ../src/gajim-remote.py:262 msgid "" "Account in which the xml will be sent; if not specified, xml will be sent to " "all accounts" @@ -8625,72 +8169,71 @@ msgstr "" "Den konto hvor XML vil blive sendt; hvis ikke den er specificeret, vil XML " "blive sendt til alle kontoer" -#: ../src/gajim-remote.py:269 +#: ../src/gajim-remote.py:268 msgid "Handle a xmpp:/ uri" msgstr "Håndter en xmpp:/ uri" -#: ../src/gajim-remote.py:271 +#: ../src/gajim-remote.py:270 msgid "uri" msgstr "uri" -#: ../src/gajim-remote.py:271 +#: ../src/gajim-remote.py:270 msgid "URI to handle" msgstr "URI som skal håndteres" -#: ../src/gajim-remote.py:272 +#: ../src/gajim-remote.py:271 msgid "Account in which you want to handle it" msgstr "Den konto som du vil håndtere det med" -#: ../src/gajim-remote.py:274 -#, fuzzy +#: ../src/gajim-remote.py:273 msgid "Message content" -msgstr "besked indhold" +msgstr "Besked indhold" -#: ../src/gajim-remote.py:278 +#: ../src/gajim-remote.py:277 msgid "Join a MUC room" msgstr "Deltag i et MUC rum" -#: ../src/gajim-remote.py:280 +#: ../src/gajim-remote.py:279 msgid "room" msgstr "rum" -#: ../src/gajim-remote.py:280 +#: ../src/gajim-remote.py:279 msgid "Room JID" msgstr "Rum JID" -#: ../src/gajim-remote.py:281 +#: ../src/gajim-remote.py:280 msgid "nick" msgstr "kælenavn" -#: ../src/gajim-remote.py:281 +#: ../src/gajim-remote.py:280 msgid "Nickname to use" msgstr "Kælenavn som skal bruges" -#: ../src/gajim-remote.py:282 +#: ../src/gajim-remote.py:281 msgid "password" msgstr "adgangskode" -#: ../src/gajim-remote.py:282 +#: ../src/gajim-remote.py:281 msgid "Password to enter the room" msgstr "Adgangskode for at slutte sig til rummet" -#: ../src/gajim-remote.py:283 +#: ../src/gajim-remote.py:282 msgid "Account from which you want to enter the room" msgstr "Vælg den konto som du vil slutte dig til rummet med" -#: ../src/gajim-remote.py:288 +#: ../src/gajim-remote.py:287 msgid "Check if Gajim is running" msgstr "Kontroller om Gajim kører" -#: ../src/gajim-remote.py:292 +#: ../src/gajim-remote.py:291 msgid "Shows or hides the ipython window" msgstr "Viser eller gemmer ipython vinduet" -#: ../src/gajim-remote.py:319 +#: ../src/gajim-remote.py:318 msgid "Missing argument \"contact_jid\"" msgstr "Manglende argument \"contact_jid\"" -#: ../src/gajim-remote.py:338 +#: ../src/gajim-remote.py:339 #, python-format msgid "" "'%s' is not in your roster.\n" @@ -8699,15 +8242,15 @@ msgstr "" "'%s' er ikke i dit kontaktvindue.\n" "Specificer venligst en konto for at sende beskeden." -#: ../src/gajim-remote.py:341 +#: ../src/gajim-remote.py:342 msgid "You have no active account" msgstr "Du har ingen aktiv konto" -#: ../src/gajim-remote.py:393 +#: ../src/gajim-remote.py:395 msgid "It seems Gajim is not running. So you can't use gajim-remote." msgstr "Det ser ud til at Gajim ikke kører. Så du kan ikke bruge gajim-remote." -#: ../src/gajim-remote.py:416 +#: ../src/gajim-remote.py:422 #, python-format msgid "" "Usage: %(basename)s %(command)s %(arguments)s \n" @@ -8716,16 +8259,16 @@ msgstr "" "Brug: %(basename)s %(command)s %(arguments)s \n" "\t %(help)s" -#: ../src/gajim-remote.py:420 +#: ../src/gajim-remote.py:426 msgid "Arguments:" msgstr "Argumenter:" -#: ../src/gajim-remote.py:424 +#: ../src/gajim-remote.py:430 #, python-format msgid "%s not found" msgstr "%s ikke fundet" -#: ../src/gajim-remote.py:428 +#: ../src/gajim-remote.py:436 #, python-format msgid "" "Usage: %s command [arguments]\n" @@ -8734,7 +8277,7 @@ msgstr "" "Brug: %s kommando [argumenter]\n" "Kommando er en af:\n" -#: ../src/gajim-remote.py:493 +#: ../src/gajim-remote.py:505 #, python-format msgid "" "Too many arguments. \n" @@ -8743,7 +8286,7 @@ msgstr "" "For mange argumenter. \n" "Skriv \"%(basename)s help %(command)s\" for mere information" -#: ../src/gajim-remote.py:498 +#: ../src/gajim-remote.py:510 #, python-format msgid "" "Argument \"%(arg)s\" is not specified. \n" @@ -8752,7 +8295,7 @@ msgstr "" "Argument \"%(arg)s\" er ikke specificeret. \n" "Skriv \"%(basename)s help %(command)s\" for mere information" -#: ../src/gajim-remote.py:517 +#: ../src/gajim-remote.py:529 msgid "Wrong uri" msgstr "Forkert uri" @@ -8781,154 +8324,178 @@ msgstr "Du kan ikke slette det nuværende tema" msgid "Please first choose another for your current theme." msgstr "Vælg venligst en anden for dit nuværende tema." -#: ../src/groupchat_control.py:162 +#: ../src/groupchat_control.py:167 msgid "Sending private message failed" msgstr "Sending af privat besked fejlede" #. in second %s code replaces with nickname -#: ../src/groupchat_control.py:164 +#: ../src/groupchat_control.py:169 #, python-format msgid "You are no longer in group chat \"%(room)s\" or \"%(nick)s\" has left." msgstr "" "Du er ikke længere i gruppe samtale \"%(room)s\" eller \"%(nick)s\" har " "forladt rummet." -#: ../src/groupchat_control.py:436 +#: ../src/groupchat_control.py:439 msgid "Insert Nickname" msgstr "Indsæt Kælenavn" -#: ../src/groupchat_control.py:595 +#: ../src/groupchat_control.py:617 msgid "Conversation with " msgstr "Samtale med " -#: ../src/groupchat_control.py:597 +#: ../src/groupchat_control.py:619 msgid "Continued conversation" msgstr "Fortsat samtale" #. Can be a message (see handle_event_gc_config_change in gajim.py) -#: ../src/groupchat_control.py:1194 +#. Can be a presence (see chg_contact_status in groupchat_control.py) +#: ../src/groupchat_control.py:1228 ../src/gui_interface.py:1050 +msgid "Any occupant is allowed to see your full JID" +msgstr "En hvilken som helst deltager har lov til at se din fulde JID" + +#. Can be a message (see handle_event_gc_config_change in gajim.py) +#: ../src/groupchat_control.py:1231 msgid "Room logging is enabled" msgstr "Rum logging er aktiveret" -#: ../src/groupchat_control.py:1196 +#: ../src/groupchat_control.py:1233 msgid "A new room has been created" msgstr "Et nyt rum er blevet oprettet" -#: ../src/groupchat_control.py:1199 +#: ../src/groupchat_control.py:1236 msgid "The server has assigned or modified your roomnick" msgstr "Serveren har fastsat eller ændret dit kælenavn for rummet" #. do not print 'kicked by None' -#: ../src/groupchat_control.py:1205 +#: ../src/groupchat_control.py:1242 #, python-format msgid "%(nick)s has been kicked: %(reason)s" msgstr "%(nick)s er blevet udvist: %(reason)s" -#: ../src/groupchat_control.py:1209 +#: ../src/groupchat_control.py:1246 #, python-format msgid "%(nick)s has been kicked by %(who)s: %(reason)s" msgstr "%(nick)s er blevet udvist af %(who)s: %(reason)s" #. do not print 'banned by None' -#: ../src/groupchat_control.py:1219 +#: ../src/groupchat_control.py:1256 #, python-format msgid "%(nick)s has been banned: %(reason)s" msgstr "%(nick)s er blevet uønsket: %(reason)s" -#: ../src/groupchat_control.py:1223 +#: ../src/groupchat_control.py:1260 #, python-format msgid "%(nick)s has been banned by %(who)s: %(reason)s" msgstr "%(nick)s er blevet uønsket af %(who)s: %(reason)s" -#: ../src/groupchat_control.py:1235 ../src/groupchat_control.py:1328 +#: ../src/groupchat_control.py:1272 ../src/groupchat_control.py:1365 #, python-format msgid "You are now known as %s" msgstr "Du er nu kendt som %s" -#: ../src/groupchat_control.py:1289 ../src/groupchat_control.py:1293 -#: ../src/groupchat_control.py:1298 +#: ../src/groupchat_control.py:1288 ../src/gui_interface.py:894 +#, python-format +msgid "%(nick)s is now known as %(new_nick)s" +msgstr "%(nick)s er nu kendt som %(new_nick)s" + +#: ../src/groupchat_control.py:1326 ../src/groupchat_control.py:1330 +#: ../src/groupchat_control.py:1335 #, python-format msgid "%(nick)s has been removed from the room (%(reason)s)" msgstr "%(nick)s er blevet fjernet fra rummet %(reason)s" -#: ../src/groupchat_control.py:1290 +#: ../src/groupchat_control.py:1327 msgid "affiliation changed" msgstr "tilknytning ændret" -#: ../src/groupchat_control.py:1295 +#: ../src/groupchat_control.py:1332 msgid "room configuration changed to members-only" msgstr "Rum konfiguration er blevet ændret til 'kun for medlemmer'" -#: ../src/groupchat_control.py:1300 +#: ../src/groupchat_control.py:1337 msgid "system shutdown" msgstr "computeren slukkes" -#: ../src/groupchat_control.py:1377 +#: ../src/groupchat_control.py:1414 #, python-format msgid "** Affiliation of %(nick)s has been set to %(affiliation)s by %(actor)s" msgstr "" "** Tilhørsforholdet for %(nick)s er blevet sat til %(affiliation)s af %" "(actor)s" -#: ../src/groupchat_control.py:1381 +#: ../src/groupchat_control.py:1418 #, python-format msgid "** Affiliation of %(nick)s has been set to %(affiliation)s" msgstr "** Tilhørsforholdet for %(nick)s er blevet sat til %(affiliation)s" -#: ../src/groupchat_control.py:1396 +#: ../src/groupchat_control.py:1433 #, python-format msgid "** Role of %(nick)s has been set to %(role)s by %(actor)s" msgstr "** %(nick)s rolle er blevet sat til %(role)s af %(actor)s" -#: ../src/groupchat_control.py:1400 +#: ../src/groupchat_control.py:1437 #, python-format msgid "** Role of %(nick)s has been set to %(role)s" msgstr "** %(nick)s rolle er blevet sat til %(role)s" -#: ../src/groupchat_control.py:1429 +#: ../src/groupchat_control.py:1466 #, python-format msgid "%s has left" msgstr "%s har forladt samtalen" -#: ../src/groupchat_control.py:1434 +#: ../src/groupchat_control.py:1471 #, python-format msgid "%s has joined the group chat" msgstr "%s deltager nu i gruppe samtalen" -#: ../src/groupchat_control.py:1668 +#: ../src/groupchat_control.py:1473 ../src/gui_interface.py:919 +#: ../src/history_window.py:442 ../src/notify.py:250 +#, python-format +msgid "%(nick)s is now %(status)s" +msgstr "%(nick)s er nu %(status)s" + +#: ../src/groupchat_control.py:1706 #, python-format msgid "Are you sure you want to leave group chat \"%s\"?" msgstr "Er du sikker på du vil forlade gruppe samtalen \"%s\"?" -#: ../src/groupchat_control.py:1670 +#: ../src/groupchat_control.py:1708 msgid "" "If you close this window, you will be disconnected from this group chat." msgstr "" "Hvis du lukker dette vindue vil du blive frakoblet fra denne gruppe samtale." -#: ../src/groupchat_control.py:1707 +#: ../src/groupchat_control.py:1712 ../src/gui_interface.py:1172 +#: ../src/gui_interface.py:1940 ../src/gui_interface.py:1975 +#: ../src/message_window.py:227 ../src/roster_window.py:2658 +#: ../src/roster_window.py:3301 ../src/roster_window.py:3990 +msgid "Do _not ask me again" +msgstr "Ikke spørg mig ige_n" + +#: ../src/groupchat_control.py:1745 msgid "Changing Subject" msgstr "Ændre emne" -#: ../src/groupchat_control.py:1708 +#: ../src/groupchat_control.py:1746 msgid "Please specify the new subject:" msgstr "Anfør et nyt emne:" -#: ../src/groupchat_control.py:1715 +#: ../src/groupchat_control.py:1753 msgid "Changing Nickname" msgstr "Ændre kælenavn" -#: ../src/groupchat_control.py:1716 +#: ../src/groupchat_control.py:1754 msgid "Please specify the new nickname you want to use:" msgstr "Anfør dit nye kælenavn:" #. Ask for a reason -#: ../src/groupchat_control.py:1745 +#: ../src/groupchat_control.py:1783 #, python-format msgid "Destroying %s" msgstr "Fjern %s" -#: ../src/groupchat_control.py:1746 +#: ../src/groupchat_control.py:1784 msgid "" "You are going to definitively destroy this room.\n" "You may specify a reason below:" @@ -8936,22 +8503,22 @@ msgstr "" "Du er ved at definitivt fjerne dette rum.\n" "Du kan anføre en grund herunder:" -#: ../src/groupchat_control.py:1748 +#: ../src/groupchat_control.py:1786 msgid "You may also enter an alternate venue:" msgstr "Du kan også indtaste et alternativt mødested:" #. ask for reason -#: ../src/groupchat_control.py:1921 +#: ../src/groupchat_control.py:1967 #, python-format msgid "Kicking %s" msgstr "Sparker %s" -#: ../src/groupchat_control.py:1922 ../src/groupchat_control.py:2227 +#: ../src/groupchat_control.py:1968 ../src/groupchat_control.py:2291 msgid "You may specify a reason below:" msgstr "Du kan anføre en begrundelse under:" #. ask for reason -#: ../src/groupchat_control.py:2226 +#: ../src/groupchat_control.py:2290 #, python-format msgid "Banning %s" msgstr "Udeluk %s" @@ -8976,58 +8543,473 @@ msgid "Details" msgstr "Detaljer" #. we talk about file -#: ../src/gtkgui_helpers.py:166 ../src/gtkgui_helpers.py:181 +#: ../src/gtkgui_helpers.py:171 ../src/gtkgui_helpers.py:186 #, python-format msgid "Error: cannot open %s for reading" msgstr "Fejl: kan ikke åbne %s for læsning" -#: ../src/gtkgui_helpers.py:351 +#: ../src/gtkgui_helpers.py:362 msgid "Error reading file:" msgstr "Fejl ved læsning af fil:" -#: ../src/gtkgui_helpers.py:354 +#: ../src/gtkgui_helpers.py:365 msgid "Error parsing file:" msgstr "Fejl ved fortolkning af fil:" #. do not traceback (could be a permission problem) #. we talk about a file here -#: ../src/gtkgui_helpers.py:391 +#: ../src/gtkgui_helpers.py:406 #, python-format msgid "Could not write to %s. Session Management support will not work" msgstr "" "Kunne ikke skrive til %s. Sessions håndterings understøttelse vil ikke virke" #. xmpp: is currently handled by another program, so ask the user -#: ../src/gtkgui_helpers.py:728 +#: ../src/gtkgui_helpers.py:770 msgid "Gajim is not the default Jabber client" msgstr "Gajim er ikke standard Jabber client" -#: ../src/gtkgui_helpers.py:729 +#: ../src/gtkgui_helpers.py:771 msgid "Would you like to make Gajim the default Jabber client?" msgstr "Har du lyst til at gøre Gajim til standard Jabber client?" -#: ../src/gtkgui_helpers.py:730 +#: ../src/gtkgui_helpers.py:772 msgid "Always check to see if Gajim is the default Jabber client on startup" msgstr "Altid kontroller om Gajim er standard Jabber client ved opstart" -#: ../src/gtkgui_helpers.py:799 +#: ../src/gtkgui_helpers.py:845 msgid "Extension not supported" msgstr "Udvidelse er ikke understøttet" -#: ../src/gtkgui_helpers.py:800 +#: ../src/gtkgui_helpers.py:846 #, python-format msgid "Image cannot be saved in %(type)s format. Save as %(new_filename)s?" msgstr "Billede kan ikke gemmes i formatet %(type)s. Gem som %(new_filename)s?" -#: ../src/gtkgui_helpers.py:835 +#: ../src/gtkgui_helpers.py:881 msgid "Save Image as..." msgstr "Gem Billede som..." -#: ../src/gui_menu_builder.py:89 +#: ../src/gui_interface.py:129 +#, python-format +msgid "" +"Your desired nickname in group chat %s is in use or registered by another " +"occupant.\n" +"Please specify another nickname below:" +msgstr "" +"Dit ønskede kælenavn i gruppesamtalen %s er i brug eller registreret af en " +"anden indehaver.\n" +"Specificer venligst et andet kælenavn under:" + +#: ../src/gui_interface.py:132 +msgid "Always use this nickname when there is a conflict" +msgstr "Altid brug dette kælenavn når der er en konflikt" + +#: ../src/gui_interface.py:149 +msgid "Do you accept this request?" +msgstr "Accepterer du denne forespørsel?" + +#: ../src/gui_interface.py:151 +#, python-format +msgid "Do you accept this request on account %s?" +msgstr "Accepterer du denne forespørgsel for konto %s?" + +#: ../src/gui_interface.py:154 +#, python-format +msgid "HTTP (%(method)s) Authorization for %(url)s (id: %(id)s)" +msgstr "HTTP (%(method)s) Autorisering for %(url)s (id: %(id)s)" + +#: ../src/gui_interface.py:205 ../src/notify.py:524 +msgid "Connection Failed" +msgstr "Tilslutning Fejlede" + +#: ../src/gui_interface.py:544 ../src/gui_interface.py:548 +#, python-format +msgid "Error %(code)s: %(msg)s" +msgstr "Fejl %(code)s: %(msg)s" + +#. ('MSGNOTSENT', account, (jid, ierror_msg, msg, time, session)) +#: ../src/gui_interface.py:558 ../src/gui_interface.py:572 +#, python-format +msgid "error while sending %(message)s ( %(error)s )" +msgstr "fejl opstod under sending %(message)s ( %(error)s )" + +#: ../src/gui_interface.py:599 ../src/notify.py:526 +msgid "Subscription request" +msgstr "Abonnement forespørgsel" + +#: ../src/gui_interface.py:624 +msgid "Authorization accepted" +msgstr "Autorisering accepteret" + +#: ../src/gui_interface.py:625 +#, python-format +msgid "The contact \"%s\" has authorized you to see his or her status." +msgstr "Kontakten \"%s\" har godkendt dig til at se hans eller hendes status." + +#: ../src/gui_interface.py:637 +#, python-format +msgid "Contact \"%s\" removed subscription from you" +msgstr "Kontakt \"%s\" har fjernet abonneringen på dig" + +#: ../src/gui_interface.py:638 +msgid "" +"You will always see him or her as offline.\n" +"Do you want to remove him or her from your contact list?" +msgstr "" +"Du vil altid se ham eller hende som offline.\n" +"Vil du fjerne ham eller hende fra din kontakt liste?" + +#: ../src/gui_interface.py:663 ../src/notify.py:528 +msgid "Unsubscribed" +msgstr "Frameldt abonnement" + +#: ../src/gui_interface.py:704 +#, python-format +msgid "Contact with \"%s\" cannot be established" +msgstr "Kontakt med \"%s\" kan ikke blive etableret" + +#: ../src/gui_interface.py:986 +#, python-format +msgid "%(jid)s has set the subject to %(subject)s" +msgstr "%(jid)s har sat emnet til %(subject)s" + +#: ../src/gui_interface.py:1053 +msgid "Room now shows unavailable member" +msgstr "Rummet viser nu; ikke tilgængelige medlemmer" + +#: ../src/gui_interface.py:1055 +msgid "room now does not show unavailable members" +msgstr "Rummet viser nu ikke; ikke tilgængelige medlemmer" + +#: ../src/gui_interface.py:1058 +msgid "A non-privacy-related room configuration change has occurred" +msgstr "En ændring i en non-privacy-related rum konfiguration har forekommet" + +#. Can be a presence (see chg_contact_status in groupchat_control.py) +#: ../src/gui_interface.py:1061 +msgid "Room logging is now enabled" +msgstr "Rum logging er nu aktiveret" + +#: ../src/gui_interface.py:1063 +msgid "Room logging is now disabled" +msgstr "Rum logging er nu deaktiveret" + +#: ../src/gui_interface.py:1065 +msgid "Room is now non-anonymous" +msgstr "Rummet er nu ikke-anonymt" + +#: ../src/gui_interface.py:1068 +msgid "Room is now semi-anonymous" +msgstr "Rummet er nu semi-anonymt" + +#: ../src/gui_interface.py:1071 +msgid "Room is now fully-anonymous" +msgstr "Rummet er nu helt anonymt" + +#: ../src/gui_interface.py:1103 +#, python-format +msgid "A Password is required to join the room %s. Please type it." +msgstr "" +"En adgangskode er påkrævet for at deltage i rummet %s. Venligst skriv den." + +#: ../src/gui_interface.py:1137 +msgid "" +"You configured Gajim to use GPG agent, but there is no GPG agent running or " +"it returned a wrong passphrase.\n" +msgstr "" +"Du har konfigureret Gajim til at bruge GPG agenten, men der er ingen GPG " +"agent som kører eller den returnerede en forkert gpg-løsen.\n" + +#: ../src/gui_interface.py:1139 ../src/gui_interface.py:1145 +msgid "You are currently connected without your OpenPGP key." +msgstr "Du er for øjeblikket tilsluttet uden din OpenPGP nøgle." + +#: ../src/gui_interface.py:1140 +msgid "Your passphrase is incorrect" +msgstr "Dit pgp-løsen er ikke korrekt" + +#: ../src/gui_interface.py:1144 +msgid "OpenGPG Passphrase Incorrect" +msgstr "OpenPGP-løsen er ikke korrekt" + +#: ../src/gui_interface.py:1170 +msgid "GPG key not trusted" +msgstr "GPG nøglen kan ikke stoles på" + +#: ../src/gui_interface.py:1170 +msgid "" +"The GPG key used to encrypt this chat is not trusted. Do you really want to " +"encrypt this message?" +msgstr "" +"GPG nøglen brugt til at kryptere den samtale er ikke til at stole på. Vil du " +"virkelig kryptere den besked?" + +#: ../src/gui_interface.py:1182 +msgid "" +"Gnome Keyring is installed but not \t\t\t\tcorrectly started (environment " +"variable probably not \t\t\t\tcorrectly set)" +msgstr "" +"Gnomes Nøglering er installeret men ikke \t\t\t\tstartet korrekt " +"(miljøvariabel er sandsynligvis ikke \t\t\t\t\\sat op rigtig)" + +#: ../src/gui_interface.py:1292 +#, python-format +msgid "New mail on %(gmail_mail_address)s" +msgstr "Ny e-post på %(gmail_mail_address)s" + +#: ../src/gui_interface.py:1294 +#, python-format +msgid "You have %d new mail conversation" +msgid_plural "You have %d new mail conversations" +msgstr[0] "Du har %d ny e-post samtale" +msgstr[1] "Du har %d nye e-post samtaler" + +#: ../src/gui_interface.py:1307 +#, python-format +msgid "" +"\n" +"\n" +"From: %(from_address)s\n" +"Subject: %(subject)s\n" +"%(snippet)s" +msgstr "" +"\n" +"\n" +"Fra: %(from_address)s\n" +"Emne: %(subject)s\n" +"%(snippet)s" + +#: ../src/gui_interface.py:1379 +#, python-format +msgid "%s wants to send you a file." +msgstr "%s vil gerne sende dig en fil." + +#: ../src/gui_interface.py:1417 ../src/roster_window.py:1814 +msgid "Remote contact stopped transfer" +msgstr "Den fjerne kontakt stoppede filoverførslen" + +#: ../src/gui_interface.py:1419 ../src/roster_window.py:1816 +msgid "Error opening file" +msgstr "Fejl ved åbning af fil" + +#: ../src/gui_interface.py:1450 +#, python-format +msgid "You successfully received %(filename)s from %(name)s." +msgstr "Du har succesfuldt modtaget %(filename)s fra %(name)s" + +#. ft stopped +#: ../src/gui_interface.py:1454 +#, python-format +msgid "File transfer of %(filename)s from %(name)s stopped." +msgstr "Filoverførsel af %(filename)s fra %(name)s er stoppet." + +#: ../src/gui_interface.py:1467 +#, python-format +msgid "You successfully sent %(filename)s to %(name)s." +msgstr "Du har succesfuldt sendt %(filename)s til %(name)s." + +#. ft stopped +#: ../src/gui_interface.py:1471 +#, python-format +msgid "File transfer of %(filename)s to %(name)s stopped." +msgstr "Filoverførsel af %(filename)s til %(name)s er stoppet." + +#: ../src/gui_interface.py:1576 +#, python-format +msgid "" +"Unable to decrypt message from %s\n" +"It may have been tampered with." +msgstr "" +"Ikke i stand til at dekryptere beskeden fra %s\n" +"Det er mulig den er blevet forfalsket." + +#: ../src/gui_interface.py:1583 +msgid "Unable to decrypt message" +msgstr "Ikke i stand til at dekryptere beskeden" + +#: ../src/gui_interface.py:1657 +msgid "Username Conflict" +msgstr "Brugernavns Konflikt" + +#: ../src/gui_interface.py:1658 +msgid "Please type a new username for your local account" +msgstr "Skriv et nyt brugernavn for din lokale konto" + +#: ../src/gui_interface.py:1670 +msgid "Ping?" +msgstr "Ping?" + +#: ../src/gui_interface.py:1683 +#, python-format +msgid "Pong! (%s s.)" +msgstr "Pong! (%s .s)" + +#: ../src/gui_interface.py:1694 +msgid "Error." +msgstr "Fejl." + +#: ../src/gui_interface.py:1721 +msgid "Resource Conflict" +msgstr "Ressource Konflikt" + +#: ../src/gui_interface.py:1722 +msgid "" +"You are already connected to this account with the same resource. Please " +"type a new one" +msgstr "" +"Du er allerede tilsluttet til denne konto med den samme ressource. Skriv " +"venligst en ny" + +#: ../src/gui_interface.py:1771 +#, fuzzy, python-format +msgid "%s wants to start a voice chat." +msgstr "%s vil gerne sende dig en fil." + +#: ../src/gui_interface.py:1774 +#, fuzzy +msgid "Voice Chat Request" +msgstr "Filoverførsel Forespørgsel" + +#: ../src/gui_interface.py:1879 +msgid "Error verifying SSL certificate" +msgstr "Fejl under verificering af SSL certifikat" + +#: ../src/gui_interface.py:1880 +#, python-format +msgid "" +"There was an error verifying the SSL certificate of your jabber server: %" +"(error)s\n" +"Do you still want to connect to this server?" +msgstr "" +"Der var en fejl under verificeringen af SSL certifikatet fra din jabber " +"server: %(error)s\n" +"Vil du stadig prøve på at forbinde til denne server?" + +#: ../src/gui_interface.py:1885 +msgid "Ignore this error for this certificate." +msgstr "Ignorer denne fejl for dette certifikat." + +#: ../src/gui_interface.py:1905 +msgid "SSL certificate error" +msgstr "SSL certifikat fejl" + +#: ../src/gui_interface.py:1906 +#, python-format +msgid "" +"It seems the SSL certificate of account %(account)s has changed or your " +"connection is being hacked.\n" +"Old fingerprint: %(old)s\n" +"New fingerprint: %(new)s\n" +"\n" +"Do you still want to connect and update the fingerprint of the certificate?" +msgstr "" +"Det ser ud til at SSL certifikatet for kontoen %(account)s er blevet ændret " +"eller din forbindelse er blevet kompromitteret\n" +"Gammelt fingeraftryk: %(old)s\n" +"Nyt fingeraftryk: %(new)s\n" +"\n" +"Vil du stadig forbinde og opdatere fingeraftrykket for certifikatet?" + +#: ../src/gui_interface.py:1936 ../src/gui_interface.py:1971 +msgid "Insecure connection" +msgstr "Ikke sikker forbindelse" + +#: ../src/gui_interface.py:1937 +msgid "" +"You are about to send your password on an unencrypted connection. Are you " +"sure you want to do that?" +msgstr "" +"Du er ved at sende din adgangskode over en ikke krypteret forbindelse. Er du " +"sikker på du vil gøre dette?" + +#: ../src/gui_interface.py:1939 ../src/gui_interface.py:1974 +msgid "Yes, I really want to connect insecurely" +msgstr "Ja, jeg vil virkelig gerne tilslutte mig uden sikkerhed" + +#: ../src/gui_interface.py:1972 +msgid "" +"You are about to send your password on an insecure connection. You should " +"install PyOpenSSL to prevent that. Are you sure you want to do that?" +msgstr "" +"Du er ved at sende din adgangskode på en usikker forbindelse. Du bør " +"installere PyOpenSSL for at forhindre dette. Er du sikker på du vil gøre " +"dette?" + +#: ../src/gui_interface.py:1992 +msgid "PEP node was not removed" +msgstr "PEP knude blev ikke fjernet" + +#: ../src/gui_interface.py:1993 +#, python-format +msgid "PEP node %(node)s was not removed: %(message)s" +msgstr "PEP knude %(node)s blev ikke fjernet: %(message)s" + +#. theme doesn't exist, disable emoticons +#: ../src/gui_interface.py:2547 ../src/gui_interface.py:2569 +msgid "Emoticons disabled" +msgstr "Følelsesikoner er ikke aktiveret" + +#: ../src/gui_interface.py:2548 +msgid "" +"Your configured emoticons theme has not been found, so emoticons have been " +"disabled." +msgstr "" +"Dit konfigurerede følelsesikon tema blev ikke fundet, så følelsesikoner er " +"blevet deaktiveret." + +#: ../src/gui_interface.py:2570 +msgid "" +"Your configured emoticons theme cannot been loaded. You maybe need to update " +"the format of emoticons.py file. See http://trac.gajim.org/wiki/Emoticons " +"for more details." +msgstr "" +"Dit konfigurerede følelsesikon tema kan ikke findes. Du er måske nød til at " +"opdatere formatet for filen emoticons.py. Se http://trac.gajim.org/wiki/" +"Emoticons for flere detaljer." + +#: ../src/gui_interface.py:2598 ../src/roster_window.py:3441 +msgid "You cannot join a group chat while you are invisible" +msgstr "Du kan ikke deltage i en gruppe samtale mens du er usynlig" + +#. it is good to notify the user +#. in case he or she cannot see the output of the console +#: ../src/gui_interface.py:2969 +msgid "Could not save your settings and preferences" +msgstr "Kunne ikke gemme din opsætning og indstillinger" + +#: ../src/gui_interface.py:3462 +msgid "Passphrase Required" +msgstr "Adgangskode Påkrævet" + +#: ../src/gui_interface.py:3463 +#, python-format +msgid "Enter GPG key passphrase for key %(keyid)s (account %(account)s)." +msgstr "Indtast adgangskoden til GPG nøglen %(keyid)s (Konto %(account)s)." + +#: ../src/gui_interface.py:3477 +msgid "GPG key expired" +msgstr "GPG nøgle er udløbet" + +#: ../src/gui_interface.py:3478 +#, fuzzy, python-format +msgid "Your GPG key has expired, you will be connected to %s without OpenPGP." +msgstr "Din GPG nøgle er udløbet, du vil blive tilsuttet til %s uden OpenPGP." + +#. ask again +#: ../src/gui_interface.py:3487 +msgid "Wrong Passphrase" +msgstr "Forkert Adgangskode" + +#: ../src/gui_interface.py:3488 +msgid "Please retype your GPG passphrase or press Cancel." +msgstr "Indtast din GPG adgangskode igen eller annuller." + +#: ../src/gui_menu_builder.py:93 msgid "_New Group Chat" msgstr "_Ny Gruppe Samtale" -#: ../src/gui_menu_builder.py:400 +#: ../src/gui_menu_builder.py:413 msgid "I would like to add you to my roster" msgstr "Jeg vil gerne tilføje dig til mit kontaktvindue" @@ -9042,7 +9024,7 @@ msgstr "Kontakter" #. holds time #: ../src/history_manager.py:174 ../src/history_manager.py:214 -#: ../src/history_window.py:95 +#: ../src/history_window.py:97 msgid "Date" msgstr "Dato" @@ -9053,7 +9035,7 @@ msgstr "Kælenavn" #. holds message #: ../src/history_manager.py:188 ../src/history_manager.py:220 -#: ../src/history_window.py:103 +#: ../src/history_window.py:105 msgid "Message" msgstr "Besked" @@ -9078,192 +9060,188 @@ msgstr "" "\n" "I tilfælde du trykker JA, venligst vent..." -#: ../src/history_manager.py:458 +#: ../src/history_manager.py:467 msgid "Exporting History Logs..." msgstr "Eksporter Historik Log..." -#: ../src/history_manager.py:533 +#: ../src/history_manager.py:542 #, python-format msgid "%(who)s on %(time)s said: %(message)s\n" msgstr "%(who)s klokken %(time)s sagde: %(message)s\n" -#: ../src/history_manager.py:570 +#: ../src/history_manager.py:579 msgid "Do you really want to delete logs of the selected contact?" msgid_plural "Do you really want to delete logs of the selected contacts?" msgstr[0] "Vil du virkelig slette loggen for den valgte kontakt?" msgstr[1] "Vil du virkelig slette loggene fra de valgte kontakter?" -#: ../src/history_manager.py:574 ../src/history_manager.py:609 +#: ../src/history_manager.py:583 ../src/history_manager.py:618 msgid "This is an irreversible operation." msgstr "Dette er en irreversibel handling." -#: ../src/history_manager.py:606 +#: ../src/history_manager.py:615 msgid "Do you really want to delete the selected message?" msgid_plural "Do you really want to delete the selected messages?" msgstr[0] "Vil du virkelig slette den valgte besked?" msgstr[1] "Vil du virkelig slette de valgte beskeder?" -#: ../src/history_window.py:298 +#: ../src/history_window.py:305 #, python-format msgid "Conversation History with %s" msgstr "Konversations Historik med %s" -#: ../src/history_window.py:343 +#: ../src/history_window.py:350 msgid "Disk Error" msgstr "Disk Skrivefejl" -#: ../src/history_window.py:427 +#: ../src/history_window.py:438 #, python-format msgid "%(nick)s is now %(status)s: %(status_msg)s" msgstr "%(nick)s er nu %(status)s: %(status_msg)s" -#: ../src/history_window.py:438 -#, fuzzy, python-format +#: ../src/history_window.py:449 +#, python-format msgid "Error: %s" -msgstr "Fejl besked: %s" +msgstr "Fejl: %s" -#: ../src/history_window.py:440 -#, fuzzy +#: ../src/history_window.py:451 msgid "Error" -msgstr "Fejl." +msgstr "Fejl" -#: ../src/history_window.py:442 +#: ../src/history_window.py:453 #, python-format msgid "Status is now: %(status)s: %(status_msg)s" msgstr "Status er nu: %(status)s: %(status_msg)s" -#: ../src/history_window.py:445 +#: ../src/history_window.py:456 #, python-format msgid "Status is now: %(status)s" msgstr "Status er nu: %(status)s" -#: ../src/htmltextview.py:512 ../src/htmltextview.py:522 +#: ../src/htmltextview.py:513 ../src/htmltextview.py:523 msgid "Timeout loading image" msgstr "Tidsudløb nået for at laste billede" -#: ../src/htmltextview.py:532 +#: ../src/htmltextview.py:533 msgid "Image is too big" msgstr "Billede er for stort" -#: ../src/message_window.py:220 -#, fuzzy +#: ../src/message_window.py:225 msgid "You are going to close several tabs" -msgstr "Du er ikke tilsluttet til serveren" +msgstr "Du er ved at lukke flere faneblade" -#: ../src/message_window.py:221 -#, fuzzy +#: ../src/message_window.py:226 msgid "Do you really want to close them all?" -msgstr "Vil du virkelig slette den valgte besked?" +msgstr "Vil du virkelig lukke dem alle?" -#: ../src/message_window.py:481 +#: ../src/message_window.py:490 msgid "Chats" msgstr "Samtaler" -#: ../src/message_window.py:483 +#: ../src/message_window.py:492 msgid "Group Chats" msgstr "Gruppe Samtaler" -#: ../src/message_window.py:485 +#: ../src/message_window.py:494 msgid "Private Chats" msgstr "Private Samtaler" -#: ../src/message_window.py:491 +#: ../src/message_window.py:500 msgid "Messages" msgstr "Beskeder" -#: ../src/negotiation.py:32 +#: ../src/negotiation.py:34 msgid "- messages will be logged" msgstr "- beskeder vil blive logget" -#: ../src/negotiation.py:34 +#: ../src/negotiation.py:36 msgid "- messages will not be logged" msgstr "- beskeder vil ikke blive logget" -#: ../src/notify.py:242 +#: ../src/notify.py:248 #, python-format msgid "%(nick)s Changed Status" msgstr "%(nick)s Ændrede Status" -#: ../src/notify.py:252 +#: ../src/notify.py:258 #, python-format msgid "%(nickname)s Signed In" msgstr "%(nickname)s Loggede Ind" -#: ../src/notify.py:260 +#: ../src/notify.py:266 #, python-format msgid "%(nickname)s Signed Out" msgstr "%(nickname)s Loggede Ud" -#: ../src/notify.py:272 +#: ../src/notify.py:278 #, python-format msgid "New Single Message from %(nickname)s" msgstr "Ny Besked fra %(nickname)s" -#: ../src/notify.py:280 +#: ../src/notify.py:286 #, python-format msgid "New Private Message from group chat %s" msgstr "Ny Privat Besked fra gruppe samtale %s" -#: ../src/notify.py:282 +#: ../src/notify.py:288 #, python-format msgid "%(nickname)s: %(message)s" msgstr "%(nickname)s: %(message)s" -#: ../src/notify.py:285 +#: ../src/notify.py:291 #, python-format msgid "Messaged by %(nickname)s" msgstr "Besked fra %(nickname)s" -#: ../src/notify.py:291 +#: ../src/notify.py:297 #, python-format msgid "New Message from %(nickname)s" msgstr "Ny Besked fra %(nickname)s" -#: ../src/notify.py:555 -#, fuzzy +#: ../src/notify.py:568 msgid "Ignore" -msgstr "_Ignorer" +msgstr "Ignorer" -#: ../src/profile_window.py:55 +#: ../src/profile_window.py:57 msgid "Retrieving profile..." msgstr "Henter profil..." -#: ../src/profile_window.py:108 ../src/roster_window.py:2852 +#: ../src/profile_window.py:110 ../src/roster_window.py:2845 msgid "File is empty" msgstr "Filen er tom" -#: ../src/profile_window.py:111 ../src/roster_window.py:2855 +#: ../src/profile_window.py:113 ../src/roster_window.py:2848 msgid "File does not exist" msgstr "Filen eksisterer ikke" #. keep identation #. unknown format -#: ../src/profile_window.py:125 ../src/profile_window.py:141 -#: ../src/roster_window.py:2857 ../src/roster_window.py:2868 +#: ../src/profile_window.py:127 ../src/profile_window.py:143 +#: ../src/roster_window.py:2850 ../src/roster_window.py:2861 msgid "Could not load image" msgstr "Kunne ikke laste billede" -#: ../src/profile_window.py:251 +#: ../src/profile_window.py:255 msgid "Information received" msgstr "Information modtaget" -#: ../src/profile_window.py:318 +#: ../src/profile_window.py:326 msgid "Without a connection you can not publish your contact information." msgstr "Uden en tilslutning kan du ikke publicere din kontakt information." -#: ../src/profile_window.py:332 +#: ../src/profile_window.py:339 msgid "Sending profile..." msgstr "Sender profil..." -#: ../src/profile_window.py:347 +#: ../src/profile_window.py:354 msgid "Information NOT published" msgstr "Information er IKKE publiceret" -#: ../src/profile_window.py:354 +#: ../src/profile_window.py:361 msgid "vCard publication failed" msgstr "vCard publicering fejlede" -#: ../src/profile_window.py:355 +#: ../src/profile_window.py:362 msgid "" "There was an error while publishing your personal information, try again " "later." @@ -9271,48 +9249,53 @@ msgstr "" "Der var en fejl under publicering af din personlige information, prøv igen " "senere." -#: ../src/roster_window.py:280 ../src/roster_window.py:1017 +#: ../src/roster_window.py:280 ../src/roster_window.py:1019 msgid "Merged accounts" msgstr "Flettede kontoer" -#: ../src/roster_window.py:1906 +#: ../src/roster_window.py:1871 msgid "Authorization has been sent" msgstr "Godkendelse er blevet sendt" -#: ../src/roster_window.py:1907 +#: ../src/roster_window.py:1872 #, python-format msgid "Now \"%s\" will know your status." msgstr "Nu vil %s vide din status." -#: ../src/roster_window.py:1927 +#: ../src/roster_window.py:1894 msgid "Subscription request has been sent" msgstr "Forespørgsel på abonnering er blevet sendt" -#: ../src/roster_window.py:1928 +#: ../src/roster_window.py:1895 #, python-format msgid "If \"%s\" accepts this request you will know his or her status." msgstr "" "Hvis %s accepterer denne forespørsel vil du kunne se hans eller hendes " "status." -#: ../src/roster_window.py:1940 +#: ../src/roster_window.py:1909 msgid "Authorization has been removed" msgstr "Godkendelse er blevet fjernet" -#: ../src/roster_window.py:1941 +#: ../src/roster_window.py:1910 #, python-format msgid "Now \"%s\" will always see you as offline." msgstr "Nu vil %s altid se dig som offline." -#: ../src/roster_window.py:1969 +#: ../src/roster_window.py:1938 msgid "GPG is not usable" msgstr "GPG er ikke brugbar" -#: ../src/roster_window.py:2174 ../src/roster_window.py:3383 +#: ../src/roster_window.py:1939 +#, python-format +msgid "You will be connected to %s without OpenPGP." +msgstr "Du vil blive tilsluttet til %s uden OpenPGP." + +#: ../src/roster_window.py:2148 ../src/roster_window.py:3394 msgid "You are participating in one or more group chats" msgstr "Du deltager i en eller flere gruppesamtaler" -#: ../src/roster_window.py:2175 ../src/roster_window.py:3384 +#: ../src/roster_window.py:2149 ../src/roster_window.py:3395 msgid "" "Changing your status to invisible will result in disconnection from those " "group chats. Are you sure you want to go invisible?" @@ -9320,28 +9303,27 @@ msgstr "" "Hvis du ændrer din status til usynlig vil det resultere i at du bliver " "frakoblet fra disse gruppesamtaler. Er du sikker på du vil gøre dig usynlig?" -#: ../src/roster_window.py:2201 +#: ../src/roster_window.py:2175 msgid "desync'ed" msgstr "ikke synkroniseret" -#: ../src/roster_window.py:2257 +#: ../src/roster_window.py:2236 msgid "Really quit Gajim?" -msgstr "" +msgstr "Skal Gajim afsluttes?" -#: ../src/roster_window.py:2258 -#, fuzzy +#: ../src/roster_window.py:2237 msgid "Are you sure you want to quit Gajim?" -msgstr "Er du sikker på du vil forlade gruppe samtalen \"%s\"?" +msgstr "Er du sikker på du vil afslutte Gajim?" -#: ../src/roster_window.py:2259 +#: ../src/roster_window.py:2238 msgid "Always close Gajim" -msgstr "" +msgstr "Altid afslut Gajim" -#: ../src/roster_window.py:2350 ../src/roster_window.py:2587 +#: ../src/roster_window.py:2333 ../src/roster_window.py:2576 msgid "You have unread messages" msgstr "Du har ulæste beskeder" -#: ../src/roster_window.py:2351 +#: ../src/roster_window.py:2334 msgid "" "Messages will only be available for reading them later if you have history " "enabled and contact is in your roster." @@ -9349,16 +9331,16 @@ msgstr "" "Beskeder vil kun være tilgængelige for læsning senere hvis du har historik " "aktiveret og kontakten er i dit kontaktvindue." -#: ../src/roster_window.py:2588 +#: ../src/roster_window.py:2577 msgid "You must read them before removing this transport." msgstr "Du må læse dem før du fjerner denne transport." -#: ../src/roster_window.py:2591 +#: ../src/roster_window.py:2580 #, python-format msgid "Transport \"%s\" will be removed" msgstr "Transport \"%s\" vil blive fjernet" -#: ../src/roster_window.py:2592 +#: ../src/roster_window.py:2581 msgid "" "You will no longer be able to send and receive messages from contacts using " "this transport." @@ -9366,11 +9348,11 @@ msgstr "" "Du vil ikke længere være i stand til at sende og modtage beskeder fra " "kontakter som bruger denne transport." -#: ../src/roster_window.py:2595 +#: ../src/roster_window.py:2584 msgid "Transports will be removed" msgstr "Transporter vil blive fjernet" -#: ../src/roster_window.py:2600 +#: ../src/roster_window.py:2589 #, python-format msgid "" "You will no longer be able to send and receive messages to contacts from " @@ -9379,68 +9361,69 @@ msgstr "" "Du vil ikke længere være i stand til at sende og modtage beskeder fra " "kontakter som bruger disse transporter: %s" -#: ../src/roster_window.py:2662 -#, fuzzy +#: ../src/roster_window.py:2653 msgid "You are about to block a contact. Are you sure you want to continue?" -msgstr "Du er ved at oprette en metakontakt. Er du sikker på du vil fortsætte?" +msgstr "Du er ved at blokere en kontakt. Er du sikker på du vil fortsætte?" -#: ../src/roster_window.py:2664 +#: ../src/roster_window.py:2655 msgid "" "This contact will see you offline and you will not receive messages he will " "send you." msgstr "" +"Denne kontakt vil se dig offline og du vil ikke modtage beskeder han sender " +"dig." #. it's jid -#: ../src/roster_window.py:2748 +#: ../src/roster_window.py:2741 msgid "Rename Contact" msgstr "Omdøb Kontakt" -#: ../src/roster_window.py:2749 +#: ../src/roster_window.py:2742 #, python-format msgid "Enter a new nickname for contact %s" msgstr "Indtast et nyt kælenavn for kontakt %s" -#: ../src/roster_window.py:2756 +#: ../src/roster_window.py:2749 msgid "Rename Group" msgstr "Omdøb Gruppe" -#: ../src/roster_window.py:2757 +#: ../src/roster_window.py:2750 #, python-format msgid "Enter a new name for group %s" msgstr "Indtast et nyt navn for gruppen %s" -#: ../src/roster_window.py:2798 +#: ../src/roster_window.py:2791 msgid "Remove Group" msgstr "Fjern Gruppen" -#: ../src/roster_window.py:2799 +#: ../src/roster_window.py:2792 #, python-format msgid "Do you want to remove group %s from the roster?" msgstr "Vil du fjerne gruppen %s fra kontaktvinduet?" -#: ../src/roster_window.py:2800 +#: ../src/roster_window.py:2793 msgid "Also remove all contacts in this group from your roster" msgstr "Fjern også alle kontakter i denne gruppe fra kontaktvinduet" -#: ../src/roster_window.py:2839 +#: ../src/roster_window.py:2832 msgid "Assign OpenPGP Key" msgstr "Tildel OpenPGP Nøgle" -#: ../src/roster_window.py:2840 +#: ../src/roster_window.py:2833 msgid "Select a key to apply to the contact" msgstr "Vælg den nøgle du vil anvende til kontakten" -#: ../src/roster_window.py:3203 +#: ../src/roster_window.py:3210 #, python-format msgid "Contact \"%s\" will be removed from your roster" msgstr "Kontakt %s vil blive fjernet fra dit kontaktvindue" -#: ../src/roster_window.py:3205 +#: ../src/roster_window.py:3212 #, python-format msgid "You are about to remove \"%(name)s\" (%(jid)s) from your roster.\n" -msgstr "" +msgstr "Du er ved at fjerne \"%(name)s\" (%(jid)s) fra dit kontaktvindue.\n" -#: ../src/roster_window.py:3210 +#: ../src/roster_window.py:3217 msgid "" "By removing this contact you also remove authorization resulting in him or " "her always seeing you as offline." @@ -9449,11 +9432,11 @@ msgstr "" "vil altid se dig som offline." #. Contact is not in roster -#: ../src/roster_window.py:3216 +#: ../src/roster_window.py:3223 msgid "Do you want to continue?" msgstr "Vil du fortsætte?" -#: ../src/roster_window.py:3219 +#: ../src/roster_window.py:3226 msgid "" "By removing this contact you also by default remove authorization resulting " "in him or her always seeing you as offline." @@ -9461,16 +9444,16 @@ msgstr "" "Ved at fjerne denne kontakt fjerner du også samtidig godkendelsen, så han " "eller hun altid vil se dig som offline." -#: ../src/roster_window.py:3222 +#: ../src/roster_window.py:3229 msgid "I want this contact to know my status after removal" msgstr "Jeg vil at denne kontakt kan se min status efter den er blevet fjernet" #. several contact to remove at the same time -#: ../src/roster_window.py:3226 +#: ../src/roster_window.py:3233 msgid "Contacts will be removed from your roster" msgstr "Kontakter vil blive fjernet fra dit kontaktvindue" -#: ../src/roster_window.py:3231 +#: ../src/roster_window.py:3238 #, python-format msgid "" "By removing these contacts:%s\n" @@ -9480,33 +9463,35 @@ msgstr "" "fjerner du også godkendelsen, hvilket medfører at de altid vil se dig som " "offline." -#: ../src/roster_window.py:3286 -#, fuzzy +#: ../src/roster_window.py:3295 msgid "" "You are about to send a custom status. Are you sure you want to continue?" -msgstr "Du er ved at oprette en metakontakt. Er du sikker på du vil fortsætte?" +msgstr "" +"Du er ved at sende en personlig status. Er du sikker på du vil fortsætte?" -#: ../src/roster_window.py:3288 +#: ../src/roster_window.py:3297 #, python-format msgid "" "This contact will temporarily see you as %(status)s, but only until you " "change your status. Then he will see your global status." msgstr "" +"Denne kontakt vil midlertidig se dig som %(status)s, men kun indtil du " +"ændrer din status. Da vil han se din globale status." -#: ../src/roster_window.py:3305 +#: ../src/roster_window.py:3316 msgid "No account available" msgstr "Ingen konto tilgængelig" -#: ../src/roster_window.py:3306 +#: ../src/roster_window.py:3317 msgid "You must create an account before you can chat with other contacts." msgstr "" "Du må oprette en konto før du kan begynde en samtale med andre kontakter." -#: ../src/roster_window.py:3877 +#: ../src/roster_window.py:3897 msgid "Metacontacts storage not supported by your server" msgstr "Metakontakt lagring er ikke understøttet af din server" -#: ../src/roster_window.py:3879 +#: ../src/roster_window.py:3899 msgid "" "Your server does not support storing metacontacts information. So those " "information will not be saved on next reconnection." @@ -9515,12 +9500,12 @@ msgstr "" "information. Så denne information vil ikke blive gemt til næste gang du " "tilslutter dig." -#: ../src/roster_window.py:3964 +#: ../src/roster_window.py:3984 msgid "" "You are about to create a metacontact. Are you sure you want to continue?" msgstr "Du er ved at oprette en metakontakt. Er du sikker på du vil fortsætte?" -#: ../src/roster_window.py:3966 +#: ../src/roster_window.py:3986 msgid "" "Metacontacts are a way to regroup several contacts in one line. Generally it " "is used when the same person has several Jabber accounts or transport " @@ -9529,183 +9514,182 @@ msgstr "" "Metakontakter er en måde at gruppere flere kontakter på en linie. Oftest " "bruges det når den samme person har flere Jabber eller transport kontoer." -#: ../src/roster_window.py:4081 +#: ../src/roster_window.py:4101 msgid "Invalid file URI:" msgstr "Ugyldig Fil URI:" -#: ../src/roster_window.py:4092 +#: ../src/roster_window.py:4112 #, python-format msgid "Do you want to send this file to %s:" msgid_plural "Do you want to send these files to %s:" msgstr[0] "Vil du sende denne fil til %s:" msgstr[1] "Vil du sende disse filer til %s:" -#: ../src/roster_window.py:4207 -#, fuzzy, python-format +#: ../src/roster_window.py:4227 +#, python-format msgid "Send %s to %s" -msgstr "Send %s" +msgstr "Send %s til %s" -#: ../src/roster_window.py:4213 -#, fuzzy, python-format +#: ../src/roster_window.py:4233 +#, python-format msgid "Make %s and %s metacontacts" -msgstr "Send en fil til en kontakt" +msgstr "Lav %s og %s til metakontakter" #. new chat #. single message #. for chat_with #. for single message #. join gc -#: ../src/roster_window.py:4794 ../src/roster_window.py:4865 -#: ../src/roster_window.py:4874 ../src/systray.py:216 ../src/systray.py:263 -#: ../src/systray.py:269 +#: ../src/roster_window.py:4718 ../src/roster_window.py:4789 +#: ../src/roster_window.py:4798 ../src/statusicon.py:248 +#: ../src/statusicon.py:295 ../src/statusicon.py:301 #, python-format msgid "using account %s" msgstr "med konto %s" #. add -#: ../src/roster_window.py:4881 +#: ../src/roster_window.py:4805 #, python-format msgid "to %s account" msgstr "til %s konto" #. disco -#: ../src/roster_window.py:4886 +#: ../src/roster_window.py:4810 #, python-format msgid "using %s account" msgstr "bruger %s konto" -#: ../src/roster_window.py:4923 ../src/systray.py:279 +#: ../src/roster_window.py:4847 ../src/statusicon.py:311 msgid "_Manage Bookmarks..." msgstr "Håndter Bog_mærker..." #. profile, avatar -#: ../src/roster_window.py:4943 +#: ../src/roster_window.py:4867 #, python-format msgid "of account %s" msgstr "fra konto %s" -#: ../src/roster_window.py:4983 +#: ../src/roster_window.py:4907 #, python-format msgid "for account %s" msgstr "for konto %s" -#: ../src/roster_window.py:5039 ../src/roster_window.py:5140 +#: ../src/roster_window.py:4963 ../src/roster_window.py:5064 msgid "_Change Status Message" msgstr "_Ændre Status Besked" -#: ../src/roster_window.py:5066 +#: ../src/roster_window.py:4990 msgid "Publish Tune" msgstr "Publicer Melodi" -#: ../src/roster_window.py:5074 +#: ../src/roster_window.py:4998 msgid "Configure Services..." msgstr "Tilpas Tjenester..." -#: ../src/roster_window.py:5228 +#: ../src/roster_window.py:5145 msgid "_Maximize All" msgstr "_Maksimer alt" #. Send Group Message -#: ../src/roster_window.py:5236 ../src/roster_window.py:5404 +#: ../src/roster_window.py:5153 ../src/roster_window.py:5325 msgid "Send Group M_essage" msgstr "Send Gruppeb_esked" -#: ../src/roster_window.py:5244 +#: ../src/roster_window.py:5161 msgid "To all users" msgstr "Til alle brugere" -#: ../src/roster_window.py:5248 +#: ../src/roster_window.py:5165 msgid "To all online users" msgstr "Til alle brugere på net" #. Manage Transport submenu -#: ../src/roster_window.py:5424 +#: ../src/roster_window.py:5345 msgid "_Manage Contacts" msgstr "_Håndter Kontakter" #. Edit Groups -#: ../src/roster_window.py:5432 +#: ../src/roster_window.py:5353 msgid "Edit _Groups" msgstr "Ændre _Grupper" #. Send single message -#: ../src/roster_window.py:5485 +#: ../src/roster_window.py:5408 msgid "Send Single Message" msgstr "Send Enkel Besked" #. Execute Command -#: ../src/roster_window.py:5531 +#: ../src/roster_window.py:5454 msgid "Execute Command..." msgstr "Kør Kommando..." #. Manage Transport submenu -#: ../src/roster_window.py:5541 +#: ../src/roster_window.py:5464 msgid "_Manage Transport" msgstr "Hå_ndter Transport" #. Modify Transport -#: ../src/roster_window.py:5549 +#: ../src/roster_window.py:5472 msgid "_Modify Transport" msgstr "_Modificer Transport" #. Rename -#: ../src/roster_window.py:5558 +#: ../src/roster_window.py:5481 msgid "_Rename" msgstr "_Omdøb" -#: ../src/roster_window.py:5623 +#: ../src/roster_window.py:5546 msgid "_Maximize" msgstr "_Maksimer" -#: ../src/roster_window.py:5631 -#, fuzzy +#: ../src/roster_window.py:5554 msgid "_Reconnect" -msgstr "Afbry_d tilslutningen" +msgstr "_Tilslut igen" -#: ../src/roster_window.py:5637 +#: ../src/roster_window.py:5560 msgid "_Disconnect" msgstr "Afbry_d tilslutningen" #. History manager -#: ../src/roster_window.py:5716 +#: ../src/roster_window.py:5642 msgid "History Manager" msgstr "Historik Håndterer" -#: ../src/roster_window.py:5725 +#: ../src/roster_window.py:5653 msgid "_Join New Group Chat" msgstr "_Deltag i Ny Gruppe Samtale" -#: ../src/roster_window.py:5881 +#: ../src/roster_window.py:5809 msgid "Change Status Message..." msgstr "Ændre Status Besked..." -#: ../src/search_window.py:93 +#: ../src/search_window.py:94 msgid "Waiting for results" msgstr "Venter på resultater" -#: ../src/search_window.py:133 ../src/search_window.py:211 +#: ../src/search_window.py:132 ../src/search_window.py:210 msgid "Error in received dataform" msgstr "Fejl i modtaget dataform" #. No result -#: ../src/search_window.py:167 ../src/search_window.py:203 +#: ../src/search_window.py:166 ../src/search_window.py:202 msgid "No result" msgstr "Intet resultat" -#: ../src/session.py:128 +#: ../src/session.py:132 msgid "Disk WriteError" msgstr "Disk SkriveFejl" -#: ../src/session.py:249 +#: ../src/session.py:254 #, python-format msgid "Subject: %s" msgstr "Emne: %s" -#: ../src/session.py:422 ../src/session.py:457 +#: ../src/session.py:429 ../src/session.py:464 msgid "Confirm these session options" msgstr "Bekræft disse sessions indstillinger" -#: ../src/session.py:424 +#: ../src/session.py:431 #, python-format msgid "" "The remote client wants to negotiate an session with these features:\n" @@ -9720,7 +9704,7 @@ msgstr "" "\n" "\tKan disse indstillinger godkendes?" -#: ../src/session.py:458 +#: ../src/session.py:465 #, python-format msgid "" "The remote client selected these options:\n" @@ -9735,116 +9719,116 @@ msgstr "" "\n" "Fortsæt med sessionen?" -#: ../src/systray.py:177 +#: ../src/statusicon.py:209 msgid "_Change Status Message..." msgstr "_Ændre Status Besked..." -#: ../src/systray.py:293 +#: ../src/statusicon.py:325 msgid "Hide this menu" msgstr "Skjul denne menu" -#: ../src/tooltips.py:326 ../src/tooltips.py:520 +#: ../src/tooltips.py:347 ../src/tooltips.py:544 msgid "Jabber ID: " msgstr "Jabber ID: " -#: ../src/tooltips.py:329 ../src/tooltips.py:524 +#: ../src/tooltips.py:350 ../src/tooltips.py:548 msgid "Resource: " msgstr "Ressource: " -#: ../src/tooltips.py:334 +#: ../src/tooltips.py:355 #, python-format msgid "%(owner_or_admin_or_member)s of this group chat" msgstr "%(owner_or_admin_or_member)s af denne gruppe samtale" -#: ../src/tooltips.py:431 +#: ../src/tooltips.py:455 msgid " [blocked]" msgstr " [blokeret]" -#: ../src/tooltips.py:435 +#: ../src/tooltips.py:459 msgid " [minimized]" msgstr " [minimeret]" -#: ../src/tooltips.py:450 ../src/tooltips.py:705 +#: ../src/tooltips.py:474 ../src/tooltips.py:686 msgid "Status: " msgstr "Status: " -#: ../src/tooltips.py:480 +#: ../src/tooltips.py:504 #, python-format msgid "Last status: %s" msgstr "Sidste status: %s" -#: ../src/tooltips.py:482 +#: ../src/tooltips.py:506 #, python-format msgid " since %s" msgstr " siden %s" -#: ../src/tooltips.py:500 +#: ../src/tooltips.py:524 msgid "Connected" msgstr "Tilsluttet" -#: ../src/tooltips.py:502 +#: ../src/tooltips.py:526 msgid "Disconnected" msgstr "Tilslutning afbrudt" #. ('both' is the normal sub so we don't show it) -#: ../src/tooltips.py:531 +#: ../src/tooltips.py:555 msgid "Subscription: " msgstr "Abonnering: " -#: ../src/tooltips.py:541 +#: ../src/tooltips.py:565 msgid "OpenPGP: " msgstr "OpenPGP: " -#: ../src/tooltips.py:637 +#: ../src/tooltips.py:618 msgid "Tune:" msgstr "Melodi:" -#: ../src/tooltips.py:663 +#: ../src/tooltips.py:644 msgid "Download" msgstr "Hent" -#: ../src/tooltips.py:669 +#: ../src/tooltips.py:650 msgid "Upload" msgstr "Send" -#: ../src/tooltips.py:676 +#: ../src/tooltips.py:657 msgid "Type: " msgstr "Type: " -#: ../src/tooltips.py:680 +#: ../src/tooltips.py:661 msgid "Transferred: " msgstr "Overført: " -#: ../src/tooltips.py:683 ../src/tooltips.py:704 +#: ../src/tooltips.py:664 ../src/tooltips.py:685 msgid "Not started" msgstr "Ikke startet" -#: ../src/tooltips.py:687 +#: ../src/tooltips.py:668 msgid "Stopped" msgstr "Stoppet" -#: ../src/tooltips.py:689 ../src/tooltips.py:692 +#: ../src/tooltips.py:670 ../src/tooltips.py:673 msgid "Completed" msgstr "Fuldført" -#: ../src/tooltips.py:696 +#: ../src/tooltips.py:677 msgid "?transfer status:Paused" msgstr "?transfer status:Midlertidig stoppet" #. stalled is not paused. it is like 'frozen' it stopped alone -#: ../src/tooltips.py:700 +#: ../src/tooltips.py:681 msgid "Stalled" msgstr "Hænger" -#: ../src/tooltips.py:702 +#: ../src/tooltips.py:683 msgid "Transferring" msgstr "Overfører" -#: ../src/tooltips.py:738 +#: ../src/tooltips.py:721 msgid "This service has not yet responded with detailed information" msgstr "Denne tjeneste har endnu ikke svaret med detaljeret information" -#: ../src/tooltips.py:741 +#: ../src/tooltips.py:724 msgid "" "This service could not respond with detailed information.\n" "It is most likely legacy or broken" @@ -9852,29 +9836,28 @@ msgstr "" "Denne tjeneste kunne ikke svare med detaljeret information.\n" "Den er højst sandsynlig ikke fungerende" -#: ../src/vcard.py:245 +#: ../src/vcard.py:252 msgid "?Client:Unknown" msgstr "?Client:Ukendt" -#: ../src/vcard.py:247 +#: ../src/vcard.py:254 msgid "?OS:Unknown" msgstr "?OS:Ukendt" -#: ../src/vcard.py:268 -#, fuzzy +#: ../src/vcard.py:275 msgid "?Time:Unknown" -msgstr "?Client:Ukendt" +msgstr "?Tid:Ukendt" -#: ../src/vcard.py:292 ../src/vcard.py:302 ../src/vcard.py:511 +#: ../src/vcard.py:299 ../src/vcard.py:309 ../src/vcard.py:518 #, python-format msgid "since %s" msgstr "siden %s" -#: ../src/vcard.py:331 +#: ../src/vcard.py:336 msgid "Affiliation:" msgstr "Tilknytning:" -#: ../src/vcard.py:339 +#: ../src/vcard.py:344 msgid "" "This contact is interested in your presence information, but you are not " "interested in his/her presence" @@ -9882,7 +9865,7 @@ msgstr "" "Denne kontakt er interesseret i din tilstedeværelses information, men du er " "ikke interesseret i hans/hendes tilstedeværelse" -#: ../src/vcard.py:341 +#: ../src/vcard.py:346 msgid "" "You are interested in the contact's presence information, but he/she is not " "interested in yours" @@ -9890,14 +9873,14 @@ msgstr "" "Du er interesseret i kontaktens tilstedeværelses information, men han/hun er " "ikke interesseret i din" -#: ../src/vcard.py:343 +#: ../src/vcard.py:348 msgid "You and the contact are interested in each other's presence information" msgstr "" "Du og kontakten er begge interessered i hinandens tilstedeværelses " "information" #. None -#: ../src/vcard.py:345 +#: ../src/vcard.py:350 msgid "" "You are not interested in the contact's presence, and neither he/she is " "interested in yours" @@ -9905,233 +9888,68 @@ msgstr "" "Du er ikke interesseret i kontaktens tilstedeværelse, og han/hun er ikke " "interesseret i din" -#: ../src/vcard.py:352 +#: ../src/vcard.py:357 msgid "You are waiting contact's answer about your subscription request" msgstr "Du venter på kontaktens svar om din abonnements forespørsel" -#: ../src/vcard.py:354 +#: ../src/vcard.py:359 msgid "There is no pending subscription request." msgstr "Der er ikke nogen ventende abbonerings forespørgsler." -#: ../src/vcard.py:359 ../src/vcard.py:413 ../src/vcard.py:536 +#: ../src/vcard.py:364 ../src/vcard.py:418 ../src/vcard.py:541 msgid " resource with priority " msgstr " ressource med prioritet " -#~ msgid "Add Special _Notification" -#~ msgstr "Tilføj Speciel _Påmindelse" +#~ msgid "_Incoming message:" +#~ msgstr "_Indkommende besked:" -#~ msgid "Assign Open_PGP Key" -#~ msgstr "Tilskriv Open_PGP Nøgle" - -#~ msgid "Command not supported for zeroconf account." -#~ msgstr "Kommando er ikke understøttet for zeroconf konto." - -#~ msgid "Commands: %s" -#~ msgstr "Kommandoer: %s" - -#~ msgid "Usage: /%s, clears the text window." -#~ msgstr "Brug: /%s, rydder tekst vinduet" - -#~ msgid "Usage: /%s, hide the chat buttons." -#~ msgstr "Brug: /%s, gem samtale knapper" +#~ msgid "_Outgoing message:" +#~ msgstr "_Udgående besked:" #~ msgid "" -#~ "Usage: /%(command)s , sends action to the current group chat. Use " -#~ "third person. (e.g. /%(command)s explodes.)" +#~ "The host %s you configured as the ft_add_hosts_to_send advanced option is " +#~ "not valid, so ignored." #~ msgstr "" -#~ "Brug: /%(command)s , sender handling til den nuværende gruppe " -#~ "samtale. Brug tredie person. (f.eks. /%(command)s eksploderer.)" +#~ "Værten %s du konfigurerte i ft_add_hosts_to_send avancerte indstillinger " +#~ "er ikke gyldig, så den bliver ignoreret." -#~ msgid "Usage: /%s, sends a ping to the contact" -#~ msgstr "Brug: %s, sender en ping til kontakten" - -#~ msgid "Usage: /%s, send the message to the contact" -#~ msgstr "Brug: /%s, send beskeden til kontakten" - -#~ msgid "No help info for /%s" -#~ msgstr "Ingen hjælp for /%s" - -#~ msgid "Enable link-local/zeroconf messaging" -#~ msgstr "Aktiver link-local/zeroconf beskeder" - -#~ msgid "Nickname not found: %s" -#~ msgstr "Kælenavn ikke fundet: %s" - -#~ msgid "This group chat has no subject" -#~ msgstr "Denne gruppe samtale har ikke noget emne" - -#~ msgid "Invited %(contact_jid)s to %(room_jid)s." -#~ msgstr "Inviterede %(contact_jid)s til %(room_jid)s." - -#, fuzzy -#~ msgid "Nickname not found" -#~ msgstr "Kælenavn ikke fundet: %s" - -#, fuzzy -#~ msgid "" -#~ "Usage: /%s [reason], bans the JID from the group chat. The " -#~ "nickname of an occupant may be substituted, but not if it contains \"@\". " -#~ "If the JID is currently in the group chat, he/she/it will also be kicked." -#~ msgstr "" -#~ "Brug: /%s [begrundelse], udviser denne JID fra gruppe " -#~ "samtalen. Kælenavnet til en bruger kan bruges, men ikke hvis det " -#~ "indeholder \"@\". Hvis en bruger med JID'en er tilstede i gruppe samtalen " -#~ "vil han/hun/den/det også blive udvist. Mellemrum i kælenavnet er ikke " -#~ "understøttet." +#~ msgid "OpenPGP passphrase was not given" +#~ msgstr "OpenPGP adgangskode blev ikke givet" #~ msgid "" -#~ "Usage: /%s , opens a private chat window with the specified " -#~ "occupant." +#~ "To continue sending and receiving messages, you will need to reconnect." #~ msgstr "" -#~ "Brug: /%s , åbner et privat samtale vindue med den " -#~ "specificerede bruger." +#~ "For at kunne fortsætte med at sende og modtage beskeder, må du tilslutte " +#~ "dig igen." #~ msgid "" -#~ "Usage: /%s [reason], closes the current window or tab, displaying reason " -#~ "if specified." +#~ "You are not connected or not visible to others. Your message could not be " +#~ "sent." #~ msgstr "" -#~ "Brug: /%s [begrundelse], lukker det nuværende vindue eller fan, visende " -#~ "begrundelsen hvis specificeret." +#~ "Du er ikke tilsluttet eller synlig for andre. Din besked kunne ikke " +#~ "sendes." + +#~ msgid "[This message is encrypted]" +#~ msgstr "[Denne besked er krypteret]" + +#~ msgid "%i days ago" +#~ msgstr "%i dage siden" + +#~ msgid "Trayicon" +#~ msgstr "Statusikon" + +#~ msgid "A icon in systemtray reflecting the current presence." +#~ msgstr "Et ikon i statusfeltet som viser din nuværende tilstedeværelse." #~ msgid "" -#~ "Usage: /%s [reason], invites JID to the current group chat, " -#~ "optionally providing a reason." +#~ "Requires python-gnome2-extras or compiled trayicon module from Gajim " +#~ "sources." #~ msgstr "" -#~ "Brug: /%s [begrundelse], inviter JID til den nuværende gruppe " -#~ "samtale, visende begrundelsen hvis specificeret" - -#~ msgid "" -#~ "Usage: /%s @[/nickname], offers to join room@server " -#~ "optionally using specified nickname." -#~ msgstr "" -#~ "Brug: /%s @[/kælenavn], tilbyder at deltage i rum@server " -#~ "eventuelt med det specificerede kælenavn." - -#, fuzzy -#~ msgid "" -#~ "Usage: /%s [reason], removes the occupant specified by " -#~ "nickname from the group chat and optionally displays a reason." -#~ msgstr "" -#~ "Brug: /%s [begrundelse], fjerner deltager med kælenavnet fra " -#~ "gruppe samtalen og hvis specificeret, viser en begrundelse" - -#~ msgid "" -#~ "Usage: /%s [message], opens a private message window and sends " -#~ "message to the occupant specified by nickname." -#~ msgstr "" -#~ "Brug: /%s [besked], åbner et privat samtale vindue og sender " -#~ "beskeden til deltageren med det specificerede kælenavn." - -#~ msgid "Usage: /%s , changes your nickname in current group chat." -#~ msgstr "" -#~ "Brug: /%s , ændrer dit kælenavn i den nuværende gruppe samtale." - -#~ msgid "Usage: /%s , display the names of group chat occupants." -#~ msgstr "Brug: /%s , viser navnene på deltagerne i gruppe samtalen." - -#~ msgid "" -#~ "Usage: /%s [topic], displays or updates the current group chat topic." -#~ msgstr "" -#~ "Brug: /%s [emne], viser eller opdaterer det nuværende gruppe samtale emne." - -#~ msgid "" -#~ "Usage: /%s , sends a message without looking for other commands." -#~ msgstr "" -#~ "Brug: /%s , sender en besked uden at kigge efter andre kommandoer." - -#, fuzzy -#~ msgid "" -#~ "Usage: /%s , allow to send you messages and private " -#~ "messages." -#~ msgstr "" -#~ "Brug: /%s , ændrer dit kælenavn i den nuværende gruppe samtale." - -#~ msgid "Click to see features (like MSN, ICQ transports) of jabber servers" -#~ msgstr "" -#~ "Tryk for at se egenskaber (som MSN, ICQ transporter) på jabber serveren" - -#~ msgid "Servers Features" -#~ msgstr "Server Egenskaber" - -#~ msgid "Your JID:" -#~ msgstr "Din JID:" - -#~ msgid "Name:" -#~ msgstr "Navn:" - -#~ msgid "_Host:" -#~ msgstr "_Værtsmaskine:" - -#~ msgid "Show _roster" -#~ msgstr "Vis _kontaktvindue" - -#~ msgid "Select the account with which to synchronise" -#~ msgstr "Vælg den konto som du vil synkronisere med" - -#~ msgid "Modify Account" -#~ msgstr "Ændre Konto" - -#~ msgid "" -#~ "%(title)s by %(artist)s\n" -#~ "from %(source)s" -#~ msgstr "" -#~ "%(title)s af %(artist)s\n" -#~ "fra %(source)s" - -#~ msgid "Gajim account %s" -#~ msgstr "Gajim konto %s" - -#~ msgid "Always use OS/X default applications" -#~ msgstr "Altid brug OS/X standard programmer" - -#~ msgid "Custom" -#~ msgstr "Tilpasset" - -#~ msgid "Duplicate Jabber ID" -#~ msgstr "Jabber ID eksisterer" - -#~ msgid "This account is already configured in Gajim." -#~ msgstr "Denne konto er allerede konfigureret i Gajim." - -#~ msgid "PyOpenSSL" -#~ msgstr "PyOpenSSL" - -#~ msgid "gajim-remote" -#~ msgstr "gajim-fjernstyring" - -#~ msgid "OpenGPG" -#~ msgstr "OpenGPG" - -#~ msgid "gnome-keyring" -#~ msgstr "gnome-nøglering" - -#~ msgid "" -#~ "Requires python-gnome2-extras or compilation of gtkspell module from " -#~ "Gajim sources." -#~ msgstr "" -#~ "Kræver python-gnome2-extras eller kompilering af gtkspell modulet fra " +#~ "Kræver python-gnome2-extras eller et kompileret statusikon modul fra " #~ "Gajim kildekoden." -#~ msgid "Notification-daemon" -#~ msgstr "Påmindelses-dæmon" +#~ msgid "Requires PyGTK >= 2.10." +#~ msgstr "Kræver PyGTK >= 2.10." -#~ msgid "Idle" -#~ msgstr "Tomgang" - -#~ msgid "Requires compilation of the idle module from Gajim sources." -#~ msgstr "Kræver kompilering af tomgangs modulet fra Gajim kildekoden." - -#~ msgid "libsexy" -#~ msgstr "libsexy" - -#~ msgid "File transfer stopped by the contact at the other end" -#~ msgstr "Filoverførslen blev stoppet af kontakten i den anden ende" - -#~ msgid "Generic" -#~ msgstr "Fællesbetegnelse" - -#~ msgid "Mood" -#~ msgstr "Humør" - -#~ msgid "Activity" -#~ msgstr "Aktivitet" +#~ msgid "gtk-ok" +#~ msgstr "ok" diff --git a/po/de.po b/po/de.po index 6a5d40c83..d1a3361d9 100644 --- a/po/de.po +++ b/po/de.po @@ -9,10 +9,10 @@ # Niklas Hambüchen , 2009. msgid "" msgstr "" -"Project-Id-Version: gajim 0.12\n" +"Project-Id-Version: gajim 0.13\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2009-10-28 22:17+0100\n" -"PO-Revision-Date: 2009-08-19 23:38+0200\n" +"POT-Creation-Date: 2009-11-25 22:20+0100\n" +"PO-Revision-Date: 2009-10-31 17:57+0100\n" "Last-Translator: Nico Gulden \n" "Language-Team: German \n" "MIME-Version: 1.0\n" @@ -97,7 +97,7 @@ msgstr "Bitte einen Server wählen" #: ../data/glade/account_creation_wizard_window.glade.h:7 msgid "@" -msgstr "" +msgstr "@" #: ../data/glade/account_creation_wizard_window.glade.h:8 msgid "" @@ -108,9 +108,8 @@ msgstr "" "SHA1-Fingerprint dieses Zertifikates:\n" #: ../data/glade/account_creation_wizard_window.glade.h:11 -#, fuzzy msgid "Anon_ymous authentication" -msgstr "Authentifizierung _verwenden" +msgstr "Anon_yme Authentifizierung" #: ../data/glade/account_creation_wizard_window.glade.h:12 msgid "Connect when I press Finish" @@ -285,9 +284,9 @@ msgstr "Persönliche Informationen bearbeiten …" #. No configured account #: ../data/glade/account_modification_window.glade.h:16 #: ../data/glade/accounts_window.glade.h:21 -#: ../data/glade/roster_window.glade.h:5 ../src/common/helpers.py:1217 -#: ../src/common/helpers.py:1229 ../src/notify.py:547 ../src/notify.py:568 -#: ../src/notify.py:607 ../src/notify.py:619 +#: ../data/glade/roster_window.glade.h:5 ../src/common/helpers.py:1100 +#: ../src/common/helpers.py:1112 ../src/notify.py:560 ../src/notify.py:581 +#: ../src/notify.py:620 ../src/notify.py:632 msgid "Gajim" msgstr "Gajim" @@ -296,9 +295,9 @@ msgstr "Gajim" #. General group cannot be changed #: ../data/glade/account_modification_window.glade.h:17 #: ../data/glade/accounts_window.glade.h:22 -#: ../data/glade/preferences_window.glade.h:50 ../src/common/contacts.py:98 -#: ../src/dialogs.py:103 ../src/dialogs.py:111 ../src/roster_window.py:2753 -#: ../src/roster_window.py:5351 +#: ../data/glade/preferences_window.glade.h:52 ../src/common/contacts.py:135 +#: ../src/dialogs.py:111 ../src/dialogs.py:121 ../src/roster_window.py:2746 +#: ../src/roster_window.py:5268 msgid "General" msgstr "Allgemein" @@ -359,21 +358,21 @@ msgid "Information about you, as stored in the server" msgstr "Informationen über Sie, die auf dem Server gespeichert sind" #: ../data/glade/account_modification_window.glade.h:27 -#: ../data/glade/accounts_window.glade.h:35 ../src/config.py:1585 -#: ../src/config.py:2131 +#: ../data/glade/accounts_window.glade.h:35 ../src/config.py:1646 +#: ../src/config.py:2196 msgid "No key selected" msgstr "Kein Schlüssel ausgewählt" #. None means no proxy profile selected #: ../data/glade/account_modification_window.glade.h:29 #: ../data/glade/accounts_window.glade.h:37 -#: ../data/glade/change_mood_dialog.glade.h:3 ../src/config.py:1106 -#: ../src/config.py:1209 ../src/config.py:1489 ../src/config.py:1494 -#: ../src/config.py:2038 ../src/config.py:2117 ../src/config.py:2130 -#: ../src/config.py:3317 ../src/config.py:3390 ../src/dialogs.py:293 -#: ../src/dialogs.py:295 ../src/dialogs.py:498 ../src/dialogs.py:511 -#: ../src/roster_window.py:2807 ../src/roster_window.py:2813 -#: ../src/roster_window.py:2818 +#: ../data/glade/change_mood_dialog.glade.h:3 ../src/config.py:1158 +#: ../src/config.py:1261 ../src/config.py:1550 ../src/config.py:1555 +#: ../src/config.py:2103 ../src/config.py:2182 ../src/config.py:2195 +#: ../src/config.py:3396 ../src/config.py:3469 ../src/dialogs.py:308 +#: ../src/dialogs.py:310 ../src/dialogs.py:513 ../src/dialogs.py:526 +#: ../src/roster_window.py:2800 ../src/roster_window.py:2806 +#: ../src/roster_window.py:2811 msgid "None" msgstr "Kein Proxy" @@ -488,9 +487,8 @@ msgid "Accounts" msgstr "Konten" #: ../data/glade/accounts_window.glade.h:9 -#, fuzzy msgid "Anonymous authentication" -msgstr "Authentifizierung _verwenden" +msgstr "Anonyme Authentifizierung" #: ../data/glade/accounts_window.glade.h:13 msgid "" @@ -533,8 +531,8 @@ msgstr "" "Eventuell müssen Sie dazu Ihre Firewall-Einstellungen ändern." #: ../data/glade/accounts_window.glade.h:32 -#: ../data/glade/zeroconf_information_window.glade.h:4 ../src/config.py:1612 -#: ../src/dialogs.py:806 +#: ../data/glade/zeroconf_information_window.glade.h:4 ../src/config.py:1673 +#: ../src/dialogs.py:830 msgid "Jabber ID:" msgstr "Jabber-ID:" @@ -548,7 +546,7 @@ msgid "Mer_ge accounts" msgstr "Konten _zusammenführen" #. Rename -#: ../data/glade/accounts_window.glade.h:42 ../src/roster_window.py:5302 +#: ../data/glade/accounts_window.glade.h:42 ../src/roster_window.py:5219 msgid "Re_name" msgstr "_Umbenennen" @@ -628,7 +626,7 @@ msgstr "Neuen Kontakt hinzufügen" #: ../data/glade/add_new_contact_window.glade.h:4 msgid "I would like to add you to my contact list." -msgstr "Ich würde Dich gerne zu meiner Kontaktliste hinzufügen." +msgstr "Ich würde Sie gerne zu meiner Kontaktliste hinzufügen." #: ../data/glade/add_new_contact_window.glade.h:5 msgid "" @@ -947,7 +945,7 @@ msgstr "Zuletzt geändert:" msgid "New entry received" msgstr "Neuer Eintrag empfangen" -#: ../data/glade/atom_entry_window.glade.h:5 ../src/atom_window.py:114 +#: ../data/glade/atom_entry_window.glade.h:5 ../src/atom_window.py:124 msgid "You have received new entry:" msgstr "Sie haben einen neuen Eintrag erhalten:" @@ -991,11 +989,11 @@ msgstr "Neues Passwort eingeben:" msgid "Type your new status message" msgstr "Geben Sie Ihre neue Statusnachricht ein" -#: ../data/glade/change_status_message_dialog.glade.h:2 ../src/tooltips.py:601 +#: ../data/glade/change_status_message_dialog.glade.h:2 ../src/tooltips.py:613 msgid "Activity:" msgstr "Aktivität:" -#: ../data/glade/change_status_message_dialog.glade.h:3 ../src/tooltips.py:586 +#: ../data/glade/change_status_message_dialog.glade.h:3 ../src/tooltips.py:608 msgid "Mood:" msgstr "Stimmung:" @@ -1076,9 +1074,8 @@ msgid "Assign Open_PGP Key..." msgstr "Open_PGP-Schlüssel zuweisen …" #: ../data/glade/contact_context_menu.glade.h:4 -#, fuzzy msgid "E_xecute Command..." -msgstr "Befehl ausführen …" +msgstr "B_efehl ausführen …" #: ../data/glade/contact_context_menu.glade.h:5 msgid "Edit _Groups..." @@ -1086,8 +1083,8 @@ msgstr "_Gruppen bearbeiten …" #. Invite to #. Invite to Groupchat -#: ../data/glade/contact_context_menu.glade.h:6 ../src/roster_window.py:5257 -#: ../src/roster_window.py:5412 +#: ../data/glade/contact_context_menu.glade.h:6 ../src/roster_window.py:5174 +#: ../src/roster_window.py:5333 msgid "In_vite to" msgstr "_Einladen zu" @@ -1100,8 +1097,8 @@ msgid "Remo_ve" msgstr "Ent_fernen" #. Send Custom Status -#: ../data/glade/contact_context_menu.glade.h:9 ../src/roster_window.py:5267 -#: ../src/roster_window.py:5497 +#: ../data/glade/contact_context_menu.glade.h:9 ../src/roster_window.py:5184 +#: ../src/roster_window.py:5420 msgid "Send Cus_tom Status" msgstr "Benu_tzerdefinierten Status senden" @@ -1135,8 +1132,8 @@ msgid "_Allow him/her to see my status" msgstr "Erlaube dem Kont_akt, meinen Status zu sehen" #: ../data/glade/contact_context_menu.glade.h:18 -#: ../data/glade/gc_occupants_menu.glade.h:7 ../src/roster_window.py:5330 -#: ../src/roster_window.py:5449 ../src/roster_window.py:5578 +#: ../data/glade/gc_occupants_menu.glade.h:7 ../src/roster_window.py:5247 +#: ../src/roster_window.py:5370 ../src/roster_window.py:5501 msgid "_Block" msgstr "_Blockieren" @@ -1147,7 +1144,7 @@ msgstr "_Verbiete dem Kontakt, meinen Status zu sehen" #: ../data/glade/contact_context_menu.glade.h:20 #: ../data/glade/gc_control_popup_menu.glade.h:6 #: ../data/glade/gc_occupants_menu.glade.h:8 -#: ../data/glade/roster_window.glade.h:21 ../src/roster_window.py:5647 +#: ../data/glade/roster_window.glade.h:21 ../src/roster_window.py:5570 msgid "_History" msgstr "_Verlauf" @@ -1169,8 +1166,8 @@ msgstr "_Abonnement" # TODO: Review by german translators #: ../data/glade/contact_context_menu.glade.h:25 -#: ../data/glade/gc_occupants_menu.glade.h:13 ../src/roster_window.py:5324 -#: ../src/roster_window.py:5443 ../src/roster_window.py:5575 +#: ../data/glade/gc_occupants_menu.glade.h:13 ../src/roster_window.py:5241 +#: ../src/roster_window.py:5364 ../src/roster_window.py:5498 msgid "_Unblock" msgstr "_Entblocken" @@ -1263,7 +1260,7 @@ msgid "When a file transfer is complete show a popup notification" msgstr "" "Zeige eine Popup-Benachrichtigung, wenn die Datei komplett übertragen wurde." -#: ../data/glade/filetransfers.glade.h:13 ../src/filetransfers_window.py:792 +#: ../data/glade/filetransfers.glade.h:13 ../src/filetransfers_window.py:820 msgid "_Continue" msgstr "_Fortsetzen" @@ -1271,7 +1268,7 @@ msgstr "_Fortsetzen" msgid "_Notify me when a file transfer is complete" msgstr "Be_nachrichtige mich, wenn die Dateiübertragung abgeschlossen ist" -#: ../data/glade/filetransfers.glade.h:15 ../src/filetransfers_window.py:200 +#: ../data/glade/filetransfers.glade.h:15 ../src/filetransfers_window.py:204 msgid "_Open Containing Folder" msgstr "Öffne _Ordner" @@ -1299,7 +1296,7 @@ msgstr "" "Kontakt-Reihe\n" "Chat-Banner" -#: ../data/glade/gajim_themes_window.glade.h:6 ../src/chat_control.py:818 +#: ../data/glade/gajim_themes_window.glade.h:6 ../src/chat_control.py:859 msgid "Bold" msgstr "Fett" @@ -1319,11 +1316,11 @@ msgstr "Gajim-Design-Einstellungen" msgid "Gone" msgstr "Weg" -#: ../data/glade/gajim_themes_window.glade.h:11 ../src/common/pep.py:153 +#: ../data/glade/gajim_themes_window.glade.h:11 ../src/common/pep.py:150 msgid "Inactive" msgstr "Inaktiv" -#: ../data/glade/gajim_themes_window.glade.h:12 ../src/chat_control.py:819 +#: ../data/glade/gajim_themes_window.glade.h:12 ../src/chat_control.py:860 msgid "Italic" msgstr "Kursiv" @@ -1371,7 +1368,7 @@ msgstr "_Thema ändern …" msgid "Configure _Room..." msgstr "Chat_raum einrichten …" -#: ../data/glade/gc_control_popup_menu.glade.h:4 ../src/disco.py:1624 +#: ../data/glade/gc_control_popup_menu.glade.h:4 ../src/disco.py:1746 msgid "_Bookmark" msgstr "Chatraum zu den Lesezeichen _hinzufügen" @@ -1460,8 +1457,9 @@ msgstr "" msgid "Welcome to Gajim History Logs Manager" msgstr "Willkommen im Gajim-Verlaufsmanager" -#: ../data/glade/history_manager.glade.h:4 ../src/dialogs.py:2884 -#: ../src/dialogs.py:2987 +#. Change label for accept_button to action name instead of 'OK'. +#: ../data/glade/history_manager.glade.h:4 ../src/dialogs.py:3007 +#: ../src/dialogs.py:3104 msgid "Delete" msgstr "Löschen" @@ -1492,7 +1490,7 @@ msgstr "" msgid "_Search Database" msgstr "Durch_suche Datenbank" -#: ../data/glade/history_window.glade.h:1 ../src/history_window.py:316 +#: ../data/glade/history_window.glade.h:1 ../src/history_window.py:323 msgid "Conversation History" msgstr "Unterhaltungsverlauf" @@ -1517,11 +1515,10 @@ msgstr "Unterhaltungsver_lauf" # TODO: Synchronize with other strings concerning bookmarks #: ../data/glade/join_groupchat_window.glade.h:2 -#, fuzzy msgid "Bookmark this room" -msgstr "Diesen Chatraum speichern (Strg+B)" +msgstr "Diesen Chatraum merken (Strg+B)" -#: ../data/glade/join_groupchat_window.glade.h:3 ../src/dialogs.py:1972 +#: ../data/glade/join_groupchat_window.glade.h:3 ../src/dialogs.py:2076 msgid "Join Group Chat" msgstr "Chatraum betreten" @@ -1548,8 +1545,8 @@ msgstr "Kürzlich:" msgid "Room:" msgstr "Chatraum:" -#: ../data/glade/join_groupchat_window.glade.h:9 ../src/disco.py:1201 -#: ../src/disco.py:1628 +#: ../data/glade/join_groupchat_window.glade.h:9 ../src/disco.py:1306 +#: ../src/disco.py:1750 msgid "_Join" msgstr "_Betreten" @@ -1577,7 +1574,7 @@ msgstr "Minimieren bei automatischem Beitritt" msgid "Print status:" msgstr "Status anzeigen:" -#: ../data/glade/manage_bookmarks_window.glade.h:9 ../src/config.py:1602 +#: ../data/glade/manage_bookmarks_window.glade.h:9 ../src/config.py:1663 msgid "Server:" msgstr "Server:" @@ -1689,17 +1686,26 @@ msgid "Show a list of formattings" msgstr "Schriftformatierung (Alt+M)" #: ../data/glade/message_window.glade.h:10 -msgid "Show a menu of advanced functions (Alt+A)" +#, fuzzy +msgid "Show a menu of advanced functions (Alt+D)" msgstr "Liste erweiterter Funktionen anzeigen (Alt+A)" #: ../data/glade/message_window.glade.h:11 msgid "Show the contact's profile (Ctrl+I)" msgstr "Benutzerprofil anzeigen (Strg+I)" -#. Make sure the character after "_" is not M/m (conflicts with Alt+M that is supposed to show the Emoticon Selector) +#: ../data/glade/message_window.glade.h:12 +msgid "Toggle audio session" +msgstr "" + #: ../data/glade/message_window.glade.h:13 +msgid "Toggle video session" +msgstr "" + +#. Make sure the character after "_" is not M/m (conflicts with Alt+M that is supposed to show the Emoticon Selector) +#: ../data/glade/message_window.glade.h:15 #: ../data/glade/xml_console_window.glade.h:11 -#: ../src/filetransfers_window.py:260 +#: ../src/filetransfers_window.py:266 msgid "_Send" msgstr "_Senden" @@ -1831,6 +1837,16 @@ msgid "Configure color and font of the interface" msgstr "Farben und Schriftarten für die Oberfläche konfigurieren" #: ../data/glade/preferences_window.glade.h:36 +#, fuzzy +msgid "Contact's message:" +msgstr "Chat-Nachricht:" + +#: ../data/glade/preferences_window.glade.h:37 +#, fuzzy +msgid "Contact's nickname:" +msgstr "Name des Kontakts" + +#: ../data/glade/preferences_window.glade.h:38 msgid "" "Detached roster with detached chats\n" "Detached roster with single chat\n" @@ -1844,31 +1860,31 @@ msgstr "" "separate Kontaktliste gruppiert nach Benutzerkonto\n" "separate Kontaktliste gruppiert nach Typ" -#: ../data/glade/preferences_window.glade.h:41 +#: ../data/glade/preferences_window.glade.h:43 msgid "Display _activity of contacts in roster" msgstr "_Aktivitäten von Kontakten in der Kontaktliste anzeigen" -#: ../data/glade/preferences_window.glade.h:42 +#: ../data/glade/preferences_window.glade.h:44 msgid "Display _extra email details" msgstr "Zusätzliche _E-Mail-Details anzeigen" -#: ../data/glade/preferences_window.glade.h:43 +#: ../data/glade/preferences_window.glade.h:45 msgid "Display _tunes of contacts in roster" msgstr "Die gerade abgespielten Musik_titel anzeigen" -#: ../data/glade/preferences_window.glade.h:44 +#: ../data/glade/preferences_window.glade.h:46 msgid "Display a_vatars of contacts in roster" msgstr "A_vatare der Kontakte in der Kontaktliste anzeigen" -#: ../data/glade/preferences_window.glade.h:45 +#: ../data/glade/preferences_window.glade.h:47 msgid "Display m_ood of contacts in roster" msgstr "_Stimmungen anzeigen" -#: ../data/glade/preferences_window.glade.h:46 +#: ../data/glade/preferences_window.glade.h:48 msgid "Display status _messages of contacts in roster" msgstr "Status_nachrichten anzeigen" -#: ../data/glade/preferences_window.glade.h:47 +#: ../data/glade/preferences_window.glade.h:49 msgid "" "Gajim can send and receive meta-information related to a conversation you " "may have with a contact. Here you can specify which chatstates you want to " @@ -1878,7 +1894,7 @@ msgstr "" "versenden. Hier können Sie festlegen, welche Chatstatus-Benachrichtigungen " "in Ihrem Chatfenster anzeigt werden sollen." -#: ../data/glade/preferences_window.glade.h:48 +#: ../data/glade/preferences_window.glade.h:50 msgid "" "Gajim can send and receive meta-information related to a conversation you " "may have with a contact. Here you can specify which chatstates you want to " @@ -1888,7 +1904,7 @@ msgstr "" "versenden. Hier können Sie festlegen, welche Chatstatus-Benachrichtigungen " "Sie Ihrem Gegenüber senden möchten." -#: ../data/glade/preferences_window.glade.h:49 +#: ../data/glade/preferences_window.glade.h:51 msgid "" "Gajim will notify you via a popup window in the bottom right of the screen " "about contacts that just signed out" @@ -1896,11 +1912,11 @@ msgstr "" "Gajim informiert Sie über ein Popup-Fenster in der rechten unteren " "Bildschirmecke über Kontakte, die sich gerade abgemeldet haben." -#: ../data/glade/preferences_window.glade.h:51 +#: ../data/glade/preferences_window.glade.h:53 msgid "Hide all buttons in chat windows" msgstr "Versteckt alle Schaltflächen im Chatfenster" -#: ../data/glade/preferences_window.glade.h:52 +#: ../data/glade/preferences_window.glade.h:54 msgid "" "If checked, Gajim will allow others to detect the operation system you are " "using" @@ -1908,7 +1924,7 @@ msgstr "" "Falls aktiviert, erlaubt Gajim Ihrem Gegenüber, Ihr Betriebssystem " "festzustellen." -#: ../data/glade/preferences_window.glade.h:53 +#: ../data/glade/preferences_window.glade.h:55 msgid "" "If checked, Gajim will also include information about the sender of the new " "emails" @@ -1916,14 +1932,14 @@ msgstr "" "Falls aktiviert, fügt Gajim auch Informationen über den Absender neuer E-" "Mails hinzu." -#: ../data/glade/preferences_window.glade.h:54 +#: ../data/glade/preferences_window.glade.h:56 msgid "" "If checked, Gajim will change status to Away when the computer is unused." msgstr "" "Falls aktiviert, wird der Status in Abwesend geändert, wenn der Computer " "nicht genutzt wird." -#: ../data/glade/preferences_window.glade.h:55 +#: ../data/glade/preferences_window.glade.h:57 msgid "" "If checked, Gajim will change status to Not Available when the computer has " "not been used even longer" @@ -1931,7 +1947,7 @@ msgstr "" "Falls aktiviert, wird der Status in Nicht Verfügbar geändert, wenn der " "Computer längere Zeit nicht genutzt wird." -#: ../data/glade/preferences_window.glade.h:56 +#: ../data/glade/preferences_window.glade.h:58 msgid "" "If checked, Gajim will display avatars of contacts in roster window and in " "group chats" @@ -1939,7 +1955,7 @@ msgstr "" "Falls aktiviert, werden die Avatare der Kontakte in der Kontaktliste und in " "Chaträumen eingeblendet." -#: ../data/glade/preferences_window.glade.h:57 +#: ../data/glade/preferences_window.glade.h:59 msgid "" "If checked, Gajim will display status messages of contacts under the contact " "name in roster window and in group chats" @@ -1947,28 +1963,28 @@ msgstr "" "Falls aktiviert, wird unter dem Namen jeden Kontaktes in der Kontaktliste " "und in Chaträumen die Statusnachricht angezeigt." -#: ../data/glade/preferences_window.glade.h:58 +#: ../data/glade/preferences_window.glade.h:60 msgid "" "If checked, Gajim will display the activity of contacts in the roster window" msgstr "" "Falls aktiviert, wird die Aktivität der Kontakte in der Kontaktliste " "angezeigt." -#: ../data/glade/preferences_window.glade.h:59 +#: ../data/glade/preferences_window.glade.h:61 msgid "" "If checked, Gajim will display the mood of contacts in the roster window" msgstr "" "Falls aktiviert, wird die Stimmung der Kontakte in der Kontaktliste " "angezeigt." -#: ../data/glade/preferences_window.glade.h:60 +#: ../data/glade/preferences_window.glade.h:62 msgid "" "If checked, Gajim will display the tunes of contacts in the roster window" msgstr "" "Falls aktiviert, wird der gerade abgespielte Musiktitel der Kontakte in der " "Kontaktliste angezeigt." -#: ../data/glade/preferences_window.glade.h:61 +#: ../data/glade/preferences_window.glade.h:63 msgid "" "If checked, Gajim will highlight spelling errors in input fields of chat " "windows. If no language is explicitly set via right click on the input " @@ -1979,7 +1995,7 @@ msgstr "" "Rechtsklick), wird die Standardsprache für diesen Kontakt oder Chatraum " "verwendet." -#: ../data/glade/preferences_window.glade.h:62 +#: ../data/glade/preferences_window.glade.h:64 msgid "" "If checked, Gajim will ignore incoming events from unauthorized contacts. " "Use with caution, because it blocks all messages from any contact that is " @@ -1989,7 +2005,7 @@ msgstr "" "Kontakten ignoriert. Vorsicht: Sie können nur noch Nachrichten von Kontakten " "empfangen, die in Ihrer Kontaktliste sind." -#: ../data/glade/preferences_window.glade.h:63 +#: ../data/glade/preferences_window.glade.h:65 msgid "" "If checked, Gajim will keep logs for encrypted messages. Please note that " "when using E2E encryption the remote party has to agree on logging, else the " @@ -1999,7 +2015,7 @@ msgstr "" "Bitte bedenken Sie, dass bei der Benutzung von ESession-Verschlüsselung der " "Chatpartner zustimmen muss; ansonsten wird nichts aufgezeichnet." -#: ../data/glade/preferences_window.glade.h:64 +#: ../data/glade/preferences_window.glade.h:66 msgid "" "If checked, Gajim will show a notification when a new e-mail is received via " "GMail" @@ -2007,7 +2023,7 @@ msgstr "" "Falls aktiviert, wird eine Benachrichtigung angezeigt, wenn eine neue E-Mail " "über Google-Mail empfangen wurde." -#: ../data/glade/preferences_window.glade.h:65 +#: ../data/glade/preferences_window.glade.h:67 msgid "" "If checked, Gajim will use protocol-specific status icons. (eg. A contact " "from MSN will have the equivalent msn icon for status online, away, busy, " @@ -2017,7 +2033,7 @@ msgstr "" "Beispiel wird für einen MSN-Kontakt das jeweilige MSN-Symbol für den Status " "\"Anwesend\", \"Abwesend\", \"Beschäftigt\", etc. angezeigt.)" -#: ../data/glade/preferences_window.glade.h:66 +#: ../data/glade/preferences_window.glade.h:68 msgid "" "If enabled, Gajim will not ask for a status message. The specified default " "message will be used instead." @@ -2025,7 +2041,7 @@ msgstr "" "Falls aktiviert, werden Sie nicht nach einer Statusnachricht gefragt. Die " "Standardnachricht wird benutzt." -#: ../data/glade/preferences_window.glade.h:67 +#: ../data/glade/preferences_window.glade.h:69 msgid "" "If not disabled, Gajim will replace ascii smilies like ':)' with equivalent " "animated or static graphical emoticons" @@ -2033,19 +2049,19 @@ msgstr "" "Falls aktiviert, werden ASCII-Smilies wie \":)\" mit äquivalenten " "graphischen Emoticons ersetzt." -#: ../data/glade/preferences_window.glade.h:68 +#: ../data/glade/preferences_window.glade.h:70 msgid "Log _encrypted chat session" msgstr "V_erschlüsselte Sitzungen aufzeichnen" -#: ../data/glade/preferences_window.glade.h:69 +#: ../data/glade/preferences_window.glade.h:71 msgid "Ma_ke message windows compact" msgstr "Nachrichtenfenster _kompakt anzeigen" -#: ../data/glade/preferences_window.glade.h:70 +#: ../data/glade/preferences_window.glade.h:72 msgid "Ma_nage..." msgstr "Verwalte_n …" -#: ../data/glade/preferences_window.glade.h:71 +#: ../data/glade/preferences_window.glade.h:73 msgid "" "Never\n" "Only when pending events\n" @@ -2055,31 +2071,31 @@ msgstr "" "Nur bei neuen Ereignissen\n" "Immer" -#: ../data/glade/preferences_window.glade.h:74 +#: ../data/glade/preferences_window.glade.h:76 msgid "Notifications" msgstr "Benachrichtigungen" -#: ../data/glade/preferences_window.glade.h:75 +#: ../data/glade/preferences_window.glade.h:77 msgid "Notify me about contacts that sign _in" msgstr "Benachr_ichtigen, wenn sich ein Kontakt anmeldet" -#: ../data/glade/preferences_window.glade.h:76 +#: ../data/glade/preferences_window.glade.h:78 msgid "Notify me about contacts that sign _out" msgstr "Benachrichtigen, wenn sich ein K_ontakt abmeldet" -#: ../data/glade/preferences_window.glade.h:77 +#: ../data/glade/preferences_window.glade.h:79 msgid "Notify on new _GMail email" msgstr "Bei neuen E-Mails bei _Google-Mail benachrichtigen" -#: ../data/glade/preferences_window.glade.h:78 +#: ../data/glade/preferences_window.glade.h:80 msgid "Personal Events" msgstr "Persönliche Ereignisse" -#: ../data/glade/preferences_window.glade.h:79 +#: ../data/glade/preferences_window.glade.h:81 msgid "Play _sounds" msgstr "Klänge ab_spielen" -#: ../data/glade/preferences_window.glade.h:80 +#: ../data/glade/preferences_window.glade.h:82 msgid "" "Pop it up\n" "Notify me about it\n" @@ -2089,25 +2105,25 @@ msgstr "" "Benachrichtigung anzeigen\n" "Nur in der Kontaktliste anzeigen" -#: ../data/glade/preferences_window.glade.h:83 +#: ../data/glade/preferences_window.glade.h:85 msgid "Preferences" msgstr "Einstellungen" # FIXME: Check English. This should be called something like "Show systray icon" # because the systray itself is always visible. -#: ../data/glade/preferences_window.glade.h:84 +#: ../data/glade/preferences_window.glade.h:86 msgid "Show systray:" msgstr "Symbol in der Systemleiste anzeigen:" -#: ../data/glade/preferences_window.glade.h:85 +#: ../data/glade/preferences_window.glade.h:87 msgid "Sign _in" msgstr "_anmelden" -#: ../data/glade/preferences_window.glade.h:86 +#: ../data/glade/preferences_window.glade.h:88 msgid "Sign _out" msgstr "a_bmelden" -#: ../data/glade/preferences_window.glade.h:87 +#: ../data/glade/preferences_window.glade.h:89 msgid "" "Some messages may include rich content (formatting, colors etc). If checked, " "Gajim will just display the raw message text." @@ -2116,27 +2132,27 @@ msgstr "" "Schriftarten usw.). Falls aktiviert, wird Gajim nur den reinen " "Nachrichtentext anzeigen." -#: ../data/glade/preferences_window.glade.h:88 +#: ../data/glade/preferences_window.glade.h:90 msgid "Sort contacts by status" msgstr "Kontakte nach Status sortieren" -#: ../data/glade/preferences_window.glade.h:89 ../src/config.py:390 +#: ../data/glade/preferences_window.glade.h:91 ../src/config.py:377 msgid "Status" msgstr "Status" -#: ../data/glade/preferences_window.glade.h:90 +#: ../data/glade/preferences_window.glade.h:92 msgid "Status _iconset:" msgstr "Status-S_ymbole:" -#: ../data/glade/preferences_window.glade.h:91 +#: ../data/glade/preferences_window.glade.h:93 msgid "Style" msgstr "Stil" -#: ../data/glade/preferences_window.glade.h:92 +#: ../data/glade/preferences_window.glade.h:94 msgid "T_heme:" msgstr "D_esign:" -#: ../data/glade/preferences_window.glade.h:93 +#: ../data/glade/preferences_window.glade.h:95 msgid "" "The auto away status message. If empty, Gajim will not change the current " "status message\n" @@ -2149,7 +2165,7 @@ msgstr "" "eingesetzt werden. $T kann für die Zeit eingesetzt werden, seit der der " "Status auf Abwesend gestellt ist." -#: ../data/glade/preferences_window.glade.h:96 +#: ../data/glade/preferences_window.glade.h:98 msgid "" "The auto not available status message. If empty, Gajim will not change the " "current status message\n" @@ -2162,104 +2178,106 @@ msgstr "" "Statusnachricht eingesetzt werden. $T kann für die Zeit eingesetzt werden, " "seit der der Status auf Nicht Verfügbar gestellt ist." -#: ../data/glade/preferences_window.glade.h:99 +#: ../data/glade/preferences_window.glade.h:101 msgid "Use _transports icons" msgstr "_Transport-Symbole verwenden" -#: ../data/glade/preferences_window.glade.h:100 +#: ../data/glade/preferences_window.glade.h:102 msgid "Use system _default" msgstr "Benutze System-_Voreinstellung" -#: ../data/glade/preferences_window.glade.h:101 +#: ../data/glade/preferences_window.glade.h:103 msgid "When new event is received:" msgstr "Wenn eine neue Nachricht empfangen wird:" -#: ../data/glade/preferences_window.glade.h:102 +#: ../data/glade/preferences_window.glade.h:104 +#, fuzzy +msgid "Your message:" +msgstr "Fehlermeldung: %s" + +#: ../data/glade/preferences_window.glade.h:105 +#, fuzzy +msgid "Your nickname:" +msgstr "Spitzname:" + +#: ../data/glade/preferences_window.glade.h:106 msgid "_Away after:" msgstr "Automatisch _abwesend nach:" -#: ../data/glade/preferences_window.glade.h:103 +#: ../data/glade/preferences_window.glade.h:107 msgid "_Browser:" msgstr "_Browser:" -#: ../data/glade/preferences_window.glade.h:104 +#: ../data/glade/preferences_window.glade.h:108 msgid "_Display chat state notifications:" msgstr "Benachrichtigungen über _den Chatstatus anzeigen:" -#: ../data/glade/preferences_window.glade.h:105 +#: ../data/glade/preferences_window.glade.h:109 msgid "_Emoticons:" msgstr "_Emoticons:" -#: ../data/glade/preferences_window.glade.h:106 +#: ../data/glade/preferences_window.glade.h:110 msgid "_File manager:" msgstr "_Dateimanager:" -#: ../data/glade/preferences_window.glade.h:107 +#: ../data/glade/preferences_window.glade.h:111 msgid "_Highlight misspelled words" msgstr "Falsch geschriebene Wörter _hervorheben" -#: ../data/glade/preferences_window.glade.h:108 +#: ../data/glade/preferences_window.glade.h:112 msgid "_Ignore events from contacts not in the roster" msgstr "" "Ereignisse von Kontakten, die nicht in der Kontaktliste sind, _ignorieren" -#: ../data/glade/preferences_window.glade.h:109 +#: ../data/glade/preferences_window.glade.h:113 msgid "_Ignore rich content in incoming messages" msgstr "Formatierten Inhalt in ankommenden Nachrichten _ignorieren" -#: ../data/glade/preferences_window.glade.h:110 -msgid "_Incoming message:" -msgstr "_Eingehende Nachricht:" - -#: ../data/glade/preferences_window.glade.h:111 +#: ../data/glade/preferences_window.glade.h:114 msgid "_Log status changes of contacts" msgstr "_Logge die Statusveränderungen von Kontakten" -#: ../data/glade/preferences_window.glade.h:112 +#: ../data/glade/preferences_window.glade.h:115 msgid "_Mail client:" msgstr "E-_Mail-Programm:" -#: ../data/glade/preferences_window.glade.h:113 +#: ../data/glade/preferences_window.glade.h:116 msgid "_Not available after:" msgstr "Automatisch _nicht verfügbar nach:" -#: ../data/glade/preferences_window.glade.h:114 +#: ../data/glade/preferences_window.glade.h:117 msgid "_Open..." msgstr "Ö_ffnen …" -#: ../data/glade/preferences_window.glade.h:115 -msgid "_Outgoing message:" -msgstr "_Ausgehende Nachricht:" - -#: ../data/glade/preferences_window.glade.h:116 +#: ../data/glade/preferences_window.glade.h:118 msgid "_Reset to Default Colors" msgstr "Auf Standardfarben zu_rücksetzen" -#: ../data/glade/preferences_window.glade.h:117 +#: ../data/glade/preferences_window.glade.h:119 msgid "_Send chat state notifications:" msgstr "Benachrichtigungen über den Chatstatus _senden:" -#: ../data/glade/preferences_window.glade.h:118 +#: ../data/glade/preferences_window.glade.h:120 msgid "_Status message:" msgstr "_Statusnachricht:" -#: ../data/glade/preferences_window.glade.h:119 +#: ../data/glade/preferences_window.glade.h:121 msgid "_URL highlight:" msgstr "_URL hervorheben:" -#: ../data/glade/preferences_window.glade.h:120 +#: ../data/glade/preferences_window.glade.h:122 msgid "_Window behavior:" msgstr "_Fensterverhalten:" -#: ../data/glade/preferences_window.glade.h:121 +#: ../data/glade/preferences_window.glade.h:123 msgid "in _group chats" msgstr "in Chat_räumen" -#: ../data/glade/preferences_window.glade.h:122 +#: ../data/glade/preferences_window.glade.h:124 msgid "in _roster" msgstr "in der _Kontaktliste" -#: ../data/glade/preferences_window.glade.h:123 +#: ../data/glade/preferences_window.glade.h:125 msgid "minutes" msgstr "Minuten" @@ -2292,9 +2310,8 @@ msgid "All" msgstr "allen" #: ../data/glade/privacy_list_window.glade.h:7 -#, fuzzy msgid "All (including subscription)" -msgstr "Kontakten, die:" +msgstr "Alle (Abonnement eingeschlossen)" #: ../data/glade/privacy_list_window.glade.h:8 msgid "Allow" @@ -2312,7 +2329,7 @@ msgstr "der Jabber-ID:" msgid "Order:" msgstr "Reihenfolge:" -#: ../data/glade/privacy_list_window.glade.h:12 ../src/dialogs.py:3114 +#: ../data/glade/privacy_list_window.glade.h:12 ../src/dialogs.py:3235 msgid "Privacy List" msgstr "Privatsphären-Liste" @@ -2457,7 +2474,7 @@ msgid "Prefix:" msgstr "Namenspräfix:" #: ../data/glade/profile_window.glade.h:25 -#: ../data/glade/vcard_information_window.glade.h:30 ../src/vcard.py:327 +#: ../data/glade/vcard_information_window.glade.h:30 ../src/vcard.py:332 msgid "Role:" msgstr "Rolle:" @@ -2517,8 +2534,8 @@ msgstr "Konto entfernen (in Gajim und auf dem _Server)" #. Remove group #. Remove -#: ../data/glade/remove_account_window.glade.h:4 ../src/roster_window.py:5339 -#: ../src/roster_window.py:5459 ../src/roster_window.py:5588 +#: ../data/glade/remove_account_window.glade.h:4 ../src/roster_window.py:5256 +#: ../src/roster_window.py:5380 ../src/roster_window.py:5511 msgid "_Remove" msgstr "_Entfernen" @@ -2527,24 +2544,27 @@ msgid "" "someone@somewhere.com would like you to add some contacts in " "your roster." msgstr "" +"jemand@irgendwo.de möchte Sie als Kontakt zu seiner Kontaktliste " +"hinzufügen." #: ../data/glade/roster_item_exchange_window.glade.h:2 msgid "Message Body